本篇主要是postgresql12 安装配置部分。
pgpool-ii 配置在第二篇:pgpool-ii4.1.2 高可用集群[主备切换]配置部分
整个流程分为以下几部分:
先说说这套方案要达到的效果/解决的问题,目的不一致的/没有想了解的可以不用往下看了.
解决三种宕机
基于两台装有postgresql数据库的服务器,通过每台机器上的pgpool-ii程序来维护一个高可用体系, 从而保证能始终提供一个可用的IP地址,用于外界数据操作或者访问.
#设置rpm源 curl -O https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm rpm -ivh pgdg-redhat-repo-latest.noarch.rpm #安装(这里是版本为12的postgresql) yum -y install postgresql12 postgresql12-server -O #如果后续发现连接不上,可以关闭防火墙 systemctl stop firewalld systemctl disable firewalld
# ftp下载rpm离线包 curl -O https://yum.postgresql.org/12/redhat/rhel-7-x86_64/postgresql12-12.3-1PGDG.rhel7.x86_64.rpm curl -O https://yum.postgresql.org/12/redhat/rhel-7-x86_64/postgresql12-contrib-12.3-1PGDG.rhel7.x86_64.rpm curl -O https://yum.postgresql.org/12/redhat/rhel-7-x86_64/postgresql12-libs-12.3-1PGDG.rhel7.x86_64.rpm curl -O https://yum.postgresql.org/12/redhat/rhel-7-x86_64/postgresql12-server-12.3-1PGDG.rhel7.x86_64.rpm #contrib 是安装扩展的 没有这个包就没有 ossp-uuid的插件 #server 是数据库的安装文件 #libs 用来客户端进行连接. #注意 如果是centos8 的话,修改为 rhel-8 进行下载就可以了.
# 上传文件到服务器之后, 执行安装命令
rpm -ivh postgresql*.rpm
执行完安装之后(查看状态可跳过, 直接进行数据库初始化):
此时使用systemctl status postgreslq-12 查看服务状态:
● postgresql-12.service - PostgreSQL 12 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-12.service; disabled; vendor preset: disabled)
Active: inactive (dead)
Docs: https://www.postgresql.org/docs/12/static/
我们可以找到默认配置文件地址: /usr/lib/systemd/system/postgresql-12.service
如果cat命令查看配置文件, 我们可以得到一些基础信息:
数据库数据目录: Environment=PGDATA=/var/lib/pgsql/12/data/
postgresql安装目录: PGHOME=/usr/pgsql-12/
数据库初始化
# 切换到postgres用户 su - postgres cd /usr/pgsql-12/bin ./initdb -D /var/lib/pgsql/12/data
**退回root用户, 重启postgrersql-12服务, 并设置开机自启 **
systemctl enable postgresql-12 && systemctl restart postgresql-12
**本机测试访问 **
su - postgres
-bash-4.2$ psql
postgres=# (这里就可以开始写查询语句了)
**配置远程访问 **
修改数据目录下配置文件: pg_hba.conf
vim /var/lib/pgsql/12/data/pg_hba.conf
# 在文件中添加:
host all all 0.0.0.0/0 md5
修改数据目录下配置文件: postgresql.conf
vim /var/lib/pgsql/12/data/postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外配置): listen_addresses = '*' port = 5432 max_connections = 100
修改完成重启服务, 使用远程命令或者远程客户端测试访问即可
-- 使用远程命令访问 psql -h 10.242.111.204 -p 5432 -U postgres -- 登陆成功可以执行操作 -- 如修改密码 (引号中为新密码) postgres=# alter role postgres with password 'postgres';
流复制原理简述
流复制大约是从pg9版本之后使用, 流复制其原理为:备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record。(关于预写式日志WAL,是一种事务日志的实现)
图中可以看到流复制中日志提交的大致流程为:
流复制同步级别
通过在postgresql.conf配置synchronous_commit参数来设置同步级别
synchronous_commit = off # synchronization level; # off, local, remote_write, or on
配置时需要注意的点:
su - postgres -bash-4.2$ psql postgres=# create role repuser login replication encrypted password 'repuser'; CREATE ROLE postgres=# \q
vim /var/lib/pgsql/12/data/pg_hba.conf
# 在文件中添加:
host replication repuser 0.0.0.0/0 md5
vim /var/lib/pgsql/12/data/postgresql.conf # 在文件中修改(此配置仅用于远程访问, 流复制后续还有额外配置): listen_addresses = '*' port = 5432 max_connections = 100 # 最大连接数,据说从机需要大于或等于该值 # 控制是否等待wal日志buffer写入磁盘再返回用户事物状态信息。同步流复制模式需要打开。 synchronous_commit = on # *=all,意思是所有slave都被允许以同步方式连接到master,但同一时间只能有一台slave是同步模式。 # 另外可以指定slave,将值设置为slave的application_name即可。 synchronous_standby_names = '*' wal_level = replica max_wal_senders = 2 #最多有2个流复制连接 wal_keep_segments = 16 wal_sender_timeout = 60s #流复制超时时间
修改完成重启postgresql-12服务systemctl restart postgresql-12
systemctl stop postgresql-12
mkdir /var/lib/pgsql/12/data chmod 0700 data chown postgres.postgres data
# 切换到postgres用户,否则备份的文件属主为root, 导致启动出错 su – postgres pg_basebackup -h 10.242.111.204 -p 5432 -U repuser -Fp -Xs -Pv -R -D /var/lib/pgsql/12/data # -h 的ip是当前的主库, -U 就是前面个船舰的用来复制的那个用户额外需要注意的是:
systemctl restart postgresql-12
使用命令或者远程客户端工具登入postgresql主(primary)数据库
# 切换垂直显示 postgres=# \x Expanded display is on. # 查询备机连接 postgres=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 27132 usesysid | 16384 usename | repuser application_name | walreceiver client_addr | 10.242.111.207 client_hostname | client_port | 34726 backend_start | 2020-06-19 16:23:01.309172+08 backend_xmin | state | streaming sent_lsn | 0/11000148 write_lsn | 0/11000148 flush_lsn | 0/11000148 replay_lsn | 0/11000148 write_lag | flush_lag | replay_lag | sync_priority | 1 sync_state | sync reply_time | 2020-06-19 18:39:43.346062+08 # 可以发现207的那台备机已经连接上, 并且使用的是 sync 同步模式(async 为异步) # 此时可以在主库上创建数据库/表/添加数据, 然后去备库上查询 以显示效果, 如: postgres=# create database test_204; postgres=# \test_204 postgres=# create table test_table(name text); postgres=# insert into test_table(name) values ('china'); # 补充基础查询命令 # \list 列出可用数据库 # \db_name 选择数据库 # \dt 查询关系表
至此, 流复制(数据同步)策略完成.
# 关闭主库primary systemctl stop postgresql-12 # 从库上执行切换 # 第一种 /usr/pgsql-12/bin/pg_ctl promote -D /var/lib/pgsql/12/data # 第三种 su postgres psql postgres=# select pg_promote(true,60); # 此时从库会提升为主库接管集群中的读写操作
pgpool-ii 中默认的 failover_command 切换数据库主备角色脚本, 是通过pg_ctl promote 来实现的
后续pgpool操作见下一篇文章
参考资料:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!