PG数据库复制的原理简介

简单说明一下pg数据库复制原理:WAL(预写日志,write-ahead log)记录了所有已经完成的事务信息的日志文件,复制的实现是将主服务器(master)的WAL日志开放给从服务器(slave),slave server(pull)获取master server上的WAL日志到自己本地后,将其中的事务重新走一遍,从而实现复制,达到master-slave数据同步。

1.找到主用pg实例的对应的内部ip地址 xxx.xxx.xxx.xxx

1.1 确定当前pg实例是master还是slave

以root用户名登录到多节点的任意的paas服务器上,执行以下命令,确定当前节点是pg数据库的主用服务器还是备用服务器。(注意:这里的主用和备用只是针对pg的,至于其他的服务实例哪个服务器上是它的主用或者备用,实际可能不完全一致。

step1:大概列出当前paas服务器上有哪些pg容器实例在运行,找到一个对的pg容器id,假设是docker-container-id

docker ps|grep 关键性的字符串(例如docker ps|grep pg)

step2:确定pg的data目录位置--依次执行下面的4条命令,等到最后一条查询命令结束后,假设查询到config_file       | /var/lib/postgresql/data/postgresql.conf,那么记录一下得到的目录位置为 /var/lib/postgresql/data/

docker exec -it docker-container-id /bin/sh

su - postgres

psql

select name,setting,context from pg_settings where category='File Locations';

step3:继续执行下面的2条命令,ls查询后确定一下是否存在recovery.conf文件,如果有,那么继续step4否则直接得到结果,当前paas服务器即为主用pg所在的服务器(目标已经达成第2章节的内容不用关注了)

\q

ls /var/lib/postgresql/data/

step4:查看recovery.conf文件的内容,找到里面的“host=”后面的ip地址,这个ip地址即为pg实例的内部ip地址,例如假设这里找到的是:192.168.0.1,现在进入第2章节内容

cat /var/lib/postgresql/data/recovery.conf

上面的语句执行后大概会有这么行信息:

primary_conninfo = 'host=192.168.0.1 port=5432 user=pgrep password=test application_name=replica1'

1.2 附录--判断pg主备角色的几种有效方法

1.2.1 进入psql命令行环境,执行函数pg_is_in_recovery()

查询到的结果为 f代表当前是主用,如果是t代表是备用

1.2.2从wal日志实现复制来进行初步判断(如果出现级联复制的场景,这个查询结果不一定准确)

# ps -ef|grep "postgres: wal"|grep -v "grep"

查询结果中有流sender的字样的为主库,receiver则为备库

1.2.3从recovery.conf配置文件方向进行判定

如果pg的data所在的目录下有recovery.conf文件,那么为备库,否则为主库。当为主库的时候,一般这是应该会有一个recovery.done文件的存在。

2.通过k8s找到内部ip地址是部署在那个节点环境上

paas服务器上,root用户名下执行命令。后面标黄的是第1章节中找到的pg实例的主库k8s内部ip地址

kubectl get pods -o wide --all-namespaces|grep 192.168.0.1

上面这条命令执行后的结果理论上只有有一行信息,其中第7列是IP,第8列是NODE,因此我们得到了NODE的地址,例如是:10.10.1.2

继续执行命令: kubectl get nodes  此时返回信息能够看到10.10.1.2这个NODE地址对应的节点是哪个了。因此,所在的节点服务器也因此确定下来。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