框架环境
192.168.100.102 --虚拟ip 172.18.5.23 --主服务器 172.18.5.41 -- 从服务器
安装PostgreSQL-主从结构中使用
下载安装
网页端地址:https://yum.postgresql.org/rpmchart/ 可以查看各个版本的pgsql,点击12版本进去,查看需要安装的内容:
点击:PostgreSQL Database Server 12 PGDG 在此页面选择要下载的内容,点击进入二层菜单,下载特定版本的安装包,pgsql安装需要下载的安装包,如下:
postgresql12-libs-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-contrib-12.4-1PGDG.rhel7.x86_64 postgresql12-12.4-1PGDG.rhel7.x86_64.rpm postgresql12-server-12.4-1PGDG.rhel7.x86_64.rpm
安装
yum install -y postgresql12-libs-12.4-1PGDG.rhel7.x86_64.rpm yum install -y postgresql12-12.4-1PGDG.rhel7.x86_64.rpm yum install -y postgresql12-server-12.4-1PGDG.rhel7.x86_64.rpm yum install -y postgresql12-contrib-12.4-1PGDG.rhel7.x86_64.rpm
安装出现下面的问题的时候:
缺少依赖性 ,联网的情况下可以用: yum install krb5-server 等进行安装。未联网的情况下,请参考下面的文章:
具体参考:离线安装:https://www.cnblogs.com/whitebai/p/12128037.html 在线安装:https://www.cnblogs.com/whitebai/p/12122240.html 安装依赖:https://www.cnblogs.com/whitebai/p/12128078.html
创建目录
mkdir -p /app/pgsql/data && chown postgres:postgres /app/pgsql/data; -- 数据目录 mkdir -p /app/pgsql/pg_archive && chown postgres:postgres /app/pgsql/pg_archive; --用于归档的目录(主从复制时用) cd /app/pgsql && chmod 700 data; --分配拥有者读写权限 cd /app/pgsql && chmod 700 pg_archive; --分配拥有者读写权限
切换用户
su - postgres --切换回postgres 用户 /usr/pgsql-12/bin/initdb -D /app/pgsql/data/ --初始化数据库
修改数据库路径
su 切换为root用户,以root身份
vim /usr/lib/systemd/system/postgresql-12.service --修改Service Environment=PGDATA=/app/pgsql/data/ --修改数据库路径
自动启动
su 切换为root用户,以root身份
systemctl enable postgresql-12 systemctl start postgresql-12
登录postgresql并设置密码,postgresql在安装时默认添加用户postgres
su - postgres psql ALTER USER postgres WITH PASSWORD '123456'; q
允许远程登录
修改pg_hba 指定数据库路径时:
vi /app/pgsql/data/pg_hba.conf # IPv4 local connections: 下面添加 host all all 0.0.0.0/0 md5
修改postgresql 指定路径时:修改时候去掉前面的# 注释
vi /app/pgsql/data/postgresql.conf listen_addresses = '*'
重启服务
systemctl restart postgresql-12 netstat -ltpn | grep 5432 --查看状态 ,可以不用执行
允许通过防火墙
firewall-cmd --zone=public --add-port=5432/tcp --permanent firewall-cmd --reload
主从配置
主服务器
添加pg用于同步的用户名
su - postgres psql CREATE ROLE replica login replication encrypted password '123456'; -创建具有复制流操作的用户:replica
修改配置文件:pg_hba.conf,信任从服务器访问
vi /app/pgsql/data/pg_hba.conf #文件尾部添加信任的从服务器 # replica为postgres用户 # XX.XX.XX.XX为从节点的完整IP,如果为网段配置就不是32了,md5为允许密码验证,trust为免密 # TYPE DATABASE USER ADDRESS METHOD host replication replica 172.18.5.41/32 trust
、允许10.1.1.0~10.1.1.255网段登录数据库:
1
|
host all all 10.1.1.0/24 md5 |
2、修改配置文件:postgresql.conf
vi /app/pgsql/data/postgresql.conf
# 新增或修改下列属性设置(使用命令“/”来查找,否则眼花)
listen_addresses = '*' # (修改)监听所有IP
max_connections = 100 # (修改)最大连接数,据说从机需要大于或等于该值
archive_mode = on # (修改)开启归档
archive_command = 'test ! -f /app/pgsql/pg_archive/%f && cp %p /app/pgsql/pg_archive/%f'
# 9.6开始没有hot_standby(热备模式) wal_level = replica #最多有2个流复制连接 max_wal_senders = 2 wal_keep_segments = 16 #流复制超时时间 wal_sender_timeout = 60s # 最大连接数,据说从机需要大于或等于该值 max_connections = 100
3、重启服务
systemctl restart postgresql-12
4、在从节点上验证访问
psql -h 172.18.5.23 -U postgres
FATAL: no pg_hba.conf entry for host “XXX” user “”xxx“”
# 如果发现不知道密码或密码不正确,修改postgres用户密码(数据库)
ALTER USER postgres WITH PASSWORD '你的密码';
三、从服务器
1、停止服务
systemctl stop postgresql-12
2、切换用户(一定要)
su - postgres
3、清空数据文件夹(是这样的,没错)
rm -rf /app/pgsql/data/*
cd /app/pgsql/data
4、从主节点获取数据
# 使用replica用户,从主节点获取备份数据(这条命令建议照抄,有兴趣在深究内部参数)
pg_basebackup -h 172.18.5.23 -p 5432 -U replica -Fp -Xs -Pv -R -D /app/pgsql/data
5、编辑standby.signal文件(就在数据文件夹内,以此标识从节点,当从节点提升为主节点后会自动删除)
# 添加
standby_mode = 'on'
6、修改postgresql.conf文件
vi /app/pgsql/data/postgresql.conf
primary_conninfo = 'host=172.18.5.23 port=5432 user=replica password=123456'
recovery_target_timeline = latest # 默认
max_connections = 120 # 大于等于主节点,正式环境应当重新考虑此值的大小
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
7、重新启动从节点
systemctl start postgresql-12
四、验证主从
方法一:
登录主节点数据库执行如下命令
su postgres
psql
select client_addr,sync_state from pg_stat_replication;
结果如下:
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
---------------+------------
172.18.5.41 | async
(1 row)
说明104服务器是从节点,在接收流,而且是异步流复制
方法二:
在主节点与从节点分别执行如下命令
ps -ef | grep postgres
可以看到主节点有wal receiver进程
postgres 2638 2606 0 17:12 ? 00:00:00 postgres: walsender replica 172.18.5.41(51504) streaming 0/7000660
可以看到从节点有wal receiver进程
postgres 1960 1953 0 17:12 ? 00:00:02 postgres: walreceiver streaming 0/7000660
五、主备切换(主库出现故障时)
当主库出现故障时,我们需要将备库提升为主库进行读写操作。
0、在pg12之前我们一般使用2种方式:
1)pg_ctl 方式: 在备库主机执行 pg_ctl promote shell 脚本
2)触发器文件方式: 备库配置 recovery.conf 文件的 trigger_file 参数,之后在备库主机上创建触发器文件
1、pg12开始新增了一个pg_promote()函数,让我们可以通过SQL命令激活备库。
pg_promote()语法:
pg_promote(wait boolean DEFAULT true, wait_seconds integer DEFAULT 60)
两个参数:
wait: 表示是否等待备库的 promotion 完成或者 wait_seconds 秒之后返回成功,默认值为 true。
wait_seconds: 等待时间,单位秒,默认 60
2、切换举例:
1)主库操作:关闭主库,模拟主库故障:
systemctl stop postgresql-12
2)备库操作:激活备库:
su postgres
psql
select pg_promote(true,60);
4、验证:
/usr/pgsql-12/bin/pg_controldata /app/pgsql/data
主备库英文显示如下:
Database cluster state: in production
Database cluster state: in archive recovery
主备库中文显示如下:
数据库簇状态: 在运行中
数据库簇状态: 正在归档恢复
六、原主库修复后降为备库(其实大部分操作与建立备库时一样,只是修改几个IP地址)
1、新主库(104):
# vi /app/pgsql/data/pg_hba.conf
host replication replica 172.18.5.23/32 trust
# systemctl restart postgresql-12
2、新备库(103)
# systemctl stop postgresql-12
# su - postgres
# rm -rf /app/pgsql/data/*
# cd /app/pgsql/data
# pg_basebackup -h 172.18.5.41 -p 5432 -U replica -Fp -Xs -Pv -R -D /app/pgsql/data
# vi standby.signal
# 添加
standby_mode = 'on'
vi /app/pgsql/data/postgresql.conf
primary_conninfo = 'host=172.18.5.41 port=5432 user=replica password=123456'
# systemctl start postgresql-12
七、再次将老主库切回主库
1、当前备库:
> 停止服务
> 删除“/app/pgsql/data/standby.signal”文件
> 启动服务
2、当前主库:
> 停止服务
> 以“postgres”用户创建“/app/pgsql/data/standby.signal”文件,添加内容:standby_mode = 'on'
> 启动服务
https://blog.csdn.net/luxingjyp/article/details/104637798 https://www.cnblogs.com/VicLiu/p/12993542.html
pgPool 负载均衡搭建
服务器环境
172.18.5.23 master 172.18.5.41 slave 172.18.5.42 vip -虚拟ip
.host 添加配置
vi /etc/hosts
/etc/init.d/network restart --修改完成后刷新
使用yum下载rpm包安装pgpool-II,注意下载的安装包须与PG的版本一致。安装包目录详见https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-8-x86_64/。
yum install https://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-release-4.1-2.noarch.rpm
yum install pgpool-II-pg12 yum install pgpool-II-pg12-debuginfo yum install pgpool-II-pg12-devel yum install pgpool-II-pg12-extensions
服务开机启动
systemctl enable pgpool.service
启动停止服务
systemctl start pgpool.service systemctl stop pgpool.service
目录/相关命令授权
因为pgpool-ii 配置中会以 postgres 用户执行一些系统权限命令, 需要使用设置普通用户授权:
chmod u+x /usr/sbin/ip chmod u+s /usr/sbin/arping chmod u+s /sbin/ip chmod u+s /sbin/ifconfig
配置中相关的日志目录,pid 目录权限:
chown -R postgres.postgres /etc/pgpool-II --给postgres 用户权限 mkdir /var/run/pgpool/ chown postgres.postgres /var/run/pgpool/ mkdir -p /var/log/pgpool/ touch /var/log/pgpool/pgpool_status chown -R postgres.postgres /var/log/pgpool/
配置程序运行的用户和组为 postgres 一般10以上,postgres 就在postgres 组下面,没有的话,可以搜索如何创建组
修改pgpool运行用户和组为postgres
vi /usr/lib/systemd/system/pgpool.service --10如果采取默认的基本不需要修改 User=postgres Group=postgres
服务器SSH免密设置
# 主机/备机操作 su - postgres ssh-keygen # 一直enter
继续在postgres用户下执行
ssh-copy-id -i .ssh/id_rsa.pub master ssh-copy-id -i .ssh/id_rsa.pub slave
如果提示输入postgres密码的时候,请输入postgres 用户的密码(非postgres数据库的密码),如果没有设置,可以切换回root用户 sudo
-u postgres
passwd
设置密码
以上操作主机、备机都要执行
pgpool-ii 相关配置(/etc/pgpool-II/)
pool_hba.conf
(主备相同)
pool_hba.conf
是配置用户链接时的验证策略, 和postgresql
的pg_hba.conf
保持一致,要么都是trust
,要么都是md5
验证方式,这里采用了md5验证方式如下设置
su - postgres cd /etc/pgpool-II/ vim pool_hba.conf
编辑内容如下(这里和postgressql设置一样, trust/md5保持一致)
配置pg_hba.conf,认证方式保持一致
修改 vi /app/pgsql/data/pg_hba.conf 与上面保持一致
非必要可选步骤,为了集群可扩展性,可以将复制的认证条件放宽
pcp.conf
/ pool_passwd (主备相同)
这个文件是pgpool管理器自己的用户名和密码,用于管理集群的.
在 /etc/pgpool-II/ 目录下
pg_md5 postgres
e8a48653851e28c69d0506508fb27fc5
vi pcp.conf
--添加
#USERID:MD5PASSWD
postgres:e8a48653851e28c69d0506508fb27fc5
pg_md5 -p -m -u postgres pool_passwd
#数据库登录用户是postgres,这里输入登录密码,不能出错
#输入密码后,在/etc/pgpoll-II目录下会生成一个pool_passwd文件
pgpool.conf
(重点)
这里我们配置主节点的,然后备节点直接拷贝过去
su - postgres cd /etc/pgpool-II/ touch failover_stream.sh chmod u+x failover_stream.sh 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 /app/pgsql/data" # Prompte standby database. /usr/bin/ssh -T $new_master $trigger_command exit 0;