postgresql9.5主从hot_standby模式配置

来源:互联网 发布:域名要不要云解析 编辑:程序博客网 时间:2024/06/03 21:39
参考http://blog.csdn.net/wlwlwlwl015/article/details/53287855

前言

简单记录一下postgresql主从的实现方式之一——基于Standby的异步流复制,这是PostgreSQL9.x版本(2010.9)之后提供的一个很nice的功能,类似的功能在Oracle中是11g之后才提供的active dataguard和SQL Server 2012版本之后才提供的日志传送,此处再次为pg鼓掌,确实是一个很棒的开源数据库。废话不多说,本篇blog就详细记录一下在pg9.5中实现Hot Standby异步流复制的完整配置过程和注意事项。

Standby数据库原理

简单介绍一些基础概念与原理,首先我们做主从同步的目的就是实现db服务的高可用性,通常是一台主数据库提供读写,然后把数据同步到另一台从库,然后从库不断apply从主库接收到的数据,从库不提供写服务,只提供读服务。在postgresql中提供读写全功能的服务器称为primary databasemaster database,在接收主库同步数据的同时又能提供读服务的从库服务器称为hot standby server

PostgreSQL在数据目录下的pg_xlog子目录中维护了一个WAL日志文件,该文件用于记录数据库文件的每次改变,这种日志文件机制提供了一种数据库热备份的方案,即:在把数据库使用文件系统的方式备份出来的同时也把相应的WAL日志进行备份,即使备份出来的数据块不一致,也可以重放WAL日志把备份的内容推到一致状态。这也就是基于时间点的备份(Point-in-Time Recovery),简称PITR。而把WAL日志传送到另一台服务器有两种方式,分别是:

  1. WAL日志归档(base-file)
  2. 流复制(streaming replication)

第一种是写完一个WAL日志后,才把WAL日志文件拷贝到standby数据库中,简言之就是通过cp命令实现远程备份,这样通常备库会落后主库一个WAL日志文件。而第二种流复制是postgresql9.x之后才提供的新的传递WAL日志的方法,它的好处是只要master库一产生日志,就会马上传递到standby库,同第一种相比有更低的同步延迟,所以我们肯定也会选择流复制的方式。

在实际操作之前还有一点需要说明就是standby的搭建中最关键的一步——在standby中生成master的基础备份。postgresql9.1之后提供了一个很方便的工具—— pg_basebackup,关于它的详细介绍和参数说明可以在官网中查看,下面在搭建过程中再做相关具体说明,关于一些基础概念和原理先介绍到这里。

详细配置

下面开始实战,首先准备两台服务器,我这里开了2个虚机做测试,分别是(centos6也可以):

  1. 主库(master) centos-release-7-2.1511 192.168.3.193 postgresql 9.5.3
  2. 从库(standby) centos-release-7-2.1511 192.168.3.194 postgresql 9.5.3
  3. 从库(standby) centos-release-7-2.1511 192.168.3.195 postgresql 9.5.3

如果是编译安装的,在编译安装完成后需要做一些初始化工作:

  1. useradd postgres
  2. echo "postgres" | passwd --stdin postgres
  3. mkdir /usr/local/pgsql/data
  4. chown -R postgres /usr/local/pgsql/data
  5. su - postgres <<EOF
  6. /usr/local/pgsql/bin/initdb -k -D /usr/local/pgsql/data
  7. exit
  8. EOF
  9. chown -R postgres /usr/local/pgsql
  10. chmod -R 700 /usr/local/pgsql
warning:从库服务器可以跳过初始化数据库那一步

配置环境变量:

  1. export PGHOME=/home/postgres
  2. export PGDATA=/usr/local/pgsql/data
  3. export PATH=/usr/local/pgsql/bin:$PATH

以下工作都是在postgres用户下操作的。

主库配置

注意此处的操作都是在主库(192.168.3.193)上进行的,首先打开数据目录下的postgresql.conf文件然后做以下修改:

  1. listen_addresses = ‘*’(默认localhost)
  2. wal_level = hot_standby(默认是minimal)
  3. max_wal_senders=2(默认是0) #注意这个选项配置值要小于max_connections
  4. max_connections=100 (默认是100)#要确保max_connections大于max_wal_senders
  5. wal_keep_segments=64(默认是0)
  6. wal_log_hints=on (默认注释掉了) #执行pg_rewind需要配置
  7. hot_standby=on (默认注释掉了) #只对slaver有效,以便master倒掉时,slaver可以热切换到master

