CLup产品文档

往前插入
往后插入
删除

HA集群

1. 基于共享存储的高可用集群

本次配置以下面的环境做为示例:
机器的情况:

主机名 IP 数据库端口 数据库数据目录
CLUP0 10.197.167.25 N/A N/A
pg01 10.197.167.29 5432 pgdata
pg02 10.197.167.30 5432 /pgdata

集群的信息的VIP为:10.197.167.251

我们假设在CLUP机器上已配置好了配置文件/opt/clup/conf/clup.conf同时在10.197.167.2910.197.167.30机器上安装好了clup-agent和已配置好了/opt/clup-agent/conf/clup-agent.conf
共享磁盘为/dev/sdb,同时也挂载到了/data目录下,我们的数据库软件也在机器10.197.167.29上安装好了,数据库实例也创建在了/data目录下。

在CLUP机器上启动CLUP程序,在每台数据库机器上启动clup-agent程序

2. 导入共享磁盘高可用集群

在导入共享磁盘的高可用集群之前,需要先手工把数据库创建好。然后再到此界面中导入此高可以集群,这里把创建数据库的过程略过。

在CLUP的web管理端中的,在HA集群菜单中,点击集群定义中的导入共享盘HA集群按钮,(暂不支持添加docker类型的数据库)出来界面:

界面说明如下:

  • 集群名称:可以自定义写一个,方便标识即可,如“cluster_shared_disk”
  • 集群VIP: 输入10.197.167.251,注意VIP需要于主机IP在同一个地址段内
  • 数据库端口:5432
  • 数据目录:我们输入/data/pgdata,记住这个目录是数据库的数据目录,即postgresql.conf文件所在的目录
  • DB中HA用户:通常用postgres,需使用超级用户
  • DB中HA密码:通常使用postgres的密码
  • 机器1:输入10.197.167.29
  • 机器2:输入10.197.167.30
  • 选择当前主:根据实际情况选择机器1或者机器2
  • 选择主:选择当前主为“机器1”
  • 操作系统用户:操作系统用户名,如果存在会自动获取此用户的UID,如果不存在需要手工输入此用户的 UID。
  • 数据库软件:数据库安装目录
  • reset命令1:输入一个IPMI的命令,通过这个IPMI的命令可以远程重启机器1,主要是防止脑裂时文件系统被同时挂载到两台机器上,从而导致文件系统的损坏。
  • reset命令2:同上,通过这个IPMI的命令可以远程重启机器2
  • 共享磁盘:共享磁盘为/dev/sdb,但为了防止Linux下的设备名变化,我们输入此设备的label: LABEL=”/data”,从3.1.0版本之后,CLUP可以设置多块共享磁盘,如LABEL=”data1”,LABEL=”data2”,即多块磁盘的配置用逗号分隔
  • 挂载目录:这是指定共享磁盘的挂载路径,从3.1.0版本之后,可以设置多块共享磁盘的多个挂载路径,多个挂载路径需要与共享磁盘一一对应,如/data1,/data2,即多个路径用逗号分隔。则共享磁盘“LABEL=”data1””会挂载到“/data1”下,而共享磁盘“LABEL=”data2””会挂载到“/data2”下
  • 探测DB,用来检测集群是否正常的数据库,默认,无需修改
  • 探测周期:高可用系统的检查系统的周期
  • 探测超时秒数:一次检查超过多少秒,会认为检测失败
  • 探测重试次数:失败后重新探测次数
  • 重试间隔(秒):失败后重新探测间隔的秒数
  • 探测SQL:在检测数据库时所使用的SQL,不用改动
  • 探测备库SQL:当共享磁盘集群作为备库的时候需要用到,不用改动
  • 触发DB名称:当发生故障切换时,会调用此设置项指定的数据库中的触发函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
  • 触发DB函数:当发生故障切换时会调用上一条配置项指定的数据库中本配置项指定的函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
  • 备注:随便输入一些,用于记录一些信息。

上面的reset命令设置为IPMI的命令,通常设置为如下内容:
ipmitool -H 172.16.167.29 -Uadmin –PXXX chassis power reset
其中ipmitool命令中的参数:

  • -H 172.16.167.29: 是机器1的IPMI的IP地址,请改成实际的值。注意这是机器1的IPMI的IP地址,不是机器的IP地址
  • -Uadmin: admin是IPMI的用户名,请改成实际的值
  • -PXXX: IPMI的密码,请改成实际的值

