流复制HA集群
1. 基于流复制的高可用集群
安装配置的一个例子:
机器的情况:
主机名 | IP | 数据库端口 | 数据库数据目录 |
---|---|---|---|
clup0 | 10.197.166.74 | N/A | N/A |
pg01 | 10.197.166.115 | 5443 | /data/replication |
pg02 | 10.197.166.116 | 5443 | /data/replication |
pg03 | 10.197.166.117 | 5443 | /data/replication |
CLup管理节点安装在10.197.166.74,pg01~03为数据库主机,上面安装了clup-agent程序。
2. 导入流复制集群
使用此功能可以把用户已经有的流复制集群导入到CLup中进行统一管理。
CLup只支持PostgreSQL9.5以上版本的数据库,如果您的数据库版本低于此版本,则不能纳管。
从CLup的管理机器能够能以流复制协议连接到要纳管的数据库上,才可以纳管。在CLup管理机上可以用下面的命令,测试是否可以连接:
psql "dbname='template1' host=XXX user=replica port=5443 replication=database"
另需要修改主备库的一些配置,才能纳管到CLup中。
PostgreSQL12版本以前备库使用recovery.conf配置文件,内容类似如下:
standby_mode = 'on'
recovery_target_timeline = 'latest'
primary_conninfo = 'application_name=10.197.166.115 user=postgres password=postgres host=10.197.166.115 port=5443 sslmode=disable sslcompression=1'
PostgreSQL12版本以上将备库的recovery.conf参数并入到postgresql.conf文件的内容类似如下:
recovery_target_timeline = 'latest'
primary_conninfo = 'application_name=10.197.166.115 user=postgres password=postgres host=10.197.166.115 port=5443 sslmode=disable sslcompression=1
其中“primary_conninfo”
中的:
- application_name=10.197.166.115 如果要纳管到CLup中,需要把application_name设置为流复制IP地址(一般是本机IP)。
检查原有数据库的归档配置,因为HA切换,每台机器都可能变成主库,要求每台机器上都需要把归档目录配置好,如一个用户的归档配置如下:
archive_mode = on
archive_command = 'DIR=/data01/arch/`date +%F`; test ! -d $DIR && mkdir -p $DIR; chmod 755 $DIR; test ! -f $DIR/%f && cp %p $DIR'
上面的归档配置要求每台机器上都要有/data01/arch的目录。
检查recovery.conf中的配置,重点是 restore_command的命令,如下面的配置:
restore_command = 'PEER_DIR=/data01/peer_arch; cp $PEER_DIR/*/%f %p'
需要保证上面的命令在每台机器上都可以执行。当然也可以把这条记录去掉。
在CLup的web管理端中的,在集群定义页面中,点导入PostgreSQL流复制集群
按钮:
在弹出来的框中,输入如下信息:
- 集群名称:我们自定义一个,例如srcluster01
- 集群VIP: 输入一个事先分配好的不会被其它机器使用的IP, 如10.197.166.250
- 数据库端口:输入原先数据库端口
- 数据目录:输入数据库的数据目录,这里我们输入/data/replication
- 数据库IP列表:我们输入10.197.166.115,10.197.166.116,10.197.166.117,主库需写在第一个,单实例集群直接输入IP即可
- 流复制IP列表:我们输入10.197.166.115,10.197.166.116,10.197.166.117,主库需写在第一个,单实例集群直接输入IP即可
- DB中HA用户:一般使用postgres ,需使用超级用户
- DB中HA用户密码:配置与用户对应的密码
- DB复制用户:搭建流复制的用户,必须超级用户,一般为postgres
- DB复制用户密码:流复制用户的密码
- 只读VIP:输入10.197.166.244,如果不使用读写分离,我们也可以不输入,保留为空
- 均衡器列表:负载均衡器(暂未适配),可以不输入,保留为空
- 探测DB:用来检测集群是否正常的数据库,默认,无需修改
- 探测周期:高可用系统的检查系统的周期
- 探测超时:一次检查超过多少秒,会认为检测失败
- 探测重试次数:失败后重新探测次数
- 重试间隔(秒):失败后重新探测间隔的秒数
- 是否自动加回集群:检查到备库故障以后是否自动加回集群,过程中可能会执行pg_rewind或者pg_basebackup
- 跨机房自动激活主库:默认为否,CLup集群模式下可用
- 故障切换保持级联关系:集群中的数据库发生故障切换时是否保持级联关系
- 跨站切换保留旧站vip:默认不保留
- 探测主库SQL:在检测主库时所使用的SQL,不用改动
- 探测备库SQL:在检测备库时所使用的SQL,不用改动
- 触发DB名称:当发生故障切换时,会调用此设置项指定的数据库中的触发函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
- 触发DB函数:当发生故障切换时会调用上一条配置项指定的数据库中 本配置项指定的函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
- 备注:随便输入一些,主要是标注这个集群
添加流复制高可用集群仅支持一个主库拖所有备库的情况,所以填的数据库中第一个为主库,其他数据库的上级主库均为第一个主库, 如果需要更改上级主库,可以到数据库管理页面列表中选择对应数据库,使用更多-切换备库级联的功能,可以实现切换上一级主库。
3. 创建流复制高可用集群
注意:CLup会自动为运行数据库的操作系统用户在.bashrc中添加环境变量。如果之前在运行数据库的操作系统用户的.bashrc或.bash_profile文件中添加以下环境变量,请先注释掉或删掉以下配置项:
- export PATH
- export LD_LIBRARY_PATH
- export PGDATA
- export PGHOST
- export PGPORT
如果上面这些环境变量没有清理掉,可能出现配置重复且不一至导致CLup创建HA集群失败。
在集群定义页面中,点创建PostgreSQL流复制集群
按钮,弹出创建流复制集群的向导:
在弹出来的框中,按照提示输入信息:
- 所在主机:选择一个数据库的主机, 如10.197.166.115
- 复制ip:填写一个该数据库的复制IP,如10.197.166.115
- 操作系统用户:操作系统用户名称,如果存在会自动获取UID
- 数据库软件:数据库安装目录
- 数据目录:填写该数据库所要存放的数据目录
- 优先级:设置当前数据库的优先级,主库故障的时候先根据优先级来切换,优先级一致时候会根据wal日志来切换,值越小,优先级越高
- 资源隔离配置:对集群内的实例进行cpu和内存的限制,资源不足不能创建。
填写完成以后点击添加
,第一个添加的数据库作为主库,其他都作为它的备库,添加的数据库到下面的列表中,信息填错了可以点击删除
,删掉数据库重新添加:
点下一步,进入第二步:
填写集群信息:
- 集群名称:输入一个集群的名字
- 数据库端口: 选择数据库的端口,同一个集群我们会把端口设置一致
- DB中HA用户:一般使用postgres,需使用超级用户
- DB中HA用户密码:配置与用户对应的密码
- DB复制用户:搭建流复制的用户,必须超级用户,一般为postgres
- DB复制用户密码:流复制用户的密码
- 集群VIP: 输入10.197.166.250
- 只读VIP:如果不使用读写分离,我们也可以不输入,保留为空
- 均衡器列表:暂未完成负载均衡器的适配,我们可以不输入,保留为空
第三步 填写集群的探测信息:
填写探测信息:
- 探测DB:用来检测集群是否正常的数据库,默认即可,无需修改
- 探测周期:高可用系统的检查系统的周期
- 超时秒数:一次检查超过多少秒,会认为检测失败
- 探测重试次数:失败后重新探测次数
- 重试间隔(秒):失败后重新探测间隔的秒数
- 是否自动加回集群:数据库发生故障或clup-agent故障,恢复后是否自动加回集群,也可以手动操作,建议手动操作,使用默认否即可
- 探测SQL:在检测数据库时所使用的SQL,不用改动
- 触发DB名称:当发生故障切换时,会调用此设置项指定的数据库中的触发函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
- 触发DB函数:当发生故障切换时会调用上一条配置项指定的数据库中 本配置项指定的函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
- 备注:随便输入一些,主要是标注这个集群
第四步 填写数据库常用配置:
常用参数配置以及后续的一般参数配置和其它参数配置基本上与创建数据库时输入的内容基本一样,这里旧不再赘述了。
添加完后,这个集群就出现在列表中,此时集群的状态还是离线状态。离线状态表示HA的检测和切换是不生效的。这时点击本集群那一行中的上线
按钮,集群即开始上线。
集群上线,CLup会对此集群做一系列的检查,如果检查不通过,请查看不通过的原因,根据原因进行修复:
上面这个错误通常是因为机器上的clup-agent服务没有启动,不能正常连接到CLup,在对应机器上面执行systemctl status clup-agent
检查状态并执行命令systemctl start clup-agent
启动clup-agent就可以解决了。
有时我们把主备数据库的流复制搭建好了,但还是报下面的错误:
错误1:备库的流复制配置primary_conninfo中application_name没有配置正确,查询主库中的pg_stat_replication
表,看application_name
名称是否正确;
postgres=# select usename,application_name,client_addr from pg_stat_replication ;
usename | application_name | client_addr
----------+------------------+---------------
postgres | 10.197.167.27 | 10.197.167.26
postgres | 10.197.160.28 | 10.197.167.28
(2 rows)
如上所示,备库主机10.197.167.28
的application_name与提示信息中的值不相同,此时需要将备库中recovery.conf
或postgresql.conf
配置文件中流复制的application_name
名称配置成提示中的值10.197.167.28
。注意:不要在备库中的recovery.conf
添加一些特殊的配置项,因为每次切换时,CLup都会根据配置自动生成recovery.conf
文件,你的这些特殊配置项都会被覆盖掉。
错误2:备库落后主库太多,导致需要的WAL日志文件在主库上已经被移除了;此时可以点击集群详情页中的此备库的状态,将此备库当前状态设置为Fault,然后点击加回集群
重新搭建此备库,选择此备库的上级主库,点击确定后勾选重新搭建备库,可选择保留旧的数据目录或是删除原有数据目录。
错误3:流复制配置错误,此情况出现在导入流复制集群上线时出现的错误,因此需要手动按照导入流复制集群的步骤进行检查。
如果检查通过之后,集群就变成了正常状态:
4. 流复制集群的管理
在HA管理中,点击流复制集群那一行中的详情按钮,进入到流复制集群详情页面:
详情页面中有几个TAB切换页:
- 主备数据库:一个列表,显示主备数据库的信息
- 查看延迟:查看流复制的主备库之间的复制延迟
- 查看LSN:查各个数据库的当前LSN
- 机房配置:查看集群的机房信息
- 集群拓扑图:以图形化形式展示集群中数据库的级联方式
点击查看主备数据库的界面:
对于基于流复制的集群,我们可以把一台备数据库变成主数据库,原先的主数据库变成备数据库,其它的备数据库重新从新主数据库中同步。在上面的界面中,点“切换为主库”按钮,可以把此备库切换成主库,原主库切换被备库:
注意:在切换过程中会重启所有的主备库,业务会短暂中断!!!
另我们有时会对数据库做一些维护操作,如停止数据库,这时如果我们直接停止数据库,CLup会认为数据库出现的故障,会自动再把数据库拉起来,这时我们需要让CLup对这个集群停止工作,方法就是让集群离线,在集群列表中对指定的集群点离线按钮即可以完成这个工作,当集群处于离线状态,不会再触发故障转换的动作。
在上面的界面中点“停止”按钮,可以把数据库停掉,但要注意,如果HA集群在上线的情况下,如果发现数据库停机了,会自动把其拉起来。
点击查看延迟
的界面:
在此界面中可以看到流复制的延迟和状态,注意“实际状态”为“streaming”才是正常的流复制状态,其它状态都表示流复制有问题。“同步”中显示为“async”表示流复制是异步的。
点击查看LSN
的界面:
点击机房配置
的界面:
点击集群拓扑图
的界面: