首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何配置Cassandra以跨多个EC2区域使用Ec2MultiRegionSnitch

如何配置Cassandra以跨多个EC2区域使用Ec2MultiRegionSnitch
EN

Stack Overflow用户
提问于 2012-06-13 22:09:11
回答 1查看 6.5K关注 0票数 6

我是卡桑德拉的新手,我的任务是让它在EC2环境中跨多个区域运行,这样如果整个EC2区域崩溃,我们的应用程序就会继续在它的快乐之路上运行。我已经阅读了尽可能多的关于Ec2MultiRegionSnitch的文档,并且已经停止了。我在查卡桑德拉1.0.10号。

我的问题如下:

1)启动bin/cassandra时,会得到错误:无法在JMX中启动注册mbean。虽然我可以在任何节点上运行bin/nodetool -h环,但是我可以从一个健康的系统中获得您期望的显示。我已经将mx4j库添加到我的cassandra部署中。我想我可以试着把它去掉。

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

代码语言:javascript
复制
    CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
    and strategy_options = {us-east-1:2,us-west-1:2};

3)在运行“使用mykeyspace”之后,我可以创建一个列族,如下所示:

代码语言:javascript
复制
    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 -h,运行使用mykeyspace;进行描述;每个节点正确地描述mykeyspace,包括列族和种子列表。

5)但当我试图表演一个简单的:

代码语言:javascript
复制
    set people['1']['FIRST_NAME'] = 'John'; 

我得到堆栈跟踪如下:

代码语言:javascript
复制
    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)

My配置:

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

我的集群中有4个节点:在以下每个区域中都有一个节点:AvailabilityZones。

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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中,我还包括:

代码语言:javascript
复制
    JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=<Node's local IP Address>"

,我的恳求,,希望我已经提供了足够的信息来帮助我让这件事像你想要的那样工作。

附加信息堆栈跟踪来自第一个mx4j问题:

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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

我的节点工具环输出__

代码语言:javascript
复制
    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是俄勒冈州)。所以我不认为仅仅把我们西部地区分开就能成功地区分区域。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-14 22:43:08

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

1)卡桑德拉-拓扑,属性仅由PropertyFileSnitch使用。使用ec2告密者时,该文件与此无关。2)告密者目前报告“我们-西部”而不是“我们-西部-1”的原因是一个错误。https://issues.apache.org/jira/browse/CASSANDRA-4026。如果在'us-west-2‘中添加节点,它们将正确地得到报告。

因此,这里的解决方案是更新复制设置:

代码语言:javascript
复制
CREATE KEYSPACE mykeyspace 
    WITH placement_strategy = 'org.apache.cassandra.locator.NetworkTopologyStrategy'
    and strategy_options = {us-east:2,us-west:2};

而且,不幸的是,我不知道mx4j有什么问题。卡桑德拉并不需要它,所以除非你真的需要它,否则你可以把它移除。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11024042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档