Amazon ec2 如何配置Cassandra使用EC2Multi RegionsNitch跨多个EC2区域工作

Amazon ec2 如何配置Cassandra使用EC2Multi RegionsNitch跨多个EC2区域工作,amazon-ec2,cassandra,Amazon Ec2,Cassandra,我是Cassandra的新手,我的任务是在多个地区的EC2环境中安装和运行它,这样,如果整个EC2地区崩溃,我们的应用程序将继续它的快乐之路。我已经阅读了尽可能多的关于EC2MultipregionsNitch的文档,已经完全停止了。我正在运行卡桑德拉1.0.10 我的问题如下: 1) 当我启动bin/cassandra时,我得到一个错误:无法在JMX中启动寄存器mbean。尽管我可以在任何节点上运行bin/nodetool-h环,并且我可以从一个健康的系统中得到您所期望的显示。我已经将mx4j

我是Cassandra的新手,我的任务是在多个地区的EC2环境中安装和运行它,这样,如果整个EC2地区崩溃,我们的应用程序将继续它的快乐之路。我已经阅读了尽可能多的关于EC2MultipregionsNitch的文档,已经完全停止了。我正在运行卡桑德拉1.0.10

我的问题如下:

1) 当我启动bin/cassandra时,我得到一个错误:无法在JMX中启动寄存器mbean。尽管我可以在任何节点上运行bin/nodetool-h环,并且我可以从一个健康的系统中得到您所期望的显示。我已经将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};
    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}];
    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)
    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
3) 运行“use mykeyspace”后,我可以创建一个列族,如下所示:

    CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
    and strategy_options = {us-east-1:2,us-west-1:2};
    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}];
    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)
    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
4) 完成此操作后,我可以在4个节点中的任意一个上运行bin/cassandra cli-h,运行use-use-mykeyspace;描述;每个节点都正确地描述了mykeyspace,包括列族和种子列表

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

    set people['1']['FIRST_NAME'] = 'John'; 
我得到一个堆栈跟踪,如下所示:

    CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
    and strategy_options = {us-east-1:2,us-west-1:2};
    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}];
    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)
    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
我的配置:

我已对端口22、7000、7199和9160执行了ec2授权

我的集群中有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配置如下:

    CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
    and strategy_options = {us-east-1:2,us-west-1:2};
    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}];
    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)
    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
我的卡桑德拉拓扑。属性

    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  
我非常确定我已经正确添加了区域/可用性区域。至少我认为我符合文档中出现的内容。(请参阅此链接中的EC2MultipregionsNitch)


我不认为我可以把这些地区列为美国西部和美国东部,因为西部有两个地区(us-west-1是加利福尼亚地区,us-west-2是俄勒冈州地区)。所以我不认为仅仅把美国西部地区划分出来就能成功地区分不同的地区。

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

1) cassandra-topology.properties仅由PropertyFileSnitch使用。使用ec2告密器时,该文件不相关。 2) 告密者目前报告“美国西部”而不是“美国西部1”的原因是由于一个bug。如果您在“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并不需要它,除非你确实需要它,否则你可以删除它。

你应该为你看到的第一个jmx问题附加error/stacktrace。我的第一个猜测是,您的数据中心没有命名为“us-east-1”和“us-west-1”。检查/附加“nodetool环”的输出,看看它们是什么。我在原始帖子的底部添加了您要求的其他信息。这就澄清了问题。我在做这个项目的时候遇到了很多卡桑德拉的错误。