1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

yashandb教程FG042-YashanDB主备集群部署

本文档风哥主要介绍YashanDB主备集群部署相关知识,包括YashanDB主备集群概念、架构、复制原理、部署准备、主库安装配置、备库安装配置、主备复制配置、部署实战、复制验证、主备切换测试等内容,风哥教程参考YashanDB官方文档高可用与容灾内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn

Part01-基础概念与理论知识

1.1 YashanDB主备集群概念

YashanDB主备集群是指由一个主库和一个或多个备库组成的高可用架构,通过日志复制实现数据同步,确保在主库故障时能够快速切换到备库,保证服务的连续性。学习交流加群风哥微信: itpux-com

YashanDB主备集群的核心特点:

  • 主库负责处理所有写操作
  • 备库通过复制主库的WAL日志保持数据同步
  • 支持多种复制模式:同步、异步、半同步
  • 备库可以提供只读服务,分担主库压力
  • 支持自动或手动故障切换

1.2 YashanDB主备集群架构

YashanDB主备集群架构包括以下组件:

  • 主库(Primary):处理所有写操作,生成WAL日志
  • 备库(Standby):接收并应用主库的WAL日志,保持数据同步
  • 复制通道:主库与备库之间的网络连接,用于传输WAL日志
  • 监控系统:监控主备状态、复制延迟等

1.3 YashanDB主备复制原理

YashanDB主备复制的工作原理:

  1. 主库执行写操作,生成WAL日志
  2. 主库的WAL发送进程(WAL Sender)将WAL日志发送到备库
  3. 备库的WAL接收进程(WAL Receiver)接收WAL日志并写入本地
  4. 备库的恢复进程(Recovery)应用WAL日志,更新备库数据
  5. 备库处于只读状态,可处理查询请求
风哥提示:主备复制是YashanDB高可用的基础,正确配置和管理主备复制对确保系统稳定性至关重要。学习交流加群风哥QQ113257174

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.

生产环境建议:主备节点之间的网络连接是主备复制的关键,建议使用专用网络,确保网络带宽和稳定性。更多学习教程公众号风哥教程itpux_com

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主库的安装与配置:

# 下载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备库的安装与配置:

# 下载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)
风哥提示:主备复制配置完成后,应定期验证复制状态,确保数据同步正常。from yashanb视频:www.itpux.com

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日志,确保网络带宽和稳定性
  • 参数调优:根据实际业务场景调整复制相关参数
持续优化:主备集群的配置和管理是一个持续的过程,需要根据业务发展和系统运行情况不断优化。建议定期review主备集群的性能和可靠性,及时调整配置。

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息