使用Patroni,etcd,HAProxy构建高可用性PostgreSQL集群

碰巧的是,在解决问题时,我没有足够的经验来独自开发和运行此解决方案。 然后我开始谷歌搜索。


我不知道要抓的是什么,但是在无数次我面对的事实是,即使您按照教程中的步骤逐步进行操作,也要准备与作者相同的环境,但没有任何效果。 我不知道这是什么意思,但是当我再次遇到这个问题时,我决定-当一切顺利时,我将编写教程。 肯定会起作用的一种。


在线指南


碰巧的是,Internet不会缺少各种指南,教程,分步指南等。 碰巧的是,我的任务是开发一种解决方案,以方便故障安全的PostgreSQL集群的组织和构建,其主要要求是从主服务器到所有副本的流复制以及在主服务器发生故障时自动输入保留。


在这个阶段,定义了使用的技术堆栈:


  • PostgreSQL作为DBMS
  • Patroni作为集群解决方案
  • etcd作为Patroni的分布式存储
  • HAproxy用于为使用数据库的应用程序组织单个入口点

安装方式


您的注意力-使用Patroni等etc. HAProxy构建高可用性PostgreSQL集群。


所有操作均在安装了Debian 10的虚拟机上执行。



我不建议在将patroni和postgresql放在同一台机器上安装etcd,因为磁盘负载对于etcd非常重要。 但是出于培训目的,我们将这样做。
安装etcd。


#!/bin/bash apt-get update apt-get install etcd 

将内容添加到文件/ etc / default / etcd

[成员]


ETCD_NAME = datanode1#您机器的主机名
ETCD_DATA_DIR =“ / var / lib / etcd / default.etcd”


所有IP地址均应有效。 应将主机,客户端等设置为IP地址


ETCD_LISTEN_PEER_URLS =“ http://192.168.0.143:2380”#您的机器地址
ETCD_LISTEN_CLIENT_URLS =“ http://192.168.0.143:2379,http://127.0.0.1:2379”#您的机器地址


[团]


ETCD_INITIAL_ADVERTISE_PEER_URLS =“ http://192.168.0.143:2380”#您的计算机地址
ETCD_INITIAL_CLUSTER =“ datanode1 = http://192.168.0.143:2380,datanode2=http://192.168.0.144:2380,datanode3=http://192.168.0.145:2380”#etcd群集中所有计算机的地址
ETCD_INITIAL_CLUSTER_STATE =“新”
ETCD_INITIAL_CLUSTER_TOKEN =“ etcd-cluster-1”
ETCD_ADVERTISE_CLIENT_URLS =“ http://192.168.0.143:2379”#您的计算机地址


运行命令


 systemctl restart etcd 

PostgreSQL 9.6 +支持


首先要做的是安装三个虚拟机,以在其上安装必要的软件。 安装机器之后,如果您按照我的教程进行操作,则可以运行这个简单的脚本(几乎)为您完成所有操作。 以root身份运行。


请注意,该脚本使用PostgreSQL版本9.6,这是由于我们公司的内部要求。 该解决方案未在其他版本的PostgreSQL上进行测试。


 #!/bin/bash apt-get install gnupg -y echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" >> /etc/apt/sources.list wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add - apt-get update apt-get install postgresql-9.6 python3-pip python3-dev libpq-dev -y systemctl stop postgresql pip3 install --upgrade pip pip install psycopg2 pip install patroni[etcd] echo "\ [Unit] Description=Runners to orchestrate a high-availability PostgreSQL After=syslog.target network.target [Service] Type=simple User=postgres Group=postgres ExecStart=/usr/local/bin/patroni /etc/patroni.yml KillMode=process TimeoutSec=30 Restart=no [Install] WantedBy=multi-user.targ\ " > /etc/systemd/system/patroni.service mkdir -p /data/patroni chown postgres:postgres /data/patroni chmod 700 /data/patroni touch /etc/patroni.yml 

接下来,在刚刚创建的/etc/patroni.yml文件中,您需要放入以下内容,当然,将所有位置的IP地址更改为您使用的地址。
请注意此Yaml中的评论。 将地址更改为群集中每台计算机上的地址。


