集群拓扑在哪定义
集群拓扑在 config.xml(或 conf.d 目录下的片段文件)里用 remote_servers 定义:一个集群下面挂若干 shard,每个 shard 下再挂若干 replica,并写明主机与端口。节点自己属于哪个分片、哪个副本,由 macros 段里的分片与副本宏决定。
internal_replication 决定写入方式
internal_replication 设为 true 时,写入一张副本表只会写其中一个副本,其余副本由复制机制同步,配合 ReplicatedMergeTree 使用才有意义。设为 false 时写入会发往该分片的所有副本,由分布式表负责一致性,若同时又用了副本表就容易出现重复计数。
基本信息
| 配置位置 | config.xml 或 conf.d 下的片段文件 |
|---|---|
| 结构 | remote_servers 到集群名到 shard 再到 replica 列表 |
| 宏 | macros 里的分片与副本标识,供副本路径占位符使用 |
| internal_replication | true 表示写一张副本表即可,由副本机制同步 |
| 校验 | SELECT * FROM system.clusters 查看展开后的拓扑 |
示例
示例
<remote_servers>
<prod>
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ch-1</host>
<port>9000</port>
</replica>
<replica>
<host>ch-2</host>
<port>9000</port>
</replica>
</shard>
</prod>
</remote_servers>
-- 校验:查看展开后的分片与副本
-- SELECT cluster, shard_num, replica_num, host_name, is_local FROM system.clusters WHERE cluster = 'prod';典型使用场景
- 新集群搭建:定义分片与副本拓扑,并给每个节点配好宏
- 扩容:增加分片或副本后同步更新各节点配置
- 写入异常排查:确认 internal_replication 与表引擎是否匹配
- 拓扑核对:用 system.clusters 确认每个节点看到的集群结构一致
- 环境复刻:在测试环境搭一套同构集群做演练
要素与作用
| 要素 | 作用 | 注意 |
|---|---|---|
| remote_servers | 定义集群拓扑 | 集群名要与 DDL 中使用的名字一致 |
| macros 分片与副本 | 标识节点身份 | 副本路径占位符依赖它 |
| internal_replication | 写入策略 | true 配合副本表,false 由分布式表承担 |
| system.clusters | 拓扑校验视图 | 各节点看到的结果应当一致 |
配置改完后要用 system.clusters 校验展开结果,不要只看配置文件文本;各节点看到的拓扑必须一致,否则分布式查询会出现部分节点访问失败。
配置改动需要 reload 或重启才生效,滚动操作期间集群查询会短暂受影响;internal_replication 与表引擎搭配错误会造成数据重复或副本不同步。