【问题标题】:How to configure Cassandra to work across multiple EC2 regions with Ec2MultiRegionSnitch如何使用 Ec2MultiRegionSnitch 配置 Cassandra 以跨多个 EC2 区域工作
【发布时间】:2012-06-16 22:50:22
【问题描述】:

我是 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};

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 个节点中的任何一个上运行 bin/cassandra-cli -h,运行 use 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)

我的配置:

我已经对端口 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)

每个 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)

我的 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

我的 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

我认为我不能将这些地区列为 us-west 和 us-east,因为西部有两个地区(us-west-1 是加利福尼亚地区,us-west-2 是俄勒冈地区) .因此,我不认为仅仅将 us-west 放在会成功区分地区。

【问题讨论】:

  • 您应该为您看到的第一个 jmx 问题附加错误/堆栈跟踪。我的第一个猜测是您的数据中心没有命名为“us-east-1”和“us-west-1”。检查/附加“nodetool ring”的输出以查看它们是什么。
  • 我已在原帖底部添加了您要求的其他信息。

标签: amazon-ec2 cassandra


【解决方案1】:

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

1) cassandra-topology.properties 仅由 PropertyFileSnitch 使用。使用 ec2 告密者时,该文件无关紧要。 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};

另外,很遗憾我不知道 mx4j 有什么问题。 cassandra 不需要它,所以除非你真的需要它,否则你可以删除它。

【讨论】:

  • 这样就搞定了。我在处理这个项目时遇到了许多 cassandra 错误。
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 2016-10-15
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多