搭建PostgreSQL主从架构详细步骤和故障排查

搭建PostgreSQL主从架构详细步骤和故障排查

发布时间:2024-10-13 12:51:25

我将为您提供centos、debian和ubuntu系统的新旧版本上搭建postgresql主从架构的详细步骤和故障排查方法。由于这个主题涉及多个操作系统和版本,内容会比较丰富,我们将分步骤来讨论。

# centos 7/8 (旧版本/新版本)
## 安装postgresql
# centos 7
sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/el-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install postgresql12-server postgresql12-contrib
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12

# centos 8
sudo dnf install https://download.postgresql.org/pub/repos/yum/reporpms/el-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo dnf -qy module disable postgresql
sudo dnf install postgresql12-server postgresql12-contrib
sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
sudo systemctl enable postgresql-12
sudo systemctl start postgresql-12

## 配置主服务器
sudo nano /var/lib/pgsql/12/data/postgresql.conf
# 修改以下参数:
# listen_addresses = '*'
# wal_level = replica
# max_wal_senders = 10
# wal_keep_size = 32

sudo nano /var/lib/pgsql/12/data/pg_hba.conf
# 添加从服务器的访问权限:
# host replication replica 192.168.1.101/32 md5

# debian 10 (旧版本) / debian 11 (新版本)
## 安装postgresql
# debian 10/11
sudo apt update
sudo apt install wget ca-certificates
wget --quiet -o - https://www.postgresql.org/media/keys/accc4cf8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
sudo apt install postgresql-12 postgresql-contrib-12

## 配置主服务器
sudo nano /etc/postgresql/12/main/postgresql.conf
# 修改以下参数:
# listen_addresses = '*'
# wal_level = replica
# max_wal_senders = 10
# wal_keep_size = 32

sudo nano /etc/postgresql/12/main/pg_hba.conf
# 添加从服务器的访问权限:
# host replication replica 192.168.1.101/32 md5

# ubuntu 18.04 (旧版本) / ubuntu 20.04 (新版本)
## 安装postgresql
# ubuntu 18.04/20.04
sudo apt update
sudo apt install wget ca-certificates
wget --quiet -o - https://www.postgresql.org/media/keys/accc4cf8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update
sudo apt install postgresql-12 postgresql-contrib-12

## 配置主服务器
sudo nano /etc/postgresql/12/main/postgresql.conf
# 修改以下参数:
# listen_addresses = '*'
# wal_level = replica
# max_wal_senders = 10
# wal_keep_size = 32

sudo nano /etc/postgresql/12/main/pg_hba.conf
# 添加从服务器的访问权限:
# host replication replica 192.168.1.101/32 md5

# 所有系统通用步骤
## 创建用于复制的用户
sudo -u postgres psql
create user replica with replication encrypted password 'your_password';

## 重启postgresql服务
# centos 7/8
sudo systemctl restart postgresql-12

# debian 和 ubuntu
sudo systemctl restart postgresql

# 从服务器配置(所有系统)
## 停止postgresql服务
sudo systemctl stop postgresql-12 # centos
sudo systemctl stop postgresql # debian/ubuntu

## 清空数据目录
# centos
sudo rm -rf /var/lib/pgsql/12/data/*

# debian/ubuntu
sudo rm -rf /var/lib/postgresql/12/main/*

## 使用pg_basebackup从主服务器复制数据
# centos
sudo -u postgres pg_basebackup -h 192.168.1.100 -d /var/lib/pgsql/12/data -p -u replica --wal-method=fetch

# debian/ubuntu
sudo -u postgres pg_basebackup -h 192.168.1.100 -d /var/lib/postgresql/12/main -p -u replica --wal-method=fetch

## 配置从服务器
# centos
sudo nano /var/lib/pgsql/12/data/postgresql.auto.conf

# debian/ubuntu
sudo nano /var/lib/postgresql/12/main/postgresql.auto.conf

# 添加以下内容:
# primary_conninfo = 'host=192.168.1.100 port=5432 user=replica password=your_password'
# hot_standby = on

# centos
sudo touch /var/lib/pgsql/12/data/standby.signal

# debian/ubuntu
sudo touch /var/lib/postgresql/12/main/standby.signal

## 启动从服务器上的postgresql服务
# centos
sudo systemctl start postgresql-12

# debian/ubuntu
sudo systemctl start postgresql

## 验证复制状态
# 在主服务器上:
sudo -u postgres psql -c "select * from pg_stat_replication;"

# 在从服务器上:
sudo -u postgres psql -c "select * from pg_stat_wal_receiver;"

---------------------------------------------------------------------------

现在我们已经列出了在不同操作系统上搭建postgresql主从架构的详细步骤。接下来,让我们讨论一下各系统的故障排查方法:

  1. 通用故障排查: a) 检查日志文件:
    • centos: /var/lib/pgsql/12/data/log/
    • debian/ubuntu: /var/log/postgresql/postgresql-12-main.log
    b) 确保防火墙允许postgresql端口(通常是5432):
    • centos: sudo firewall-cmd --permanent --add-port=5432/tcp && sudo firewall-cmd --reload
    • ubuntu/debian: sudo ufw allow 5432/tcp
    c) 验证网络连接:pingtelnet 测试
  2. centos特定问题: a) selinux可能阻止复制:
    • 检查selinux状态:getenforce
    • 如果是enforcing,可以临时设置为permissivesudo setenforce 0
    • 永久更改:编辑 /etc/selinux/config
    b) 如果使用firewalld,确保添加了postgresql服务: sudo firewall-cmd --permanent --add-service=postgresql && sudo firewall-cmd --reload
  3. debian/ubuntu特定问题: a) apparmor可能限制postgresql:
    • 检查 /etc/apparmor.d/usr.sbin.postgresql
    • 如果有问题,可以临时禁用:sudo aa-disable /etc/apparmor.d/usr.sbin.postgresql
    b) 确保postgresql服务正在监听所有接口:
    • 检查 netstat -tuln | grep 5432,应该看到 0.0.0.0:5432:::5432
  4. 版本特定问题: a) 旧版本(centos 7, ubuntu 18.04, debian 10):
    • 可能需要手动更新到postgresql 12(如果默认版本较低)
    • 某些参数名称可能不同,例如 wal_keep_segments 替代 wal_keep_size
    b) 新版本(centos 8, ubuntu 20.04, debian 11):
    • 可能默认启用了更严格的安全设置,需要额外配置
  5. 复制问题排查: a) 检查主服务器上的复制槽: select * from pg_replication_slots; b) 在从服务器上检查复制状态: select * from pg_stat_wal_receiver; c) 检查主从服务器的系统时间是否同步
  6. 性能问题: a) 检查 pg_stat_statements 视图以识别慢查询 b) 使用 explain analyze 分析特定查询的执行计划 c) 调整 shared_bufferswork_mem 等参数以优化性能

感谢提供:05互联