如何使用Ec2MultiRegionSnitch将Cassandra配置为跨多个EC2区域工作

jsp*_*att 6 amazon-ec2 cassandra

我是Cassandra的新手,他的任务是在多个地区的EC2环境中启动并运行,这样如果整个EC2区域瘫痪,我们的应用程序将继续以愉快的方式运行.我已经阅读了尽可能多的关于Ec2MultiRegionSnitch的文档,并且已经停止了.我正在运行cassandra 1.0.10.

我的问题如下:

1)当我启动bin/cassandra时,我收到错误:无法在JMX中启动注册mbean.虽然我可以在任何节点上运行bin/nodetool -h ring,但我得到了一个健康系统所期望的显示.我已将mx4j库添加到我的cassandra部署中.我可以尝试删除我想的.

2)当我然后启动bin/cassandra-cli -h时,我能够创建密钥空间,如下所示:

    CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
    and strategy_options = {us-east-1:2,us-west-1:2};
Run Code Online (Sandbox Code Playgroud)

3)运行'use 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}];
Run Code Online (Sandbox Code Playgroud)

4)在我这样做之后,我可以在4个节点中的任何一个上运行bin/cassandra-cli -h,运行使用mykeyspace; 描述; 并且每个节点都正确地描述了mykeyspace,包括列族和种子列表.

5)但是当我尝试执行一个简单的:

    set people['1']['FIRST_NAME'] = 'John'; 
Run Code Online (Sandbox Code Playgroud)

我得到一个堆栈跟踪如下:

    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)
Run Code Online (Sandbox Code Playgroud)

我的配置:

我已经为端口22,7000,7199和9160执行了ec2-authorize

我的集群中有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)
Run Code Online (Sandbox Code Playgroud)

每个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
Run Code Online (Sandbox Code Playgroud)

另外在每个节点的cassandra-env.sh我都包括:

    JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<Node's local IP Address>"
Run Code Online (Sandbox Code Playgroud)

我的辩护 希望我已经向某人提供了足够的信息来帮助我按照自己的意愿使用这个东西.

附加信息 来自第一个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)
Run Code Online (Sandbox Code Playgroud)

我的cassandra-topology.properties

    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
Run Code Online (Sandbox Code Playgroud)

我的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  
Run Code Online (Sandbox Code Playgroud)

我很确定我已经正确添加了区域/可用区域.至少我认为我匹配文档中出现的内容.(请参阅此链接中的Ec2MultiRegionSnitch) http://www.datastax.com/docs/1.0/cluster_architecture/replication

我不认为我可以将这些地区列为我们西部和东部地区,因为西部有两个地区(美国西部1区是加利福尼亚地区,而美国西部区域2区域是俄勒冈州).因此,我认为仅仅将西部 - 西部成功地区分区域.

nic*_*ley 6

我在评论中的猜测是正确的.您的复制设置和数据中心名称不匹配.有几件事.

1)cassandra-topology.properties仅由PropertyFileSnitch使用.使用ec2 snitch时,该文件无关紧要.2)小报当前报告'us-west'而不是'us-west-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};
Run Code Online (Sandbox Code Playgroud)

另外,遗憾的是我不知道mx4j有什么问题.虽然cassandra不需要它,除非你真的需要它,你可以删除它.