Ketama 修改支持分布式存储迁移-笨方法

来源:互联网 发布:重启网卡 linux 编辑:程序博客网 时间:2024/06/09 21:49
//添加节点
public void addNode (List<Node> nodes2, Node node) throws IOException {
    nodes2.add(node);    File file = new File(node.getUrl());if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}if (!file.exists()) {file.createNewFile();}BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));KetamaNodeLocator tmpKetamaNodeLocator = new KetamaNodeLocator(nodes2, HashAlgorithm.KETAMA_HASH, numReps);for (int i = 0; i < numReps / 4; i++) {byte[] digest = hashAlg.md5(node.getName() + "#" + i);for(int h = 0; h < 4; h++) {//对于每四个字节,组成一个long值数值,做为这个虚拟节点的在环中的惟一keylong m = hashAlg.hash(digest, h);Long key2 = ketamaNodes.ceilingKey(m);if (key2 == null) {key2 = ketamaNodes.firstKey();}Node node2 = ketamaNodes.get(key2);BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(node2.getUrl())));String line = null;while ((line = reader.readLine()) != null) {if (tmpKetamaNodeLocator.getPrimary(line).getName().equals(node.getName())) {writer.write(line + System.getProperty("line.separator"));}}reader.close();}}writer.close();this.ketamaNodes = tmpKetamaNodeLocator.ketamaNodes;    }    //删除节点    public void removeNode (List<Node> nodes2, Node node) throws IOException {    nodes2.remove(node);    File file = new File(node.getUrl());    BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));KetamaNodeLocator tmpKetamaNodeLocator = new KetamaNodeLocator(nodes2, HashAlgorithm.KETAMA_HASH, numReps);HashMap<String, List<String>> nodeMap = new HashMap<String, List<String>>();String line = null;while ((line = reader.readLine()) != null) {Node node2 = tmpKetamaNodeLocator.getPrimary(line);List<String> content = nodeMap.get(node2.getUrl());if (content == null) {content = new ArrayList<String>();}content.add(line);nodeMap.put(node2.getUrl(), content);}reader.close();for (Map.Entry<String, List<String>> entry : nodeMap.entrySet()) {FileWriter writer = new FileWriter(entry.getKey());for (String item : entry.getValue()) {writer.write(item);}writer.close();}if (file.exists()) {file.delete();}this.ketamaNodes = tmpKetamaNodeLocator.ketamaNodes;    }


测试 代码

public static void main(String[] args) throws IOException {UserTest test = new UserTest();// 初始化节点List<Node> allNodes = test.getNodes(NODE_COUNT);KetamaNodeLocator locator = new KetamaNodeLocator(allNodes,HashAlgorithm.KETAMA_HASH, VIRTUAL_NODE_COUNT);// 初始化所有的useridList<String> allKeys = test.getAllStrings();// 写userid到文件中,查看写的分布情况long start = System.nanoTime();for (String key : allKeys) {Node node = locator.getPrimary(key);File file = new File(node.getUrl());if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}if (!file.exists()) {file.createNewFile();}FileWriter writer = new FileWriter(file.getAbsolutePath(), true);writer.write(key + System.getProperty("line.separator"));writer.close();}long end = System.nanoTime();System.out.println("init time=" + (end - start));String name = "node" + (NODE_COUNT + 1);String url = "D:\\" + "node" + (NODE_COUNT + 1) + ".txt";Node node2 = new Node(name, url);start = System.nanoTime();locator.addNode(allNodes, node2);end = System.nanoTime();System.out.println("add node time=" + (end - start));HashMap<String, Integer> count = new HashMap<String, Integer>();for (String key : allKeys) {Node node = locator.getPrimary(key);Integer cnt = count.get(node.getName());if (cnt == null) {count.put(node.getName(), 1);} else {count.put(node.getName(), cnt + 1);}}System.out.println("-----------------add percent------------------------");for (Map.Entry<String, Integer> entry : count.entrySet()) {System.out.println("Node name :" + entry.getKey() + " - Times : "+ entry.getValue() + " - Percent : "+ (float) entry.getValue() / EXE_TIMES * 100 + "%");}start = System.nanoTime();name = "node" + (NODE_COUNT - 1);url = "D:\\" + "node" + (NODE_COUNT - 1) + ".txt";Node node3 = new Node(name, url);locator.removeNode(allNodes, node3);end = System.nanoTime();System.out.println("remove node time=" + (end - start));count = new HashMap<String, Integer>();for (String key : allKeys) {Node node = locator.getPrimary(key);Integer cnt = count.get(node.getName());if (cnt == null) {count.put(node.getName(), 1);} else {count.put(node.getName(), cnt + 1);}}System.out.println("-----------------remove percent------------------------");for (Map.Entry<String, Integer> entry : count.entrySet()) {System.out.println("Node name :" + entry.getKey() + " - Times : "+ entry.getValue() + " - Percent : "+ (float) entry.getValue() / EXE_TIMES * 100 + "%");}}/** * Gets the mock node by the material parameter *  * @param nodeCount *            the count of node wanted * @return the node list */private List<Node> getNodes(int nodeCount) {List<Node> nodes = new ArrayList<Node>();for (int k = 1; k <= nodeCount; k++) {String name = "node" + k;String url = "D:\\" + "node" + k + ".txt";Node node = new Node(name, url);nodes.add(node);}return nodes;}/** * All the keys */private List<String> getAllStrings() {List<String> allStrings = new ArrayList<String>(EXE_TIMES);for (int i = 0; i < EXE_TIMES; i++) {allStrings.add("" + i);}return allStrings;}

测试结果:

init time=42104011914
add node time=852151265
-----------------add percent------------------------
Node name :node43 - Times : 2129 - Percent : 2.129%
Node name :node42 - Times : 1991 - Percent : 1.991%
Node name :node45 - Times : 1985 - Percent : 1.9850001%
Node name :node44 - Times : 2107 - Percent : 2.1069999%
Node name :node47 - Times : 1955 - Percent : 1.9549999%
Node name :node46 - Times : 1655 - Percent : 1.6550001%
Node name :node49 - Times : 2065 - Percent : 2.065%
Node name :node48 - Times : 1844 - Percent : 1.8440001%
Node name :node41 - Times : 2064 - Percent : 2.0640001%
Node name :node40 - Times : 1954 - Percent : 1.9540001%
Node name :node31 - Times : 2118 - Percent : 2.118%
Node name :node32 - Times : 1750 - Percent : 1.75%
Node name :node33 - Times : 2008 - Percent : 2.008%
Node name :node34 - Times : 1751 - Percent : 1.751%
Node name :node35 - Times : 1994 - Percent : 1.994%
Node name :node36 - Times : 1785 - Percent : 1.7850001%
Node name :node37 - Times : 1946 - Percent : 1.946%
Node name :node38 - Times : 1997 - Percent : 1.997%
Node name :node39 - Times : 2209 - Percent : 2.2089999%
Node name :node50 - Times : 1951 - Percent : 1.9509999%
Node name :node51 - Times : 1907 - Percent : 1.907%
Node name :node1 - Times : 1979 - Percent : 1.979%
Node name :node30 - Times : 2009 - Percent : 2.009%
Node name :node22 - Times : 1738 - Percent : 1.7379999%
Node name :node23 - Times : 1991 - Percent : 1.991%
Node name :node20 - Times : 1897 - Percent : 1.897%
Node name :node21 - Times : 1990 - Percent : 1.99%
Node name :node26 - Times : 1909 - Percent : 1.909%
Node name :node27 - Times : 2166 - Percent : 2.166%
Node name :node24 - Times : 1998 - Percent : 1.998%
Node name :node25 - Times : 1864 - Percent : 1.8640001%
Node name :node4 - Times : 1995 - Percent : 1.995%
Node name :node5 - Times : 2392 - Percent : 2.392%
Node name :node2 - Times : 2103 - Percent : 2.103%
Node name :node28 - Times : 1789 - Percent : 1.789%
Node name :node3 - Times : 1803 - Percent : 1.8030001%
Node name :node29 - Times : 1770 - Percent : 1.77%
Node name :node8 - Times : 2283 - Percent : 2.283%
Node name :node9 - Times : 1673 - Percent : 1.673%
Node name :node6 - Times : 1632 - Percent : 1.632%
Node name :node7 - Times : 2027 - Percent : 2.027%
Node name :node13 - Times : 2082 - Percent : 2.082%
Node name :node14 - Times : 1985 - Percent : 1.9850001%
Node name :node15 - Times : 1902 - Percent : 1.9020001%
Node name :node16 - Times : 2023 - Percent : 2.023%
Node name :node10 - Times : 1958 - Percent : 1.958%
Node name :node11 - Times : 2093 - Percent : 2.093%
Node name :node12 - Times : 1860 - Percent : 1.86%
Node name :node17 - Times : 1964 - Percent : 1.9640001%
Node name :node18 - Times : 2017 - Percent : 2.017%
Node name :node19 - Times : 1943 - Percent : 1.9430001%
remove node time=37365569
-----------------remove percent------------------------
Node name :node43 - Times : 2201 - Percent : 2.201%
Node name :node42 - Times : 2048 - Percent : 2.0479999%
Node name :node45 - Times : 2035 - Percent : 2.035%
Node name :node44 - Times : 2147 - Percent : 2.1469998%
Node name :node47 - Times : 1961 - Percent : 1.9610001%
Node name :node46 - Times : 1655 - Percent : 1.6550001%
Node name :node48 - Times : 1889 - Percent : 1.889%
Node name :node41 - Times : 2104 - Percent : 2.104%
Node name :node40 - Times : 2009 - Percent : 2.009%
Node name :node31 - Times : 2198 - Percent : 2.198%
Node name :node32 - Times : 1796 - Percent : 1.7960001%
Node name :node33 - Times : 2035 - Percent : 2.035%
Node name :node34 - Times : 1824 - Percent : 1.8239999%
Node name :node35 - Times : 2020 - Percent : 2.02%
Node name :node36 - Times : 1813 - Percent : 1.8130001%
Node name :node37 - Times : 1948 - Percent : 1.948%
Node name :node38 - Times : 2066 - Percent : 2.066%
Node name :node39 - Times : 2266 - Percent : 2.266%
Node name :node50 - Times : 2004 - Percent : 2.004%
Node name :node51 - Times : 1934 - Percent : 1.9339999%
Node name :node1 - Times : 1990 - Percent : 1.99%
Node name :node30 - Times : 2048 - Percent : 2.0479999%
Node name :node22 - Times : 1792 - Percent : 1.792%
Node name :node23 - Times : 2009 - Percent : 2.009%
Node name :node20 - Times : 1897 - Percent : 1.897%
Node name :node21 - Times : 1990 - Percent : 1.99%
Node name :node26 - Times : 2023 - Percent : 2.023%
Node name :node27 - Times : 2208 - Percent : 2.208%
Node name :node24 - Times : 2062 - Percent : 2.062%
Node name :node25 - Times : 1898 - Percent : 1.898%
Node name :node4 - Times : 2033 - Percent : 2.033%
Node name :node5 - Times : 2467 - Percent : 2.467%
Node name :node2 - Times : 2145 - Percent : 2.145%
Node name :node28 - Times : 1875 - Percent : 1.8750001%
Node name :node3 - Times : 1877 - Percent : 1.877%
Node name :node29 - Times : 1801 - Percent : 1.801%
Node name :node8 - Times : 2313 - Percent : 2.313%
Node name :node9 - Times : 1709 - Percent : 1.709%
Node name :node6 - Times : 1663 - Percent : 1.663%
Node name :node7 - Times : 2084 - Percent : 2.084%
Node name :node13 - Times : 2138 - Percent : 2.138%
Node name :node14 - Times : 2003 - Percent : 2.003%
Node name :node15 - Times : 1938 - Percent : 1.938%
Node name :node16 - Times : 2042 - Percent : 2.042%
Node name :node10 - Times : 1978 - Percent : 1.978%
Node name :node11 - Times : 2159 - Percent : 2.159%
Node name :node12 - Times : 1894 - Percent : 1.8939999%
Node name :node17 - Times : 1997 - Percent : 1.997%
Node name :node18 - Times : 2044 - Percent : 2.044%
Node name :node19 - Times : 1970 - Percent : 1.97%


求方法是否正确

原创粉丝点击