Token的生成【译】

前些日子有同学问如何生成token,原来做Voldemort的时候,官方提供了一个脚本,自动生成,Voldemort只是一致性hash很方便,考虑的因素也少。而Cassandra考虑的就多了,跨机架,跨数据中心,都有很多需要注意的。上次我说了在同一个数据中心很实用,可控的方法。下面讲讲DataStax推荐的一些方法。 【正文开始】 Token是为数据中心中某一特定节点分配某一范围的数据的依据。 当启动一个Cassandra的集群,必须选择数据在集群中节点是如何分布的。partitioner是根据数据的key来决定这行数据存储在哪个节点上。token是独立与partitioner的。每一个节点都会分配一个token,这个token决定了节点在环中的位置,以及哪些数据会存储在这个节点上。分配给节点的token需要分布在所有的token可能的范围中。每一个token确定的范围是从前一个token开始,顺时针到自己的左开右闭区间。一个简单的例子:如果全部的token范围是0-100,而且集群中有四个节点。那可能每个节点的token为0,25,50,75。这种方法,保证了每个token确定的数据范围大小是一样的。每一个数据中心都应该作为一个独立的环来划分。 Note:集群中的每个节点在第一次启动之前必须设置好token,token的设置在cassandra.yaml配置文件中的initial_token项。 Token生成工具DataStax提供了一个python脚本,用来自动生成token,token是0到2^127 - 1之间的整数。 具体步骤如下:

  1. 这里下载脚本,名为tokengentool
  2. 修改为可执行,chmod +x tokengentool
  3. 执行生成:./tokengentool <nodes_num_in_dc1> <nodes_num_in_dc2>
  4. 将生成的token分配给每个node的initial_token
为一个数据中心生成token
当我们只有一个数据中心的时候,使用RadomPartitioner,输入节点的数量即可。例如,我们有6个节点:
./tokengentool 6
然后会有如下的结果:
{
  "0": {
        "0": 0,
        "1": 28356863910078205288614550619314017621,
        "2": 56713727820156410577229101238628035242,
        "3": 85070591730234615865843651857942052864,
        "4": 113427455640312821154458202477256070485,
        "5": 141784319550391026443072753096570088106
        }
}
大家可以发现,基本是按照平均计算的 在一个数据中心,多机架的情况下,计算token 如果在一个数据中心中,多个机架,和之前一样,输入节点的数量,生成token。然后以交替的顺序分配给不同机架的节点。例如rack1,rack2,rack3,rack1,rack2,rack3等,作为一个最佳实践,每个机架上的服务器数量应该相同,这样可以均匀的交替分配。举例如下: ./tokengentool 8 具体分配如下图: 为多数据中心生成token 在多数据中心部署的情况下,数据在每一个数据中心的存储策略需要根据NetworkTopologyStrategy。这个策略在不同的数据中心中独立决定数据存储的方式。第一个复本的存储会根据partitioner找到相应的节点,剩下的节点的选择是顺时针沿着环走,直到遇到一个和前面一个复本在不同机架的节点为止,这个节点就是要找的存储节点。如果这样的节点不存在,那么所有的复本都存在同一个机架上面了。具体可以详细参考NetworkTopologyStrategy。 当计算多数据中心的token的时候,可以有很多不同的方法。每一个数据中心内的节点都管理这等量的数据,这是重要的。而集群内的节点分布却不是那么重要。 交替的分配Token使用tokengentool计算出token,并且将token交替的分配给不同数据中心的节点。计算方法如下,两个数据中心,每个三个节点: ./tokengentool 3 3 结果如下:
{
  "0": {
      "0": 0,
      "1": 56713727820156410577229101238628035242,
      "2": 113427455640312821154458202477256070485
       },
  "1": {
      "0": 28356863910078205288614550619314017621,
      "1": 85070591730234615865843651857942052863,
      "2": 141784319550391026443072753096570088106
     }
}
下图阐述了交替分配的结果: 避免token冲突(在实际使用中,我并没有使用到跨数据中心的规模,这一段,理解不够。翻译不准,还请大家指点) 避免token冲突的方法是将计算出来的token值做一些偏移,尽管你可以只增加1,但最好还是增加的大一些,比如100,这样可以有空间替换宕掉的节点。 下面的例子是两个具有三个节点的数据中心和一个有两个节点的数据中心: ./tokengentool 3
   {
    "0": {
        "0": 0,
        "1": 56713727820156410577229101238628035242,
        "2": 113427455640312821154458202477256070485
         }
 }

./tokentool 2

  {
      "0": {
        "0": 0,
          "1": 85070591730234615865843651857942052864
           }
  }
具体分配的图如下: 这最后一个,大家看明白了么? 【完】

posted on 2012-06-29 17:25  sing1ee  阅读(3667)  评论(0编辑  收藏  举报