跳转至

共享存储集群

共享存储集群

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
备份和恢复

此功能都在主节点上完成,和执行单一节点时的方法一致。参见备份和恢复章节

定期配置数据保证了集群在发生主节点在完成整个流程后,整个集群恢复完成。

共享存储设备

集群支持各种共享存储,存储挂载为操作系统的目录,每个实例节点挂载同一份数据,通过文件系统访问共享文件。