2012-06-13 37 views
6

我是Cassandra的新手,並且負責在多個區域的EC2環境中啓動並運行該應用程序,例如,如果整個EC2區域耗盡我們的應用程序,繼續其快樂的方式。我已經閱讀了儘可能多的關於Ec2MultiRegionSnitch的文檔,並且已經停止了。我正在運行cassandra 1.0.10。是如何配置Cassandra以跨Ec2MultiRegionSnitch跨多個EC2區域工作

我的問題如下:

1)當我開始斌/卡桑德拉我得到的錯誤:無法啓動的JMX MBean的註冊。雖然我可以在任何節點上運行bin/nodetool -h ring,並且我可以從健康的系統中獲得所需的顯示效果。我已將mx4j庫添加到我的cassandra部署中。我可以嘗試刪除,我想。

2)當我再啓動斌/卡桑德拉-CLI -h我能夠創建密鑰空間如下:

CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' 
    and strategy_options = {us-east-1:2,us-west-1:2}; 

3)我跑後「使用mykeyspace」我可以創建一個列族作爲如下:

CREATE COLUMN FAMILY people 
     WITH comparator=UTF8Type AND key_validation_class=UTF8Type AND 
     default_validation_class=UTF8Type AND column_metadata=[{column_name:FIRST_NAME,validation_class:UTF8Type}, 
     {column_name:LAST_NAME,validation_class:UTF8Type}, 
     {column_name:EMAIL,validation_class:UTF8Type}, 
     {column_name:LOGIN,validation_class:UTF8Type, index_type: KEYS}]; 

4)我這樣做後,我可以在任何的4個節點上運行斌/卡桑德拉-CLI -h,運行使用mykeyspace;描述;並且每個節點都正確描述了mykeyspace,包括列族和種子列表。

5),但是當我嘗試進行簡單:

set people['1']['FIRST_NAME'] = 'John'; 

我得到一個堆棧跟蹤如下:

null 
    UnavailableException() 
     at org.apache.cassandra.thrift.Cassandra$insert_result.read(Cassandra.java:15206) 
     at org.apache.cassandra.thrift.Cassandra$Client.recv_insert(Cassandra.java:858) 
     at org.apache.cassandra.thrift.Cassandra$Client.insert(Cassandra.java:830) 
     at org.apache.cassandra.cli.CliClient.executeSet(CliClient.java:901) 

我的配置:

我已經執行EC2 - 授權端口22,7000,7199和9160

我的羣集中有4個節點:以下每個區域都有一個節點:AvailabilityZones。

us-east-1:us-east-1a (initial_token: 0) 
    us-east-1:us-east-1c (initial_token: 85070591730234615865843651857942052864) 
    us-west-1:us-west-1a (initial_token: 1) 
    us-west-1:us-west-1c (initial_token: 85070591730234615865843651857942052865) 

每個EC2實例都與公有IP地址相關聯。

在我已經配置cassandra.yaml每個節點如下:

seeds: <set to the public ip address for the us-east-1a and us-west-1a nodes> 
    storage_port: 7000 
    listen_address: <private ip address of this node> 
    broadcast_address: <public ip address of this node> 
    rpc_address: 0.0.0.0 
    rpc_port: 9160 
    endpoint_snitch: Ec2MultiRegionSnitch 

此外,在每個節點的cassandra-env.sh我已經包括:

JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<Node's local IP Address>" 

我懇求 希望我已經提供了足夠的信息,以幫助我得到這個東西工作,如人所願。

其他信息 堆棧從第一MX4J問題跟蹤:

WARN 22:07:17,651 Could not start register mbean in JMX java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 
    at org.apache.cassandra.utils.Mx4jTool.maybeLoad(Mx4jTool.java:66) 
    at org.apache.cassandra.service.AbstractCassandraDaemon.setup(AbstractCassandraDaemon.java:243) 
    at org.apache.cassandra.service.AbstractCassandraDaemon.activate(AbstractCassandraDaemon.java:356) 
    at org.apache.cassandra.thrift.CassandraDaemon.main(CassandraDaemon.java:107) 
    Caused by: java.net.BindException: Cannot assign requested address 
    at java.net.PlainSocketImpl.socketBind(Native Method) 
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:353) 

我卡桑德拉拓撲。性能

aaa.aaa.aaa.aaa=us-east-1:us-east-1a 
    bbb.bbb.bbb.bbb=us-east-1:us-east-1c 

    ccc.ccc.ccc.ccc=us-west-1:us-west-1a 
    ddd.ddd.ddd.ddd=us-west-1:us-west-1c 

    default=us-east-1:us-east-1a 

我nodetool環輸出__

Address   DC   Rack  Status State Load   Owns Token          
                      85070591730234615865843651857942052865  
    aaa.aaa.aaa.aaa us-east  1a   Up  Normal 11.09 KB  50.00% 0           
    bbb.bbb.bbb.bbb us-west  1a   Up  Normal 6.68 KB   0.00% 1           
    ccc.ccc.ccc.ccc us-east  1c   Up  Normal 11.09 KB  50.00% 85070591730234615865843651857942052864  
    ddd.ddd.ddd.ddd us-west  1c   Up  Normal 15.5 KB   0.00% 85070591730234615865843651857942052865 

我敢肯定我已經正確添加的區域/可用性區域。至少我認爲我匹配了文檔中出現的內容。 (看Ec2MultiRegionSnitch在這個鏈接) http://www.datastax.com/docs/1.0/cluster_architecture/replication

我不認爲我可以列出的區域爲美國西部和美國東部,因爲有兩個區域在西部(美國西部1是加州地區而美國西部2是俄勒岡州地區)。所以我不認爲只是把我們西部區域成功地區分開來。

+0

您應該爲您看到的第一個jmx問題附加錯誤/堆棧跟蹤。我的第一個猜測是你的數據中心沒有被命名爲'us-east-1'和'us-west-1'。檢查/附加'nodetool ring'的輸出,看看它們是什麼。 – nickmbailey

+0

我已在原始帖子的底部添加了您請求的其他信息。 – jspyeatt

回答

6

我在我評論中的猜測是正確的。您的複製設置和數據中心名稱不匹配。幾件事。

1)cassandra-topology.properties僅由PropertyFileSnitch使用。該文件在使用ec2 snitch時無關緊要。 2)目前報道「美國西部」而不是「美國西部1」的原因是由於一個錯誤。 https://issues.apache.org/jira/browse/CASSANDRA-4026。如果您在'us-west-2'中添加了節點,他們將會正確報告。

所以這裏的解決方案是更新複製設置:

CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy' 
    and strategy_options = {us-east:2,us-west:2}; 

而且,不幸的是我不知道什麼是錯的MX4J。儘管如此,cassandra並不需要它,除非你真的需要它,因爲你可以刪除它。

+0

清理了一些東西。在處理這個項目時,我遇到了許多cassandra錯誤。 – jspyeatt