我是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是俄勒冈州地区)。所以我不认为只是把我们西部区域成功地区分开来。
您应该为您看到的第一个jmx问题附加错误/堆栈跟踪。我的第一个猜测是你的数据中心没有被命名为'us-east-1'和'us-west-1'。检查/附加'nodetool ring'的输出,看看它们是什么。 – nickmbailey
我已在原始帖子的底部添加了您请求的其他信息。 – jspyeatt