PG主备架构(一)异步复制

PG主备架构(一) 异步复制

今天我们讲讲PG的贮备架构,又叫流复制,什么是流复制?我们都知道,在做其他数据库的高科用架构的时候,都会用到一个东西就是日志,mysql有binlog,Oracle有redo日志。他们的性质其实都是一样的,日志文件都是循环写覆盖写的,这个时候想要将这段时间的所有的数据库变化都记录下来,就要用到这些日志文件,或者叫做归档文件。而在PG当中,所谓流复制,其实就是将WAL日志(不知道WAL是啥的去看看我体系结构那篇文章)传递的方法。所以这里和其他的数据库高可用架构一样,有同步和异步的区别。

异步复制:

所谓异步复制,就是当primary产生日志之后,传到standby,就不管了,也不管standby是不是接受到了这个日志,也不管standby是不是应用了这个日志。异步同步方式是在PostgreSQL9.0当中才有的,这种方式的性能好,但是可能会丢数据,而且这种方法有个致命的缺点是standby的数据一直落后在master之后。比如说在数据量很大的时候,并且数据做了读写分离,如果日志传递出现了一些差异,这个时候就可能会导致mater和standby的数据不一致。难受!!!!

同步复制:

所谓同步复制,就是当primary产生日志之后,传到standby,等到standby应用完这个日志之后,返回一个信号,primary才会继续工作。否则primary就一直hang在那。。。。。。。。。。对没错,一直hang。。。。。。。。。。同步复制是在PostgreSQL9.1才有的,这种方式的问题就是一致性我是保证了,但是我的性能出现了问题,而且最最头疼的是,如果我的Standby宕机了。那我在执行事务的时候,我的master会一直的hang在那,我们的业务也就跟着停了。但是PG出了一个解决的方案,就是再加一个standby节点,当我的一个standby节点出现了问题的话,那么我还有一个standby在,这样我的primary知道现在还有一个节点活着,那么就不会hang在那了。这个时候我们可能会想到,如果有多个standby节点,如果我网络有问题,那是不是我的primary要等我的所有的standby都从primary获取完日志并且应用后才能才能进行其他的事务,那这样性能岂不是差的也太远了?hahaha!是的,PG在9.2的时候,出现了一种级联的复制架构,就是只有一个standby节点从primary上拿日志,而其他的standby从那个standby上拿日志,这样又保证宕掉一个standby节点primary不会停,又保证了数据同步的时候的性能问题。

等等,大家是不是觉得跟MySQL特别的像啊?对,就是跟MySQL特别特别的像。

好了,不多扯了,直接上干货!!!

声明:我的数据库是我们公司的UXDB,和PG几乎类似,所以大家如果是用的PG的话,就只需要把我下面出现的参数,视图当中有UX开头的换成PG即可。

服务器信息:

异步搭建流程:

我搭建异步的只用两个服务器,primary和slave

primary操作:

首先配置/etc/hosts文件

将这个文件scp到其他服务器

scp /etc/hosts master:/etc/hosts

scp /etc/hosts slave:/etc/hosts

我们在主库的数据目录当中找到一个文件,ux_hba.conf这个文件(在PG里面这个文件叫做pg_hba.conf),这个文件当中记录了我们连接的一些信息:

我们看一下这个文件,这个文件的作用就是访问认证,认证连接的规则:

TYPE:这是连接方法,连接方法有四种:local,host,hostssl,hostnossl;

local表示本地连接,就是本地套接字连接。

host表示使用TCP/IP进行连接,这个连接方式可以连接SSL的连接,也可以连接非SSL的连接。SSL是安全套接层,是网络层的加密协议,防止数据中途被抓包窃取。

hostssl表示只认证通过TCP/IP,并且只能连接SSL的连接。

hostnossl表示值认证通过TCP/IP,并且只能连接非SSL的连接。

再修改完这个文件之后,我们不需要将数据库重启,只需要把数据库重新加载一下即可 ux_ctl -D /home/uxdb/uxclu reload(注意如果是PG请使用pg_ctl)

DATABASE:

