PGPool-II-12+PG-12流复制实现HA主备切换

postgresql-12数据库安装+流复制+主备切换

主库安装
yum install -y postgresql12-*
vim /usr/lib/systemd/system/postgresql-12.service

修改PGDATA目录为自定义目录,可复制一个作为备库程序,并修改成备库的PGDATA目录
导入环境变量
export PATH=/usr/pgsql-12/bin:$PATH
创建自定义的PGDATA目录并修改权限用于初始化数据库
mkdir /home/pg12/data
chmod 700 /home/pg12/data
/usr/pgsql-12/bin/postgresql-12-setup initdb [若启动自定义的pg程序时需要指定service name]

一般安装好后psql等命令应该可以执行,如果 psql:找不到命令 可以如下操作
vim ~/.bashrc
添加一行
export PATH=/usr/pgsql-12/bin:$PATH
再重新连接服务器后即可

vim PGDATA/postgresql.conf
listen_addresses = '*' 
port = 自定义
wal_level = replica
max_wal_senders = 10

vim PGDATA/pg_hba.conf
添加
host    all                  all             0.0.0.0/0               md5
host    replication     all             0.0.0.0/0               md5

systemctl enable postgresql-12
systemctl start postgresql-12

su postgres
psql -p 自定义端口
\l 查看是不是正确的数据库
修改数据库用户postgres密码
ALTER USER postgres WITH PASSWORD 'postgres';   
--必须以分号结束,成功执行后会出现ALTER ROLE
\q 退出

复制备库
若是同机器上的备库只需要创建备库的PGDATA目录即可
若是不同机器的备库则重复上面的安装步骤到PGDATA目录创建并修改权限完成即可

su postgres
pg_basebackup -D /home/pg12/data(备库PGDATA目录) -X stream -R -Fp -v -P -h 主库ip(若是本机则localhost) -p 5432(主库端口)
需要输入密码,即上面修改的postgres密码

复制完成后进入备库PGDATA目录,查看是否有standby.signal(有这个文件则启动时会作为备库)

vim postgresql.auto.conf 
查看这个文件里的host和port信息是否是主库的,否则需要修改

vim postgresql.conf
因为是复制的所以只需要修改
port = 自定义(同机需要改,不同机看有没有冲突端口)
hot_standby = on(备库需要打开,允许在备库执行查询sql)

完成后启动备库
回到root用户
systemctl start postgresql-12.service(同机的则启动上面复制的新程序)

查看是主库还是备库
pg_controldata /home/pg12/data(要看的库的PGDATA目录)

Database cluster state:               in production           (主库)
Database cluster state:               in archive recovery (备库)

数据库簇状态:                         在运行中              (主库)
数据库簇状态:                         正在归档恢复       (备库)

进入主库
su postgres
psql -p 5432(主库端口)
select client_addr, sync_state from pg_stat_replication;
如下则表示正在异步流复制

 client_addr  | sync_state 
--------------+------------
 10.10.10.2 | async
 ::1          | async

主备切换

停止主库
systemctl stop postgresql-12
切换备库为主库
su postgres
psql -p 5434(备库端口)
select pg_promote();
如下则表示成功
 pg_promote 
------------
 t

但此时在新的主库查询是没有其他备库在流复制的
select client_addr, sync_state from pg_stat_replication;
 client_addr | sync_state 
-------------+------------
(0 行记录)

将其他备库的流复制切换到新的主库

到其他备库上执行以下操作
vim postgresql.auto.conf 修改host和port信息为新主库
需要有standby.signal文件,没有可以touch standby.signal
重启备库

再回到新的主库
select client_addr, sync_state from pg_stat_replication;
 client_addr  | sync_state 
--------------+------------
 10.10.10.2 | async
(1 行记录)

其他备库切换期间对新主库的写入操作也会复制到备库

将原主库启动作为新的备库
su postgres
vim postgresql.auto.conf 修改host和port信息为新主库
touch standby.signal
重启原主库

再回到新的主库
select client_addr, sync_state, state from pg_stat_replication;
 client_addr  | sync_state |   state   
--------------+------------+-----------
 10.10.10.2 | async      | streaming
 ::1          | async      | streaming


也可以清空原主库的PGDATA目录,重复pg_basebackup操作
异步流复制,原主库宕机很久后再恢复,可能和新主库的时间线不同,pg_rewind暂时没研究,所以还是用pg_basebackup重来

=========================================================================

PostgreSQL数据默认会创建一个linux用户postgres,可以修改linux系统的postgres用户的密码
1.删除PostgreSQL用户密码
# sudo passwd -d postgres
passwd: password expiry information changed.
//passwd -d 是清空指定用户密码的意思
2.设置PostgreSQL用户密码
#sudo -u postgres passwd
输入新的 UNIX 密码:
重新输入新的 UNIX 密码:
passwd:已成功更新密码

=========================================================================

PGPool-II-12+PG-12流复制实现HA主备切换

规划
pgpool 10.10.10.1 主
pg        10.10.10.1 主
pgpool 10.10.10.2 备
pg        10.10.10.2 备
vip        10.10.10.3

分别在两台机器上
vim /etc/hosts
10.10.10.1 master
10.10.10.2 slave
10.10.10.3 vip

在master,slave机器上都生成ssh如下:
su postgres
ssh-keygen -t rsa 一路回车
cat ~/.ssh/id_rsa.pub 查看生成的公钥
把生成的公钥追加到 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

分别将
master的公钥追加到slave的authorized_keys,
slave的公钥追加到master的authorized_keys。
两边互相ssh验证

ssh postgres@slave

