一、 主机
主机 | IP | 服务 |
---|---|---|
master | 192.168.0.56 | postgresql、postgis、pgpool |
slave | 192.168.0.58 | postgresql、postgis、pgpool |
二、安装postgresql
过程忽略
三、配置白名单与流复制
1. master配置
PostgreSQL流复制默认是异步的。在主服务器上提交事务和从服务器上变化可见之间有一个小的延迟,这个延迟远小于基于文件日志传送,通常1秒能完成。如果主服务器突然崩溃,可能会有少量数据丢失。
同步复制必须等主服务器和从服务器都写完WAL后才能提交事务。这样在一定程度上会增加事务的响应时间。
配置同步复制仅需要一个额外的配置步骤: synchronous_standby_names
必须设置为一个非空值。synchronous_commit
也必须设置为 on
。
这里部署的是异步的流复制
1.1 配置白名单
1 | vim /pgdata/pg_hba.conf |
1.2 修改配置文件
1 | vim /pgdata/postgresql.conf |
1.3 创建data目录,赋权并修改启动文件
1 | mkdir -p /pgdata && chown postgres:postgres /pgdata && chmod 700 /pgdata |
1.4 修改启动文件
1 | vim /usr/lib/systemd/system/postgresql-10.service |
1.5 启动postgresql并创建replica用户,密码replica
1 | systemctl start postgresql-10.service |
1.6 在slave节点测试链接主节点
slave节点执行:psql -h 192.168.0.56 -U postgres
(首先设置好postgres用户密码后测试)
2 slave配置
2.1 配置白名单
1 | vim /pgdata/pg_hba.conf |
2.2 创建data目录
1 | mkdir -p /pgdata && chown postgres:postgres /pgdata && chmod 700 /pgdata |
2.3 备份数据
1 | # 切换用户 |
2.4 修改启动文件
1 | vim /usr/lib/systemd/system/postgresql-10.service |
2.5 配置recovery.conf
1 | su postgres |
2.6 配置postgresql.conf
1 | vim /pgdata/postgresql.conf |
2.7 启动postgresql
1 | systemctl start postgresql-10.services |
3 验证流复制
3.1 在master上登陆psql
查看状态:
1 | select client_addr,sync_state from pg_stat_replication; |
3.2 创建test库
1 | Create database test; |
3.3 slave上登陆psql
查看库
发现已同步。
4 主从切换及恢复
4.1 模拟主故障
关闭postgresql
4.2 升级从库为主库
1 | [root@test3 log]# su postgres |
升级主库后,recovery.conf
会变成recovery.done
, 配置文件失效
4.3 通过pg_rewind命令同步数据,主库变成从库
1 | [root@test2 log]# su postgres |
修改修改recovery.done
1 | [root@test2 pgdata]# mv recovery.done recovery.conf |
修改主库连接地址
启动本地数据库
1 | [root@test2 pgdata]# systemctl start postgresql-10.serivce |
4.4 检测集群状态
在主库(原从库)执行查询命令
查看状态:
select client_addr,sync_state from pg_stat_replication;
1 | postgres=# select client_addr,sync_state from pg_stat_replication; |
四、配置pgpool (经测试不稳定)
参考:https://www.jianshu.com/p/ef183d0a9213
pgpool-II是PostgreSQL服务器之间一种有效的中间件和PostgreSQL数据库客户端。它提供了以下功能。
连接池
pgpool-II保存到PostgreSQL服务器的连接,当一个相同新连接(如用户名、数据库、协议版本)进来时,重用他们。它减少了连接开销,提高了系统的整体吞吐量。
复制
pgpool-II可以管理多个PostgreSQL服务器。使用复制功能可以使2个或更多的物理磁盘上创建一个实时备份,这样服务不会因服务器的磁盘故障而中断。
负载平衡
如果数据库是复制的,在任何服务器上执行一个SELECT查询会返回相同的结果。pgpool-II复制特性的优势在于减少每个PostgreSQL服务器上的负载,因为它可以使用分布在多个服务器之间进行SELECT查询,从而提高系统的整体吞吐量。最好是查询和PostgreSQL服务器数量成一定比例,多用户同时执行多查询达到负载均衡最好的效果。
限制连接数
PostgreSQL的最大并发连接数有一定限制的,当超过限制的连接数后,连接会被拒绝。然而,设置增加最大连接数又会增加资源消耗,影响系统性能。pgpool-II也有最大连接数限制,但超过的连接进来时是进行立即排队,而不是返回一个错误。
pgpool-II交互PostgreSQL的后端和前端协议时,起着继电器的作用。因此,数据库应用程序(前端)认为pgpool-II是真实的PostgreSQL服务器,服务器(后端)认为pgpool-II是它的客户端之一。因为pgpool-II在服务器和客户端是透明的,所以pgpool-II可以使用现有的数据库应用程序而做到几乎不修改它们。
1 各节点免密登录
关闭系统selinux防火墙,否则失败,同事修改SSH免密登录,使配置支持。
安装之前先配置密钥使master和slave这两台虚拟机的postgres用户能免密连接,
先修改postgres的密码,在root用户下
1 | passwd postgres |
1 | # Master到slave1的免密码登陆: |
2 安装pgpool(主从节点都安装)
1 | yum install pgpool-II-10.x86_64 |
3 配置(主从节点均配置)
3.1 配置pool_hba.conf
pool_hba.conf是对登录用户进行验证的,要和pg的pg_hba.conf保持一致,要么都是trust,要么都是md5验证方式,这里采用了md5验证方式如下设置:
1 | [postgres@master ~]$ cd /opt/pgpool/etc |
3.2 配置pcp.conf
pcp.conf配置用于pgpool自己登陆管理使用的,一些操作pgpool的工具会要求提供密码等,配置如下:
1 | [postgres@master ~]$ cd /etc/pgpool-II-10 |
3.3 配置系统命令权限
配置ifconfig, arping
执行权限 ,执行failover_stream.sh
需要用到,可以让其他普通用户执行。
1 | [root@master ~]# chmod u+s /sbin/ifconfig |
3.4 配置master上的pgpool.conf
1 | [postgres@master ~]$ cd /opt/pgpool/etc |
编辑内容如下
1 | # ---------------------------- |
3.5 配置slave上的pgpool.conf
1 | # ---------------------------- |
配置文件里,故障处理配置的是failover_command = ‘/etc/pgpool-II-10/failover_stream.sh %H ‘,因此,需要在/opt/pgpool目录中写个failover_stream.sh脚本:
1 | [postgres@master ~]$ cd /etc/pgpool-II-10 |
1 |
|
如果是其他用户创建的,需要赋予postgres可执行权限,例如
1 | [root@opt ~]$ chown -R postgres.postgres /opt/pgpool |
3.6 启动集群
分别启动postgrsql
1 | systemctl start postgresql-10.service |
分别启动pgpool
1 | systemctl start pgpool-II-10.service |
启动pgpool后,查看集群节点状态:
1 | [postgres@master ~]$ psql -h vip -p 9999 |
发现当前主备节点都是正常的up状态。