昔我往矣

PostgreSQL实战(上):搭建主从集群

2021年03月4日

本系列分为上下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

当前暂无评论 »

添加新评论 »