PostgreSQL实战(上):搭建主从集群
本系列分为上下2篇,上篇是搭建PostgreSQL主从集群,下篇是使用repmgr配置高可用PostgreSQL集群。这里是上篇,搭建一个具备数据自动复制的主从PostgreSQL集群。
以下是搭建环境,IP地址和版本等。
主:172.17.0.7
从:172.17.0.8
系统:CentOS 7.6
PostgreSQL-10
安装和环境准备
执行安装和数据目录准备,在主从服务器上同时进行操作。
# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# yum install -y postgresql10-server postgresql10-contrib.x86_64
postgresql默认数据目录是/var/lib/pgsql/10/data/,我们按自己的需求修改下。创建数据目录/data/pgsql_data/10/data
和修改postgres用户家目录。
# mkdir -p /data/pgsql_data/10/data
# chown -R postgres:postgres /data/pgsql_data/
# chmod 700 /data/pgsql_data/
# usermod postgres -d /data/pgsql_data/
修改postgresql服务的systemd unit文件,/usr/lib/systemd/system/postgresql-10.service
,通过修改如下一行改变postgresql的数据目录。
...
Environment=PGDATA=/data/pgsql_data/10/data
...
然后重载systemd
# systemctl daemon-reload
配置主服务器
在主服务器上执行如下的操作。
初始化数据库
# /usr/pgsql-10/bin/postgresql-10-setup initdb
创建归档目录
# mkdir /data/pgsql_data/10/data/pg_archive
# chown -R postgres:postgres /data/pgsql_data/10/data/pg_archive
修改主配置文件postgresql.conf
和授权文件pg_hba.conf
:
在/data/pgsql_data/10/data/postgresql.conf
中启用并按照如下的配置修改这些行:
listen_addresses = '*'
shared_preload_libraries = 'pg_stat_statements' # (change requires restart)
wal_level = replica # minimal, replica, or logical
synchronous_commit = local # synchronization level;
archive_mode = on # enables archiving; off, on, or always
archive_command = 'test ! -f /data/pgsql_data/10/data/pg_archive/%f && cp %p /data/pgsql_data/10/data/pg_archive/%f' # command to use to archive a logfile segment
synchronous_standby_names = '*' # standby servers that provide sync rep
对/data/pgsql_data/10/data/pg_hba.conf
也进行修改操作,ADDRESS字段修改成主从服务器的IP地址:
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 172.17.0.7/32 trust
host all all 172.17.0.8/32 trust
host all all 0.0.0.0/0 md5
host replication replicauser 172.17.0.7/32 trust
host replication replicauser 172.17.0.8/32 trust
trust的含义是免认证
md5是使用密码认证
replicauser 是用于同步的专门用户,后面的步骤中会创建
启动主postgresql
# systemctl start postgresql-10.service
创建同步专用用户replicauser,给默认的postgres用户添加密码:
# su - postgres
$ createuser -U postgres replicauser -c 5 --replication # 创建从专用于复制的帐号 replicauser
$ psql
postgres=# alter user postgres with password '123456'; # 给postgres用户设置密码为 123456
配置standby服务器
在standby服务器上操作,由于配置了trust,所以standby上的数据同步操作不需要密码。
# su - postgres
$ pg_basebackup -h 172.17.0.7 -U replicauser -D /data/pgsql_data/10/data/ -P -Xs -R
数据同步完成后,切换到root用户,启动postgresql
# chmod go-rwx /data/pgsql_data/10/data
# systemctl start postgresql-10
此时,主从2台服务器应该处理同步状态了。
验证主从同步
在primary服务器上使用postgres用户操作,创建pg_test数据库,并新建test表。
$ createdb pg_test
$ psql
postgres=# \c pg_test
pg_test=# create table test(id integer);
pg_test=# insert into test(id) values(2);
到standby服务器上查询test表数据,应该可以看到数据被同步过来了。
pg_test=# select * from test;
id
----
2
(1 row)
在primary上查看postgresql的同步状态,:
postgres=# \x
Expanded display is on.
postgres=# select * from pg_stat_replication ;
pid | 4288
usesysid | 16389
usename | replicauser
application_name | walreceiver
client_addr | 172.17.0.8
client_hostname |
client_port | 9418
backend_start | 2021-03-10 15:57:10.950824+00
backend_xmin |
state | streaming
sent_lsn | 0/40172B0
write_lsn | 0/40172B0
flush_lsn | 0/40172B0
replay_lsn | 0/40172B0
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
可以从以上结果看到客户端信息和主从同步的状态等。
手工故障切换
如果172.17.0.7发生了故障,此时,应该将172.17.0.8提升为primary,然后想办法恢复172.17.0.7机器,并且清空172.17.0.7的数据且将其设置为新的standby,向172.17.0.8同步数据。切换测试的步骤如下
提升standby为primary
关掉172.17.0.7上的postgresql服务,模拟primary发生故障。在172.17.0.7上使用postgres用户操作
$ /usr/pgsql-10/bin/pg_ctl stop -D /data/pgsql_data/10/data/
此时,172.17.0.8的角色仍然还是standby,standby的数据库是只读,只有提升standby为primary,其状态才变成可写。在172.17.0.8上切换到postgres用户操作,进行角色提升
$ psql -d pg_test
pg_test=# insert into test(id) values(100);
ERROR: cannot execute INSERT in a read-only transaction # 此时还处于read-only
pg_test=# \q
$ /usr/pgsql-10/bin/pg_ctl -D /data/pgsql_data/10/data promote # 提升角色为primary
waiting for server to promote.... done
server promoted
$ psql -d pg_test
pg_test=# insert into test(id) values(100); # 切换之后,数据库可以写入了
INSERT 0 1
pg_test=# select * from test; # 验证写入成功
id
-----
2
100
(2 rows)
此时,完成了将172.17.0.8提升为primary。
将原master变成standdby
为了保证集群的数据同步和备份,在172.17.0.7恢复后,先别启动postgres服务,应将设置为172.17.0.8的standby,在172.17.0.7上执行如下操作:
$ rm -rf /data/pgsql_data/10/data/* # 清理数据
$ pg_basebackup -h 172.17.0.8 -U replicauser -D /data/pgsql_data/10/data/ -P -Xs -R #从新172.17.0.8上同步数据
96962/96962 kB (100%), 1/1 tablespace
# systemctl start postgresql-10.service # 切换到root,启动数据库服务
此时,主从服务器互换,172.17.0.8是primary,172.17.0.7是standby。使用前面的“验证主从同步”方法可进行验证。
创建业务数据库和数据库用户
前面的部分我们接触到了postgresql自带的postgres用户,我们自己也创建了专用于数据同步的replicauser用户,还创建了pg_test测试用的数据库。下面我们来建立应用专用的数据库和用户。
$ createdb xnow_blog
$ createuser xnow_user
$ psql
postgres=# alter database xnow_blog owner to xnow_user ;
postgres=# alter user xnow_user with password 'xnow123';
psql测试下连接的效果。
$ psql -h localhost -U xnow_user -d xnow_blog
Password for user xnow_user:
psql (10.16)
Type "help" for help.
xnow_blog=>
PostgreSQL客户端
桌面客户端有pgAmin 4
命令行客户端有psql和pgcli,psql是官方命令行工具,pgcli比较友好。
参考
浅谈PostgreSQL高可用架构:http://www.postgres.cn/downfiles/pg2016conf_day1_s3_pm4.pdf
postgresql高可用集群安装: https://www.huaweicloud.com/articles/c9085371664cf7832506b107950f2e91.html
当前暂无评论 »