2012-01-04

Tags: cassandra , java

這篇的說明是以Cassandra 1.x版為基準,早期版本可能不是這樣。

接著...進入正題,先來個名詞解釋!

Snitch:用來設定cassandra ring裡的node怎麼分群。如果所有node都在同個網段時(e.g. 172.16.0.x)這部份可用預設SimpleSnitch設定不需修改,如果各個node分布的硬體在多個dc(datacenter)或是多個rank,而且各個node的網段又完全不同的話,這部份就要改設定,不然cassandra ring可能會串不起來。半官方解說在 這裡。可以設定的值有下列儿種
* SimpleSnitch
* DseSimpleSnitch
* RackInferringSnitch
* PropertyFileSnitch
* EC2Snitch
* EC2MultiRegionSnitch

Replication Strategy:根據Snitch設定值的不同,當建立新keyspace時所需對應設定的參數。半官方解說在 這裡。可以設定的值有下列儿種
* SimpleStrategy
* NetworkTopologyStrategy

看完上面這堆後,真的知道它是怎麼一回事的,應該沒多少人。覺的文件像在講外星語是很正常的,所以接下來直接來看實作吧。看完實作後再回頭來看前面的名詞解釋,就會了解是怎麼一回事了。

實作的機器有下面二台
Cassandra Server1:172.16.0.157
Cassandra Server2:172.16.0.220

因為Snitch跟Replication Strategy要搭配才會發生效用,然後這二台機器又在同個網段(172.16.0.X),所以可以用最簡單也是最常用的搭配組合「SimpleSnitch + SimpleStrategy」。官方文件中最常見的介紹方式也是這個組合。

===========================================================================
SimpleSnitch + SimpleStrategy設定方式
1.修改二個node的cassandra.yaml的設定

endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
2.用nodetool進行測試,會發現結果中的dc被命名為datacenter1,rank則是rack1,這二個部份無法手動調整
loudtu@cloudtu-VirtualBox:~/cassandra-1.0.6-1/bin$ ./nodetool -h 127.0.0.1 ring
Address DC Rack Status State Load Owns Token
85070591730234615865843651857942052864
172.16.0.220 datacenter1 rack1 Up Normal 123.46 KB 50.00% 0
172.16.0.157 datacenter1 rack1 Up Normal 111.73 KB 50.00% 85070591730234615865843651857942052864
3.建立新的keyspace。配合SimpleSnitch,有其對應的SimpleStrategy語法。範列中{replication_factor:2}指的是 {replication_factor:number_of_replicas}
create keyspace testks
with strategy_options=[{replication_factor:2}]
and placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy';
===========================================================================

如果多個node的IP是跨不同網段(e.g. "110.82.155.1"、"110.82.156.1"),這時可以用「RackInferringSnitch+NetworkTopologyStrategy」的組合。半官方的範例在 這裡。雖然說一般是跨網段時才要這樣設定,但是在同個網段內也是可以這樣設定,只是node會被分配在同個datacenter或是rank。

===========================================================================
RackInferringSnitch + NetworkTopologyStrategy設定方式
1.修改二個node的cassandra.yaml的設定
endpoint_snitch: org.apache.cassandra.locator.RackInferringSnitch
2.用nodetool進行測試,會發現結果中的dc被命名為16,rank則是0,這二個部份無法手動調整。但是這個命名是有規則的,相關規則可參照 這裡的說明。
cloudtu@cloudtu-VirtualBox:~/cassandra-1.0.6-1/bin$ ./nodetool -h 127.0.0.1 ring
Address DC Rack Status State Load Owns Token
85070591730234615865843651857942052864
172.16.0.220 16 0 Up Normal 107.69 KB 50.00% 0
172.16.0.157 16 0 Up Normal 111.83 KB 50.00% 85070591730234615865843651857942052864
3.建立新的keyspace。配合RackInferringSnitch,有其對應的NetworkTopologyStrategy語法。範列中{16:2}指的是 {datacenter_name:number_of_replicas}
create keyspace testks
with strategy_options=[{16:2}]
and placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy';
===========================================================================

如果「RackInferringSnitch+NetworkTopologyStrategy」的組合還是無法滿足實務上的需求,想要更有彈性,則是可以考慮「PropertyFileSnitch + NetworkTopologyStrategy」的組合。半官方的範例在 這裡。在這種組合的設定裡,連dc、rank的名字都可以自己設定。

===========================================================================
PropertyFileSnitch + NetworkTopologyStrategy設定方式
1.修改二個node的cassandra.yaml的設定
endpoint_snitch: org.apache.cassandra.locator.PropertyFileSnitch
2.因為設定成PropertyFileSnitch,所以接著必需到二個node的cassandra-topology.properties設定所有node的IP與其相對應的dc與rank。
# Data Center One
172.16.0.157=DC1:RAC1

# Data Center Two
172.16.0.220=DC2:RAC1

# default for unknown nodes
default=DC1:RAC1

3.用nodetool進行測試,會發現結果中的dc與rank的名稱是來自於cassandra-topology.properties裡的設定。
cloudtu@cloudtu-VirtualBox:~/cassandra-1.0.6-1/bin$ ./nodetool -h 127.0.0.1 ring
Address DC Rack Status State Load Owns Token
85070591730234615865843651857942052864
172.16.0.220 DC2 RAC1 Up Normal 150.59 KB 50.00% 0
172.16.0.157 DC1 RAC1 Up Normal 155.01 KB 50.00% 85070591730234615865843651857942052864
4.建立新的keyspace。配合PropertyFileSnitch,有其對應的NetworkTopologyStrategy語法。範列中{DC1:1,DC2:1}指的是 {datacenter_name:number_of_replicas}。本範例中有多個dc,所以設定值之間必需用「,」隔開。
create keyspace testks
with strategy_options=[{DC1:1,DC2:1}]
and placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy';
===========================================================================

把這些範例看完後,想必對Snitch與Replication Strategy比較有感覺了。簡單來說,cassandra ring裡有多個node,但是多個node到底是分布在哪個dc、哪個rank,這部份在cassandra裡有可能無法自動判定(e.g. 不同網段的node可能會分布在多個dc、多個rank,也可能這些不同網段的node其實是在同個dc、同個rank),所以才衍生了必需設定Snitch的議題。又因為你設定了Snitch等於是你自行幫這堆node進行了分群的動作,所以必需在keyspace建立時,自行指定資料之後要存到哪個dc、那個rank裡。而Replication Strategy就是在做這件事。

在了解這個前因後果後,再回到最前面把名詞解釋的部份再看一次,如此一來就會真的了解這二個名詞是在講啥東東,為何二者之間的關聯會這麼的密切。

補充說明:Snitch的設定,除了文中實作的SimpleSnitch、 RackInferringSnitch、PropertyFileSnitch這三個最常見的設定外;如果是把cassandra放在Amazon的EC2上,則是需要設成EC2Snitch或EC2MultiRegionSnitch,這部份如果有實際需求的話,可以參考半官方的 文件,了解如何設定。