PostgreSQL多节点k8s环境下,如何找到主用(master)pg实例所在的服务器?

简单说明一下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

(0)
上一篇 2022年9月25日 08:50
下一篇 2022年9月25日 11:45

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

优速盾注册领取大礼包www.cdnb.net
/sitemap.xml