PostgreSQL REPMGR 灾难恢复过程复盘

2021-05-19 00:00:00 数据库 启动 方式 注册 恢复


大家肯能注意到,近一直都是各种数据库的灾难恢复的复盘, 本身作为一个TEAM 的LEADER 我想到的是在紧急情况下,我们应该有一个应对的措施,对每一个 TEAM 的  DBA 都应该在那个时候沉着冷静,并且知道那些是应该做的, 那些是不该做的.


今天轮到了POSTGRESQL ,目前我们采用的是 REPMGR 的方式做的高可用集群,为什么. POSTGRESQL 的高可用,有以下几种 P+C  , REPMGR,  Patroni + ETCD 的方式, 那为什么我们终选择了 REPMGR ,原因如下


1  REPMGR 是这三种里面简单的高可用的方式,这里的意思是结构节点,搭建简单,处理简单

2  在网络有波动的情况下,比较好控制,如果遇到网络上的短暂的问题,REPMGR通过一系列的方式可以避免某些切换. 调整的参数明显

3   资料多,并且有2象限(现在是EDB)这样的公司作为后盾, 并且国内的瀚高也是用这个作为他们商业的高可用方式的二次开发对象.

 4  更适合我们公司目前的现状,包含硬件,软件环境,人员的情况



目前我们采用的一个主+两个从的方式  一个注册 一个不注册 (一个从可能是延迟库,也可能为BIG DATA 提供抽取数据使用)


我们以POSTGRESQL 12.2  REPMGR 5.2.1 版本为例


1  从库DOWN

2  两个从库DOWN

3  主库DOWN 

4   一主一从DOWN 

5  全部DOWN 


1 安装依赖包

安装依赖包

yum -y install readline-devel

yum -y install gcc* --skip-broken

yum -y install zlib*

yum -y install openssl openssl-devel

yum -y install pam pam-devel

yum -y install libxml2 libxml2-devel

yum -y install libxslt libxslt-devel

yum -y install gcc, bison, gcc-c++, readline, readline-devel, zlib, zlib-devel

yum -y install libssl*

yum -y install systemd*

 yum -y install e2fsprogs-devel uuid-devel libuuid-devel


2  设置用户名密码


useradd postgres 

passwd  postgres 

visudo


3  操作ssh 互信


ssh-keygen -t rsa

ssh-copy-id -i /home/postgres/.ssh/id_rsa.pub postgres@10.50.132.145

ssh-copy-id -i /home/postgres/.ssh/id_rsa.pub postgres@10.50.132.146

ssh-copy-id -i /home/postgres/.ssh/id_rsa.pub postgres@10.50.132.147


4 解压文件编译文件

 tar -zxvf postgresql-12.2.tar.gz

./configure --prefix=/usr/local/postgres --bindir=/usr/local/postgres/bin --sysconfdir=/etc --libdir=/usr/local/postgres/libs --includedir=/usr/local/postgres/includes --datadir=/pgdata --datarootdir=/pgdata/root --with-pgport=5432 --with-openssl --with-pam --with-systemd --with-libxml --with-segsize=4 --with-ossp-uuid

gmake & gmake install


5  初始化数据库

sudo chown -R postgres:postgres /pgdata/

/usr/local/postgres/bin/initdb -D /pgdata/data --wal-segsize=64

添加.bash_profile配置文件

6  调整主库的postgresql配置文件 postgresql.conf 此处略过

新建用户 ,密码略过

repmgr

repl

调整主库的pg_hba.conf 配置文件  


7 将.bash-profile 拷贝到其他的两个数据库上

scp -r /home/postgres/.bash_profile postgres@10.50.132.146

scp -r /home/postgres/.bash_profile postgres@10.50.132.147


8  安装repmgr 

yum -y install flex

tar -zxvf  repmgr-5.2.1.tar.gz

./configure


make 

make install


并且需要在postgresql.conf  添加 repmgr 在 shared_perload_libraries


9 配置REPMGR 数据库

启动主库 并且在主库中运行如下命令

create database repmgr;

create user repmgr with password 'repmgr';

alter user repmgr superuser login;

alter database repmgr owner to repmgr;

create user repl with superuser password 'repl';

\c  repmgr

create extension repmgr;


10  需要配置 .pgpass 免密功能

10.50.132.145:5432:repmgr:repmgr:repmgr

10.50.132.145:postgres:repl:repl

10.50.132.146:5432:repmgr:repmgr:repmgr

10.50.132.146:5432:postgres:repl:repl

10.50.132.147:5432:repmgr:repmgr:repmgr

10.50.132.147:5432:postgres:repl:repl


然后改变文件属性

