由于工作需要,最近开始接触各种数据库,并尝试各种数据库产品的高可用方案。
今天分享的是postgresSQL的主从配置,其实还是蛮简单的,跟随本文的步骤,保证能实现PG主从的搭建。
1. 安装环境
1
2
3
4
<code>192.168.0.136 主库</code>
<code>192.168.0.160 从库</code>
<code>PORT: 5432</code>
<code>USR: postgres</code>
2. 主库已经运行一段时间,检查主库的version,保证主从数据库的version相同。
5
6
7
<code># psql </code><code>--version</code>
<code>psql (PostgreSQL) 9.4.11</code>
<code># rpm -qa|grep postgres</code>
<code>postgresql94-libs-9.4.11-1PGDG.rhel6.x86_64</code>
<code>postgresql94-server-9.4.11-1PGDG.rhel6.x86_64</code>
<code>postgresql94-9.4.11-1PGDG.rhel6.x86_64</code>
3. 在从库上安装相同版本的软件
检查安装情况,已经安装和primary相同的软件版本
4. 查询主库的数据库位置
8
9
10
<code># su - postgres</code>
<code>$ echo $PGDATA</code>
<code>/var/lib/pgsql/9.4/data</code>
<code>$ cd /var/lib/pgsql/9.4/data</code>
<code>$ ls</code>
<code>base pg_clog pg_hba.conf pg_log pg_multixact </code>
<code>pg_replslot pg_snapshots pg_stat_tmp pg_tblspc PG_VERSION </code>
<code>postgresql.auto.conf postmaster.opts </code><code>global</code> <code>pg_dynshmem pg_ident.conf </code>
<code> </code><code>pg_logical pg_notify pg_serial pg_stat pg_subtrans </code>
<code> </code><code>pg_twophase pg_xlog postgresql.conf postmaster.pid</code>
确认配置文件位置
<code>postgres=# show config_file;</code>
<code> </code><code>config_file </code>
<code>-----------------------------------------</code>
<code> </code><code>/var/lib/pgsql/9.4/data/postgresql.conf</code>
查看数据文件目录
<code>postgres=# show data_directory;</code>
<code> </code><code>data_directory </code>
<code>-------------------------</code>
<code> </code><code>/var/lib/pgsql/9.4/data</code>
5. 准备修改主库的参数文件,先查询一下pg_hba.conf已有的参数内容
<code>$ cat pg_hba.conf|grep -v </code><code>'^#'</code>
<code>local</code> <code>all</code> <code>all</code> <code>peer</code>
<code>host </code><code>all</code> <code>all</code> <code>0.0.0.0/0 trust</code>
<code>host </code><code>all</code> <code>all</code> <code>::1/128 ident</code>
6. 在主库的pg_hba.conf中添加
<code>$ more pg_hba.conf</code>
<code>host replication replica 192.168.0.160 md5</code>
这样,就设置了replica这个用户可以从192.168.0.160 对应的网段进行流复制请求。
7. 在主库给postgres设置密码,登录和备份权限。
<code>$psql</code>
<code>postgres# </code><code>CREATE</code> <code>ROLE replica login replication encrypted </code><code>password</code> <code>'replica123'</code>
8. 修改postgresql.conf,注意设置下下面几个地方:
<code>wal_level = hot_standby # 这个是设置主为wal的主机</code>
<code>max_wal_senders = 10 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个</code>
<code>wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目</code>
<code>wal_sender_timeout = 60s # 设置流复制主机发送数据的超时时间</code>
<code>max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的</code>
<code>archive_mode = </code><code>on</code>
<code>archive_command = </code><code>'cp %p /var/lib/pgsql/9.4/archive/%f'</code>
9. 创建对应archive log存放路径
<code>mkdir -p /var/lib/pgsql/9.4/archive/</code>
10. 重启主库,让配置生效
<code># service postgresql-9.4 start</code>
<code>Starting postgresql-9.6 service: [ OK ]</code>
11. 在从库远程连接主数据库,验证replica用户是否可以正常访问
<code> </code><code>psql -h IP-address -p 5432 dbname usename </code>
<code> </code><code>psql -h 192.168.0.136 -p 5432 postgres replica</code>
12. 然后在主库做一次基础备份(后面的Hot-standby主要使用data目录下文件):
<code>postgres=# </code><code>SELECT</code> <code>pg_start_backup(</code><code>'bak20170905'</code><code>);</code>
<code>$tar czvf /var/lib/pgsql/9.4/backups/backup_data.tar.gz.20170905 /var/lib/pgsql/9.4/data</code>
<code>postgres=# </code><code>SELECT</code> <code>pg_stop_backup();</code>
13. 将备份文件sftp到从库,并解压,替换原有的data目录
<code>cd /var/lib/pgsql/9.4/</code>
<code>mv data data_bk</code>
<code>mv backup_data.tar.gz.20170905 backup_data.tar.gz</code>
<code>tar -xzvf backup_data.tar.gz</code>
14. 删除一些就的身份信息,归档日志文件等
<code>rm -rf data/pg_xlog/</code>
<code>mkdir -p data/pg_xlog/archive_status</code>
<code>rm data/postmaster.pid</code>
15. 查找并拷贝recovery.conf.sample文件到data目录下
<code>find / -</code><code>name</code> <code>recovery.conf.sample</code>
<code>/root/postgresql/postgresql-9.2.20/src/backend/access/transam/recovery.conf.sample </code>
<code>/usr/pgsql-9.4/share/recovery.conf.sample</code>
<code>复制</code>
<code>cp /usr/pgsql-9.4/share/recovery.conf.sample /var/lib/pgsql/9.4/data/recovery.conf</code>
16. 然后编辑recovery.conf:
<code>standby_mode = </code><code>on</code>
<code>restore_command = </code><code>'cp /var/lib/pgsql/9.4/archive/%f %p'</code> <code>#这个参数,我还需要确认具体含义</code>
<code>primary_conninfo = </code><code>'host=192.168.0.136 port=5432 user=replica password=replica123'</code> <code># 主服务器的信息以及连接的用户,这条信息最重要</code>
<code>recovery_target_timeline = </code><code>'latest'</code>
17. 拷贝下面配置文件
<code>cp /var/lib/pgsql/9.4/data.bk/postgresql.conf /var/lib/pgsql/9.4/data/postgresql.conf</code>
<code>cp /var/lib/pgsql/9.4/data.bk/pg_hba.conf /var/lib/pgsql/9.4/data/pg_hba.conf</code>
18. 然后编辑pstgresql.conf:
<code>hot_standby = </code><code>on</code>
19. 启动Hot-Standby:
<code>/usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data </code><code>--port=5432</code>
20. 验证是否部署成功
在主节点上执行,验证已经成功搭建,说明5.160是从服务器,在接收流,而且是异步流复制。
<code>postgres=# </code><code>select</code> <code>client_addr,sync_state </code><code>from</code> <code>pg_stat_replication;</code>
<code> </code><code>client_addr | sync_state </code>
<code>-------------+------------</code>
<code> </code><code>192.168.0.160 | async</code>
21. 查询更多数据同步信息:
<code>postgres=# </code><code>select</code> <code>usename,application_name,client_addr,client_port,backend_start,backend_xmin,state,sent_location,write_location,flush_location,replay_location,sync_priority,sync_state </code><code>from</code> <code>pg_stat_replication;</code>
<code> </code><code>usename | application_name | client_addr | client_port | backend_start | backend_xmin | state | sent_location | write_location | flush_location | replay_location | sync_priority | sync_state </code>
<code>---------+------------------+-------------+-------------+-------------------------------+--------------+-----------+---------------+----------------+----------------+-----------------+---------------+------------</code>
<code> </code><code>replica | walreceiver | 192.168.0.160 | 39375 | 2017-09-05 17:49:22.512393+08 | | streaming | 5/1049488 | 5/1049488 | 5/1049488 | 5/1049488 | 0 | async</code>
22. 此外,还可以分别在主、从节点上运行 ps aux | grep postgres 来查看进程:
主服务器上,可以看到有一个 wal sender 进程,还有archiver进程等
<code># ps aux | grep postgres</code>
<code>postgres 1104 0.0 0.1 324652 15120 ? S 14:26 0:00 /usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data </code>
<code>postgres 1111 0.0 0.0 324652 5844 ? Ss 14:26 0:00 postgres: wal writer process </code>
<code>postgres 1113 0.0 0.0 179796 1544 ? Ss 14:26 0:00 postgres: archiver process </code><code>last</code> <code>was 000000010000000500000000.00000060.backup</code>
<code>postgres 8515 0.0 0.0 325448 3108 ? Ss 17:49 0:00 postgres: wal sender process replica 192.168.0.160(39375) streaming 5/103A1D0</code>
从服务器上,可以看到 wal receiver 进程,和recovering进程正在恢复archive log
<code>$ ps aux | grep postgres</code>
<code>postgres 11508 0.0 0.1 324684 15128 ? S 17:49 0:00 /usr/pgsql-9.4/bin/postmaster -D /var/lib/pgsql/9.4/data</code>
<code>postgres 11510 0.0 0.0 324796 4336 ? Ss 17:49 0:00 postgres: startup process recovering 000000010000000500000001</code>
<code>postgres 11513 0.0 0.0 331892 3700 ? Ss 17:49 0:00 postgres: wal receiver process streaming 5/103A1D0</code>
23. 可以在下面路径中,看到从库接收的archive log文件
<code># pwd</code>
<code>/var/lib/pgsql/9.4/data/pg_xlog</code>
<code># ls</code>
<code>000000010000000500000001 000000010000000500000002 archive_status</code>
至此,PostgreSQL主从流复制安装部署完成。
在主服务器上插入数据或删除数据,在从服务器上能看到相应的变化。从服务器上只能查询,不能插入或删除数据。
24. 第12、13、14步骤,可以通过另一种拷贝主库到从库的方法,pg_basebackup命令拷贝文件
<code>pg_basebackup -F p </code><code>--progress -D /var/lib/pgsql/9.4/data2 -h 192.168.0.136 -p 5432 -U replica --password</code>
进入到/var/lib/pgsql/9.4/data2目录,修改recovery.conf,这个文件可以从pg的安装目录的share文件夹中获取,比如
<code>cp /usr/pgsql-9.6/share/recovery.conf.sample /var/lib/pgsql/9.6/data2/recovery.conf</code>
确保文件夹权限是700,这个很关键,其他权限,不能正常启动
<code>$ chmod 0700 /var/lib/pgsql/9.6/data2</code>
使用下面命令启动standby
<code>$ /usr/pgsql-9.6/bin/postmaster -D /var/lib/pgsql/9.6/data2</code>
<code></code>
本文转自 hsbxxl 51CTO博客,原文链接:http://blog.51cto.com/hsbxxl/1963039,如需转载请自行联系原作者