前些日子有同學問如何生成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之間的整數。 具體步驟如下:
- 到這里下載腳本,名為tokengentool
- 修改為可執行,chmod +x tokengentool
- 執行生成:./tokengentool <nodes_num_in_dc1> <nodes_num_in_dc2>
- 將生成的token分配給每個node的initial_token
{
"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
}
} 具體分配的圖如下:
這最后一個,大家看明白了么? 【完】