chmod 600 .pgpass 

将文件传送到其他两台机器

11   配置repmgr 文件模板


配置文件模板

https://github.com/EnterpriseDB/repmgr/blob/master/repmgr.conf.sample


node_id=1 

node_name='10.50.132.145' 

conninfo='host=10.50.132.145 dbname=repmgr user=repmgr connect_timeout=10'

data_directory='/pgdata/data'

replication_user='repl'

replication_type='physical'

log_level='INFO'

log_facility='STDERR'

log_file='/pgdata/errorlog/repmgr.log'  

log_status_interval=300

repmgr_bindir='/usr/local/postgres/bin'

passfile='/home/postgres/.pgpass'

failover='automatic'

promote_command='repmgr standby promote -f /etc/repmgr.conf'


follow_command='repmgr standby follow -f /etc/repmgr.conf -W --upstream-node-id=%n'

repmgrd_pid_file=/pgdata/repmgr.pid 




12  注册主库

repmgr -f /etc/repmgr.conf primary register

开始克隆从库

克隆后在注册从库

repmgr -f /etc/repmgr.conf standby register

注:此时我们仅仅注册一台从库.另一台不进行注册,也不进行切换.

13

配置KEEPALIVE , 备库与主库类似不在写了

! Configuration File for keepalived

vrrp_script chk_pg {

   script "/etc/keepalived/pg_check.sh"

   interval 2

   fall 2

   rise 1


}

vrrp_instance VI_1 {

    state BACKUP

    interface ens192

    virtual_router_id 51

    mcast_src_ip 10.50.132.145

    priority 100

    advert_int 1

    nopreempt

    authentication {

        auth_type PASS

        auth_pass 1111

    }

   track_script {

       chk_pg

  }

  virtual_ipaddress {

        10.50.132.173/24 label ens192:1

    }


}


/pg_check.sh

#!/bin/bash


source /etc/profile


N=`ps -C postgres --no-header | wc -l`

if [ $N  -eq 0 ];then

   echo '0'

   exit 1


else

   echo '1'

   exit 0

fi



14   启动repmgrd -f /etc/repmgr.conf  

(在注册的REPMGR的 两台主机上启动)


安装和启动就完成了


1   从库DOWN   分为 注册的和没注册的

    

     1.1  注册的从库  将10.50.132.146 关闭, 通过查询并且连接VIP ,系统可以继续工作,不会影响到整体的业务

待 10.50.132.146 恢复后,我们启动 repmgrd -f /etc/repmgr.conf 

并查看系统状态.


1.2   关闭10.50.132.147

应用系统不会受到影响, 并且在短时间PG_WAL 日志可以追溯的情况下,从库启动后会立即开始追数据.  从主库查看从库 147 已经连接




2  2个主库DOWN    

10.50.132.146  10.50.132.147, 状态与上一样.



恢复就是启动数据库服务,并且在10.50.132.146上启动 repmgrd -f /etc/repmgr.conf



两个从库DOWN ,结论不会影响业务


3  主库DOWN

在时间从库开启判断机制,进行主从切换的准备

在预设1分钟后,还无响应,则自动开始切换

IP 漂移到从库

业务访问从库是可以进行操作的


下面进行失败的主库,从新连接会集群并作为从库

1  主库服务器启动

2  确认关闭keepalived

3  确认原主库关闭的状态下,执行 node  rejoin命令


repmgr node rejoin -f /etc/repmgr.conf -d 'host=10.50.132.146 dbname=repmgr user=repmgr' --force-rewind --config-files=postgresql.conf,postgresql.conf --verbose


主库在恢复与新主库连接后,自动拉起工作,此时145 已经成为146 的从库并且相关的注册信息也一并更改



此时需要修复 10.50.132.147 ,在关闭147 并清理/pgdata/data的数据后,我们直接运行如下命令

repmgr -h 10.50.132.146 -U repmgr -d repmgr -f /etc/repmgr.conf standby clone 



整体系统恢复


4  一主一从 down

如果是主库和 147 库DOWN 则和主库DOWN 没有区别.如果是 145 146 DOWN 则和全部DOWN 一致.


此时物理机启动, 恢复流程如下

1  启动源主库 10.50.132.146 



2  启动KEEPALIVED

业务恢复


3  启动从库

4  启动 repmgrd -f  /etc/repmgr.conf  主库的

5  启动 repmgrd -f  /etc/repmgr.conf  从库的

6  在主库运行  repmgr -f /etc/repmgr.conf cluster show



7  在从库运行 keepalived 服务



整体系统恢复.


如果是全部DOWN 机的情况下,和上面的恢复方式类似 147 库直接开启即可.




相关文章