Rootop 服务器运维与web架构

postgresql-9.6 异步复制

参考:http://blog.csdn.net/wzyzzu/article/details/53331206

官网:https://www.postgresql.org/download/linux/redhat/

环境:
master   192.168.10.50    centos7
slave       192.168.10.51    centos7

主:
安装,根据官网文档安装
[root@localhost ~]# yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm
[root@localhost ~]# yum install -y postgresql96-server postgresql96
[root@localhost ~]# /usr/pgsql-9.6/bin/postgresql96-setup initdb  #初始化数据库
[root@localhost ~]# systemctl enable postgresql-9.6
[root@localhost ~]# systemctl start postgresql-9.6
[root@localhost ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 557/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 2272/postmaster
tcp6 0 0 :::22 :::* LISTEN 557/sshd
tcp6 0 0 ::1:5432 :::* LISTEN 2272/postmaster

# 切换到 postgres 用户,创建复制账号。这里给了超级权限
[root@localhost ~]# su postgres
bash-4.2$ psql

# 用户名 rep 密码 rep
postgres=# create user rep superuser password ‘rep’;
CREATE ROLE

# 查看用户
postgres=# \du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
rep | Superuser | {}

# 退出
postgres=# \q
bash-4.2$ exit

# 修改 postgresql.conf 配置文件
[root@localhost ~]# vi /var/lib/pgsql/9.6/data/postgresql.conf
# 监听地址,否则无法远程连接
listen_addresses = ‘*’

# 这个是设置主为wal的主机
wal_level = hot_standby

# 设置最多有几个流复制连接,有几个从就设置几个
max_wal_senders = 1

# 设置一个尽量大的值,以防止主库生成WAL日志太快,日志还没有来得及传送到standby就被覆盖 一个WAL日志文件是16M
wal_keep_segments = 64

# 设置流复制主机发送数据的超时时间
wal_sender_timeout = 120s

# 从库的max_connections必须要大于主库的
max_connections = 100

保存,退出。

修改 pg_hba.conf 配置文件,追加一行
[root@localhost ~]# vi /var/lib/pgsql/9.6/data/pg_hba.conf
host replication rep 192.168.10.51/32 md5
允许rep用户从ip 192.168.10.51 来获取wal日志

重启服务
[root@localhost ~]# systemctl restart postgresql-9.6

从库:
安装,注意没有初始化这步
[root@localhost ~]# yum install -y https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm
[root@localhost ~]# yum install -y postgresql96-server postgresql96
[root@localhost ~]# systemctl enable postgresql-9.6

用pg_basebackup命令行工具在从库上生成基础备份,并生成 recovery.conf 配置文件。可以省去手动配置。

[root@localhost ~]# pg_basebackup -F p -R --progress -D /var/lib/pgsql/9.6/data -h 192.168.10.50 -p 5432 -U rep --password
Password: 输入密码
22826/22826 kB (100%), 1/1 tablespace
NOTICE: WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup

参数说明(可以通过pg_basebackup –help进行查看)
-h指定连接的数据库的主机名或IP地址
-U指定连接的用户名,此处是主库创建的rep用户
-F指定了输出的格式,支持p(原样输出)或者t(tar格式输出)
-x表示备份开始后,启动另一个流复制连接从主库接收WAL日志。
-P表示允许在备份过程中实时的打印备份的进度。
-R表示会在备份结束后自动生成recovery.conf文件,避免手动创建。
-D指定把备份写到哪个目录,注意做基础备份之前从库的数据目录 /var/lib/pgsql/9.6/data 下需要是空的,或者手动清空。

这样在 /var/lib/pgsql/9.6/data 目录下,可以省去配置 recovery.conf 步骤

编辑从库配置文件
[root@localhost ~]# vi /var/lib/pgsql/9.6/data/postgresql.conf

# 说明这台机器不仅用于数据归档,也用于数据查询
hot_standby = on

# 最大连接数,大于主
max_connections = 1000

# 数据流备份的最大延迟时间
max_standby_streaming_delay = 30s

# 多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
wal_receiver_status_interval = 10s

# 如果有错误的数据复制,是否向主进行反馈
hot_standby_feedback = off

保存,退出。

修改属主,否则启动服务会失败
[root@localhost ~]# chown -R postgres:postgres /var/lib/pgsql/9.6/data

启动服务
[root@localhost ~]# systemctl start postgresql-9.6

上查看进程,确保有 wal sender process 字样
[root@localhost pg_xlog]# ps aux | grep postgre
postgres 4725 0.0 0.8 357580 15280 ? Ss 12:49 0:00 /usr/pgsql-9.6/bin/postmaster -D /var/lib/pgsql/9.6/data/
postgres 4727 0.0 0.0 210460 1560 ? Ss 12:49 0:00 postgres: logger process
postgres 4729 0.0 0.1 357580 3220 ? Ss 12:49 0:00 postgres: checkpointer process
postgres 4730 0.0 0.1 357580 2964 ? Ss 12:49 0:00 postgres: writer process
postgres 4731 0.0 0.3 357580 6128 ? Ss 12:49 0:00 postgres: wal writer process
postgres 4732 0.0 0.1 358004 2816 ? Ss 12:49 0:00 postgres: autovacuum launcher process
postgres 4733 0.0 0.1 212580 1916 ? Ss 12:49 0:00 postgres: stats collector process
postgres 4963 0.0 0.1 358376 3312 ? Ss 13:07 0:00 postgres: wal sender process rep 192.168.10.51(35022) streaming 0/3000220

上查看进程,有 wal receive 字样
[root@localhost ~]# ps aux | grep postgre
postgres 3195 0.0 1.4 375892 27360 ? Ss 13:07 0:00 /usr/pgsql-9.6/bin/postmaster -D /var/lib/pgsql/9.6/data/
postgres 3197 0.0 0.0 210460 1552 ? Ss 13:07 0:00 postgres: logger process
postgres 3198 0.0 0.1 375956 2400 ? Ss 13:07 0:00 postgres: startup process recovering 000000010000000000000003
postgres 3199 0.2 0.1 383044 3600 ? Ss 13:07 0:00 postgres: wal receiver process streaming 0/3000220
postgres 3200 0.0 0.1 375892 1916 ? Ss 13:07 0:00 postgres: checkpointer process
postgres 3201 0.0 0.1 375892 1924 ? Ss 13:07 0:00 postgres: writer process

这样主从复制就可以了。

登陆两台pg数据库,创建表,插入数据,都会同步到从库。

注意:

pg需要编辑 /var/lib/pgsql/9.6/data/pg_hba.conf 加一条 host all rep 0.0.0.0/0 md5 才能用rep远程登陆pg数据库。否则用户是无法远程登陆的。

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/3928.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。