ipmitool命令的配置好之后,一定要先测试一下看看IPMI的用户名和密码配置是否正确,可以用ipmitool的查询电源状态的命令替代上面的重启命令来验证ipmi的用户名和密码是否配置的正确:
ipmitool -H 172.16.167.29 -Uadmin -PXXX chassis power status
如果是在虚拟机测试环境,没有IPMI环境,可以配置一个ssh命令仿真IPMI重启机器的命令,如下所示:
ssh -o ConnectTimeout=10 -o BatchMode=yes -o StrictHostKeyChecking=no root@10.197.167.29 "nohup reboot -f >/dev/null 2>&1 &"
添加完集群之后,在HA集群模块的集群定义列表中可以看到此集群:

HA集群模块

点列表中的查看按钮就可看到此集群的详情界面,在详情界面中选择tab切换页中的主备机器:

主备机器

在此界面中,可以看到共享磁盘集群中的两台机器,机器的DB状态为“无”表示数据库还没有运行,VIP状态为“无”表示这台机器目前没有VIP。如果发现机器的DB状态为“未知”,通常是这台机器上的clup-agent没有启动。

回到HA集群HA管理中,可以看到集群的状态还是“offline”,即此时集群的状态还是离线状态,离线状态表示HA的检测和切换是不生效的,要让高可用开始工作,需要让集群上线,方法是点击本集群那一行中的上线按钮,集群就可以上线,点完成,CLUP会对此集群做一系列的检查,如果检查不通过,请看不通过的原因。

注意!上线操作会自动把数据目录的文件系统挂起来,把数据库拉起来,把VIP加上去。所以需要注意共享磁盘不要挂载到已有的其它机器上,否则两边同时挂载会导致共享磁盘上的文件系统损坏!!!
如果检查通过之后,集群就变成了正常状态:

集群就变成了正常状态

3. 共享磁盘集群的管理

对于基于共享存储的集群,我们可以把数据库从一台机器切换到另一台机器上运行。
方法是在HA管理的集群列表中,点击本集群那一行中的详情按钮,进到当前集群详情页面,页面中有两个TAB页,进入到主备机器页,页面列表中可以看到有数据库切换到此主机按钮,点下这个按钮就会实现此切换的功能:

切换功能

另外我们有时会对数据库做一些维护操作,如停止数据库,这时如果我们直接停止数据库,CLUP会认为数据库出现的故障,会自动再把数据库拉起来。

我们需要让CLUP对这个集群停止工作,方法就是让集群“离线”,在集群列表中对指定的集群点离线按钮即可以完成这个工作,当集群处于“离线”状态,不会再触发故障转换的动作。

4. 集群的故障切换

CLUP会每隔”集群定义”参数“探测周期(秒)”指定的秒数去检查数据库是否正常。
检查方法为执行一个SQL,即在”集群定义”参数“探测SQL”指定的数据库中更新表“cs_sys_heartbeat”。
如果无法更新,则会触发故障切换的动作,执行的SQL为:
UPDATE cs_sys_heartbeat SET hb_time = now()
如果发现此表的hb_time时间一直不变,则认为CLUP的检测失效了:

  1. cs_sys_ha=# select * from cs_sys_heartbeat;
  2. hb_time
  3. -------------------------------
  4. 2022-05-11 15:04:47.665581+08
  5. (1 row)

注意:共享存储方式高可用进行切换时,会将旧节点上访问共享盘目录的进程都kill掉。以保证共享盘再旧节点上可以被umount掉.

5. 基于流复制的高可用集群

本次安装配置以下面的环境做为示例:
机器的情况:

主机名 IP 数据库端口 数据库数据目录
CLUP0 10.197.167.25 N/A N/A
pg01 10.197.167.26 5432 /home/postgres/pgdata
pg02 10.197.167.27 5432 /home/postgres/pgdata
pg03 10.197.167.28 5432 /home/postgres/pgdata

6. 搭建数据库的流复制集群

