yashandb教程FG042-YashanDB主备集群部署
本文档风哥主要介绍YashanDB主备集群部署相关知识,包括YashanDB主备集群概念、架构、复制原理、部署准备、主库安装配置、备库安装配置、主备复制配置、部署实战、复制验证、主备切换测试等内容,风哥教程参考YashanDB官方文档高可用与容灾内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 YashanDB主备集群概念
YashanDB主备集群是指由一个主库和一个或多个备库组成的高可用架构,通过日志复制实现数据同步,确保在主库故障时能够快速切换到备库,保证服务的连续性。学习交流加群风哥微信: itpux-com
- 主库负责处理所有写操作
- 备库通过复制主库的WAL日志保持数据同步
- 支持多种复制模式:同步、异步、半同步
- 备库可以提供只读服务,分担主库压力
- 支持自动或手动故障切换
1.2 YashanDB主备集群架构
YashanDB主备集群架构包括以下组件:
- 主库(Primary):处理所有写操作,生成WAL日志
- 备库(Standby):接收并应用主库的WAL日志,保持数据同步
- 复制通道:主库与备库之间的网络连接,用于传输WAL日志
- 监控系统:监控主备状态、复制延迟等
1.3 YashanDB主备复制原理
YashanDB主备复制的工作原理:
- 主库执行写操作,生成WAL日志
- 主库的WAL发送进程(WAL Sender)将WAL日志发送到备库
- 备库的WAL接收进程(WAL Receiver)接收WAL日志并写入本地
- 备库的恢复进程(Recovery)应用WAL日志,更新备库数据
- 备库处于只读状态,可处理查询请求
Part02-生产环境规划与建议
2.1 YashanDB主备集群规划
YashanDB主备集群规划要点:
1. 确定主备节点数量和角色
2. 规划服务器硬件配置
3. 规划存储和网络配置
4. 确定复制模式和参数
5. 规划监控和告警机制
6. 制定故障切换策略
# 主备节点规划
– 主库:处理所有写操作,需要较高的CPU和内存
– 备库:接收和应用WAL日志,需要与主库相当的配置
– 建议:主备节点配置相同,确保性能一致
# 网络规划
– 主备节点之间使用专用网络传输WAL日志
– 网络带宽建议:至少1Gbps
– 网络延迟:尽量控制在1ms以内
2.2 YashanDB主备集群环境要求
YashanDB主备集群的环境要求:
– CPU:至少8核,推荐16核以上
– 内存:至少16GB,推荐32GB以上
– 存储:至少500GB,推荐使用SSD
– 网络:1Gbps以上网络带宽
# 操作系统要求
– Oracle Linux 9.3 / RHEL 9.3 / 8.x / 7.x
– 国产麒麟操作系统 Kylin v10 SP3
– 欧拉操作系统
# 软件要求
– YashanDB 8.0及以上版本
– 相同版本的YashanDB软件(主备节点)
# 系统参数要求
– 大内存页:开启
– 透明大页:关闭
– NUMA:关闭
– TMPFS:配置合理大小
2.3 YashanDB主备集群网络配置
YashanDB主备集群的网络配置:
$ hostname
fgedu-primary
$ cat /etc/hosts
192.168.1.100 fgedu-primary
192.168.1.101 fgedu-standby
# 防火墙配置
$ firewall-cmd –add-port=5432/tcp –permanent
$ firewall-cmd –reload
# 网络测试
$ ping -c 5 fgedu-standby
PING fgedu-standby (192.168.1.101) 56(84) bytes of data.
64 bytes from fgedu-standby (192.168.1.101): icmp_seq=1 ttl=64 time=0.543 ms
64 bytes from fgedu-standby (192.168.1.101): icmp_seq=2 ttl=64 time=0.487 ms
64 bytes from fgedu-standby (192.168.1.101): icmp_seq=3 ttl=64 time=0.498 ms
64 bytes from fgedu-standby (192.168.1.101): icmp_seq=4 ttl=64 time=0.512 ms
64 bytes from fgedu-standby (192.168.1.101): icmp_seq=5 ttl=64 time=0.476 ms
— fgedu-standby ping statistics —
5 packets transmitted, 5 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.476/0.503/0.543/0.026 ms
# 网络带宽测试
$ iperf3 -c fgedu-standby
Connecting to host fgedu-standby, port 5201
[ 5] local 192.168.1.100 port 58742 connected to 192.168.1.101 port 5201
[ ID] Interval Transfer Bitrate Retr Cwnd
[ 5] 0.00-1.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 1.00-2.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 2.00-3.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 3.00-4.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 4.00-5.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 5.00-6.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 6.00-7.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 7.00-8.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 8.00-9.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
[ 5] 9.00-10.00 sec 112 MBytes 941 Mbits/sec 0 1.05 MBytes
– – – – – – – – – – – – – – – – – – – – – – – – – –
[ ID] Interval Transfer Bitrate Retr
[ 5] 0.00-10.00 sec 1.10 GBytes 941 Mbits/sec 0 sender
[ 5] 0.00-10.00 sec 1.10 GBytes 941 Mbits/sec receiver
iperf Done.
Part03-生产环境项目实施方案
3.1 YashanDB主备集群部署准备
YashanDB主备集群部署前的准备工作:
# 检查系统版本
$ cat /etc/redhat-release
Oracle Linux Server release 9.3
# 检查系统架构
$ uname -m
x86_64
# 检查CPU核心数
$ nproc
32
# 检查内存大小
$ free -h
total used free shared buff/cache available
Mem: 62G 2.1G 58G 9.8M 1.8G 59G
# 检查存储空间
$ df -h /yashanb
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 500G 20G 450G 5% /yashanb
# 关闭防火墙(临时)
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/’ /etc/selinux/config
# 安装必要的依赖包
$ dnf install -y epel-release
$ dnf install -y wget curl tar gzip unzip openssl-devel readline-devel zlib-devel
3.2 YashanDB主库安装与配置
YashanDB主库的安装与配置:
$ wget https://www.yashandb.com/downloads/YashanDB-8.0.1-Enterprise-Linux-x86_64.tar.gz
# 解压YashanDB软件
$ tar -zxvf YashanDB-8.0.1-Enterprise-Linux-x86_64.tar.gz -C /yashanb/app
# 创建数据目录
$ mkdir -p /yashanb/fgdata/fgedudb
# 创建YashanDB用户
$ useradd -m -d /home/yasdb yasdb
$ echo “yasdb:password” | chpasswd
# 设置目录权限
$ chown -R yasdb:yasdb /yashanb
# 切换到yasdb用户
$ su – yasdb
# 初始化主库
$ /yashanb/app/yasdb/bin/initdb -D /yashanb/fgdata/fgedudb
# 配置主库参数
$ cat > /yashanb/fgdata/fgedudb/postgresql.conf << EOF
# 基本参数
listen_addresses = '0.0.0.0'
port = 5432
max_connections = 1000
shared_buffers = '16GB'
# 复制参数
wal_level = 'hot_standby'
max_wal_senders = 10
wal_keep_segments = 100
hot_standby = on
# 检查点参数
checkpoint_timeout = 30min
max_wal_size = 2GB
min_wal_size = 80MB
# 日志参数
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 100MB
EOF
# 配置pg_hba.conf
$ cat > /yashanb/fgdata/fgedudb/pg_hba.conf << EOF
# 本地连接
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv4 replication connections:
host replication all 192.168.1.0/24 md5
# IPv4 connections:
host all all 192.168.1.0/24 md5
EOF
# 启动主库
$ /yashanb/app/yasdb/bin/pg_ctl -D /yashanb/fgdata/fgedudb start
# 创建复制用户
$ /yashanb/app/yasdb/bin/psql -U yasdb -d postgres
postgres=# CREATE USER fgedu WITH REPLICATION PASSWORD 'fgedu123';
CREATE ROLE
postgres=#
# 创建测试数据库
$ /yashanb/app/yasdb/bin/createdb -U yasdb fgedudb
3.3 YashanDB备库安装与配置
YashanDB备库的安装与配置:
$ wget https://www.yashandb.com/downloads/YashanDB-8.0.1-Enterprise-Linux-x86_64.tar.gz
# 解压YashanDB软件
$ tar -zxvf YashanDB-8.0.1-Enterprise-Linux-x86_64.tar.gz -C /yashanb/app
# 创建数据目录
$ mkdir -p /yashanb/fgdata/fgedudb
# 创建YashanDB用户
$ useradd -m -d /home/yasdb yasdb
$ echo “yasdb:password” | chpasswd
# 设置目录权限
$ chown -R yasdb:yasdb /yashanb
# 切换到yasdb用户
$ su – yasdb
# 从主库备份数据
$ /yashanb/app/yasdb/bin/pg_basebackup -h fgedu-primary -U fgedu -D /yashanb/fgdata/fgedudb -P -v
# 配置备库参数
$ cat > /yashanb/fgdata/fgedudb/postgresql.conf << EOF
# 基本参数
listen_addresses = '0.0.0.0'
port = 5432
max_connections = 1000
shared_buffers = '16GB'
# 复制参数
wal_level = 'hot_standby'
max_wal_senders = 10
wal_keep_segments = 100
hot_standby = on
# 检查点参数
checkpoint_timeout = 30min
max_wal_size = 2GB
min_wal_size = 80MB
# 日志参数
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 100MB
EOF
# 创建recovery.conf文件
$ cat > /yashanb/fgdata/fgedudb/recovery.conf << EOF
standby_mode = 'on'
primary_conninfo = 'host=fgedu-primary port=5432 user=fgedu password=fgedu123'
recovery_target_timeline = 'latest'
EOF
# 启动备库
$ /yashanb/app/yasdb/bin/pg_ctl -D /yashanb/fgdata/fgedudb start
3.4 YashanDB主备复制配置
YashanDB主备复制的配置与验证:
$ cat >> /yashanb/fgdata/fgedudb/postgresql.conf << EOF # 复制模式 replication_mode = 'synchronous' # 同步复制参数 synchronous_commit = 'on' synchronous_standby_names = '*' EOF # 重启主库 $ /yashanb/app/yasdb/bin/pg_ctl -D /yashanb/fgdata/fgedudb restart # 验证主备复制状态 $ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb fgedudb=# select * from pg_stat_replication; pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state -------+----------+--------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------ 12345 | 10001 | fgedu | walreceiver | 192.168.1.101 | fgedu-standby | 54321 | 2026-04-11 10:00:00.000000+08 | | streaming | 0/1234567 | 0/1234567 | 0/1234567 | 0/1234567 | | | | 1 | sync (1 row) # 验证备库状态 $ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby fgedudb=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 row) # 验证数据同步 # 在主库创建测试表 fgedudb=# create table fgedu_test (id serial primary key, name varchar(50)); CREATE TABLE # 在主库插入数据 fgedudb=# insert into fgedu_test (name) values ('test1'), ('test2'), ('test3'); INSERT 0 3 # 在备库查询数据 $ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby fgedudb=# select * from fgedu_test; id | name ----+------ 1 | test1 2 | test2 3 | test3 (3 rows)
Part04-生产案例与实战讲解
4.1 YashanDB主备集群部署实战
某企业部署YashanDB主备集群,确保业务系统的高可用性。
– 业务系统:企业ERP系统
– 数据量:300GB
– 并发用户:1000
– 可用性要求:99.99%
– RTO要求:<1分钟
– RPO要求:0
# 部署架构
– 主库:192.168.1.100(fgedu-primary)
– 备库:192.168.1.101(fgedu-standby)
– 复制模式:同步复制
# 部署步骤
1. 准备服务器环境
2. 安装YashanDB软件
3. 配置主库
4. 配置备库
5. 建立主备复制关系
6. 验证主备同步状态
# 验证部署结果
$ ssh yasdb@fgedu-primary “/yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -c ‘select * from pg_stat_replication;'”
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state
——-+———-+——–+——————+—————+—————–+————-+——————————-+————–+———–+———–+———–+———–+————+———–+———–+————+—————+————
12345 | 10001 | fgedu | walreceiver | 192.168.1.101 | fgedu-standby | 54321 | 2026-04-11 10:00:00.000000+08 | | streaming | 0/1234567 | 0/1234567 | 0/1234567 | 0/1234567 | | | | 1 | sync
(1 row)
$ ssh yasdb@fgedu-standby “/yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -c ‘select pg_is_in_recovery();'”
pg_is_in_recovery
——————-
t
(1 row)
4.2 YashanDB主备复制验证
验证YashanDB主备复制的可靠性和性能。
# 在主库执行批量插入
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb << EOF CREATE TABLE fgedu_perf_test (id serial primary key, data varchar(1000)); -- 插入10000条数据 INSERT INTO fgedu_perf_test (data) SELECT repeat('x', 1000) FROM generate_series(1, 10000); -- 查看插入结果 SELECT count(*) FROM fgedu_perf_test; EOF # 在备库验证数据同步 $ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c "SELECT count(*) FROM fgedu_perf_test;" count ------- 10000 (1 row) # 测试复制延迟 $ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c "SELECT now() - pg_last_xact_replay_timestamp() as replication_lag;" replication_lag ----------------- 00:00:00.000000 (1 row) # 测试备库只读功能 $ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby << EOF -- 尝试插入数据(应该失败) INSERT INTO fgedu_test (name) VALUES ('test4'); EOF # 输出结果 ERROR: cannot execute INSERT in a read-only transaction
4.3 YashanDB主备切换测试
测试YashanDB主备切换的流程和效果。
$ ssh root@fgedu-primary “systemctl stop yasdb”
# 查看备库状态
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c “select pg_is_in_recovery();”
pg_is_in_recovery
——————-
t
(1 row)
# 执行故障切换
$ ssh yasdb@fgedu-standby “/yashanb/app/yasdb/bin/pg_ctl -D /yashanb/fgdata/fgedudb promote”
# 查看备库状态(已提升为主库)
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c “select pg_is_in_recovery();”
pg_is_in_recovery
——————-
f
(1 row)
# 验证新主库功能
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby << EOF
-- 插入数据
INSERT INTO fgedu_test (name) VALUES ('test4');
-- 查询数据
SELECT * FROM fgedu_test;
EOF
# 输出结果
id | name
----+------
1 | test1
2 | test2
3 | test3
4 | test4
(4 rows)
# 重启原主库作为新备库
$ ssh root@fgedu-primary "systemctl start yasdb"
# 配置原主库作为备库
$ ssh yasdb@fgedu-primary << 'EOF'
# 停止数据库
/yashanb/app/yasdb/bin/pg_ctl -D /yashanb/fgdata/fgedudb stop
# 清理数据目录
rm -rf /yashanb/fgdata/fgedudb/*
# 从新主库备份数据
/yashanb/app/yasdb/bin/pg_basebackup -h fgedu-standby -U fgedu -D /yashanb/fgdata/fgedudb -P -v
# 创建recovery.conf文件
cat > /yashanb/fgdata/fgedudb/recovery.conf << EOF2
standby_mode = 'on'
primary_conninfo = 'host=fgedu-standby port=5432 user=fgedu password=fgedu123'
recovery_target_timeline = 'latest'
EOF2
# 启动备库
/yashanb/app/yasdb/bin/pg_ctl -D /yashanb/fgdata/fgedudb start
EOF
# 验证新的主备关系
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c "select * from pg_stat_replication;"
Part05-风哥经验总结与分享
5.1 YashanDB主备集群最佳实践
YashanDB主备集群的最佳实践:
- 主备节点配置一致:确保主备节点的硬件配置、软件版本、参数设置一致
- 使用同步复制:对于核心业务系统,建议使用同步复制确保数据零丢失
- 定期验证复制状态:通过监控系统定期检查复制状态和延迟
- 进行故障切换演练:定期进行故障切换演练,确保切换流程顺畅
- 配置监控和告警:设置复制延迟、备库状态等关键指标的监控和告警
- 备份策略:即使有主备复制,也要定期进行物理备份
- 网络优化:使用专用网络传输WAL日志,确保网络带宽和稳定性
- 参数调优:根据实际业务场景调整复制相关参数
5.2 YashanDB主备集群常见问题
YashanDB主备集群的常见问题及解决方案:
## 1. 复制延迟过高
– 原因:网络带宽不足、备库性能不足、主库写入压力大
– 解决方案:
– 增加网络带宽
– 优化备库硬件配置
– 调整主库写入策略
– 增加wal_keep_segments参数值
## 2. 备库无法连接主库
– 原因:网络故障、主库拒绝连接、认证失败
– 解决方案:
– 检查网络连接
– 检查主库pg_hba.conf配置
– 验证复制用户密码
– 检查主库状态
## 3. 主备数据不一致
– 原因:复制中断、备库应用WAL失败
– 解决方案:
– 重新初始化备库
– 检查备库日志
– 确保主库和备库版本一致
## 4. 故障切换后应用连接失败
– 原因:连接字符串未更新、DNS解析问题
– 解决方案:
– 使用VIP或负载均衡器
– 配置应用连接池自动重连
– 及时更新连接字符串
## 5. 同步复制导致主库性能下降
– 原因:同步复制等待备库确认
– 解决方案:
– 考虑使用半同步复制
– 优化网络性能
– 调整synchronous_commit参数
5.3 YashanDB主备集群日常维护
YashanDB主备集群的日常维护任务:
## 1. 定期检查复制状态
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -c “select * from pg_stat_replication;”
## 2. 监控复制延迟
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c “SELECT now() – pg_last_xact_replay_timestamp() as replication_lag;”
## 3. 检查备库状态
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -h fgedu-standby -c “select pg_is_in_recovery();”
## 4. 定期备份
# 在主库执行物理备份
$ /yashanb/app/yasdb/bin/pg_basebackup -D /backup/fgedudb -F t -z
## 5. 检查磁盘空间
$ df -h /yashanb
## 6. 检查日志文件
$ tail -n 100 /yashanb/fgdata/fgedudb/log/postgresql-*.log
## 7. 定期进行故障切换演练
# 按照故障切换流程进行演练
## 8. 更新统计信息
$ /yashanb/app/yasdb/bin/psql -U yasdb -d fgedudb -c “ANALYZE;”
## 9. 检查系统资源使用情况
$ top
$ free -h
$ iostat -x
## 10. 监控告警系统
# 确保监控系统正常运行,及时处理告警
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
