如何向Docker部署的Cassandra现有集群新增节点并修改副本因子
Cassandra Docker集群新增节点+修改副本因子操作步骤
一、前置检查(操作前必须完成)
- 执行
nodetool status确认现有集群所有节点状态为UN(Up Normal),无异常离线节点 - 全量备份业务keyspace数据,可通过
cqlsh -e "COPY <业务keyspace名>.<表名> TO '/本地备份路径/表名.csv'"逐表备份,或使用sstableloader做全量sstable备份,避免操作失误导致数据丢失 - 记录现有集群的
cluster_name、种子节点地址、endpoint_snitch、所属DC/机架配置,新增节点的上述参数必须和现有集群完全一致,否则无法加入集群
二、新增Docker节点操作
- 先拉取和现有集群版本完全一致的Cassandra镜像,禁止直接使用
latest标签避免版本兼容问题:docker pull cassandra:<现有集群的Cassandra版本号> - 运行新节点容器,参考命令如下,所有环境变量和现有集群保持一致:
docker run -d \ --name cassandra-new-node-1 \ -e CASSANDRA_CLUSTER_NAME="<你的集群名称>" \ -e CASSANDRA_SEEDS="<现有集群种子节点IP,多个用英文逗号分隔>" \ -e CASSANDRA_ENDPOINT_SNITCH="<现有集群的snitch配置,如GossipingPropertyFileSnitch>" \ -e CASSANDRA_DC="<现有集群对应DC名称>" \ -e CASSANDRA_RACK="<对应机架名称>" \ -p 7000:7000 \ -p 9042:9042 \ -v /本地数据存储路径:/var/lib/cassandra \ cassandra:<现有集群的Cassandra版本号>
如果你现有集群是通过docker-compose部署的,直接复用原有docker-compose配置,仅修改容器名、端口映射、本地数据卷路径后启动即可,避免配置参数不一致。
- 单节点启动完成后等待2-3分钟,执行
nodetool status确认新节点状态变为UN后,再启动下一个新节点,不要同时批量启动所有新节点,避免集群IO/带宽占用过高影响业务。
三、修改Keyspace副本因子
- 所有新节点全部成功加入集群且状态稳定后,连接cqlsh执行副本因子修改命令:
单DC集群(用SimpleStrategy):
多DC集群(用NetworkTopologyStrategy):ALTER KEYSPACE <你的业务keyspace名称> WITH REPLICATION = {'class': 'SimpleStrategy', 'replication_factor': <新的副本数量>};ALTER KEYSPACE <你的业务keyspace名称> WITH REPLICATION = {'class': 'NetworkTopologyStrategy', 'DC1': <DC1的副本数>, 'DC2': <DC2的副本数>}; - 执行
DESCRIBE KEYSPACE <你的业务keyspace名称>确认副本因子配置已更新成功。
四、数据重分布同步
- 在集群所有节点上依次执行全量repair操作,将数据同步到对应节点:
nodetool repair -full <你的业务keyspace名称> - 可执行
nodetool compactionstats查看repair和数据同步进度,所有节点repair完成前不要对外提供核心业务服务。
五、最终验证
- 执行
nodetool status <你的业务keyspace名称>确认所有节点数据负载分布正常 - 随机查询多条业务数据,确认读写无异常
- 执行
nodetool describecluster确认集群所有节点状态正常
注意:所有操作请避开业务高峰时段执行,节点加入、repair操作都会占用集群带宽和IO资源,可能导致现有业务请求延迟升高。
内容的提问来源于stack exchange,提问作者Vader20FF
相关产品推荐
相关产品推荐

