PostgreSQL高可用集群搭建指南
1. 环境规划
1.1 服务器规划
主机名 | 外网IP | 内网IP | 角色 | 配置要求 | 硬盘配置 |
---|---|---|---|---|---|
pg-etcd-01 | 192.168.199.120 | 10.123.123.120 | etcd节点 | 2C2G | 系统盘40G + 数据盘10G |
pg-master-01 | 192.168.199.121 | 10.123.123.121 | PostgreSQL主节点 | 4C8G | 系统盘40G + 数据盘100G + WAL盘50G |
pg-slave-01 | 192.168.199.122 | 10.123.123.122 | PostgreSQL从节点 | 4C8G | 系统盘40G + 数据盘100G + WAL盘50G |
pg-proxy-01 | 192.168.199.123 | 10.123.123.123 | HAProxy代理 | 2C2G | 系统盘40G + 日志盘10G |
1.2 PVE虚拟化硬盘配置详解
1.2.1 etcd节点 (pg-etcd-01)
磁盘配置:
- 系统盘:40GB (virtio-scsi, /dev/sda)
- 挂载点:/ (根分区)
- 文件系统:ext4
- 用途:操作系统和基础软件
- 数据盘:10GB (virtio-scsi, /dev/sdb)
- 挂载点:/var/lib/etcd
- 文件系统:ext4
- 用途:etcd数据存储
1.2.2 PostgreSQL节点 (pg-master-01, pg-slave-01)
磁盘配置:
- 系统盘:40GB (virtio-scsi, /dev/sda)
- 挂载点:/ (根分区)
- 文件系统:ext4
- 用途:操作系统、基础软件和系统日志
- 数据盘:100GB (virtio-scsi, /dev/sdb)
- 挂载点:/data/postgresql
- 文件系统:ext4
- 用途:PostgreSQL数据文件存储
- 建议:使用SSD存储以提高性能
- WAL日志盘:50GB (virtio-scsi, /dev/sdc)
- 挂载点:/data/postgresql/wal
- 文件系统:ext4
- 用途:PostgreSQL WAL日志文件
- 建议:独立高速存储,提高写入性能
1.2.3 HAProxy节点 (pg-proxy-01)
磁盘配置:
- 系统盘:40GB (virtio-scsi, /dev/sda)
- 挂载点:/ (根分区)
- 文件系统:ext4
- 用途:操作系统、基础软件和系统日志
- 日志盘:10GB (virtio-scsi, /dev/sdb)
- 挂载点:/var/log
- 文件系统:ext4
- 用途:HAProxy日志和系统日志
1.2.4 PVE创建虚拟机建议
# 创建虚拟机的基本配置
# etcd节点
qm create 120 --name pg-etcd-01 --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0 --net1 virtio,bridge=vmbr1
# PostgreSQL主节点
qm create 121 --name pg-master-01 --memory 8192 --cores 4 --net0 virtio,bridge=vmbr0 --net1 virtio,bridge=vmbr1
# PostgreSQL从节点
qm create 122 --name pg-slave-01 --memory 8192 --cores 4 --net0 virtio,bridge=vmbr0 --net1 virtio,bridge=vmbr1
# HAProxy节点
qm create 123 --name pg-proxy-01 --memory 2048 --cores 2 --net0 virtio,bridge=vmbr0 --net1 virtio,bridge=vmbr1
1.2.5 存储性能建议
- 系统盘:可使用普通存储,对性能要求不高
- PostgreSQL数据盘:强烈建议使用SSD存储
- WAL日志盘:建议使用高速SSD,独立于数据盘
- etcd数据盘:建议使用SSD,保证低延迟
- 备份存储:可使用大容量机械硬盘,建议至少500GB
1.3 网络规划说明
- 外网网段:192.168.199.0/24 - 用于客户端访问和管理
- 内网网段:10.123.123.0/24 - 用于集群内部通信(数据库复制、etcd通信等)
- 网络策略:
- 客户端通过外网IP访问HAProxy
- 集群内部通信使用内网IP,提高安全性和性能
- etcd、PostgreSQL复制、Patroni API使用内网通信
1.4 软件版本与资源需求
- 操作系统:Ubuntu 22.04.5 LTS (Jammy Jellyfish)
- 内存需求说明:
- etcd节点:最低2GB内存,轻量级部署足够
- PostgreSQL节点:建议8GB以上内存,数据库性能与内存直接相关
- HAProxy节点:最低2GB内存,主要用于连接转发
- PostgreSQL:16.x(最新稳定版)
- Patroni:3.2.0
- etcd:3.5.9
- HAProxy:2.4
- Python:3.10(Ubuntu 22.04自带)
2. 系统初始化
2.1 更换Ubuntu软件源(所有节点执行)
# 备份原有软件源配置
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
# 更换为阿里云镜像源(推荐,国内访问速度快)
# sudo tee /etc/apt/sources.list <<EOF
# # 阿里云Ubuntu 22.04 LTS镜像源
# deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
# deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
# deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
# EOF
# 或者使用清华大学镜像源(备选方案)
# sudo tee /etc/apt/sources.list <<EOF
# # 清华大学Ubuntu 22.04 LTS镜像源
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
#
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
#
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
#
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# EOF
# 或者使用中科大镜像源(备选方案)
sudo tee /etc/apt/sources.list <<EOF
# 中科大Ubuntu 22.04 LTS镜像源
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
EOF
# 清理apt缓存
sudo apt clean
sudo apt autoclean
# 更新软件包索引
sudo apt update
# 如果仍然有问题,可以尝试以下命令修复
# sudo apt --fix-broken install
# sudo dpkg --configure -a
2.2 所有节点执行基础配置
# 升级系统(可选,建议在生产环境中谨慎执行)
# sudo apt upgrade -y
# 安装基础工具
sudo apt install -y curl wget vim net-tools htop tree gnupg2 lsb-release
# 配置主机名解析
sudo tee -a /etc/hosts <<EOF
# 外网IP
192.168.199.120 pg-etcd-01-ext
192.168.199.121 pg-master-01-ext
192.168.199.122 pg-slave-01-ext
192.168.199.123 pg-proxy-01-ext
# 内网IP(集群内部通信)
10.123.123.120 pg-etcd-01
10.123.123.121 pg-master-01
10.123.123.122 pg-slave-01
10.123.123.123 pg-proxy-01
EOF
# 配置时间同步
sudo apt install -y chrony
sudo systemctl enable --now chrony
# 优化内核参数(所有节点执行)
sudo tee -a /etc/sysctl.conf <<EOF
# PostgreSQL优化
vm.swappiness = 1
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
fs.file-max = 2097152
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
EOF
# 应用内核参数
sudo sysctl -p
# 配置用户限制(PostgreSQL节点执行)
# 在pg-master-01和pg-slave-01节点执行
sudo tee -a /etc/security/limits.conf <<EOF
postgres soft nofile 65536
postgres hard nofile 65536
postgres soft nproc 32768
postgres hard nproc 32768
EOF