/etc/patroni.yml
 scope: pgsql #       namespace: /cluster/ #       name: postgres1 #       restapi: listen: 192.168.0.143:8008 #   ,      connect_address: 192.168.0.143:8008 #   ,      etcd: hosts: 192.168.0.143:2379,192.168.0.144:2379,192.168.0.145:2379 #     ,      etcd    # this section (bootstrap) will be written into Etcd:/<namespace>/<scope>/config after initializing new cluster # and all other cluster members will use it as a `global configuration` bootstrap: dcs: ttl: 100 loop_wait: 10 retry_timeout: 10 maximum_lag_on_failover: 1048576 postgresql: use_pg_rewind: true use_slots: true parameters: wal_level: replica hot_standby: "on" wal_keep_segments: 5120 max_wal_senders: 5 max_replication_slots: 5 checkpoint_timeout: 30 initdb: - encoding: UTF8 - data-checksums - locale: en_US.UTF8 # init pg_hba.conf     ,    pg_hba: - host replication postgres ::1/128 md5 - host replication postgres 127.0.0.1/8 md5 - host replication postgres 192.168.0.143/24 md5 - host replication postgres 192.168.0.144/24 md5 - host replication postgres 192.168.0.145/24 md5 - host all all 0.0.0.0/0 md5 users: admin: password: admin options: - createrole - createdb postgresql: listen: 192.168.0.143:5432 #   ,      connect_address: 192.168.0.143:5432 #   ,      data_dir: /data/patroni #    ,       bin_dir: /usr/lib/postgresql/9.6/bin #       postgresql pgpass: /tmp/pgpass authentication: replication: username: postgres password: postgres superuser: username: postgres password: postgres create_replica_methods: basebackup: checkpoint: 'fast' parameters: unix_socket_directories: '.' tags: nofailover: false noloadbalance: false clonefrom: false nosync: false 

该脚本必须在群集的所有三台计算机上运行,​​就像您需要将配置放在所有计算机上的文件/etc/patroni.yml中一样。


在群集中的所有计算机上执行这些操作时,请在其中的任何计算机上运行以下命令


 systemctl start patroni systemctl start postgresql 

等待大约30秒钟,然后在其余群集计算机上运行此命令。


HAProxy


我们使用出色的HAproxy提供单个入口点。 主服务器将始终在部署HAproxy的计算机的地址处可用。


为了不使HAproxy机器成为单点故障,请在Docker容器中运行它,以后可以在K8的集群中运行它,并使我们的故障转移集群更加可靠。


创建一个目录,您可以在其中存储两个文件-Dockerfile和haproxy.cfg。 去吧


Docker文件
 FROM ubuntu:latest RUN apt-get update \ && apt-get install -y haproxy rsyslog \ && rm -rf /var/lib/apt/lists/* RUN mkdir /run/haproxy COPY haproxy.cfg /etc/haproxy/haproxy.cfg CMD haproxy -f /etc/haproxy/haproxy.cfg && tail -F /var/log/haproxy.log 

请注意,haproxy.cfg文件的最后三行应列出您计算机的地址。 HAproxy将联系Patroni,主服务器在HTTP标头中将始终返回200,而副本将返回503。


haproxy.cfg
 global maxconn 100 defaults log global mode tcp retries 2 timeout client 30m timeout connect 4s timeout server 30m timeout check 5s listen stats mode http bind *:7000 stats enable stats uri / listen postgres bind *:5000 option httpchk http-check expect status 200 default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions server postgresql1 192.168.0.143:5432 maxconn 100 check port 8008 server postgresql2 192.168.0.144:5432 maxconn 100 check port 8008 server postgresql3 192.168.0.145:5432 maxconn 100 check port 8008 

在我们两个文件都位于的目录中,我们将依次执行容器打包命令,并通过转发必要的端口来启动它:


 docker build -t my-haproxy . docker run -d -p5000:5000 -p7000:7000 my-haproxy 

现在,使用HAproxy打开计算机的浏览器地址并指定端口7000,您将看到集群的统计信息。


在UP状态下,将定位作为主服务器的服务器,而副本服务器在DOWN状态下。 这是正常的,实际上它们可以工作,但是由于它们将503返回HAproxy的请求,因此以这种形式显示。 这使我们始终可以准确地知道当前三台服务器中的哪台是主服务器。


结论


你真厉害! 在短短30分钟内,您已部署了具有流复制和自动置备功能的出色的故障安全且高效的数据库集群。 如果您打算使用此解决方案,请查阅Patroni官方文档 ,尤其是有关patronictl实用程序的部分,该文件可方便地访问您的集群。


恭喜你!

Source: https://habr.com/ru/post/zh-CN482314/


All Articles