这篇文章是pg 主备的配置 以及 pgpool 的使用
1.pg11 安装
1 | yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm |
2.stand by
2.1 primary db
- 创建复制账号
1 | CREATE ROLE pgrepuser REPLICATION LOGIN ENCRYPTED PASSWORD 'pgreppass'; |
- postgresql.conf
1 | listen_addresses = '*' |
- pg_hba.conf
1 | host replication pgrepuser 0.0.0.0/0 md5 |
- 重启 pg11
2.2 standby db 异步
- 启动容器standby
1 | sudo docker run -d --name standby_pg11 -p 15432:5432 -e POSTGRES_PASSWORD=postgres -v /etc/localtime:/etc/localtime -v /home/pgdata/:/var/lib/postgresql/data -e TZ=Asia/Shanghai postgres:11.4 |
- 进入内部
1 | docker exec -it standby_pg11 bash |
- 获取 primary db 的文件内容
- 切换身份 postgres
- 删掉原有数据
- 执行
pg_basebackup
- 输入密码
pgreppass
1 | su postgres |
- 成功后,
-R
会新生成recovery.conf
可能出现的问题
- 如果 primary db 使用中文 会报错:
1 | invalid value for parameter "lc_messages": "zh_CN.UTF-8" |
- 这是两者版本不一致导致的,删掉
postgres.conf
内的1
2
3
4
5lc_messages = 'zh_CN.UTF-8' # locale for system error message
# strings
lc_monetary = 'zh_CN.UTF-8' # locale for monetary formatting
lc_numeric = 'zh_CN.UTF-8' # locale for number formatting
lc_time = 'zh_CN.UTF-8' # locale for time formatting - 然后重启 容器,内部执行
1
localedef -f UTF-8 -i zh_CN zh_CN.UTF-8
2.2 standby db 同步配置
a.
recovery.conf
修改配置,并重启1
2standby_mode = 'on'
primary_conninfo = 'application_name=a ....其中,
a,b,c
代表从库的application_name
,逗号分隔,在从库的revovery.conf
内配置修改primarydb
1 开启 postgres.conf 参数,指定具体的从库
application_name
1
synchronous_standby_names='a,b,c'
2 加载配置文件
1
pg_ctl reload -D ${pg 的data目录}
当从库(standbydb)数量小于1,且配置同步更新时,主库的写操作会终止
2.3 冲突解决
从库
max_standby_streaming_delay = 30s
作为切换主备时,值尽可能小
作为查询使用时,值尽可能大
hot_standby_feedback=on 多版本冲突解决
2.4 流复制查询
- 主库执行
- 查询复制
select * from pg_stat_replication
- 查询复制
3 pgpool2
这里主要是利用pgpool实现主备切换,负载均衡
- 设备概览
node | name | desc |
---|---|---|
192.168.10.212 | cent7 | pg 服务器A,以及pgpool |
192.168.10.233 | rh | pg 服务器B,以及pgpool |
3.1 pgpool2 安装
可以选择源码编译,或者rpm安装,这里选择的是源码编译
注意关闭selinx
- 下载源码,解压
1 | mkdir -p /data/source && /data/source |
- 安装编译所需依赖包
1 | yum -y install libmemcached-devel |
- 配置pg11 环境变量
1 | vim /etc/profile |
- 设置 A B 服务器为
postgres
账号免密登录
1 | su - postgres |
- 进行编译,把pgpool 生成到
/home/pgpool
目录
1 | cd pgpool2-4_1_0 |
- 修改
postgresql.conf 文件
1 | pgpool.pg_ctl = '/usr/pgsql-11/bin/pg_ctl' |
- 切换为root用户,赋权
1 | chmod +s /bin/ping |
- insert_lock,建议开启
1 | su postgres |
- 然后把template1 写入 pgpool.conf 配置文件
1 | insert_lock = on |
3.2 pgpool 配置
这一步的配置都是在 postgres
用户完成的
#3.1 的步骤是AB服务器通用的
/home/pgpool 里面是pgpool的目录,./etc 内是配置文件
- 复制模板为配置文件
1 | cd /home/pgpool |
- 其他配置
1 | bin/pg_md5 postgres 把生成的MD5写入pcp.conf: |
- 主要配置
pgpool.conf
,下面是需要改的,其他的不变
1 | listen_addresses = '*' |
- failover_stream.sh
1 | #! /bin/sh |
3.3 pgpool的操作
- 启动
1 | bin/pgpool -n -d > /home/pgpool/run.log 2>&1 & |
- 停止
1 | bin/pgpool -m fast stop |
- 当节点的pg宕机后,恢复命令
1 | bin/pcp_attach_node -p 9898 -h 192.168.10.100 -U postgres -n 0 |
- sql 命令 : 连接pgopool 的服务(port=9999)执行,可以查看目前的节点状态
1 | show pool_nodes; |
这套配置可以实现主从的互相切换,当某一个节点出现宕机后,需要进行手动同步节点状态,pgpool才会重新进行负载
3.4 数据恢复
postgresql.conf
需要开启几个配置
1 | full_page_writes = on |
- 如果宕机的节点为主节点时,需要首先进行数据同步
1 | su postgresql |
这套配置仅是pg的主从stream模式的高可用配置
本文采用CC-BY-SA-3.0协议,转载请注明出处
Author: dadonggua
Author: dadonggua