如何用Docker部署多数据中心的Cassandra NetworkTopologyStrategy集群?
实现Cassandra多数据中心集群(Docker环境)
默认Docker启动的Cassandra节点会自动归入同一个默认数据中心(datacenter1),要搭建多DC集群,核心是给每个节点指定不同的dc_name配置,具体步骤如下:
1. 准备自定义Cassandra配置文件
每个节点需要单独修改cassandra.yaml中的关键参数,确保数据中心、机架、网络地址配置正确:
- dc_name: 数据中心标识(如
DC1、DC2) - rack_name: 机架标识(同一DC内可分不同机架,如
RACK1、RACK2) - listen_address/broadcast_address: 容器主机名(Docker桥接网络下,主机名可直接解析)
- seed_provider: 种子节点列表,需包含各DC的至少一个节点,保证集群发现
示例配置片段
- cas1(DC1节点):
dc_name: DC1 rack_name: RACK1 listen_address: cas1 broadcast_address: cas1 seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "cas1,cas2"
- cas2(DC2种子节点):
dc_name: DC2 rack_name: RACK1 listen_address: cas2 broadcast_address: cas2 seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "cas1,cas2"
- cas3(DC2普通节点):
dc_name: DC2 rack_name: RACK2 listen_address: cas3 broadcast_address: cas3 seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "cas1,cas2"
2. 创建Docker桥接网络
先创建一个专属桥接网络,保证节点间通信:
docker network create cassandra-multi-dc-net
3. 启动集群节点
按顺序启动节点(种子节点优先启动,等待完全就绪后再启动其他节点),挂载自定义配置文件覆盖默认配置:
- 启动cas1:
docker run -d --name cas1 --network cassandra-multi-dc-net \ -v ./dc1/cas1/cassandra.yaml:/etc/cassandra/cassandra.yaml \ cassandra:latest
- 启动cas2(等待cas1启动完成,可通过
docker logs cas1查看启动日志确认):
docker run -d --name cas2 --network cassandra-multi-dc-net \ -v ./dc2/cas2/cassandra.yaml:/etc/cassandra/cassandra.yaml \ cassandra:latest
- 启动cas3:
docker run -d --name cas3 --network cassandra-multi-dc-net \ -v ./dc2/cas3/cassandra.yaml:/etc/cassandra/cassandra.yaml \ cassandra:latest
4. 验证集群状态
进入任意节点执行nodetool status,确认多DC集群状态:
docker exec -it cas1 nodetool status
正常输出会按数据中心分组显示节点,类似:
Datacenter: DC1 =============== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.18.0.2 70.85 KiB 16 63.7% 5f8a4d2e-6b7a-4e0a-9c1d-8e7f6a5b3c1a RACK1 Datacenter: DC2 =============== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Tokens Owns (effective) Host ID Rack UN 172.18.0.3 65.82 KiB 16 36.3% a1b2c3d4-5e6f-7g8h-9i0j-k1l2m3n4o5p6 RACK1 UN 172.18.0.4 62.79 KiB 16 0.0% q7r8s9t0-u1v2-w3x4-y5z6-a7b8c9d0e1f2 RACK2
5. 使用NetworkTopologyStrategy创建Keyspace
创建keyspace时指定NetworkTopologyStrategy,并配置各DC的复制因子:
docker exec -it cas1 cqlsh
在CQL shell中执行:
CREATE KEYSPACE my_keyspace WITH replication = { 'class': 'NetworkTopologyStrategy', 'DC1': 1, 'DC2': 2 };
复制因子根据业务需求调整,比如DC1设为1(单副本),DC2设为2(多副本冗余)。
内容的提问来源于stack exchange,提问作者Dinesh 255
相关产品推荐
相关产品推荐

