public long getServer(byte[] keyByte, boolean isRead) {
	if (serverList == null || serverList.size() == 0) {
		log.error("server list is empty");
		return 0;
	}
	int serverIdx = findServerIdx(keyByte); 

	long serverIp = 0;
	serverIp = serverList.get(serverIdx);
	log.debug("oroginal target server: " + 
			TairUtil.idToAddress(serverIp) + 
			" alive server: " + aliveNodes);
	
	if (!aliveNodes.contains(serverIp)) {
		serverIp = 0;
		log.warn("master server " + TairUtil.idToAddress(serverIp) + " had down");
	}
	
	if (serverIp == 0 && isRead) {
		for (int i  = 1; i < copyCount; ++i) {
			int copyServerIdx = serverIdx + i * bucketCount;
			serverIp = serverList.get(copyServerIdx);
			log.debug("read operation try: " + TairUtil.idToAddress(serverIp));
			if (aliveNodes.contains(serverIp)) {
				
				break;
			} else {
				serverIp = 0;
			}
		}
		if (serverIp == 0) {
			log.warn("slave servers also"+ " had down");
		}
	}
    return serverIp;
  }