这里是限制连接的数据库

database_name 表示对应的IP仅可以供限制的数据库进行连接,如果有多个数据库,用','隔开就行。

all 表示所有数据库

sameuser 表示仅匹配请求方和目标方同名的用户。

samegroup 表示仅匹配请求方和目标方在同组的用户。

replication 匹配replication的连接,这个是流复制当中特有的参数。

USER:

表示需要连接段和目标端需要匹配的数据库用户名,all表示匹配所有的用户,写对应的用户名就是仅限对应的用户连接,如果有多个用户,就用','连接。

ADDRESS:

这里就是限定连接,请求方的IP地址为什么这里就写什么,在IP地址的后面我们也可以加上子网掩码,该子网掩码限定了我们连接服务器的数量。如果我们在服务器当中的/etc/hosts做了主机名和对应的IP配置的话,那么我们也可以直接在这个文件当中写hostname。

METHOD:

认证的方法,认证的方法有很多,我说几个常用的:

trust:完全信任,这种方法就是完全没有条件的允许连接,请求方可以使用任何用户,连密码都不用输。

md5:连接方通过连接传递是md5加密之后的。

password:连接方通过连接传递是明文的,没有加密。

剩下的还有好多,我现在还没有用到,大家可以查查。

我们在这个文件当中添加我们对端的连接,

host replicaiton all master md5

host replication all slave1 md5

host replication all slave2 md5

其实这三可以写成一个

host replication all 192.168.1.0/24 md5

这就表示允许所有用户通过192.168.1.0/24的整个段通过replication的流式复制方式进行连接。

现在修改数据库的参数文件

参数文件改的不多只需要三个:

listen_address='*'

max_wal_senders=5

wal_level=hot_standby (这里要说一下,我们公司的数据库UXDB这个参数要改成replicat ,在PG里面改成hot_standby)

SLAVE:

现在在SLAVE端,进行数据库复制操作,这里用到的是ux_basebackup,在PG当中叫做pg_basebackup,该命令的作用是备份数据库,这个工具可以将整个实例和数据文件全部拷出来。当使用这个工具远程进行拷贝数据库的时候,我们就要配置上面说的ux_hba.conf(PG中叫做pg_hba.conf),ux_basebackup具体命令如下:

ux_basebackup -D /home/uxdb/uxclu -Fp -Xs -P -R -h master -p 5432

-D 是指定请求方的目录,可以指定全路径。

-F 是指定输出的格式。这个参数后面可以加两个参数规定文件的格式,一个是p,一个是t。p是将目标端所有的文件原封不动的完全拷到请求端;t是将目标端的所有的文件备份到一个tar文件当中。

-X 是在备份的过程中将产生的xlog也跟着备份过来,这样保证了在恢复数据库的时候将请求端和目标端恢复到相同的时间点,在后面可以加参数:f,s。f (fetch),s(stream) 使用-f的的时候可能会导致日志覆盖的问题;而s的话是流式的复制。

-P 这个参数是控制实时的打印复制的进度。

-R 这个参数的做用是在复制的时候顺便生成recover.conf文件,这个文件我们后面说。

-h 指定IP地址

-p 指定端口号

现在我们将数据库复制到的slave端,我们查看一下recovery.conf这个文件,这个文件的作用就是将数据库的standby同primary连通,并且设置同步开关。

进入到文件当中查看一下信息

standby_mode 就是设置是否将这台服务器作为备用服务器启动。

primary_conninfo 就是记录连接的规则。

然后我们启动standby数据库,这样我们的异步数据库就成了。我们验证一下

master :

slave1:

我们也可以查一个异步同步特有的视图

ux_stat_replication 在PG里面叫pg_stat_replication

这里记录了一些我们同步的信息。

现在我们关掉standby,在进行一次事务操作。

master进行一次插入操作,我们发现是可以插入的。为什么要在这里做这个操作,是因为和同步的做对比。

我们再开启Standby,此时数据又被传了过来。

好的异步就先这样,下章我们说说同步!!!!

THAT'S ALL

BY CUI PEACE

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180918G1QM0Q00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券