下面稍作说明:

   第一个不用说了,

   wal_level表示启动搭建Hot Standby,

   max_wal_senders则需要设置为一个大于0的数,它表示主库最多可以有多少个并发的standby数据库,

   wal_keep_segments也应当设置为一个尽量大的值,以防止主库生成WAL日志太快,日志还没有来得及传送到standby就被覆盖,但是需要考虑磁盘空间允许,一个WAL日志一个WAL日志文件是16M,如果wal_keep_segments设置为64,也就是说将为standby库保留64个WAL日志文件,那么就会占用16*64=1GB的磁盘空间,所以需要综合考虑,在磁盘空间允许的情况下设置大一些,就会减少standby重新搭建的风险。


开启数据库服务:

  1. pg_ctl start -l /usr/local/pgsql/log/pg_server.log

接下来还需要在主库创建一个超级用户来专门负责让standby连接去拖WAL日志:

  1. create user repl superuser password '111111';

接下来修改/usr/local/pgsql/data/pg_hba.conf:

  1. # TYPE DATABASE USER ADDRESS METHOD
  2. # "local" is for Unix domain socket connections only
  3. local all all trust
  4. # IPv4 local connections:
  5. hostpostgrespostgres192.168.3.0/24            trust
  6. host all all 127.0.0.1/32 trust
  7. # IPv6 local connections:
  8. host all all ::1/128 trust
  9. # Allow replication connections from localhost, by a user with the
  10. # replication privilege.
  11. #local replication postgres trust
  12. #host replication postgres 127.0.0.1/32 trust
  13. #host replication postgres ::1/128 trust
  14. hostreplicationrepl192.168.3.0/24trust
红色的为添加的,注意添加的位置不能随意
  1. hostpostgrespostgres192.168.3.0/24 trust
意思是允许用户postgres从192.168.3.0/24网络上前来同步本地数据库,如pg_rewind命令。

  1. hostreplicationrepl192.168.3.0/24trust

意思是允许用户repl从192.168.3.0/24网络上发起到本数据库的流复制连接,简言之即允许从库服务器连接主库去拖WAL日志数据。如pg_basebackup命令

warning:为了方便可以配成“trust”(从库服务器前来拉数据时不需要密码)


主库配置很简单,到此就算结束了,重启主库服务:

  1. pg_ctl restart -l /usr/local/postgresql/log/pg_server.log

从库配置

从此处开始配置从库(192.168.3.194),首先要通过pg_basebackup命令行工具在从库上生成基础备份,命令如下:

  1. ./pg_basebackup -h 192.168.3.193 -U repl -F p -x -P -R -D /usr/local/postgresql/data/ -l replbackup20161122

下面简单做一下参数说明(可以通过pg_basebackup --help进行查看)

   -h指定连接的数据库的主机名或IP地址,这里就是主库的ip。

   -U指定连接的用户名,此处是我们刚才创建的专门负责流复制的repl用户。

   -F指定了输出的格式,支持p(原样输出)或者t(tar格式输出)。

   -x表示备份开始后,启动另一个流复制连接从主库接收WAL日志。

   -P表示允许在备份过程中实时的打印备份的进度。

   -R表示会在备份结束后自动生成recovery.conf文件,这样也就避免了手动创建。

   -D指定把备份写到哪个目录,这里尤其要注意一点就是做基础备份之前从库的数据目录(/usr/local/postgresql/data)目录需要手动清空

   -l表示指定一个备份的标识,运行命令后看到如下进度提示就说明生成基础备份成功: 

如果在pg_hba.conf中指定的md5认证方式,则这里需要输入密码。

我们现在可以启动从库,在从库运行

  1. pg_ctl start -l /usr/local/postgresql/log/pg_server.log

启动后看一下日志是否正常,有问题处理。


现在就可以建表做测试了。

在master服务器(192.168.3.193)中的postgres库下建一张表并添加几条数据;

然后在standby服务器(192.168.3.194)中进行查看同步情况;

可以看到完美同步,那么从库是否能删除呢?测试一下: 
standby的数据无法删除,正如我们之前说的,standby只提供只读服务,而只有master才能进行读写操作,所以master才有权限删除数据,master删除的同时standby中的数据也将同步删除,关于异步流复制的内容到这里就已经全部介绍完毕了。


从库(192.168.3.195)操作同从库(192.168.3.194)


warning:也可以不创建superuser用户“repl”,而直接用postgres

原创粉丝点击