参考:
https://docs.percona.com/postgresql/17/solutions/ha-patroni.html
我的GCP三台主机node1=35.208.138.220:2380,node3=35.208.253.243,node5=35.208.162.10
每台机器都按照下面安装
1)先要安装etcd分布式管理软件(V3):
sudo apt-get update
sudo apt-get install -y etcd
配置文件/etc/etcd/etcd.conf.yaml
name: 'node1'
initial-cluster-token: PostgreSQL_HA_Cluster_1
initial-cluster-state: new
initial-cluster: node1=http://35.208.138.220:2380,node3=http://35.208.253.243:2380,node5=http://35.208.162.10:2380
data-dir: /var/lib/etcd
initial-advertise-peer-urls: http://35.208.138.220:2380
listen-peer-urls: http://35.208.138.220:2380
advertise-client-urls: http://35.208.138.220:2379
listen-client-urls: http://35.208.138.220:2379
覆盖默认的配置
-
Create the directory if it doesn’t exist:
sudo mkdir -p /etc/systemd/system/etcd.service.d
-
Write the override in one shot:
sudo tee /etc/systemd/system/etcd.service.d/override.conf << 'EOF' [Service] ExecStart= ExecStart=/usr/bin/etcd --config-file /etc/etcd/etcd.conf.yaml EOF
-
Reload and restart:
sudo systemctl daemon-reload sudo systemctl restart etcd
3)启动
export ETCDCTL_API=3
HOST_1=35.208.138.220
HOST_2=35.208.253.243
HOST_3=35.208.162.10
ENDPOINTS="http://35.208.138.220:2379,http://35.208.253.243:2379,http://35.208.162.10:2379"
sudo systemctl enable --now etcd
sudo systemctl status etcd
sudo systemctl start etcd
4)安装Percona的版本的pg17和管理软件
A)添加Percona repo到系统
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt-get update
B)使能repo
sudo percona-release setup ppg-17
sudo apt-get update
(If you’re running PostgreSQL 15 or 16, replace ppg-17
with ppg-15
or ppg-16
.)
C)安装Patroni管理工具
sudo apt-get install percona-patroni
This will pull in Patroni (Percona’s build of it) along with all its dependencies Percona.
D)验证版本
patroni --version
systemctl status patroni
sudo journalctl -u patroni -f
+ Cluster: mycluster (7535123762072343268) --+----+-----------+
| Member | Host | Role | State | TL | Lag in MB |
+--------+----------------+--------+---------+----+-----------+
| node1 | 35.208.138.220 | Leader | running | 1 | |
+--------+----------------+--------+---------+----+-----------+
scope: mycluster
namespace: /service/
name: node1
restapi:
listen: 0.0.0.0:8008
connect_address: 35.208.138.220:8008
etcd:
host: 127.0.0.1:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
initdb:
- encoding: UTF8
- data-checksums
pg_hba:
# allow PostgreSQL superuser access
- host all all 0.0.0.0/0 md5
# allow replication user access
- host replication repl 0.0.0.0/0 md5
postgresql:
listen: 0.0.0.0:5432
connect_address: 35.208.138.220:5432 # your node’s IP
data_dir: /var/lib/postgresql/17/main # adjust to your PG version/path
bin_dir: /usr/lib/postgresql/17/bin
authentication:
replication:
username: repl
password: replpass
superuser:
username: postgres
password: pg #第一次启动,可能汇报密码不对,因为没有给postgres用户设置密码,参见常用错误
parameters:
max_connections: 100
常见错误: postgres密码错误
在root用户下直接登陆psql:
sudo -u postgres psql
\password postgres
179 sudo systemctl status etcd
180 export ETCDCTL_API=3
181 HOST_1=35.208.138.220
182 HOST_2=35.208.253.243
183 HOST_3=35.208.162.10
190 ENDPOINTS="http://35.208.138.220:2379,http://35.208.253.243:2379,http://35.208.162.10:2379"
191 sudo etcdctl --endpoints="$ENDPOINTS" member list
192 ENDPOINTS="35.208.138.220:2379,35.208.253.243:2379,35.208.162.10:2379"
193 sudo systemctl stop etcd
194 sudo systemctl enable --now etcd
195 sudo systemctl status etcd
196 sudo etcdctl --endpoints="$ENDPOINTS" member list
223 vi /etc/etcd/etcd.conf
241 sudo apt-get remove --purge -y etcd etcd-server etcd-client
242 # Also drop any stray service definitions
243 sudo rm -f /etc/systemd/system/etcd2.service
244 sudo systemctl daemon-reload
245 sudo apt-get update
246 sudo apt-get install -y etcd
247 etcd --version
248 sudo systemctl edit etcd.service
249 sudo mkdir -p /etc/systemd/system/etcd.service.d
250 sudo tee /etc/systemd/system/etcd.service.d/override.conf << 'EOF'
[Service]
ExecStart=
ExecStart=/usr/bin/etcd --config-file /etc/etcd/etcd.conf.yaml
EOF
251 sudo systemctl daemon-reload
252 sudo systemctl restart etcd
253 systemctl status etcd.service
254 vi /etc/etcd/etcd.conf.yaml:
259 sudo chmod 0777 /etc/etcd/etcd.conf.xml
260 sudo systemctl daemon-reload
261 sudo systemctl restart etcd
262 systemctl status etcd.service
263 sudo chmod 0777 -R /etc/etcd/
264 sudo systemctl restart etcd
265 systemctl status etcd.service
266 sudo chown root:root /etc/etcd/etcd.conf.yaml
267 sudo chmod 600 /etc/etcd/etcd.conf.yaml
268 ls /etc/etcd/
269 mv /etc/etcd/etcd.conf.xml /etc/etcd/etcd.conf.yaml