1、前言
近期接了个任务,包含pg数据库高可用部署的需求,于是想到了已经有过若干次实操经验的patroni+haproxy模式。不过这次略有不同,安装环境是离线的。但是有之前几次经验打底,想着离线也没啥大不了,就是在联网环境下把依赖down下来在上传到环境上就行了,结果惨遭打脸。。
2、踩坑经过
一开始先找一台与部署环境相近的可联网服务器,用yum和pip将需要的包下载下来,再传上服务器安装,这一步省略,可以参照网上的教程。
一切都很顺利,很快python3.6和patroni的各种包都安装完成,在我满怀信心启动的时候遭重了:
File "/opt/patroni/patroni/init.py", line 173, in main
return patroni_main()
File "/opt/patroni/patroni/init.py", line 140, in patroni_main
patroni = Patroni()
File "/opt/patroni/patroni/init.py", line 25, in init
self.dcs = get_dcs(self.config)
File "/opt/patroni/patroni/dcs/init.py", line 74, in get_dcs
Available implementations: """ + ', '.join(available_implementations))
patroni.exceptions.PatroniException: 'Can not find suitable configuration of distributed configuration store\nAvailable implementations: '
启动报错,翻日志看看:
INFO: Failed to import patroni.dcs.consul
INFO: Failed to import patroni.dcs.etcd
INFO: Failed to import patroni.dcs.etcd3
INFO: Failed to import patroni.dcs.exhibitor
INFO: Failed to import patroni.dcs.raft
INFO: Failed to import patroni.dcs.zookeeper
看起来是没有找到对应的dcs库,但是不应该啊,我已经装了python-etcd
[root@localhost data]# pip3 freeze
click @ file:///home/package/pippa/patroni/click-8.0.4-py3-none-any.whl
dnspython @ file:///home/package/pippa/patroni/dnspython-2.2.1-py3-none-any.whl
importlib-metadata @ file:///home/package/pippa/patroni/importlib_metadata-4.8.3-py3-none-any.whl
patroni @ file:///home/package/pippa/patroni-3.0.1-py3-none-any.whl
prettytable @ file:///home/package/pippa/patroni/prettytable-2.5.0-py3-none-any.whl
psutil @ file:///home/package/pippa/psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl
psycopg2-binary @ file:///home/package/pippa/patroni/psycopg2_binary-2.9.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
python-dateutil @ file:///home/package/pippa/patroni/python_dateutil-2.8.2-py2.py3-none-any.whl
python-etcd==0.4.5
PyYAML @ file:///home/package/pippa/patroni/PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl
six @ file:///home/package/pippa/patroni/six-1.16.0-py2.py3-none-any.whl
typing-extensions @ file:///home/package/pippa/patroni/typing_extensions-4.1.1-py3-none-any.whl
urllib3 @ file:///home/package/pippa/patroni/urllib3-1.26.15-py2.py3-none-any.whl
wcwidth @ file:///home/package/pippa/patroni/wcwidth-0.2.6-py2.py3-none-any.whl
ydiff==1.2
zipp @ file:///home/package/pippa/patroni/zipp-3.6.0-py3-none-any.whl
看了issue几个类似的问题,都是由于没装对应的dcs导致的,但我明明已经装了,难道是版本不对?于是乎开始重装、换版本、改配置等各种操作,但是都没用。
在被折磨到不行的时候,我突然想到是不是python-etcd这个包本身有问题。于是打开交互式命令行import了一下etcd,结果发现是ssl模块有问题。。。
ImportError: No module named _ssl
但是查看一下,发现已经安装了openssl包了。。
# rpm -qa|grep ssl
openssl-devel-1.0.2k-25.el7_9.x86_64
apr-util-openssl-1.5.2-6.el7.x86_64
openssl-1.0.2k-19.el7.x86_64
openssl-libs-1.0.2k-19.el7.x86_64
xmlsec1-openssl-1.2.20-7.el7_4.x86_64
python-backports-ssl_match_hostname-3.5.0.1-1.el7.noarch
可能是环境或者版本问题,不管了,直接下载最新版本openssl包,然后使用指定openssl版本重编译python,注意:
1、Modules/Setup文件中
_socket socketmodule.c
SSL=/usr/local/openssl
_ssl _ssl.c \
-DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
-L$(SSL)/lib -lssl -lcrypto
这几行必须取消注释,路径指定为openssl安装路径
2、python编译命令必须加上ssl模块:
./configure --prefix=/usr/local/python3 --enable-optimizations --with-openssl=/usr/local/openssl
网上的教程一般都是只说其中一个,但我亲测两个缺一不可
编译完成后就可以顺利启动了。启动后记得在leader加上复制槽,不然会有replication slot "xxx" does not exist的报错,复制槽名称与节点名称(即patroni.yml中的name)一致,有几个节点就要加几条,不然主从复制会报错
--添加复制槽
select * from pg_create_physical_replication_slot('xxx');
--查看复制槽
select * from pg_replication_slots;