共享存储集群
共享存储集群¶
Seabox共享存储集群,允许多个数据库实例同时访问同一份文件,同时具有高可用、负载均衡功能。相比其他的集群方式,性能有一定的优势。
原理¶
共享集群主要由数据库文件、数据库实例、共享存储等组成。
数据库实例和共享存储可以分别线性扩展,提升集群的处理能力。
-
不同节点间共享的数据
-
日志文件(sd_wal)
-
数据文件(base)
-
不同节点间独立的数据
-
内存缓存
-
日志的重做状态
共享存储不同的实例使用同一份的日志文件、数据文件, Primary 接收写访问请求,记入日志并刷新缓存到文件。备份节点检测到日志变更后将日志重做更新缓存,不更新数据文件,避免写争抢,保证数据文件的一致性。从节点可以有一个或者多个,负担额外的读请求,实现负载均衡。
共享存储由于只有一份数据,在集群中的节点出现故障停机的恢复工作会很快,数据文件是完整的,保存了故障期间的所有更改,不用再去同步获得日志,只需要保证启动的环境没有问题,就可以加入集群,重新或得高可用。
共享集群的存储模块,采用分布式存储,分布式存储提供了存储层的冗余和高可用,可以保证数据文件的安全性和可用性,同时分布式存储可以方便的添加节点扩充存储空间。
共享存储集群的计算节点加入到集群的方式和读写分离集群类似,但是避免了同步日志数据的过程,只需要设置好即可,在recover.conf
配置为standby_mode
即可。
recovery_target_timeline='latest'
standby_mode='on'
主节点发生故障,备用节点在切换为主节点的过程中,新的主节点执行恢复流程,清理未完成的事务,进入正常的状态。
在故障恢复或者增加节点的过程中, 所有的日志文件都是完整的,因此只需要按照普通节点的启动流程即可,中间需要的恢复操作由主节点来完成并跟踪新数据文件,从节点只是简单的重做日志恢复内存缓冲区状态即可。
集群启动¶
-
启动每个节点的数据库
-
启动每个节点的coordinator
-
通过delegate IP 访问集群,执行
show cluster_nodes
查看集群的状态。
seaboxsql=# show cluster_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay | replication_state | replication_sync_state | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+-------------------+------------------------+---------------------
0 | pgha1 | 10001 | up | 0.500000 | primary | 0 | true | 0 | | | 2020-06-17 18:44:13
1 | pgha2 | 10001 | up | 0.500000 | standby | 0 | false | 0 | | | 2020-06-17 18:43:50
(2 rows)
Failover¶
主节点因为软件或者硬件故障掉线后,Coordinator会检测到离线消息或者主动探测到主节点离线,此时会从可用的备用节点中选出一个节点作为主节点,保证上层业务的持续运行。从节点出现故障后,集群会检测到异常,读请求会发送到其他节点,保证集群的可用性。
状态查看¶
通过ssql客户端连接到集群后,可以通过执行show cluster nodes
查看集群的状态。也可以通过命令scc_node_info
查看每个节点的状态。
配置VIP¶
在seaboxcdn.conf文件中,配置watchdog并启用delegate IP,当发生故障切换时,通过此ip访问集群可能会有短暂失败的情况,在切换完成后,访问就会恢复正常。
use_watchdog = on
wd_port = 10003
wd_heartbeat_port = 10004
delegate_IP = '192.168.1.8'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev em1 label em1:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev em1'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I em1'
wd_hostname = 'ha1'
#其他的高可用cordinator配置
other_wd_port0 = 10003
heartbeat_destination0 = 'ha2'
heartbeat_destination_port0 = 10004
heartbeat_device0 = ''
other_pgpool_hostname0 = 'ha2'
other_pgpool_port0 = 10000
备份和恢复¶
此功能都在主节点上完成,和执行单一节点时的方法一致。参见备份和恢复章节
。
定期配置数据保证了集群在发生主节点在完成整个流程后,整个集群恢复完成。
共享存储设备¶
集群支持各种共享存储,存储挂载为操作系统的目录,每个实例节点挂载同一份数据,通过文件系统访问共享文件。