AntDB数据库灾备方案介绍

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采用同步效率更实时的流复制进行主从数据同步,其流程图如下:

AntDB数据库灾备方案介绍_第1张图片

主从流复制的流程为:

  1. 主备数据库启动,备库启动walreceiver进程,wal进程向主库发送连接请求。
  2. 主库收到连接请求后启动walsender进程,并与walreceiver进程建立tcp连接。
  3. 备库walreceiver进程发送最新的wal lsn给主库。
  4. 主库进行lsn对比,定期向备库发送心跳信息来确认备库可用性,并且将没有传递的wal日志进行发送。根据配置的WAL日志同步级别,等待从库反馈的接收结果。

若WAL流复制同步级别设置为 on,即同步模式,则继续下述的流程:

  1. 备库调用操作系统write()函数将wal写入缓存,然后调用操作系统fsync()函数将wal刷新到磁盘,然后进行wal回放。同时备库向主库返回ack信息,ack信息中包含write_lsn、flush_lsn、replay_lsn,这些信息会发送给主库,用以告知主库当前wal日志在备库的应用位置及状态,相关位置信息可以通过pg_stat_replication视图查看。
  2. 如果启用了hot_standby_feedback参数,备库会定期向主库发送xmin信息,用以保证主库不会vacuum掉备库需要的元组信息。

根据上图,说明流复制几种同步级别的差异:

 AntDB数据库灾备方案介绍_第2张图片

 

不同的同步级别对应的数据安全级别越高,对应的对性能影响也就越大。

上述从上至下安全级别越来越高,性能越来越差。

生产环境,从数据安全和性能两方面考虑,推荐使用 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其详细流程图如下:

AntDB数据库灾备方案介绍_第3张图片

目前,不管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符合预期结果。详细指标如下:

场景选择

  1. Master节点DB宕
  2. Master节点etcd进程宕
  3. Master节点主机宕

 AntDB数据库灾备方案介绍_第4张图片

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

你可能感兴趣的:(AntDB,国产数据库,数据库,服务器,网络)