ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PolarDB-X企业版分布式集群部署实战:环境规划与参数调优

PolarDB-X企业版分布式集群部署实战:环境规划与参数调优 搞分布式数据库部署这件事尤其是PolarDB-X企业版这种商业化交付的集群很多人第一反应是“照着官方文档敲命令就行”。真到了内网环境实操你会发现坑不在命令本身而在环境规划、角色分配、参数配套这些细节上。这篇文档把我部署PolarDB-X企业版分布式集群的完整过程、踩过的坑、以及调优思路全部整理出来给准备上手的朋友一份能直接抄作业的参考。这套集群解决什么问题一句话当你业务量到了一套单机MySQL顶不住、又不想靠分库分表中间件硬拆业务代码的阶段PolarDB-X企业版可以在私有化环境里给你一套完整的分库分表能力而且对外兼容MySQL协议应用层改动非常小。它特别适合银行、政企、大中企业内部系统这类数据不能出内网、又需要水平扩展能力的场景。下面我按实际部署顺序逐步拆解。1. 部署前的整体设计与思路拆解1.1 为什么选PolarDB-X企业版而不是自研分库分表先聊一个最实际的问题。很多团队面临数据量增长时第一反应是引入ShardingSphere这类中间件做分库分表。这个方案本身成熟但维护成本并不低你要维护中间件集群、要设计分片键、要在应用代码里加注解或配置路由规则跨分片事务和分布式JOIN更是一堆雷区。我见过不止一个团队最后光排查路由不一致导致的脏数据就花掉两三个迭代的时间。PolarDB-X企业版走的是一条“数据库原生分布式”路线。它的计算节点CN负责SQL解析、计划生成和分布式执行数据节点DN真正存储数据元数据服务GMS管理全局的库表结构和分片映射。对业务来说你连的还是MySQL协议端口3306写SQL的体验和单机MySQL几乎一致。分片规则、分布式事务、全局Binlog这些事情数据库内部消化掉了应用不需要关心。选企业版而不是开源社区版的原因也很直接企业版有商业支持兜底有配套的运维工具链和监控告警组件在安全审计、备份恢复这些企业刚需功能上更完备。说实话私有化部署数据库最怕的不是功能不够而是出了问题没人管。企业版这一点上有明确的服务链路对于承担生产系统的团队来说这笔账算得过来。1.2 部署策略物理机、网络与存储怎么定集群部署的第一件事不是装软件而是定硬件和网络策略。我的建议是如果条件允许优先物理机部署不要用虚拟机嵌套。分布式数据库本身就对网络延迟和磁盘IO敏感虚拟化层引入的调度开销和网络损耗在高并发下会被放大得非常明显。我们用三台物理机部署每台配置大致是 32核64线程、256GB内存系统盘两块SSD组RAID1跑操作系统数据盘四块NVMe SSD组RAID10放数据库文件。网络方面集群内部通信走万兆内网管理网和业务网分开。所有节点通过一台接入交换机互联不跨机房部署这台集群因为跨机房的延迟抖动会直接影响分布式事务的提交耗时。时钟同步必须提前做好集群里所有角色对时间一致性要求很高我们统一用chrony同步内网NTP服务器这个后面还会细说它坑过很多人。存储选型上有个容易犯的误区有人觉得分布式数据库应该用集中式SAN存储。恰恰相反PolarDB-X这类shared-nothing架构数据本身已经通过多副本分散在多个节点上了你再用SAN反而把整个系统的可用性绑定到一个集中式存储的单点上。本地NVMe SSD是更合理的选择IOPS高、延迟低而且成本也可控。1.3 集群角色与最小部署规模看懂PolarDB-X的架构角色是部署的前提。它不像传统MySQL一主一从就完事而是由不同角色的节点协同工作CN计算节点接收SQL请求解析、优化、生成执行计划把SQL下推到DN执行并汇总结果。它是集群对外的门面。DN数据节点真正存储数据一个DN包含若干个分片负责具体分片的数据读写、事务执行和副本同步。GMS元数据服务维护整个集群的元数据信息包括表结构、分片分布、集群拓扑变更等相当于集群的“大脑记忆中心”。CDC日志节点负责收集和同步Binlog为下游提供全局一致的变更数据流比如同步到数据仓库或消息队列。最小可用集群规模我们按照生产最低标准部署3台物理机上分布 2个CN、3个DN、1个GMS和1个CDC。CN可以多部署几个做负载均衡DN至少3副本保证高可用GMS和CDC自身的状态也由集群管理。整体布局没有让某一台机器角色过重保证单机故障时集群能自动切换角色。用生活化的方式理解这套架构DN就像仓库里面按分片存放货物数据CN是大堂经理用户进店只需要找经理点单经理自己判断货物在哪个仓库、怎么取、怎么汇总GMS是档案室记录着每个仓库里放了什么东西、东西放在哪一格。CDC则是档案室的对外传真机随时把入库动作同步给外部系统。2. 环境规划与配置清单2.1 硬件规划实例这一节给出我们实际使用的硬件规划参考不用完全照抄但思路是通用的。三台服务器的角色分布如下节点硬件配置部署角色内网IP节点A32C/64T、256GB内存、4×NVMe SSD(RAID10)CN×1、DN×1、GMS×1192.168.10.11节点B32C/64T、256GB内存、4×NVMe SSD(RAID10)CN×1、DN×2、CDC×1192.168.10.12节点C32C/64T、256GB内存、4×NVMe SSD(RAID10)DN×1192.168.10.13注意这里DN副本的布局不是随意安排的。3个DN副本分布在3台物理机上任何一台物理机宕机仍然有两个副本可用配合选举机制可以自动选出新主副本。如果机房只有两台物理机至少要保证3个DN不能集中在同一台上否则一旦这台机器故障数据副本数就跌破安全线了。主机名建议直接用带语义的命名方式比如dn-host-a、cn-host-b这种不要用什么node1、node2含糊命名。主机名在内网解析里保持一致后面部署工具配置拓扑时不容易搞混。我的习惯是每台机器的/etc/hosts里把三台机器的IP和主机名全部写进去避免依赖DNS服务也能减少部署时解析超时的可能性。2.2 操作系统与内核参数配置操作系统选用CentOS 7.9内核尽量保持官方最新补丁版本。如果你用的是阿里云生态的Alibaba Cloud Linux兼容性更好PolarDB-X企业版的部署包通常会对这些发行版做更完整的适配验证。x86_64架构下部署最省心ARM架构虽然不是不行但要确认部署包是否包含对应的二进制版本。内核参数方面有几个关键项必须改否则高负载下会出现莫名奇妙的问题。第一个是vm.max_map_count默认值65530对Java和内存型组件来说偏低建议调整到262144第二个是进程文件描述符限制ulimit -n至少65535数据库类组件对连接数和文件句柄需求很高第三个是vm.swappiness建议设为10以内甚至0避免系统把数据库的热点内存换到swap导致性能抖动。修改方式通过/etc/sysctl.conf持久化配置fs.file-max、net.core.somaxconn、net.ipv4.tcp_max_syn_backlog这几个网络相关参数也要一并调整。很多部署失败的场景元凶不是软件本身而是这些基础参数没调到位组件起不来或者起来后频繁报网络超时。防火墙和SELinux是另一个大坑。生产环境为了安全可以开防火墙但你得先确认集群内网端口全部放行SELinux建议直接设为disabled数据库集群的进程、端口、文件标记行为非常复杂SELinux的强制模式很容易导致进程无法正常访问数据目录或监听端口。这个省不掉我见过有同事没关SELinux部署时GMS一直初始化失败日志里全是Permission denied。2.3 目录规划与用户体系目录规划的好坏直接影响后面故障排查的效率。我们的目录约定是/opt/polardbx安装主目录下方分bin、conf、log三个子目录/data/polardbx数据目录存放DN的数据文件、日志文件、Binlog/data/backup备份目录用于逻辑备份和物理备份的输出为什么数据目录一定要单独挂盘因为系统盘分区空间有限数据库数据量增长后很快会把根分区写满。根分区一旦满了操作系统日志、临时文件都写不进去整个机器会进入一种半瘫痪状态到时候想清理都难。独立挂载数据盘即使数据库把数据盘写满系统还能正常登录、运行排查命令这是生产环境的底线保障。安装和运行统一使用polardbx用户不要用root跑数据库进程。这个用户需要赋予数据目录和安装目录的读写权限同时设置PATH环境变量方便后续运维命令的执行。部署工具一般支持指定运行用户配置阶段把用户名和密码建议用SSH密钥配置好。3. 部署全流程与核心配置3.1 部署前检查与SSH互信部署前的检查项目我列成一个清单每项都不能跳过三台机器网络互通ping测试无丢包操作系统版本、内核架构符合部署包要求时钟同步状态正常chronyc tracking查看时钟偏差小于50ms磁盘分区按规划完成挂载df -h确认数据盘可用内核参数、文件描述符限制已修改并生效防火墙放行端口或直接关闭SELinux已禁用/etc/hosts每台机器已写好三台节点的主机映射SSH互信比较好理解部署工具需要以某个用户登录到每台目标机器执行安装命令、传输文件。我们启用了polardbx用户下的SSH密钥对把公钥分发到三台机器并加入authorized_keys这样部署过程不用反复输密码。配置好之后先用ssh polardbx192.168.10.12手动测试一下能不能免密登录别等到安装执行到一半才报连接失败。3.2 安装包下载与完整性校验企业版部署包是独立交付的一套文件不会直接挂在公开源上从销售或售后那边拿到的通常是polardbx-installer的tar包。包体不小里面包含了所有组件的二进制、依赖库、部署模板和默认配置。拿到包后第一步是校验sha256出厂时提供的校验值对一下确认传输过程中没有损坏或被人做过手脚。这一步不能省我遇到过下载不完整导致解压后组件缺失、安装半路报错的情况重新比对校验值才发现问题。解压后建议先看一下安装包内的docs/目录或README确认部署包对应的版本号、支持的OS发行版列表、以及是否有已知问题说明。企业版的部署包一般内置了版本配套关系CN、DN、GMS、CDC各自使用的二进制版本都已经绑定不需要你手动匹配这种“全家桶”式的交付方式也是企业版比社区版省心的地方之一。3.3 拓扑文件编写拓扑文件是部署工具用来理解“集群长什么样”的配置文件通常在安装包的conf目录下有个模板比如topology.yaml。你需要在这个文件里描述每台目标机器上部署哪些组件、各组件的端口和数据目录。一个示意性的拓扑配置长这样字段名以实际安装包模板为准cluster: name: polardbx-prod user: polardbx group: polardbx home_dir: /opt/polardbx data_dir: /data/polardbx gms: host: 192.168.10.11 port: 3310 # 这里配置GMS的初始账号信息 cn_nodes: - host: 192.168.10.11 port: 3306 - host: 192.168.10.12 port: 3306 dn_nodes: - host: 192.168.10.11 dn_port: 8807 data_dir: /data/polardbx/dn1 - host: 192.168.10.12 dn_port: 8807 data_dir: /data/polardbx/dn2 - host: 192.168.10.13 dn_port: 8807 data_dir: /data/polardbx/dn3 cdc_nodes: - host: 192.168.10.12 port: 8600注意几个细节CN的端口建议和MySQL保持一致都用3306这样业务端配置数据库连接字符串时几乎零修改DN的数据目录一定要对应到上一步规划的独立数据盘路径别写到系统盘GMS的账号和密码建议在拓扑文件里先配置一个强密码的初始账号部署完成后可以再改。3.4 执行安装与初始化拓扑文件确认无误后执行安装命令部署工具会自动完成整个初始化流程。这个过程大致分为几个阶段预检查工具重新检查目标机器的硬件、内核、磁盘空间等约束条件不满足会直接中止并给出原因组件下发把各个角色的二进制和依赖包分发到对应主机初始化GMS拉起元数据服务初始化系统库生成集群唯一的cluster ID初始化DN在每个数据节点上创建数据目录、初始化存储引擎、配置副本关系启动CN把计算节点接入GMS并注册建立元数据路由启动CDC连接GMS和DN开始收集全局Binlog集群自检工具会执行一轮连通性测试和基本的读写测试确认集群可用整个安装过程大约需要10到30分钟由内网速度和角色数量决定。执行过程中一定要关注日志日志位置一般会在安装包目录的logs/下或者/opt/polardbx/log下。如果某个阶段失败了修复问题后可以重新执行安装工具通常支持幂等重试已经完成且配置正确的阶段会跳过。首轮安装最容易失败的点是初始化DN时存储引擎和文件系统不兼容。比如数据盘的文件系统是xfs而某些存储引擎阶段对direct IO或文件预分配有特殊要求日志里会明确报相关错误。解决方案是把数据盘重新格式化为ext4并挂载确保文件系统特性满足要求。4. 集群配置与参数调优4.1 账号体系与连接管理集群部署完成并自检通过后第一件事是整理账号体系。使用拓扑文件中配置的初始账号登录集群执行如下操作初始化root账号设置强密码并开通远程连接权限创建业务账号按业务模块最小授权创建只读账号用于统计分析或报表查询建议创建专门的运维账号授权范围为系统表和元数据视图-- 创建业务账号示例按实际需求调整权限 CREATE USER app_readwrite% IDENTIFIED BY 强密码; GRANT SELECT, INSERT, UPDATE, DELETE ON db_order.* TO app_readwrite%; FLUSH PRIVILEGES;PolarDB-X对外连接建议通过在CN前面挂负载均衡方式实现。客户端连接SLB或LVS地址由负载均衡把请求分发到多个CN上。这样某个CN挂了连接会自动切换到健康节点对业务透明。我们实际用了LVS DR模式检测脚本检查CN的3306端口异常时自动摘除节点。连接管理上有两个容易忽视的细节。一个是连接超时参数默认的wait_timeout是8小时对于长连接为主的内部系统问题不大但如果有外部报表系统采用短连接频繁访问要适当调整另一个是最大连接数max_connections要结合CN数量和并发评估不是越大越好连接数大会吃掉大量内存反而容易触发OOM。4.2 内存与存储引擎参数内存分配是分布式数据库调优的重头戏。一个原则是给数据库进程预留足够内存但别把一个节点吃干榨净要给操作系统留出余量避免触发OOM。GMS的内存需求相对较小但是它的稳定性很关键因为所有节点的元数据访问都打到它上面堆内存设置太低会导致频繁GC表现为整个集群时不时卡顿。CN节点要重点关注查询并发内存主要消耗在执行计划缓存、结果集缓冲和通信缓冲上。DN节点消耗内存的大头是存储引擎的buffer pool规格参考单机MySQL的调优思路设置为物理内存的50%到60%保证热点数据尽量常驻内存。存储引擎选择上PolarDB-X企业版支持InnoDB和X-Engine两种引擎。简单来说如果业务负载偏重TP类短查询订单交易、账户查询InnoDB稳妥且兼容性最好如果数据量大、写入密集、有明显冷热数据分层比如日志流水、监控指标X-Engine通过分层存储设计和更紧凑的数据布局压缩率和写入吞吐更有优势。我们这套集群因为业务以订单和账户流水为主暂时选用InnoDB留一个DN节点跑X-Engine做对比压测后续再决定是否调整。4.3 Binlog保留策略与备份方案CDC节点收集的全局Binlog对数据链路下游非常重要比如同步到数仓、机大数据平台。Binlog保留时间默认可能是7天我们根据下游消费延迟情况调整到3天保留太长会占大量磁盘空间。修改CDC的Binlog过期时间不要直接删文件要通过配置项和命令方式设置安全起见可以联系售后确认具体方法。备份方案我们采用“逻辑备份物理备份”双轨制。每周日凌晨业务低谷时段做一次全量逻辑备份输出SQL文件存到独立备份盘并同步到备份机房每天增量Binlog持续同步到备份目录。PolarDB-X企业版有自己的备份工具会备份元数据和各个分片的数据恢复时通过工具统一拉起。这里我想强调一个运维理念不做恢复演练的备份等于没有备份。每季度至少做一次完整的恢复演练不要等真的出故障了才发现备份文件不可用。5. 常见问题与排查技巧实录5.1 时钟偏差引发的节点心跳异常我们遇到过最隐蔽的一个问题部署完大概两周后某个DN节点时不时被标记为“怀疑”状态集群日志里有clock skew detected字样的告警。一开始以为网络问题上午排查发现节点间时间偏差已经超过300ms。原因是部署时虽然配了chrony但有个节点的NTP源连错了一直在和一个延迟很高的NTP服务器同步。时钟偏差在分布式数据库里是致命问题。MySQL原生复制对时钟不敏感但PolarDB-X的分布式事务、全局一致快照、副本选举都对时间有强依赖时钟跳变可能导致事务提交顺序错乱、副本数据不一致。解决办法是统一配置可靠的内网NTP源并且用chronyc makestep立即同步一次重置所有节点时间后再观察。经历过这次事件后我在监控里加了时钟偏差告警偏差超过100ms就报警避免问题再次藏匿。5.2 数据盘写满后的连锁故障数据盘被打满这种事故说出来都丢人但确实发生过。当时是某天的Binlog文件异常增长本该被清理的日志没有按时回收把数据盘空间吃光了。表现出来的是DN节点刷新日志卡住CN连接开始堆积内部报错No space left on device整个集群的读写响应变得极其缓慢。排查思路是先用df -h确认各挂载点使用率再用du -sh /data/polardbx/*定位大目录。找到是Binlog目录后先确认哪些Binlog已经备份且下游消费完成用管理命令清理过期文件然后在配置层面重新校准清理策略。这里必须提醒出现磁盘问题时不要只盯数据文件Binlog、临时文件、慢查询日志、错误日志都可能成为把磁盘塞满的元凶。5.3 内存分配不当导致OOM还有一次是压测过程中某个CN节点进程突然消失查看dmesg -T | grep -i oom确认是Out-Of-Memory killer下手了。原因是我把CN的堆内存参数和DN的buffer pool参数都调得偏高单机总内存256GB两个进程加GMS和操作系统一下子突破了物理内存上限。解决思路是重新核算每台机器的内存预算。做个简单的数学256GB物理内存给操作系统预留20%剩下的80%按角色权重分配。如果一台机器上同时跑CN和DNCN分配30GB堆外和堆内总和DN分配128GB给buffer pool加上GMS预留8GB其他杂项预留10GB左右刚好控制在预算范围。OOM问题只靠事后重启进程没用必须从参数上把水位降下来或者通过cgroup对单进程做内存上限控制。5.4 部署阶段网络不通和端口占用部署阶段最烦人的问题就是工具阶段失败报连接失败或端口绑定失败。连接失败首先要看防火墙很多时候SELinux和firewalld是双重拦截互信都通了但进程监听端口还是连不进来。端口占用则需要先确认是否真的有其他进程在监听比如和已有的MySQL实例冲突要提前规划好端口分配。端口规划建议列一个固定清单内网防火墙放行时一次性全放减少从多端口反复排查的麻烦组件默认端口说明CN3306对外服务端口GMS3310元数据服务端口DN8807数据节点通信端口CDC8600日志节点服务端口安装器1888部署工具管理端口排查时统一用ss -lntp和telnet IP 端口组合验证先看本机监听状态再看跨节点连通性。两端都正常部署工具还报错再检查配置文件里的IP是否写成了主机名而主机名解析不了。回看整套部署过程我的体会是PolarDB-X企业版分布式集群的搭建真正考验人的不是安装命令的熟练度而是对分布式数据库原理的理解和对细节的把控。从架构角色规划到内核参数调整从拓扑文件编写到内存预算计算每一步都像是在拼图任何一块没放好最后兜底的都是运维的节假日。你要是正准备上手先把环境规划和参数预算这两块啃透安装阶段反而会顺利得多。这套部署流程之后还可以继续扩展接入统一监控告警、做跨机房的容灾复制、梳理客户端连接池的上限评估每块都是可以展开的深水区后面有时间我再单独写。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进