在使用CLUP创建基于流复制的高可用集群之前,需要先把PostgreSQL的流复制先搭建好(暂不支持docker类型的数据库)。PostgreSQL12版本以前备库的recovery.conf文件的内容类似如:
standby_mode = 'on' recovery_target_timeline = 'latest' primary_conninfo = 'application_name=10.197.167.26 user=postgres password=postgres host=10.197.167.26 port=5432 sslmode=disable sslcompression=1'

PostgreSQL12版本以上将备库的recovery.conf参数并入到postgresql.conf文件的内容类似如下:
recovery_target_timeline = 'latest' primary_conninfo = 'application_name=10.197.167.26 user=postgres password=postgres host=10.197.167.26 port=5432 sslmode=disable sslcompression=1'

其中“primary_conninfo”中的:

  • application_name=10.197.167.26 每台备库上这个都不能相同,可以用“stb”加上IP地址的最后一部分,如IP地址为10.197.167.27,就用stb27
  • user=postgres password=postgres需要与配置文件clup.conf中的配置项db_repl_user和db_repl_pass保持相同。
  • host=10.197.167.26 port=5432 这是主库的IP地址和端口

主备库搭建好了,需要在主库上查询select * from pg_stat_replication;来确定备库都正常工作:postgres=# select * from pg_stat_replication;

  1. pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state------+----------+----------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------------+-----------------+-----------------+---------------+------------
  2. 4968 | 10 | postgres | stb26 | 10.197.167.26 | | 56672 |2019-08-02 16:57:24.05033+08 | | streaming |
  3. 0/1DE3B88 | 0/1DE3B88 | 0/1DE3B88 | 0/1DE3B88 | 00:00:00.003841 | 00:00:00.00385 | 00:00:00.003857 | 1 | sync6341 | 10 | postgres | stb27 | 10.197.167.27 | | 8417 | 2019-08-02 18:02:07.817958+08 | | streaming |
  4. 0/1DE3B88 | 0/1DE3B88 | 0/1DE3B88 | 0/1DE3B88 | 00:00:00.268001 | 00:00:00.306253 | 00:00:00.310429 | 2 | potential(2 rows)

7. 导入流复制集群

使用此功能可以把用户已经有的流复制集群导入到CLUP中进行统一管理。
CLUP只支持PostgreSQL9.5以上版本的数据库,如果您的数据库版本低于此版本,则不能纳管。
从CLup的管理机器能够能以流复制协议连接到要纳管的数据库上,才可以纳管。在CLUP管理机上可以用下面的命令,测试是否可以连接:
psql "dbname='template1' host=XXX user=replica port=5432 replication=database"
另需要修改主备库的一些配置,才能纳管到CLUP中。
PostgreSQL12版本以前备库使用recovery.conf配置文件,内容类似如下:
standby_mode = 'on' recovery_target_timeline = 'latest' primary_conninfo = 'application_name=10.197.167.26 user=postgres password=postgres host=10.197.167.26 port=5432 sslmode=disable sslcompression=1'
PostgreSQL12版本以上将备库的recovery.conf参数并入到postgresql.conf文件的内容类似如下:
standby_mode = 'on'
recovery_target_timeline = 'latest' primary_conninfo = 'application_name=10.197.167.26 user=postgres password=postgres host=10.197.167.26 port=5432 sslmode=disable sslcompression=1
其中“primary_conninfo”中的:

  • application_name=10.197.167.26 如果那纳管道CLUP中,需要把application_name设置为本地的IP地址.

检查原有数据库的归档配置,因为HA切换,每台机器都可能变成主库,要求每台机器上都需要把归档目录配置好,如一个用户的归档配置如下:

  1. archive_mode = on`
  2. `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管理端中的,在集群定义页面中,点导入流复制HA集群按钮:

导入流复制HA集群

