centos7下安装(源码安装)PostgreSQL主从复制

1 备份原理
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,关于它的详细介绍和参数可以在官网中查看。

1、获取源码

安装PostgreSQL的方法有很多,我们可以使用centos下的包管理器安装,也可以从官网下载二进制压缩包安装,但是很多时候包管理器的仓库和官网的二进制压缩包提供的版本过少,不能完全满足我们的需求。这时候我们可以选择从官网下载源码,自己编译安装。
从官网下载PostgreSQL源代码 https://www.postgresql.org/download/
,选择source选项,下载对应版本的源码压缩包即可,根据自己的喜爱,可以选择下载tar.gz格式或者tar.bz2格式的压缩包。
我的是wget下载

wget https://ftp.postgresql.org/pub/source/v9.6.3/postgresql-9.6.3.tar.gz

前期准备
在编译之前,我们需要先新增一个操作pg的用户postgres,以后所有关于数据库的操作都会使用这个用户。

#添加新的用户组
groupadd develop
useradd -d /home/postgres -m -g develop postgres
#为用户增加密码
passwd postgres

编译
安装过程第一步,我们要配置一些安装信息,通过解压后文件夹里的configure文件实现的。如果我们想采用默认的安装,只需要执行这个脚本即可,如果我们想自定义安装过程,那么我们在执行脚本的时候需要加上一下参数,部分参数如下:

–prefix=PREFIX_DIR: 加上这个参数,pg会把所有的编译后的文件放到这个文件夹中。默认情况下,系统会把这个值设置成usr/local/pgsql。所以我们要是想把pg安装到其他文件夹下,只需要在执行脚本的时候加上这个参数即可。(一般来说,自定义安装只需要用到这个选项)
–exec-prefix=EXEC-PREFIX:可以通过该选项,将相关的文件安装到EXEC-PREFIX文件夹下,而不使用–prefix设置的地方。这样做可以比较方便地在不同主机之间共享体系相关的文件。
–bindir=DIRECTORY:可执行程序的目录,如果不指定,默认是EXEC-PREFIX/bin,如果使用默认的–exec-prefix选项,则默认是PREFIX_DIR/bin。
–sysconfdir=DIRECTORY:各种配置文件的目录,默认是PREFIX_DIR/etc。

./configure --prefix=/opt/pgsql

上面例子,会把编译后的文件全部放到/home/postgres/pgsql目录下,包括可执行程序等文件也会放到这个目录下。
执行问configure脚本后,我们就可以执行 make命令执行源码。在执行源码之前我们需要检查是否有c编译器,如果没有,我们可以执行下面命令进行安装。

yum -y install gcc

有时候一些系统还缺少readline和zlib库,这时候我们还要执行下面命令安装。

yum -y install readline-devel
yum install zlib-devel

安装缺失的包之后就可以编译源码,安装。依次执行以下命令:

#这里选择将pg安装到这个目录下面,指定了–prefix之后,pg安装后文件会全部放到这里

./configure --prefix=/opt/pgsql
make
make install

用户环境变量
为之前新建的用户添加环境变量,这样该用户就能够直接执行命令去操作pg,而不是使用绝对路径去操作命令。打开新建用户的.bash_profile文件并在文件后面加入以下内容:

[postgres@m8-9p54-duanzhengnan data]$ cat /etc/profile.d/postgresql.sh 
export POSTGRESQL_HOME=/opt/pgsql
export PATH=/opt/pgsql/bin:$PATH
export PGDATA=/opt/pgsql/data
[postgres@m8-9p54-duanzhengnan data]$ source /etc/profile.d/postgresql.sh 
[postgres@m8-9p54-duanzhengnan data]$ source /etc/profile

修改服务属主,属组

chown postgres:postgres -R /opt/pgsql/

初始化数据库
由于配置了环境变量,所以此处我们直接执行initdb即可完成pg初始化。我们先键入initdb --help看一下命令相关的参数信息:

[root@m8-9p54-duanzhengnan data]$ su postgres
[postgres@m8-9p54-duanzhengnan data]$ initdb --help
initdb initializes a PostgreSQL database cluster.

Usage:   initdb [OPTION]... [DATADIR]

