共享存储HA集群
1. 基于共享存储的高可用集群
基于共享存储的集群是指,两台机器(A机器和B机器)都挂载了一块共享盘,数据库只运行在一台机器上,如运行在A机器上,当A机器出现故障之后,把文件系统挂载到另一台机器B上,然后把数据库在机器B上拉起来,然后把VIP也切过来的高可用方式。
给出一个示例:
机器的情况:
主机名 | IP | 数据库端口 | 数据库数据目录 |
---|---|---|---|
CLup0 | 10.197.167.25 | N/A | N/A |
pg01 | 10.197.167.29 | 5432 | /data/pgdata |
pg02 | 10.197.167.30 | 5432 | /data/pgdata |
集群的信息的VIP为:10.197.167.251
我们假设在CLup机器上已配置好了配置文件/opt/clup/conf/clup.conf
同时在10.197.167.29
和10.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密码:上面填写的用户所对应的密码
- 机器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集群模块的集群定义列表中可以看到此集群:
点列表中的查看
按钮就可看到此集群的详情界面,在详情界面中选择tab切换页中的主备机器:
在此界面中,可以看到共享磁盘集群中的两台机器,机器的DB状态为“无”表示数据库还没有运行,VIP状态为“无”表示这台机器目前没有VIP。如果发现机器的DB状态为“未知”,通常是这台机器上的clup-agent没有启动。
回到HA集群的HA管理中,可以看到集群的状态还是“offline”,即此时集群的状态还是离线状态,离线状态表示HA的检测和切换是不生效的,要让高可用开始工作,需要让集群上线,方法是点击本集群那一行中的上线
按钮,集群就可以上线,点完成,CLup会对此集群做一系列的检查,如果检查不通过,请看不通过的原因。
注意!上线操作会自动把数据目录的文件系统挂起来,把数据库拉起来,把VIP加上去。所以需要注意共享磁盘不要挂载到已有的其它机器上,否则两边同时挂载会导致共享磁盘上的文件系统损坏!!!
如果检查通过之后,集群就变成了正常状态:
3. 创建共享磁盘高可用集群
在CLup的web管理端中的,在HA集群菜单中,点击集群定义中的创建集群
中创建PostgreSQL共享盘集群
,出来界面:
在上面界面中输入第一台机器的信息:
- 所在主机:10.197.166.75
- 数据目录:/shared_data/pgdata,是PostgreSQL数据库的数据目录。后续我们会把共享盘挂载在/shared_data目录下。
- 操作系统用户:postgres
- 数据库软件:选择一个PostgreSQL软件的目录
- 防脑裂reset命令:即当数据库需要切换到另一台机器上时,需要把这台机器重启,以便于防止共享盘同时挂载到两台机器上从而导致上面的文件系统损坏。如果数据库部署在物理机上通常会用ipmitool命令重启机器:
ipmitool -H 172.16.167.29 -Uadmin –PXXX chassis power reset
- 资源隔离配置:对集群内的实例进行cpu和内存的限制,资源不足不能创建。
同样的方法输入第二台机器的信息:
- 所在主机:10.197.166.75
- 数据目录:/shared_data/pgdata
- 操作系统用户:postgres
- 数据库软件:选择一个PostgreSQL软件的目录
- 防脑裂reset命令:即当数据库需要切换到另一台机器上时,需要把这台机器重启,以便于防止共享盘同时挂载到两台机器上从而导致上面的文件系统损坏。如果数据库部署在物理机上通常会用ipmitool命令重启机器:
ipmitool -H 172.16.167.29 -Uadmin –PXXX chassis power reset
- 资源隔离配置:对集群内的实例进行cpu和内存的限制,资源不足不能创建。
输入完后,点下一步,出现下面的界面:
在上面的界面中输入:
- 共享磁盘: 即主机下的一块共享盘,可能是/dev/sdX,但是/dev/sdX这个路径不是很稳定(机器重启后会变),我使用磁盘的LABLE来指定磁盘,这里输入:LABEL=”/data”
- 挂载目录:这里输入/shared_data,注意挂载目录应该是PostgreSQL数据库的数据目录的父目录。
注意做这之前需要先在一台机器上把此共享盘的文件系统格式化好:
mkfs.xfs -L /data -f /dev/sdb
用blkid命令可以看到这块盘的LABEL:
[root@clup2 /]# blkid
...
...
/dev/sdb: LABEL="/data" UUID="58d90ac1-03b5-4ec9-8600-3325b191ad5f" TYPE="xfs"
...
...
然后用命令mount LABEL="/data" /shared_data
测试是否可以挂载到目录/shared_data,测试成功后一定要用命令umount /shared_data
卸载掉。
点下一步,进入如下界面:
在上面的界面中输入:
- 集群名称:任意一个标识此集群的字符串
- 数据库端口:指定PostgreSQL数据库的端口,一般默认为5432
- DB中CLup用户:即本平台管理数据库需要的数据库账号,需要一个数据库超级用户,一般为postgres
- DB中CLup密码:上面用户的密码
- 集群vip: 给集群的一个vip地址
点下一步,出现如下界面:
在上面的界面中,通常保持默认值就可以了。
点下一步,出现如下界面:
上面的界面中主要是设置数据库的常用参数,根据实际需要设置即可。
点下一步,出现如下界面:
上面的界面中主要是设置数据库的一般参数,根据实际需要设置即可,当然如果不改变默认值,通常也是可以的。
点下一步,出现如下界面:
上面的界面中主要是设置数据库的其他参数,根据实际需要设置即可,当然如果不改变默认值,通常也是可以的。
这一步做完后,点提交
按钮就开始创建基于共享磁盘的PostgreSQL高可用集群了,如下界面:
后续我们进入到“HA集群”界面中,可“上线”此集群后,当出现故障后,此高可用集群就会自动的进行高可用切换。
4. 共享磁盘集群的管理
对于基于共享存储的集群,我们可以把数据库从一台机器切换到另一台机器上运行。
方法是在HA管理的集群列表中,点击本集群那一行中的详情
按钮,进到当前集群详情页面,页面中有两个TAB页,进入到主备机器页,页面列表中可以看到有数据库切换到此主机
按钮,点下这个按钮就会实现此切换的功能:
另外我们有时会对数据库做一些维护操作,如停止数据库,这时如果我们直接停止数据库,CLup会认为数据库出现的故障,会自动再把数据库拉起来。
我们需要让CLup对这个集群停止工作,方法就是让集群“离线”,在集群列表中对指定的集群点离线按钮即可以完成这个工作,当集群处于“离线”状态,不会再触发故障转换的动作。
5. 集群的故障切换
CLup会每隔”集群定义”参数“探测周期(秒)”指定的秒数去检查数据库是否正常。检查方法为执行一个SQL,即在”集群定义”参数“探测SQL”指定的数据库中更新表“cs_sys_heartbeat”。如果无法更新,则会触发故障切换的动作。
执行的SQL为:UPDATE cs_sys_heartbeat SET hb_time = now()
如果发现此表的hb_time时间一直不变,则认为CLup的检测失效了:
cs_sys_ha=# select * from cs_sys_heartbeat;
hb_time
-------------------------------
2022-05-11 15:04:47.665581+08
(1 row)
注意:共享存储方式高可用进行切换时,会将旧节点上访问共享盘目录的进程都kill掉。以保证共享盘再旧节点上可以被umount掉.