ssh postgres@master

安装pgpool
yum install -y pgpool-II-12

pgpool配置目录: /etc/pgpool-II-12

su postgres
cp pool_hba.conf.sample pool_hba.conf
vim pool_hba.conf
将trust都改成md5,并添加一行
host    all             all             0.0.0.0/0               md5

cp pcp.conf.sample pcp.conf
pg_md5 postgres 会生成密文密码
vim pcp.conf
添加一行postgres:密文密码
pg_md5 -p -m -u postgres pool_passwd
输入密码postgres回车
会生成pool_passwd文件

回到root
chmod u+s /usr/sbin

vim /etc/sudoers
添加两行
postgres ALL=NOPASSWD: /sbin/ip
postgres ALL=NOPASSWD: /usr/sbin/arping

查看本机网卡,配置后面的delegate_IP需要
ifconfig找到本机ip的网卡,这个em1后面要用
em1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.10.1  netmask 255.255.255.0  broadcast 10.10.10.255

cp pgpool.conf.sample pgpool.conf
vim pgpool.conf
需要修改的配置如下(备机上的pgpool.conf配置类似,把其中的对端换一下):

=========================================================================

listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898

backend_hostname0 = 'master'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/home/postgres/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'slave'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/home/postgres/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'

enable_pool_hba = on
pool_passwd = 'pool_passwd'

replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

sr_check_period = 10
sr_check_user = 'postgres'
sr_check_password = 'postgres'
sr_check_database = 'postgres'

health_check_period = 10 
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = 'postgres' #数据库密码
health_check_database = 'postgres'
#必须设置,否则primary数据库down了,pgpool不知道,不能及时切换。从库流复制还在连接数据,报连接失败。
#只有下次使用pgpool登录时,发现连接不上,然后报错,这时候,才知道挂了,pgpool进行切换。

failover_command = '/etc/pgpool-II-12/failover_stream.sh %H '

use_watchdog = on
wd_hostname = 'master'
wd_port = 9000

delegate_IP = '10.10.10.3'        # 找一个没有用到的ip地址
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev em1 label em1:0'        # eth1根据现场机器改掉,下面一样
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'

enable_consensus_with_half_votes = on    # 一定要打开这个开关才能使单台pgpool获取vip,或者两台时down一台另一台自动切换vip

wd_heartbeat_port = 9694
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
heartbeat_destination0 = 'slave'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'em1'            # em1根据现场机器改掉

other_pgpool_hostname0 = 'slave' #对端
other_pgpool_port0 = 9999
other_wd_port0 = 9000

=========================================================================

编写脚本
vim failover_stream.sh
内容如下:
=========================================================================

#! /bin/sh 
# Failover command for streaming replication. 
# Arguments: $1: new master hostname. 

new_master=$1
trigger_command="/usr/pgsql-12/bin/pg_ctl promote -D /home/pg12/data"

# Prompte standby database. 
/usr/bin/ssh -T $new_master $trigger_command

exit 0;

=========================================================================

修改配置文件和脚本权限
chown -R postgres.postgres /etc/pgpool-II-12
chmod 777 /etc/pgpool-II-12/failover_stream.sh

创建日志目录
mkdir /var/log/pgpool
chown -R postgres.postgres /var/log/pgpool

在postgres用户下启动pgpool,否则会在执行failover.sh时提示输入密码而失败
需要debug日志时可以加参数 -d
su postgres
pgpool -n -D > /var/log/pgpool/pgpool.log 2>&1 &
停止命令
pgpool -m fast stop

主备机pgpool都启动后,查看状态
主机上 ip addr 可以看到em1网卡下有vip(ifconfig看不到)

su postgres
psql -h vip -p 9999 (此时可以将vip作为对外统一的数据库ip,端口9999)
输入密码后查询
show pool_nodes;

 node_id |   hostname   | port | status | lb_weight |  role   | select_cnt | load_balance_node 
---------+--------------+------+--------+-----------+---------+------------+-------------------
 0       | 10.10.10.1 | 5434 | up     | 0.500000  | primary | 0          | true              
 1       | 10.10.10.2 | 5432 | up     | 0.500000  | standby | 0          | false             
(2 行记录)

pgpool的HA,stop任何一台pgpool,仍然可以用vip+9999端口访问数据库,重新启动后即可恢复
pg的HA

停止主库,此时备库会自动变成主库
 node_id |   hostname   | port | status | lb_weight |  role   | select_cnt | load_balance_node 
---------+--------------+------+--------+-----------+---------+------------+-------------------
 0       | 10.10.10.1 | 5434 | down   | 0.500000  | standby | 0          | false             
 1       | 10.10.10.2 | 5432 | up     | 0.500000  | primary | 0          | true              
(2 行记录)

主库使用上面方法手动进行恢复成备库后启动,需要手动加入pgpool集群
pcp_attach_node -d -U postgres -h 10.10.10.3(vip) -p 9898 -n 0(node_id)
输入pcp管理密码postgres
加入后节点状态一直是waiting,需要停止pgpool主节点,再删除pgpool_status后重启pgpool
rm /var/log/pgpool-II-12/pgpool_status (这个目录是自动创建的,不是前面自定义的日志目录)

 node_id |   hostname   | port | status | lb_weight |  role   | select_cnt | load_balance_node  
---------+--------------+------+--------+-----------+---------+------------+-------------------
 0       | 10.10.10.1 | 5434 | up     | 0.500000  | standby | 5          | true              
 1       | 10.10.10.2 | 5432 | up     | 0.500000  | primary | 132        | false             
(2 行记录)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值