Options:   -A, --auth=METHOD         default authentication method for local connections
      --auth-host=METHOD    default authentication method for local TCP/IP connections
      --auth-local=METHOD   default authentication method for local-socket connections  [-D, --pgdata=]DATADIR     location for this database cluster   -E, --encoding=ENCODING   set default encoding for new databases
      --locale=LOCALE       set default locale for new databases
      --lc-collate=, --lc-ctype=, --lc-messages=LOCALE
      --lc-monetary=, --lc-numeric=, --lc-time=LOCALE
                            set default locale in the respective category for
                            new databases (default taken from environment)
      --no-locale           equivalent to --locale=C
      --pwfile=FILE         read password for the new superuser from file   -T, --text-search-config=CFG
                            default text search configuration   -U, --username=NAME       database superuser name   -W, --pwprompt            prompt for a password for the new superuser   -X, --xlogdir=XLOGDIR    location for the transaction log directory

Less commonly used options:   -d, --debug               generate lots of debugging output   -k, --data-checksums      use data page checksums   -L DIRECTORY              where to find the input files  
-n, --noclean             do not clean up after errors   -N, --nosync              do not wait for changes to be written safely to disk   -s, --show      show internal settings   -S, --sync-only           only sync data directory

Other options:   -V, --version             output version information, then exit   -?, --help                show this help, then exit 通过这些参数后面的介绍,我们可以在数据库初始化的时候指定数据目录、编码和日志等信息。 例

#初始化时指定了数据库的编码和数据目录

initdb  -E utf8 -D /opt/pgsql/data

启动和连接
在初始化数据库之后我们要考虑启动数据库,pg则是使用pg_ctl命令来控制数据库的启动和关闭。

[postgres@m8-9p54-duanzhengnan data]$ pg_ctl --help
pg_ctl is a utility to initialize, start, stop, or control a PostgreSQL server.

Usage:
  pg_ctl init[db]               [-D DATADIR] [-s] [-o "OPTIONS"]
  pg_ctl start   [-w] [-t SECS] [-D DATADIR] [-s] [-l FILENAME] [-o "OPTIONS"]
  pg_ctl stop    [-W] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
  pg_ctl restart [-w] [-t SECS] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
                 [-o "OPTIONS"]
  pg_ctl reload  [-D DATADIR] [-s]
  pg_ctl status  [-D DATADIR]
  pg_ctl promote [-D DATADIR] [-s]
  pg_ctl kill    SIGNALNAME PID

Common options:
  -D, --pgdata=DATADIR   location of the database storage area
  -s, --silent           only print errors, no informational messages
  -t, --timeout=SECS     seconds to wait when using -w option
  -V, --version          output version information, then exit
  -w                     wait until operation completes
  -W                     do not wait until operation completes
  -?, --help             show this help, then exit
(The default is to wait for shutdown, but not for start or restart.)

If the -D option is omitted, the environment variable PGDATA is used.

Options for start or restart:
  -c, --core-files       allow postgres to produce core files
  -l, --log=FILENAME     write (or append) server log to FILENAME
  -o OPTIONS             command line options to pass to postgres
                         (PostgreSQL server executable) or initdb
  -p PATH-TO-POSTGRES    normally not necessary

Options for stop or restart:
  -m, --mode=MODE        MODE can be "smart", "fast", or "immediate"

启动命令

[postgres@m8-9p53-duanzhengnan data]$ pg_ctl -D /opt/pgsql/data -l logfile start
server starting

从帮助文档我们可以看到,使用pg_ctl命令可以帮我们启动、重启和关闭数据库。同时我们可以在启动的时候使用-D来指定数据库数据的目录,在下面的介绍我们可以看到,如果我们没有指定这个选项,那么就会使用环境变量中配置的目录,也就是我们之前在环境变量中配置PGDATA;我们也可以使用-l选项来指定日志的存储地点,以便我们方便查看数据库的日志信息。
启动数据库之后我们就可以使用psql命令连入数据库中,进入数据库我们首先要做的就是设置postgres用户的密码,键入\password,输入密码即可。
做完这些基本上就能够使用了,但是这样只能够允许我们在本机使用数据库,其他的网络是不能够连接到我们数据库的,所以我们要设置数据库允许远程访问。

修改postgresql.conf文件
找到安装目录下的postgresql.conf文件,并且在文件中找到listen_addresses选项,将其改成如下所示内容:

listen_addresses = '*'

修改pg_hba.conf文件
在与postgresql.conf文件相同的目录下找到该配置文件,打开该文件,编辑或添加下面一行。(也可以改成你允许连接的ip)

# TYPE  DATABASE  USER  CIDR-ADDRESS  METHOD
host  all  all 0.0.0.0/0 md5

重启数据库即可。

pg_ctl -D /opt/pgsql/data -l logfile restart

