【Linux】PostgreSQL 主从模式部署(源码编译方式)

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

Linux 专栏 | Docker 专栏 | Kubernetes 专栏


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【Docker】MySQL 源码构建 Docker 镜像(基于 ARM 64 架构)


目录

一、背景介绍

二、过程回顾

1、创建安装目录、数据目录

2、下载源码

3、安装依赖

4、编译安装

5、创建用户、用户组

6、修改目录属主、属组

7、切换用户

8、修改环境变量

9、初始化数据库

10、启动服务、查看状态

11、设置开机启动

12、设置PostgreSQL默认用户postgres的密码

13、配置主从模式 - 主库

14、重启主库服务

15、配置主从模式 - 从库​​​​​​ 

16、重启从库服务​​ 

17、测试主从数据同步

18、测试主从切换​​​​​​ 


一、背景介绍

近期,笔者承接了在 Linux 操作系统下部署 PostgreSQL 主从模式的需求,且客户要求必须是非容器化部署。

本文基于 PostgreSQL 11.6 版本,第一阶段选择源码编译方式,在 CentOS 7 操作系统下完成了 PostgreSQL 主从模式(1主1从)的部署验证工作,以下为完整过程。


二、过程回顾
1、创建安装目录、数据目录
mkdir -p /data/pg11 /data/pg11-data

2、下载源码
wget https://ftp.postgresql.org/pub/source/v11.6/postgresql-11.6.tar.gz
tar -xzf postgresql-11.6.tar.gz -C /data

附源码地址:https://www.postgresql.org/ftp/source/v11.6

3、安装依赖
​​​​​​​rpm -qa | grep ncurses-devel || yum install -y ncurses-devel
rpm -qa | grep readline-devel || yum install -y readline-devel
rpm -qa | grep zlib-devel || yum install -y zlib-devel

4、编译安装
cd /data/postgresql-11.6
./configure --prefix=/data/pg11
make && make install
############################################################################
cd /data/postgresql-11.6/contrib
make && make install

5、创建用户、用户组
groupadd postgres
useradd -g postgres postgres

# 为了安全考虑 PostgreSQL 不允许使用 root 用户操作数据库
# 因此需要创建 postgres 作为数据库的超级用户

6、修改目录属主、属组
chown -R postgres:postgres /data/pg11-data
chown -R postgres:postgres /data/postgresql-11.6
ll /data

7、切换用户
su - postgres

8、修改环境变量
cat >> /home/postgres/.bash_profile <<EOF

export PATH=/data/pg11/bin:$PATH
export MANPATH=/data/pg11-data/share/man:$MANPATH
export LANG=en_US.utf8
export DATE="$(date +"%Y-%m-%d %H:%M:%S")"
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH

EOF
############################################################################
tail /home/postgres/.bash_profile && source /home/postgres/.bash_profile

9、初始化数据库
initdb -D /data/pg11-data

10、启动服务、查看状态
pg_ctl -D /data/pg11-data -l /home/postgres/logfile_$(date +"%Y%m%d_%H%M") start
netstat -nltp | grep 5432

11、设置开机启动
cp /data/postgresql-11.6/contrib/start-scripts/linux /etc/init.d/postgres
sed -i 's#prefix=/usr/local/pgsql#prefix=/data/pg11#g' /etc/init.d/postgres
sed -i 's#PGDATA="/usr/local/pgsql/data"#PGDATA="/data/pg11-data"#g' /etc/init.d/postgres
chmod +x /etc/init.d/postgres

grep -E "^prefix|^PGDATA" /etc/init.d/postgres
chkconfig --list 2>/dev/null | grep postgres

# 完成上述操作后,部分操作系统下服务启动、停止、查看状态也可以使用:
# systemctl start postgres
# systemctl stop postgres
# systemctl status postgres

12、设置PostgreSQL默认用户postgres的密码
psql -c "ALTER USER postgres WITH PASSWORD 'new_password'"

🔔 若选择主从模式,主库、从库所在服务器都需要执行以上步骤

13、配置主从模式 - 主库
# 编辑 /data/pg11-data/pg_hba.conf,在指定位置添加以下内容
vi /data/pg11-data/pg_hba.conf
# IPv4 local connections:
# 单节点部署时若不配置,则本地以外无法访问,报错 no pg_hba.conf entry for host xxx
host    all             all             0.0.0.0/0               md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     all             <从节点IP>/32           trust
# 编辑 /data/pg11-data/postgresql.conf,修改为以下内容
vi /data/pg11-data/postgresql.conf
listen_addresses = '*'              # 单节点部署时若不配置,则本地以外无法访问
wal_level = replica
max_connections = 10000
archive_mode = on
archive_command = 'cp %p /data/pg11/archive/%f'
max_wal_senders = 10
wal_sender_timeout = 120s
hot_standby = on

14、重启主库服务
pg_ctl -D /data/pg11-data -l /home/postgres/logfile_$(date +"%Y%m%d_%H%M") restart

15、配置主从模式 - 从库​​​​​​ 
# 切换至 root 用户
cd /data && mkdir tmp && mv pg11-data/* tmp

# 切换至 postgres 用户
pg_basebackup -h <主库IP> -p 5432 -U postgres  -P -X stream -D /data/pg11-data -R
cp tmp/postmaster.* pg11-data/

# 若直接执行 pg_basebackup 会报错:pg_basebackup: directory "/data/pg11-data" exists but is not empty
# 需要将pg11-data目录下文件全部移走再执行 pg_basebackup,然后将postmaster.pid和postmaster.opts两个文件再移回去,最后重启即可

图片

16、重启从库服务​​ 
pg_ctl -D /data/pg11-data -l /home/postgres/logfile_$(date +"%Y%m%d_%H%M") restart

# 在主库查看集群状态
psql -x -d postgres -c "select * from pg_stat_replication"

图片

17、测试主从数据同步
# 主库服务器执行
psql -c "create database test"
psql -c "\l"
############################################################################
# 从库服务器执行
psql -c "\l"
# 若从库执行 psql -c "create database test1" 则会报错:
# ERROR:  cannot execute CREATE DATABASE in a read-only transaction

18、测试主从切换​​​​​​ 
# 主库服务器执行,模拟故障
pg_ctl stop -m fast

# 从库服务器执行
psql -c "select pg_is_in_recovery()"      # 查看是否处于恢复模式
pg_ctl -D /data/pg11-data promote         # 停止恢复模式,切换为主库
psql -c "select pg_is_in_recovery()"

# pg_ctl promote:使从库停止恢复模式,并升级为主库
# 若需要恢复回去,需要重新执行 15 的步骤

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行者Sun1989

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值