在Debian或Ubuntu上部署PostgreSQL以获得高可用性¶
本指南提供了如何在Debian或Ubuntu上使用Patroni建立一个高可用性的PostgreSQL集群的说明。
先决条件¶
对于这个设置,我们将使用运行在Ubuntu 20.04上的节点作为基本操作系统,并具有以下IP地址:
| 节点名称 | 公网IP地址 | 内部IP地址 |
|---|---|---|
| node1 | 157.230.42.174 | 10.104.0.7 |
| node2 | 68.183.177.183 | 10.104.0.2 |
| node3 | 165.22.62.167 | 10.104.0.8 |
| HAProxy-demo | 134.209.111.138 | 10.104.0.6 |
请注意
在生产环境(甚至非生产环境)中,PostgreSQL节点将位于一个私有子网中,没有任何到Internet的公共连接,而HAProxy将位于一个不同的子网中,该子网只允许来自选定IP范围的客户端流量。为了简单起见,我们在DigitalOcean VPS环境中实现了这种架构,每个节点都可以通过其内部私有IP访问其他节点。
中设置主机名设置文件¶
为了使节点相互感知并允许它们无缝通信,将它们的主机名解析为它们的公共IP地址。修改设置各节点的文件如下:
| 节点1 | 节点2 | 节点3 |
|---|---|---|
127.0.0.1 localhost node1 |
127.0.0.1 localhost node2 |
127.0.0.1 localhost node3 |
的设置HAProxy-demo节点的文件如下所示:
127.0.1.1 HAProxy-demo HAProxy-demo 127.0.0.1 localhost 10.104.0.6 HAProxy-demo 10.104.0.7 node1 10.104.0.2 node2 10.104.0.8 node3
安装Percon雷竞技下载官网a Distribution for PostgreSQL¶
遵循安装说明安装Percona D雷竞技下载官网istribution for PostgreSQL
node1,node2和node3。删除data目录。Patroni需要一个干净的环境来初始化新集群。使用如下命令停止PostgreSQL服务,并删除data目录:
美元sudosystemctl停止postgresql美元sudorm射频/var/lib/postgresql/14/main
配置ETCD分布式存储¶
分布式配置存储有助于在故障转移期间在节点之间建立共识,并将管理三个PostgreSQL实例的配置。尽管Patroni可以与其他分布式共识存储(即Zookeeper, Consul等)一起工作,但最常用的是etcd。
的etcd集群首先在一个节点中启动,然后将后续节点添加到使用添加命令。配置存储在/etc/default/etcd文件。
安装
etcd在每个PostgreSQL节点上使用以下命令:美元sudo恰当的安装etcd修改
/etc/default/etcd每个节点上的配置文件。- 在
node1,添加的IP地址node1到ETCD_INITIAL_CLUSTER参数。配置文件如下所示:
ETCD_NAME=node1 ETCD_INITIAL_CLUSTER="node1=http://10.104.0.7:2380" ETCD_INITIAL_CLUSTER_TOKEN="devops_token" ETCD_INITIAL_CLUSTER_STATE="new" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.104.0.7:2380" ETCD_DATA_DIR="/var/lib/etcd/postgresql" ETCD_LISTEN_PEER_URLS="http://10.104.0.7:2380" ETCD_LISTEN_CLIENT_URLS="http://10.104.0.7:2379,http://localhost:2379" ETCD_ADVERTISE_CLIENT_URLS="http://10.104.0.7:2379"…- 在
node2,添加两者的IP地址node1和node2到ETCD_INITIAL_CLUSTER参数:
ETCD_NAME=node2 ETCD_INITIAL_CLUSTER="node1=http://10.104.0.7:2380,node2=http://10.104.0.2:2380" ETCD_INITIAL_CLUSTER_TOKEN="devops_token" ETCD_INITIAL_CLUSTER_STATE="existing" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.104.0.2:2380" ETCD_DATA_DIR="/var/lib/etcd/postgresql" ETCD_LISTEN_PEER_URLS="http://10.104.0.2:2380" ETCD_LISTEN_CLIENT_URLS="http://10.104.0.2:2379,http://localhost:2379" ETCD_ADVERTISE_CLIENT_URLS="http://10.104.0.2:2379"…- 在
node3,ETCD_INITIAL_CLUSTER参数中包含三个节点的IP地址:
ETCD_NAME = node3 ETCD_INITIAL_CLUSTER = " node1 = http://10.104.0.7:2380, node2 = http://10.104.0.2:2380, node3 = http://10.104.0.8:2380”ETCD_INITIAL_CLUSTER_TOKEN =“devops_token ETCD_INITIAL_CLUSTER_STATE”=“现有”ETCD_INITIAL_ADVERTISE_PEER_URLS = " http://10.104.0.8:2380 " ETCD_DATA_DIR = " / var / lib / etcd / postgresql”ETCD_LISTEN_PEER_URLS = " http://10.104.0.8:2380 " ETCD_LISTEN_CLIENT_URLS = " http://10.104.0.8:2379, http://localhost: 2379 " ETCD_ADVERTISE_CLIENT_URLS = " http://10.104.0.8:2379 "……- 在
在
node1,添加node2和node3到集群添加命令:美元sudoetcdctl成员添加node2http://10.104.0.2:2380美元sudoetcdctl成员添加node3http://10.104.0.8:2380重新启动
etcd服务node2和node3:美元sudosystemctl重新启动etcd检查etcd集群成员。
美元sudoetcdctl成员列表输出如下所示:
21d50d7f768f153a: name=node1 peerURLs=http://10.104.0.7:2380 clientURLs=http://10.104.0.7:2379 isLeader=true af4661d829a39112: name=node2 peerURLs=http://10.104.0.2:2380 clientURLs=http://10.104.0.2:2379 isLeader=false e3f3c0c1d12e9097: name=node3 peerURLs=http://10.104.0.8:2380 clientURLs=http://10.104.0.8:2379 isLeader=false
设置看门狗服务¶
Linux内核使用名为a的实用程序监管机构防止系统反应迟钝。看门狗监视系统中不可恢复的raybet雷竞技竞猜在线官网应用程序错误、耗尽的系统资源等,并启动重新启动以使系统安全地返回到工作状态。看门狗功能对于打算在没有人为干预的情况下长时间运行的服务器非常有用。看门狗功能可以帮助维护服务,而不是用户找到挂起的服务器。
在本例中,我们将配置加密狗-一个标准的软件实现的看门狗是随Ubuntu 20.04。
在所有三个PostgreSQL节点上完成以下步骤,以加载和配置Softdog。
加载软件狗:
美元sudo上海- c'echo "softdog" > /etc/modules'Patroni将与看门狗服务进行交互。既然帕特罗尼是由
postgres用户,该用户必须具有Softdog的访问权限。要实现这一点,需要改变的所有权watchdog.rules存档到postgres用户:美元sudo上海- c'echo "KERNEL==\"watchdog\", OWNER=\"postgres\", GROUP=\"postgres\"" > /etc/udev/rules.d/61-watchdog.rules "从黑名单中删除Softdog。
- 找出Softdog被列入黑名单的文件:
美元grep黑名单/lib/modprobe.d/*/etc/modprobe.d/*|grep加密狗在我们的例子中,
modprobe将Softdog列入黑名单/lib/modprobe.d/blacklist_linux_5.4.0 - 73 generic.conf:黑名单加密狗- 删除
黑名单软件狗从/lib/modprobe.d/blacklist_linux_5.4.0 - 73 generic.conf文件。 - 重新启动服务
美元sudomodprobe加密狗- 验证
modprobe运行lsmod命令:
美元sudolsmod|grep加密狗如果进程正在运行,输出将显示一个进程标识符。
Softdog 16384 0检查下的Softdog文件
/dev/文件夹属于postgres用户:
美元ls- l/dev/watchdog* crw-rw——1postgrespostgres10,1309月1112: 53/dev/watchdog crw——1根根245,09月1112: 53/dev/watchdog0
提示
如果因为任何原因没有改变所有权,执行以下命令手动修改。
美元sudo乔恩postgres: postgres/dev/watchdog*
配置Patroni¶
在每个PostgreSQL节点上安装Patroni:
美元sudo恰当的安装雷竞技下载官网percona-patroni创建
patroni.yml下的配置文件/etc/patroni目录中。该文件保存了PostgreSQL集群的默认配置值,并将反映当前集群的设置。添加以下配置
node1:范围:stampede1名字:node1restapi:听:0.0.0.0:8008connect_address:node1:8008etcd:宿主:node1:2379引导:#本节将在初始化新集群后写入Etcd:// dcs:ttl:30.loop_wait:10retry_timeout:10maximum_lag_on_failover:1048576# primary_start_timeout: 300# synchronous_mode: falsepostgresql:use_pg_rewind:真正的use_slots:真正的参数:wal_level:副本hot_standby:“上”logging_collector:“上”max_wal_senders:5max_replication_slots:5wal_log_hints:“上”# archive_mode:“对”# archive_timeout: 600#archive_command: "cp -f %p /home/ postgresql /archived/%f"# recovery_conf:#restore_command: cp /home/ postgres_archived_% f %p# initdb的一些选项initdb:#注意:它需要是一个列表(一些选项需要值,其他是开关)-编码:use UTF8-data-checksumspg_hba:运行initdb后,在pg_hba.conf中添加以下行-主机所有所有10.104.0.7/32 md5-主机复制复制器127.0.0.1/32 trust-主机所有所有10.104.0.2/32 md5-Host all all 10.104.0.8/32 md5-主机所有所有10.104.0.6/32信任# - hostssl all all 0.0.0.0/0 md5#在初始集群创建后启动的附加脚本(将传递连接URL作为参数)# post_init: /usr/local/bin/setup_cluster.sh一些额外的用户需要在初始化新集群后创建用户:管理:密码:管理选项:-createrole-createdb复制因子:密码:密码选项:-复制postgresql:听:0.0.0.0:5432connect_address:node1:5432data_dir:" / var / lib / postgresql / 14 /主”bin_dir:“/ usr / lib / postgresql / 14 / bin”# config_dir:pgpass:/ tmp / pgpass0身份验证:复制:用户名:复制因子密码:密码超级用户:用户名:postgres密码:密码参数:unix_socket_directories:/ var /运行/ postgresql的监管机构:模式:要求#允许值:关闭,自动,需要设备:/dev/watchdogsafety_margin:5标签:nofailover:假noloadbalance:假clonefrom:假nosync:假/config Patroni配置文件
让我们花点时间来了解一下
patroni.yml文件。第一部分提供了第一个节点(
node1)及其连接端口。在那之后,我们有etcd服务及其端口详细信息。在这些之后,还有一个
引导节,其中包含PostgreSQL配置和数据库初始化后运行的步骤。的pg_hba.conf条目指定可以连接到该节点的所有其他节点及其身份验证机制。创建的配置文件
node2和node3。将引用替换为node1与node2和node3,分别。在每个节点上启用并重新启动patroni服务。使用以下命令:
美元sudosystemctl启用patroni美元sudosystemctl重新启动patroni
当Patroni启动时,它会按照配置文件的bootstrap部分中的指令初始化PostgreSQL(因为服务当前没有运行并且数据目录为空)。
故障排除Patroni
为了确保Patroni已经正常启动,可以使用以下命令查看日志:
美元sudojournalctl- upatroni.service- nOne hundred.- f
输出不应该显示任何错误:
node01 systemd[1]:启动PostgreSQL高可用性管理器Sep 23 12:50:22 node01 patroni[10119]: 20121-09-23 12:50:22 022 INFO:选定的新etcd服务器http://10.104.0.2:2379 Sep 23 12:50:22 node01 patroni[10119]: 20121-09-23 12:50:22 029 INFO:没有更改PostgreSQL配置项,没有重新加载。Sep 23 12:50:22 node01 patroni[10119]: 20121-09-23 12:50:22,168 INFO: Lock owner: None;我是node1 Sep 23 12:50:22 node01 patroni[10119]: 20121-09-23 12:50:22 2,177 INFO:试图引导一个新的集群Sep 23 12:50:22 node01 patroni[10140]:属于这个数据库系统的文件将由用户“postgres”拥有。Sep 23 12:50:22 node01 patroni[10140]:此用户还必须拥有服务器进程。Sep 23 12:50:22 node01 patroni[10140]:数据库集群将使用区域设置“c.t utf -8”初始化。Sep 23 12:50:22 node01 patroni[10140]:默认的文本搜索配置将被设置为"english"。Sep 23 12:50:22 node01 patroni[10140]:启用了数据页校验和。[10140]:创建目录/var/lib/postgresql/12/main…ok Sep 23 12:50:22 node01 patroni[10140]:创建子目录… ok Sep 23 12:50:22 node01 patroni[10140]: selecting dynamic shared memory implementation ... posix Sep 23 12:50:22 node01 patroni[10140]: selecting default max_connections ... 100 Sep 23 12:50:22 node01 patroni[10140]: selecting default shared_buffers ... 128MB Sep 23 12:50:22 node01 patroni[10140]: selecting default time zone ... Etc/UTC Sep 23 12:50:22 node01 patroni[10140]: creating configuration files ... ok Sep 23 12:50:22 node01 patroni[10140]: running bootstrap script ... ok Sep 23 12:50:23 node01 patroni[10140]: performing post-bootstrap initialization ... ok Sep 23 12:50:23 node01 patroni[10140]: syncing data to disk ... ok Sep 23 12:50:23 node01 patroni[10140]: initdb: warning: enabling "trust" authentication for local connections Sep 23 12:50:23 node01 patroni[10140]: You can change this by editing pg_hba.conf or using the option -A, or Sep 23 12:50:23 node01 patroni[10140]: --auth-local and --auth-host, the next time you run initdb. Sep 23 12:50:23 node01 patroni[10140]: Success. You can now start the database server using: Sep 23 12:50:23 node01 patroni[10140]: /usr/lib/postgresql/14/bin/pg_ctl -D /var/lib/postgresql/14/main -l logfile start Sep 23 12:50:23 node01 patroni[10156]: 2021-09-23 12:50:23.672 UTC [10156] LOG: redirecting log output to logging collector process Sep 23 12:50:23 node01 patroni[10156]: 2021-09-23 12:50:23.672 UTC [10156] HINT: Future log output will appear in directory "log". Sep 23 12:50:23 node01 patroni[10119]: 2021-09-23 12:50:23,694 INFO: postprimary pid=10156 Sep 23 12:50:23 node01 patroni[10165]: localhost:5432 - accepting connections Sep 23 12:50:23 node01 patroni[10167]: localhost:5432 - accepting connections Sep 23 12:50:23 node01 patroni[10119]: 2021-09-23 12:50:23,743 INFO: establishing a new patroni connection to the postgres cluster Sep 23 12:50:23 node01 patroni[10119]: 2021-09-23 12:50:23,757 INFO: running post_bootstrap Sep 23 12:50:23 node01 patroni[10119]: 2021-09-23 12:50:23,767 INFO: Software Watchdog activated with 25 second timeout, timing slack 15 seconds Sep 23 12:50:23 node01 patroni[10119]: 2021-09-23 12:50:23,793 INFO: initialized a new cluster Sep 23 12:50:33 node01 patroni[10119]: 2021-09-23 12:50:33,810 INFO: no action. I am (node1) the leader with the lock Sep 23 12:50:33 node01 patroni[10119]: 2021-09-23 12:50:33,899 INFO: no action. I am (node1) the leader with the lock Sep 23 12:50:43 node01 patroni[10119]: 2021-09-23 12:50:43,898 INFO: no action. I am (node1) the leader with the lock Sep 23 12:50:53 node01 patroni[10119]: 2021-09-23 12:50:53,894 INFO: no action. I am (node1) the leader with the
一个常见的错误是Patroni抱怨pg_hba.conf文件中缺少适当的条目。如果看到此类错误,必须手动添加或修复该文件中的条目,然后重新启动服务。
改变守护神。yml文件和重新启动服务在这里不会有任何影响,因为bootstrap部分指定了在节点中首次启动PostgreSQL时应用的配置。即使修改了Patroni配置文件并重新启动服务,它也不会重复该过程。
如果Patroni已经正常启动,您应该能够使用以下命令本地连接到PostgreSQL节点:
美元sudopsql- upostgres
命令输出如下所示:
psql(14.1)输入“help”获取帮助。postgres = #
HAProxy配置¶
HAProxy节点将接受客户端连接请求,并将这些请求路由到PostgreSQL集群的主节点。这样,客户机应用程序就不必知道底层集群中的哪个节点是当前的主节点。它所需要做的就是访问一个HAProxy URL并在那里发送它的读/写请求。在后台,HAProxy将连接路由到一个健康节点(只要至少有一个健康节点可用),并确保客户端应用程序请求永远不会被拒绝。
HAProxy能够以轮询的方式将写请求路由到主节点,并将读请求路由到辅助节点,这样就不会不必要地加载辅助实例。为此,在HAProxy配置文件中提供不同的端口。在这个部署中,写路由到端口5000,读路由到端口5001。
在服务器上安装HAProxy
HAProxy-demo节点:美元sudo恰当的安装雷竞技下载官网percona-haproxyHAProxy配置文件的路径为:
/etc/haproxy/haproxy.cfg。在此文件中指定以下配置。100年全球maxconn默认日志全球模式tcp重试2客户机超时30 m超时连接4 s超时服务器30 m超时检查5 s听统计模式http绑定*:7000年统计数据支持数据uri /听主要结合*:5000选项httpchk /一级http-check期待地位200默认的服务器国米3 s下降3上升2 on-marked-down shutdown-sessions服务器node1 node1:5432 maxconn 100检查端口8008服务器node2 node2:5432 maxconn 100检查端口8008服务器node3 node3:5432 maxconn 100检查端口8008Listen standby balance roundbin bind *:5001 option HTTPCHK /replica http-check expect status 200 default-server inter3s fall 3 rise 2 on-mark -down shutdown-sessions server node1 node1:5432 maxconn 100 check port 8008 server node2 node2:5432 maxconn 100 check port 8008 server node3 node3:5432 maxconn 100 check port 8008HAProxy将使用Patroni托管的REST api来检查每个PostgreSQL节点的健康状态,并适当地路由请求。
HAProxy重启:
美元sudosystemctl重新启动haproxy检查HAProxy日志是否有错误:
美元sudojournalctl- uhaproxy.service- nOne hundred.- f
测试¶
看到正在测试PostgreSQL集群有关如何测试PostgreSQL集群的复制、故障和切换的指导。
创建:2021年12月15日