配置主从
主/从数据库复制是将数据从主数据库复制到另外一个或者多个数据库的过程。主要好处是能够将数据分发到不同的数据库中,当主数据库出现故障时,可以请求从数据库中的数据,保证不会出现请求的中断。同样,我们也可以使用从数据库来分担主数据库的压力,加快数据的处理速度。
postgres在9.0之后引入了主从流复制机制,从数据库通过tcp流从主数据库中同步相应的数据。
配置主从前我们要准备两台装了相同版本的 postgresql的服务器,假设我们有两台装了pg的服务器,ip分别为172.30.20.1,172.30.20.2,我们规定172.30.20.1上面装的数据库为主库,172.30.20.2上面的数据库为从库。
修改服务属主,属组,并切换用户

chown postgres:postgres -R /opt/pgsql/
[root@m8-9p54-duanzhengnan data]$ su postgres

配置主数据库
1、首先在数据库安装目录下创建一个存放归档的文件夹

#数据库安装目录为/opt/pgsql

mkdir /opt/pgsql/archive

2、我们需要一个数据库用户进行主从同步。在主数据创建用户,赋予登录和复制的权限

#密码根据个人自己定义

[postgres@m8-9p53-duanzhengnan data]$ psql
psql (9.6.3)
Type "help" for help.

postgres=# create role replica login replication encrypted password '123456';
CREATE ROLE

3、允许新建的用户进行同步
在data目录下找到配置文件pg_hba.conf,在配置文件中加入如下两行

host     all             all          172.30.20.2/32          trust   #允许从服务器连接到主服务器
host   replication      replica       172.30.20.2/32          md5   #允许从服务器使用replica用户来复制

4、修改postgresql.conf配置文件
找到配置文件postgresql.conf,修改配置文件,如下所示的选项进行修改

listen_addresses = '*'   # 监听所有IP
archive_mode = on  # 允许归档
archive_command = 'cp %p /home/postgres/pgsql/archive/%f'  # 用该命令来归档logfile segment
wal_level = hot_standby 
max_wal_senders = 32 # 这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个wal_keep_segments = 256 # 设置流复制保留的最多的xlog数目
wal_sender_timeout = 60s #设置流复制主机发送数据的超时时间
max_connections = 100 # 这个设置要注意下,从库的max_connections必须要大于主库的

配置完上面选项之后就可以重启数据库,接着配置从数据库。

从数据库配置
1、为了保证基础数据的一致,我们先从主数据库将起data目录下的数据复制到从数据库的data目录下

#先将data目录下的数据都清空

rm -rf /opt/pgsql/data/* 
# 从主数据库拷贝数据到从数据库(基础备份)
pg_basebackup -h 172.30.20.1 -U replica -D /opt/pgsql/data -X stream -P  
#新建归档存储的文件夹
mkdir /opt/pgsql/archive

2、配置recovery.conf
将安装目录下share目录下的recovery.conf.sample文件复制到data目录下,并改名为recovery.conf,修改文件。

standby_mode = on    # 说明该节点是从服务器
primary_conninfo = 'host=172.30.20.1 port=5432 user=replica password=123456'  # 主数据库的信息以及连接的用户
recovery_target_timeline = 'latest'

3、配置postgresql.conf
找到配置文件postgresql.conf,修改配置文件,如下所示的选项进行修改

wal_level = hot_standby
max_connections = 1000 #一般查多于写的应用从库的最大连接数要比较大
hot_standby = on #说明这台机器不仅仅是用于数据归档,也用于数据查询
max_standby_streaming_delay = 30s #数据流备份的最大延迟时间
wal_receiver_status_interval = 10s #多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间
hot_standby_feedback = on #如果有错误的数据复制,是否向主进行反馈

配置完就可以重启从服务器。
验证主从是否配置成功
1、在主数据库上执行一下sql,即可查看相应的从数据库的信息
[

postgres@m8-9p53-duanzhengnan data]$ psql
psql (9.6.3)
Type "help" for help.

postgres=# select client_addr,sync_state from pg_stat_replication;
 client_addr | sync_state 
-------------+------------
 172.30.20.2 | async
(1 row)

2、通过查看两个服务器的进程来判断,分别在两个服务器上执行命令ps -ef | grep postgres,在主服务器上我们可以看到一个walsender的进程;在从服务器上我们可以看到一个walreceiver的进程,这样就证明主从配置完成。

链接:https://www.jianshu.com/p/ba67f0694405
来源:简书

你可能感兴趣的:(Postgresql)