在弹出来的框中,输入如下信息:

  • 集群名称:我们自定义一个,例如srcluster01
  • 集群VIP: 输入一个事先分配好的不会被其它机器使用的IP, 如10.197.167.250
  • 数据库端口:输入原先数据库端口
  • 数据目录:输入数据库的数据目录,这里我们输入/home/postgres/pgdata
  • 数据库IP列表:我们输入10.197.167.27,10.197.167.26,10.197.167.28,主库需写在第一个,单实例集群直接输入IP即可
  • 流复制IP列表:我们输入10.197.167.27,10.197.167.26,10.197.167.28,主库需写在第一个,单实例集群直接输入IP即可
  • DB中HA用户:一般使用postgres ,需使用超级用户
  • DB中HA用户密码:配置与用户对应的密码
  • DB复制用户:搭建流复制的用户,必须超级用户,一般为postgres
  • DB复制用户密码:流复制用户的密码
  • 只读VIP:输入10.197.167.244,如果不使用读写分离,我们也可以不输入,保留为空
  • 均衡器列表:负载均衡器(暂未适配),可以不输入,保留为空
  • 探测DB:用来检测集群是否正常的数据库,默认,无需修改
  • 探测周期:高可用系统的检查系统的周期
  • 探测超时:一次检查超过多少秒,会认为检测失败
  • 探测重试次数:失败后重新探测次数
  • 重试间隔(秒):失败后重新探测间隔的秒数
  • 是否自动加回集群:检查到备库故障以后是否自动加回集群,过程中可能会执行pg_rewind或者pg_basebackup
  • 跨机房自动激活主库:默认为否,CLUP集群模式下可用
  • 故障切换保持级联关系:集群中的数据库发生故障切换时是否保持级联关系
  • 跨站切换保留旧站vip:默认不保留
  • 探测主库SQL:在检测主库时所使用的SQL,不用改动
  • 探测备库SQL:在检测备库时所使用的SQL,不用改动
  • 触发DB名称:当发生故障切换时,会调用此设置项指定的数据库中的触发函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
  • 触发DB函数:当发生故障切换时会调用上一条配置项指定的数据库中 本配置项指定的函数,如果不使用此功能,则保持为空即可,此参数配合plproxy使用
  • 备注:随便输入一些,主要是标注这个集群

添加流复制高可用集群仅支持一个主库拖所有备库的情况,所以填的数据库中第一个为主库,其他数据库的上级主库均为第一个主库, 如果需要更改上级主库,可以到数据库管理页面列表中选择对应数据库,使用更多-切换备库级联的功能,可以实现切换上一级主库。

8. 创建流复制高可用集群

注意:CLUP会自动为运行数据库的操作系统用户在.bashrc中添加环境变量。如果之前在运行数据库的操作系统用户的.bashrc或.bash_profile文件中添加以下环境变量,请先注释掉或删掉:

  • export PATH
  • export LD_LIBRARY_PATH
  • export PGDATA
  • export PGHOST
  • export PGPORT

如果上面这些环境变量没有清理掉,可能出现配置重复且不一至导致CLUP创建HA集群失败。
集群定义页面中,点创建流复制HA集群按钮,弹出创建流复制集群的向导:

创建流复制HA集群

在弹出来的框中,按照提示输入信息:

  • 所在主机:选择一个数据库的主机, 如10.197.167.26
  • 复制ip:填写一个该数据库的复制IP,如10.197.167.26
  • 操作系统用户:操作系统用户名称,如果存在会自动获取UID
  • 数据库软件:数据库安装目录
  • 数据目录:填写该数据库所要存放的数据目录
  • 优先级:设置当前数据库的优先级,主库故障的时候先根据优先级来切换,优先级一致时候会根据wal日志来切换,值越小,优先级越高

填写完成以后点击添加,第一个添加的数据库作为主库,其他都作为它的备库,添加的数据库到下面的列表中,信息填错了可以点击删除,删掉数据库重新添加:

重新添加

点下一步,进入第二步:

第二步

填写集群信息:

  • 集群名称:输入一个集群的名字
  • 数据库端口: 选择数据库的端口,同一个集群我们会把端口设置一致
  • DB中HA用户:一般使用postgres,需使用超级用户
  • DB中HA用户密码:配置与用户对应的密码
  • DB复制用户:搭建流复制的用户,必须超级用户,一般为postgres
  • DB复制用户密码:流复制用户的密码
  • 集群VIP: 输入10.197.167.251
  • 只读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名称是否正确;

  1. postgres=# select usename,application_name,client_addr from pg_stat_replication ;
  2. usename | application_name | client_addr
  3. ----------+------------------+---------------
  4. postgres | 10.197.167.27 | 10.197.167.26
  5. postgres | 10.197.160.28 | 10.197.167.28
  6. (2 rows)

