在线扩容
扩容背景
分布式数据库通常面临海量数据场景,持续的增量数据容易提前达到存储瓶颈,此时我们需要为集群增加节点,进行扩容操作,保证数据库集群健康稳定的运行。
扩容准备
扩容过程中会占用较多的网络和 IO 资源,如果在扩容期间不能减少数据库操作,需要适当调整部分参数,确保扩容顺利完成。
一、根据数据库负载适当调大wal保留个数:
SET DATANODE mastere ALL (wal_keep_size = 102400);
虽然配置了 wal_keep_size,但是很多情况下,由于 master 节点数据量巨大,在扩容期间产生的 wal 数量可能远超 102GB。 从更安全的角度考虑,建议打开归档模式。
SET DATANODE master ALL (archive_mode = "on");
SET DATANODE master dm0 (archive_command = "rsync -a %p /data2/antdb/data/arch/dm0/%f");
二、wal_sender_timeout 默认值是 60 秒。服务端会中断那些停止活动超过指定毫秒数的复制连接。
若在建立流复制期间,由于某些原因,导致在 60 秒内建链失败,则会影响整个扩容流程。
建议在扩容期间,将该参数调整为 0,一直等待建立连接。
待扩容结束后,再恢复为默认的 60 秒。
SET DATANODE ALL (wal_sender_timeout = 0);
扩容过程
新增 host
假设目前集群有两台服务器,通过扩容新增一台服务器。
实际扩容场景多为成倍的扩容,如2台服务器扩容到4台,这样数据可以继续保持均衡性。
[local]:6432 antdb@antdb=# list host;
name | user | port | protocol | agentport | address | adbhome
-------+-------+------+----------+-----------+-----------------+----------------
adb01 | antdb | 22 | ssh | 8432 | 192.168.149.131 | /opt/app/antdb
adb02 | antdb | 22 | ssh | 8432 | 192.168.149.132 | /opt/app/antdb
add host 添加新的服务器。
[local]:6432 antdb@antdb=# add host adb03(port=22,protocol='ssh',adbhome='/opt/app/antdb',address="192.168.149.133",agentport=8432,user='antdb');
ADD HOST
注意: 这里新增的 host 也要按照其它主机一样配置环境变量。
deploy 数据库二进制文件到新服务器。
[local]:6432 antdb@antdb=# deploy adb03;
hostname | status | description
----------+--------+-------------
adb03 | t | success
启动新服务器的 agent 进程。
[local]:6432 antdb@antdb=# start agent adb03;
hostname | status | description
----------+--------+-------------
adb03 | t | success
此时新服务器已经加入到集群中。
新增 datanode
在新服务器中创建 datanode master
[local]:6432 antdb@antdb=# ADD DATANODE master dn3_1(host='adb03', port=14332,path = '/home/antdb/data/dn3_1');
ADD NODE
需要根据实际情况修改对应的参数内容。
搬迁数据
将 dn1_1 中的数据扩容到新的 dn3_1 中
EXPAND DATANODE master dn1_1 to dn3_1;
如果这里有多个节点需要扩容,则这里可以分别多次执行命令,例如:
EXPAND DATANODE master dn1_1 to dn3_1;
EXPAND DATANODE master dn2_1 to dn4_1;
激活新增节点
这一步,激活上一步扩容的所有新节点。
EXPAND activate;
此时,扩容工作已经完成,部分数据已经重分布到新的节点上,新插入的表数据也会按照分片规则分布到新的 datanode。
数据清除
在数据复制和搬迁过程中会产生冗余数据,通过下列命令,将冗余数据标记删除。
EXPAND clean;
此时扩容已经完成,用户可以通过 monitor all 命令查看集群的状态。
举例:
-- 添加新主机
ADD host adb03(port=22,protocol='ssh',adbhome='/opt/app/antdb',address="192.168.149.133",agentport=8432,user='antdb');
ADD host adb04(port=22,protocol='ssh',adbhome='/opt/app/antdb',address="192.168.149.134",agentport=8432,user='antdb');
-- deploy
DEPLOY adb03 password '123456';
DEPLOY adb04 password '123456';
-- add节点
ADD DATANODE MASTER dn3_1(host='adb03', port=14332,path = '/home/antdb/data/dn3_1');
ADD DATANODE MASTER dn3_1(host='adb04', port=14332,path = '/home/antdb/data/dn4_1');
-- expand
EXPAND DATANODE MASTER dn1_1 to dn3_1;
EXPAND DATANODE MASTER dn2_1 to dn4_1;
-- activate
EXPAND activate;
-- clean
EXPAND clean;
扩容异常情况处理
当用户操作不当,导致扩容失败时,可以根据提示执行命令 recover。
expand datanode 异常
basebackup 失败
解决方法:执行"expand recover basebackup fail src to dst" ,若命令失败则手动删除数据目录重新执行 expand datanode 命令
更新 mgr 信息失败
解决方法:执行"expand recover basebackup success src to dst" 命令
expand activate 异常
promote 目标 datanode 失败
解决方法:删除数据目录,重新执行 expand 命令
重启 datanode 失败
解决方法:手动启动 datanode
更新 pgxc_node 失败
解决方法:执行"expand activate recover dopromote success dst"命令




