简单说明一下pg数据库复制原理:WAL(预写日志,write-ahead log)记录了所有已经完成的事务信息的日志文件,复制的实现是将主服务器(master)的WAL日志开放给从服务器(slave),slave server(pull)获取master server上的WAL日志到自己本地后,将其中的事务重新走一遍,从而实现复制,达到master-slave数据同步。
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章节的内容不用关注了)。
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主备角色的几种有效方法
查询到的结果为 f代表当前是主用,如果是t代表是备用
# ps -ef|grep "postgres: wal"|grep -v "grep"
查询结果中有流sender的字样的为主库,receiver则为备库
如果pg的data所在的目录下有recovery.conf文件,那么为备库,否则为主库。当为主库的时候,一般这是应该会有一个recovery.done文件的存在。
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地址对应的节点是哪个了。因此,所在的节点服务器也因此确定下来。
原文链接:https://blog.csdn.net/WolfOfSiberian/article/details/120680723
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/7870