如上所示,备库主机10.197.167.28的application_name与提示信息中的值不相同,此时需要将备库中recovery.confpostgresql.conf配置文件中流复制的application_name名称配置成提示中的值10.197.167.28。注意:不要在备库中的recovery.conf添加一些特殊的配置项,因为每次切换时,CLUP都会根据配置自动生成recovery.conf文件,你的这些特殊配置项都会被覆盖掉。

错误2:备库落后主库太多,导致需要的WAL日志文件在主库上已经被移除了;此时可以点击集群详情页中的此备库的状态,将此备库当前状态设置为Fault,然后点击加回集群重新搭建此备库,选择此备库的上级主库,点击确定后勾选重新搭建备库,可选择保留旧的数据目录或是删除原有数据目录。

错误3:流复制配置错误,此情况出现在导入流复制集群上线时出现的错误,因此需要手动按照导入流复制集群的步骤进行检查。
如果检查通过之后,集群就变成了正常状态:

正常状态

9. 流复制集群的管理

HA管理中,点击流复制集群那一行中的详情按钮,进入到流复制集群详情页面:

详情页面

详情页面中有几个TAB切换页:

  • 主备数据库:一个列表,显示主备数据库的信息
  • 查看延迟:查看流复制的主备库之间的复制延迟
  • 查看LSN:查各个数据库的当前LSN
  • 机房配置:查看集群的机房信息
  • 集群拓扑图:以图形化形式展示集群中数据库的级联方式

点击查看主备数据库的界面:

主备数据库

对于基于流复制的集群,我们可以把一台备数据库变成主数据库,原先的主数据库变成备数据库,其它的备数据库重新从新主数据库中同步。在上面的界面中,点“切换为主库”按钮,可以把此备库切换成主库,原主库切换被备库:

切换为主库

注意:在切换过程中会重启所有的主备库,业务会短暂中断!!!

另我们有时会对数据库做一些维护操作,如停止数据库,这时如果我们直接停止数据库,CLUP会认为数据库出现的故障,会自动再把数据库拉起来,这时我们需要让CLUP对这个集群停止工作,方法就是让集群离线,在集群列表中对指定的集群点离线按钮即可以完成这个工作,当集群处于离线状态,不会再触发故障转换的动作。

在上面的界面中点“停止”按钮,可以把数据库停掉,但要注意,如果HA集群在上线的情况下,如果发现数据库停机了,会自动把其拉起来。

点击查看延迟的界面:

查看延迟

在此界面中可以看到流复制的延迟和状态,注意“实际状态”为“streaming”才是正常的流复制状态,其它状态都表示流复制有问题。“同步”中显示为“async”表示流复制是异步的。
点击查看LSN的界面:

查看LSN

点击机房配置的界面:

查看LSN

点击集群拓扑图的界面:

查看LSN

10. 集群主机登

主机登陆界面可以直接连接服务无需开启远程工具,支持上下翻滚命令及复制粘贴功能:

复制粘贴

11. HA日志查看

在ha日志界面可以选择根据需要选择”Success”,”Running”,”Fault”三个状态中一个,也可以根据任务类型、所属集群、时间筛选对应的日志信息:

HA日志查看

12. 集群的故障切换

CLUP会每隔在创建集群时的参数“探测周期(秒)”指定的秒数去检查数据库是否正常,检查方法为执行一个SQL,即在”集群定义”参数“探测SQL”指定的数据库中更新表“cs_sys_heartbeat”,如果无法更新,则会触发故障切换的动作,如果是主库,探测的SQL为:
UPDATE cs_sys_heartbeat SET hb_time = now()
如果发现此表的hb_time时间一直不变,则认为CLUP的检测失效了:

  1. cs_sys_ha=# select * from cs_sys_heartbeat;
  2. hb_time
  3. -------------------------------
  4. 2022-05-11 15:04:47.665581+08
  5. (1 row)

当主数据库出现故障后,CLUP会把其中一台备库激活成主库,同时让其它备库重新从这台新的主库同步WAL日志。 当备数据库出现故障后,CLUP会标记其为失败,如果配置了读写分离和负载均衡,还会把此备库从负载均衡器中移除。

对于只读备库,CLUP会执行下面的SQL去检查备库是否正常:
select 1;