AntDB灾备方案(双中心方案)
AntDB数据库节点分布于两个机房,并使用 patroni + etcd 组件进行HA管理,主节点故障时能自动切换。切换时优先选择同机房的同步slave节点选举为new master。
部署图中相关组件说明:
⚫patroni:通过参数文件来配置自动初始化数据库搭建流复制(配置pg参数文件、创建用户、可以配置预加脚本),指定etcd节点等。负责通过一个api接口连接到dcs(分布式存储系统集群),向其插入键值记录patroni参数、数据库参数、主备信息以及连接信息。平时通过对etcd中的信息进行更新、读取来判断集群的健康状态。在主备切换或者做恢复时通过向etcd读取主备信息来判断各节点的状态进行切换。
⚫etcd:最少需要三个节点且为奇数来进行leader选举(脑裂发生时etcd集群会僵死等待恢复,不会发生都认为自己是主的情况)。存储并在各个节点上同步键值信息。
⚫antdb:关系型数据库。
基本流程:
⚫patroni自动创建主备流复制集群并且向etcd读取以及更新键值,即主从的状态信息
⚫etcd存储、同步键值信息
⚫patroni进行循环检测,如果发现当前节点或者主节点发生异常,会执行相对的应对措施(重启节点、主备切换等)
AntDB流复制主从数据同步和数据安全
AntDB通过WAL日志进行数据同步的方式有两种:
- 基于WAL文件的文件级数据同步
- 基于WAL更小单位record级的流复制,同步效率更实时
不同于基于WAL文件的文件级数据同步,流复制的关键在于“流”。通过流复制,备库不断的从主库同步相应的record,并在备库apply每个WAL record,流复制每次传输单位是WAL日志的record,commit或checkpoint操作都会触发流复制传输。
AntDB采用同步效率更实时的流复制进行主从数据同步,其流程图如下:
主从流复制的流程为:
- 主备数据库启动,备库启动walreceiver进程,wal进程向主库发送连接请求。
- 主库收到连接请求后启动walsender进程,并与walreceiver进程建立tcp连接。
- 备库walreceiver进程发送最新的wal lsn给主库。
- 主库进行lsn对比,定期向备库发送心跳信息来确认备库可用性,并且将没有传递的wal日志进行发送。根据配置的WAL日志同步级别,等待从库反馈的接收结果。
若WAL流复制同步级别设置为 on,即同步模式,则继续下述的流程:
- 备库调用操作系统write()函数将wal写入缓存,然后调用操作系统fsync()函数将wal刷新到磁盘,然后进行wal回放。同时备库向主库返回ack信息,ack信息中包含write_lsn、flush_lsn、replay_lsn,这些信息会发送给主库,用以告知主库当前wal日志在备库的应用位置及状态,相关位置信息可以通过pg_stat_replication视图查看。
- 如果启用了hot_standby_feedback参数,备库会定期向主库发送xmin信息,用以保证主库不会vacuum掉备库需要的元组信息。
根据上图,说明流复制几种同步级别的差异:
不同的同步级别对应的数据安全级别越高,对应的对性能影响也就越大。
上述从上至下安全级别越来越高,性能越来越差。
生产环境,从数据安全和性能两方面考虑,推荐使用 on 同步级别。
AntDB old master数据恢复并重新纳入HA
AntDB的灾备方案中,master挂掉后,备库会自动升级为主库继续提供服务,对于原来的主库(即old master),通常有两种处理方式
- 使用pg_basebackup从new master复制全量数据恢复(类似于oracle的rman备份恢复),在追平后保持实时增量同步。
- 使用pg_rewind 从new master只复制差量数据到old master恢复,在追平后保持实时增量同步。
很显然,第一种不是很好的方案,而且当数据量比较大时,时间成本太高。
pg_rewind 工具主要实现了从源库到目标库的文件级别数据同步。但是和rsync的区别是,pg_rewind 不需要去读那些未变化的文件块,当数据量比较大而变化较小的时候,pg_rewind比pg_basebackup要快得多。
pg_rewind其详细流程图如下:
目前,不管pg_basebackup还是pg_rewind,都已经纳入patroni的自动管理,当发生主从切换时,patroni会首先尝试使用pg_rewind增量恢复old master,如果失败,则再次尝试使用pg_basebackup全量恢复old master,并重新以slave身份纳入patroni的管控。
AntDB高可用架构对标
AntDB已经形成了一套完整且经过验证的高可用体系标准,覆盖应急系统、高可用、容灾系统与备份系统四个方面。
AntDB高可用切换指标
AntDB针对生产环境进行了Master节点DB宕、Master节点主机宕、Master节点etcd carash三个场景的生产高可用验证。结果显示AntDB数据库具备自愈能力,RTO、RPO符合预期结果。详细指标如下:
场景选择
- Master节点DB宕
- Master节点etcd进程宕
- Master节点主机宕
patronictl维护命令
我们用patronictl命令可以:
- 查看集群状态
- 发送一条SQL语句
- 获取主节点dsn信息
- 重启集群
- 手动执行主备切换
- 手动failover一个节点
- 在DCS中删除集群信息
- 重新初始化节点
Usage: patronictl [OPTIONS] COMMAND [ARGS]... Options: -c, --config-file TEXT Configuration file -d, --dcs TEXT Use this DCS -k, --insecure Allow connections to SSL sites without certs --help Show this message and exit. Commands: configure Create configuration file dsn Generate a dsn for the provided member, defaults to a dsn of... edit-config Edit cluster configuration failover Failover to a replica flush Flush scheduled events list List the Patroni members for a given Patroni pause Disable auto failover query Query a Patroni PostgreSQL member reinit Reinitialize cluster member reload Reload cluster member configuration remove Remove cluster from DCS restart Restart cluster member resume Resume auto failover scaffold Create a structure for the cluster in DCS show-config Show cluster configuration switchover Switchover to a replica version Output version of patronictl command or a running Patroni... |
查看集群状态
patronictl 命令
–c 指定patroni配置文件,batman是默认集群名字,在patroni参数文件设置
patronictl -c /etc/patroni/patroni.yml list +-------------------------+----------+-------------------+--------+---------+----+-----------+-----------------+ | Cluster | Member | Host | Role | State | TL | Lag in MB | Pending restart | +-------------------------+----------+-------------------+--------+---------+----+-----------+-----------------+ | batman5 | antdb117 | 10.21.20.117:6432 | | running | 16 | 0.0 | * | | batman5 | antdb118 | 10.21.20.118:6432 | Leader | running | 16 | 0.0 | * | | batman5 | antdb119 | 10.21.20.119:6432 | | running | 16 | 0.0 | * | +-------------------------+----------+-------------------+--------+---------+----+-----------+-----------------+ |
发送一条SQL语句
patronictl -c /etc/patroni/patroni.yml query batman5 --command 'select version() ' –password Password: PostgreSQL 11.5 ADB 4.1devel 461fafc on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit |
获取主节点dsn信息
patronictl -c /etc/patroni/patroni.yml dsn batman5 host=10.21.20.118 port=6432 |
手动switchover一个节点
patronictl -c /etc/patroni/patroni.yml switchover Master [antdb117]: Candidate ['antdb118', 'antdb119'] []: antdb118 When should the switchover take place (e.g. 2015-10-01T14:30) [now]: Current cluster topology +--------------------+----------+-------------------+--------+---------+----+--- --------+ | Cluster | Member | Host | Role | State | TL |Lag in MB | +--------------------+----------+-------------------+--------+---------+----+--- --------+ | batman5 | antdb117 | 10.21.20.117:6432 | Leader | running | 22 |0.0 | | batman5 | antdb118 | 10.21.20.118:6432 | | running | 22 |0.0 | | batman5 | antdb119 | 10.21.20.119:6432 | | running | 22 |0.0 | +--------------------+----------+-------------------+--------+---------+----+--- --------+ Are you sure you want to switchover cluster batman5, demoting current master antdb117? [y/N]: y |
手动failover一个节点
patronictl -c /etc/patroni/patroni.yml failover Candidate ['antdb118', 'antdb119'] []: antdb118 Current cluster topology +--------------------+----------+-------------------+--------+---------+----+--- --------+ | Cluster | Member | Host | Role | State | TL |Lag in MB | +--------------------+----------+-------------------+--------+---------+----+--- --------+ | batman5 | antdb117 | 10.21.20.117:6432 | Leader | running | 22 |0.0 | | batman5 | antdb118 | 10.21.20.118:6432 | | running | 22 |0.0 | | batman5 | antdb119 | 10.21.20.119:6432 | | running | 22 |0.0 | +--------------------+----------+-------------------+--------+---------+----+--- --------+ Are you sure you want to failover cluster batman5, demoting current master antdb117? [y/N]: y |
在DCS中删除集群信息
patronictl -c /etc/patroni/patroni.yml remove batman5 +---------+--------+------+------+-------+-----------+ | Cluster | Member | Host | Role | State | Lag in MB | | batman5 | antdb117 | 10.21.20.117:6432 | Leader | running | 22 |0.0 | | batman5 | antdb118 | 10.21.20.118:6432 | | running | 22 |0.0 | | batman5 | antdb119 | 10.21.20.119:6432 | | running | 22 |0.0 | Please confirm the cluster name to remove: batman5 You are about to remove all information in DCS for batman5, please type: "Yes I am aware": Yes I am aware |
重新初始化节点
patronictl -c /etc/patroni/patroni.yml reinit batman5 antdb119 +---------+-------------+---------------+--------+---------+-----------+ | Cluster | Member | Host | Role | State | Lag in MB | +---------+-------------+---------------+--------+---------+-----------+ | batman5 | antdb117 | 10.21.20.117:6432 | Leader | running | 22 |0.0 | | batman5 | antdb118 | 10.21.20.118:6432 | | running | 22 |0.0 | | batman5 | antdb119 | 10.21.20.119:6432 | | running | 22 |0.0 | +---------+-------------+---------------+--------+---------+-----------+ Are you sure you want to reinitialize members antdb119? [y/N]: y Success: reinitialize for member antdb119 |