PostgreSQL Cluster
一、硬件与系统要求
1.1 硬件要求
- CPU:至少 4 核
- 内存:至少 8GB
- 磁盘:至少 100GB 可用空间
- 网络:1Gbps 以上
1.2 系统要求
- Linux:RHEL 7/8/9,Ubuntu 18.04/20.04/22.04
1.3 节点规划
本指南将创建一个包含 3 个节点的 PostgreSQL 主从复制集群:
学习交流加群风哥微信: itpux-com from:www.itpux.com from:www.itpux.com 学习交流加群风哥微信: itpux-com
- 主节点:192.168.1.10
- 从节点 1:192.168.1.11
- 从节点 2:192.168.1.12
二、安装 PostgreSQL
在所有节点上安装 PostgreSQL,参考 PostgreSQL 安装指南。
学习交流加群风哥微信: itpux-com 更多学习教程公众号风哥教程itpux_com 更多视频教程www.fgedu.net.cn 更多学习教程公众号风哥教程itpux_com 更多视频教程www.fgedu.net.cn
三、配置主从复制
3.1 配置主节点
3.1.1 修改 postgresql.conf 文件
# 监听地址
listen_addresses = '0.0.0.0'
# 端口
port = 5432
# 最大连接数
max_connections = 100
# 共享内存
shared_buffers = 1GB
# 启用归档
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/14/archive/%f'
# 复制配置
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
hot_standby = on
3.1.2 创建归档目录
sudo mkdir -p /var/lib/pgsql/14/archive
sudo chown postgres:postgres /var/lib/pgsql/14/archive
sudo chmod 700 /var/lib/pgsql/14/archive
3.1.3 创建复制用户
sudo -u postgres psql
CREATE USER repl WITH REPLICATION PASSWORD 'replpassword' LOGIN;
3.1.4 修改 pg_hba.conf 文件
# 允许复制连接
host replication repl 192.168.1.0/24 scram-sha-256
3.1.5 重启主节点服务
sudo systemctl restart postgresql-14
3.2 配置从节点
3.2.1 停止从节点服务
sudo systemctl stop postgresql-14
3.2.2 清空数据目录
sudo rm -rf /var/lib/pgsql/14/data/*
3.2.3 从主节点复制数据
sudo -u postgres pg_basebackup -h 192.168.1.10 -U repl -D /var/lib/pgsql/14/data -P -X stream
3.2.4 创建 recovery.conf 文件
sudo -u postgres bash -c 'cat > /var/lib/pgsql/14/data/recovery.conf << EOF
standby_mode = on
primary_conninfo = ''host=192.168.1.10 port=5432 user=repl password=replpassword''
trigger_file = ''/var/lib/pgsql/14/data/trigger_file''
EOF'
3.2.5 启动从节点服务
sudo systemctl start postgresql-14
3.3 验证复制状态
3.3.1 在主节点上查看
sudo -u postgres psql
SELECT * FROM pg_stat_replication;
3.3.2 在从节点上查看
sudo -u postgres psql
SELECT pg_is_in_recovery();
四、配置 Patroni 高可用集群
4.1 安装 Patroni
sudo yum install -y python3 python3-pip
sudo pip3 install patroni psycopg2-binary python-etcd
4.2 配置 Patroni
4.2.1 创建 Patroni 配置文件
sudo mkdir -p /etc/patroni
sudo bash -c 'cat > /etc/patroni/patroni.yml << EOF
scope: postgresql
namespace: /db/
name: postgresql1
restapi:
listen: 192.168.1.10:8008
connect_address: 192.168.1.10:8008
etcd:
host: 192.168.1.10:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
initdb:
- encoding: UTF8
- data-checksums
pg_hba:
- host replication replicator 127.0.0.1/32 md5
- host replication replicator 192.168.1.0/24 md5
- host all all 0.0.0.0/0 md5
users:
admin:
password: adminpassword
options:
- createrole
- createdb
postgresql:
listen: 192.168.1.10:5432
connect_address: 192.168.1.10:5432
data_dir: /var/lib/pgsql/14/data
bin_dir: /usr/pgsql-14/bin
pgpass: /tmp/pgpass0
parameters:
unix_socket_directories: ''/var/run/postgresql''
shared_buffers: 1GB
wal_level: replica
hot_standby: on
max_connections: 100
max_wal_senders: 10
watchdog:
mode: automatic
device: /dev/watchdog
safety_margin: 5
EOF'
4.2.2 启动 Patroni 服务
sudo -u postgres patroni /etc/patroni/patroni.yml
五、配置 Pgpool-II 负载均衡
5.1 安装 Pgpool-II
sudo yum install -y pgpool-II-14
5.2 配置 Pgpool-II
5.2.1 修改 pgpool.conf 文件
sudo bash -c 'cat > /etc/pgpool-II-14/pgpool.conf << EOF
listen_addresses = ''*''
port = 9999
backend_hostname0 = ''192.168.1.10''
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ''/var/lib/pgsql/14/data''
backend_flag0 = ''ALLOW_TO_FAILOVER''
backend_hostname1 = ''192.168.1.11''
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ''/var/lib/pgsql/14/data''
backend_flag1 = ''ALLOW_TO_FAILOVER''
backend_hostname2 = ''192.168.1.12''
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = ''/var/lib/pgsql/14/data''
backend_flag2 = ''ALLOW_TO_FAILOVER''
enable_pool_hba = on
pool_passwd = ''/etc/pgpool-II-14/pool_passwd''
ssl = off
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
log_destination = ''stderr''
log_connections = on
log_disconnections = on
log_pooler_errors = on
pid_file_name = ''/var/run/pgpool-II-14/pgpool.pid''
master_slave_mode = on
master_slave_sub_mode = ''stream''
delay_threshold = 10000000
query_redirect_preference = ''primary''
allow_sql_comments = on
EOF'
5.2.2 创建 pool_passwd 文件
sudo pg_md5 -p -u admin adminpassword
5.2.3 启动 Pgpool-II 服务
sudo systemctl start pgpool-II-14
sudo systemctl enable pgpool-II-14
六、安全配置
6.1 配置防火墙
sudo firewall-cmd --add-port=5432/tcp --permanent
sudo firewall-cmd --add-port=9999/tcp --permanent
sudo firewall-cmd --reload
6.2 启用 SSL
修改 postgresql.conf 文件:
学习交流加群风哥QQ113257174 学习交流加群风哥微信: itpux-com 更多学习教程公众号风哥教程itpux_com from:www.itpux.com 更多视频教程www.fgedu.net.cn
ssl = on
ssl_cert_file = ''/var/lib/pgsql/14/server.crt''
ssl_key_file = ''/var/lib/pgsql/14/server.key''
七、监控与维护
7.1 查看集群状态
sudo -u postgres psql -p 9999 -c ''SHOW pool_nodes;''
7.2 查看复制状态
sudo -u postgres psql -c ''SELECT * FROM pg_stat_replication;''
7.3 备份集群
pg_dump -U admin -d testdb -h localhost -p 9999 -f /backup/testdb.sql
7.4 故障转移测试
sudo -u postgres patronictl -c /etc/patroni/patroni.yml failover
八、故障排查
8.1 复制失败
- 查看主节点日志:
tail -f /var/lib/pgsql/14/data/log/postgresql-*.log - 查看从节点日志:
tail -f /var/lib/pgsql/14/data/log/postgresql-*.log - 检查网络连接:
ping 192.168.1.10
8.2 Patroni 服务异常
- 查看 Patroni 日志:
journalctl -u patroni - 检查 etcd 状态:
etcdctl cluster-health
8.3 Pgpool-II 连接失败
- 查看 Pgpool-II 日志:
tail -f /var/log/pgpool-II/pgpool.log - 检查后端节点状态:
sudo -u postgres psql -p 9999 -c ''SHOW pool_nodes;''
提示:生产环境中建议使用至少 3 个节点的集群,以确保高可用性。
警告:集群配置复杂,建议在测试环境中充分测试后再部署到生产环境。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
