2014-09-23

Tags: cassandra , aws

要在雲端 IaaS 主機建立 cassandra node,cassandra 設定檔裡跟 ip 有關的參數設定要特別留心,不然在 node 建完後會啟動失敗。這篇設定在  cassandra 1.x、2.x 都適用,有需要的可以參考一下...:)

假設我在 AWS 建了一台 EC2,並且將它綁定 EIP(Elastic IP),EC2 的 ip 資訊如下

private ip : 172.30.45.70
public ip : 50.190.20.220
目前的 cassandra ring(cluster) 分佈在多個 AWS region,seed node 的 public ip 是 60.190.20.210。我要將該台 EC2 加入其中,相關注意事項如下
  1. cassandra.yaml
    設定值要長像這樣,相關原因在官方文件有說明
    endpoint_snitch: EC2MultiRegionSnitch
    listen_address : ec2_private_ip
    rpc_address : ec2_private_ip
    broadcast_address : ec2_public_ip
    seeds : seed_public_ip
    以目前的例子來說則是設成
    endpoint_snitch: EC2MultiRegionSnitch
    listen_address : 172.30.45.70
    rpc_address : 172.30.45.70
    broadcast_address : 50.190.20.220
    seeds : 60.190.20.210
  2. cassandra-env.sh
    增加下面這行跟 JMX 有關的設定。為何要加這行? 這是為了防止  nodetool 指令執行時出現 "Connection has timed out" 異常。這問題在 stackoverflow 有被討論跟解釋過。
    JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=127.0.0.1"
  3. EC2 的 firewall 把該開的 port 都打開(從 EC2 > Security Group > Inbound 設定裡改),一般來說是開啟下面儿個
    storage_port : 7000
    jmx_port : 7199
    native_transport_port : 9042
    rpc_port : 9160
雖然這裡是用 EC2 當例子,不過只要是 IaaS 設定上應該都與此相似。比較大的差異在 cassandra.yaml 裡的 endpoint_snitch 設定,EC2 用 EC2MultiRegionSnitch,GCE(GoogleComputerEngine) 用 GoogleCloudSnitch,混用 IaaS 跟一般傳統實體主機可以用 GossipingPropertyFileSnitch

至於 ip 設定部份,其實只有一個重點"機器內部內網溝通走 private ip,但是走到外網進行 broadcast 時要走 public ip"。會這樣做的理由也很直覺,因為 public ip 是經由雲端服務綁定(e.g. AWS EIP),VM 本身根本不知道自己有 public ip 這回事。