kingbase教程FG083-金仓数据库集群主从
本文档风哥主要介绍金仓数据库集群主从的概念、配置和管理方法,帮助数据库管理员了解集群主从的工作原理,以及如何搭建和维护高可用的数据库集群。风哥教程参考kingbase官方文档集群主从指南。
数据库集群主从是一种高可用架构,通过将数据从主节点复制到从节点,实现数据冗余和故障转移,提高系统的可用性和可靠性。
通过本文档的学习,读者将掌握金仓数据库集群主从的搭建、配置和管理方法,为构建高可用的数据库系统提供支持。
目录大纲
Part01-基础概念与理论知识
1.1 集群主从的概念
集群主从是一种数据库高可用架构,由一个主节点和多个从节点组成。主要特点包括:
- 主节点:负责处理所有写操作,并将数据复制到从节点
- 从节点:接收主节点复制的数据,提供读操作服务
- 数据复制:主节点将事务日志发送到从节点,从节点应用这些日志
- 故障转移:当主节点故障时,从节点可以提升为新的主节点
1.2 集群主从的类型
集群主从的主要类型包括:
- 异步复制:主节点在提交事务后,异步将日志发送到从节点,性能较高但可能存在数据延迟
- 同步复制:主节点在提交事务前,等待从节点确认收到日志,数据一致性高但性能较低
- 半同步复制:主节点在提交事务前,等待至少一个从节点确认收到日志,平衡了性能和一致性,风哥提示:
1.3 集群主从的重要性
集群主从的重要性主要体现在以下几个方面:
- 高可用性:当主节点故障时,从节点可以快速接管,减少系统 downtime
- 负载均衡:将读操作分散到从节点,提高系统的整体性能
- 数据冗余:数据在多个节点上有备份,提高数据安全性
- 灾备能力:可以在不同地理位置部署从节点,提高灾备能力
- 维护便利:可以在从节点上进行备份和维护操作,不影响主节点的运行
Part02-生产环境规划与建议
2.1 集群架构规划
集群架构规划建议:
- 节点数量:
- 最小配置:1主1从
- 推荐配置:1主2从
- 大型系统:1主多从(3-5个从节点)
- 节点部署:
- 同机房部署:网络延迟低,适合同步复制
- 跨机房部署:提高灾备能力,适合异步复制
- 云环境部署:利用云服务的弹性和可靠性
- 复制方式:
- 异步复制:适合对数据一致性要求不高的场景
- 同步复制:适合对数据一致性要求高的场景
- 半同步复制:适合大多数生产环境,学习交流加群风哥微信: itpux-com
2.2 硬件配置建议
硬件配置建议:
- CPU:
- 主节点:8核以上
- 从节点:8核以上
- 内存:
- 主节点:32GB以上
- 从节点:32GB以上
- 存储:
- 主节点:SSD,500GB以上
- 从节点:SSD,500GB以上
- 网络:
- 主从节点之间:万兆网络
- 客户端连接:千兆网络
2.3 网络配置建议
网络配置建议:
- 网络拓扑:
- 主从节点在同一网络段
- 使用专用网络进行数据复制
- 配置网络冗余
- 网络参数:
- 调整TCP参数,提高网络性能
- 启用网络流量控制
- 配置防火墙规则,允许主从节点之间的通信,学习交流加群风哥QQ113257174
- 网络监控:
- 监控网络带宽使用情况
- 监控网络延迟
- 监控网络丢包率
Part03-生产环境项目实施方案
3.1 集群搭建步骤
集群搭建步骤:
- 准备环境:
- 安装Kingbase数据库
- 配置主机名和IP地址
- 配置网络连接
- 配置主节点:
- 修改kingbase.conf文件
- 修改pg_hba.conf文件
- 重启主节点
- 配置从节点:
- 备份主节点数据
- 恢复数据到从节点
- 修改kingbase.conf文件
- 创建recovery.conf文件
- 重启从节点,更多视频教程www.fgedu.net.cn
- 验证集群状态:
- 检查主节点状态
- 检查从节点状态
- 测试数据复制
3.2 集群配置管理
集群配置管理:
- 主节点配置:
- wal_level:设置为logical或replica
- max_wal_senders:设置为从节点数量+1
- max_replication_slots:设置为从节点数量
- synchronous_commit:设置为on(同步复制)或local(异步复制)
- 从节点配置:
- hot_standby:设置为on
- max_standby_archive_delay:设置为合适的值
- max_standby_streaming_delay:设置为合适的值
- 网络配置:
- 在pg_hba.conf中添加从节点的连接权限
- 配置防火墙规则,允许主从节点之间的通信
3.3 集群监控维护
集群监控维护:
- 监控内容:
- 主节点状态:监控主节点的运行状态
- 从节点状态:监控从节点的运行状态,更多学习教程公众号风哥教程itpux_com
- 复制状态:监控主从复制的延迟和状态
- 资源使用率:监控CPU、内存、磁盘和网络的使用情况
- 监控工具:
- Zabbix:全面的监控解决方案
- Prometheus:云原生监控系统
- Grafana:数据可视化工具
- Kingbase自带监控:如ksql命令
- 维护措施:
- 定期备份:定期备份主节点和从节点的数据
- 定期检查:定期检查集群状态和复制状态
- 定期更新:定期更新数据库版本和补丁
- 故障演练:定期进行故障转移演练
Part04-生产案例与实战讲解
4.1 主从复制实战
主从复制实战:
# 1. 配置主节点
# 编辑kingbase.conf
vi /kingbase/fgdata/kingbase.conf
# 添加以下配置
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
synchronous_commit = on
# 编辑pg_hba.conf
vi /kingbase/fgdata/pg_hba.conf
# 添加以下配置
host replication fgedu 192.168.1.2/32 md5
# 重启主节点
systemctl restart kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-01-01 00:00:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (postgres)
# 2. 配置从节点
# 备份主节点数据
pg_basebackup -h 192.168.1.1 -p 54321 -U fgedu -D /kingbase/fgdata -F p -X stream -P
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/1234567
pg_basebackup: starting background WAL receiver
30330/30330 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/1234567
pg_basebackup: base backup completed
# 创建recovery.conf
vi /kingbase/fgdata/recovery.conf
# 添加以下配置
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.1 port=54321 user=fgedu password=fgedu123’
trigger_file = ‘/kingbase/fgdata/failover.trigger’
# 重启从节点
systemctl restart kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-01-01 00:01:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (postgres)
# 3. 验证复制状态
# 在主节点上执行
ksql -U fgedu -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
—–+———-+———+——————+————-+—————–+————-+—————+————–+——-+———-+———–+———–+————+———–+———–+————+—————+————
1234 | 16384 | fgedu | walreceiver | 192.168.1.2 | | 54321 | 2024-01-01 00:01:00+08 | | streaming | 0/1234567 | 0/1234567 | 0/1234567 | 0/1234567 | | | | 1 | sync
(1 row)
# 在从节点上执行
ksql -U fgedu -d fgedudb -c “SELECT pg_is_in_recovery();”
pg_is_in_recovery
——————-
t
(1 row)
# 编辑kingbase.conf
vi /kingbase/fgdata/kingbase.conf
# 添加以下配置
wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
synchronous_commit = on
# 编辑pg_hba.conf
vi /kingbase/fgdata/pg_hba.conf
# 添加以下配置
host replication fgedu 192.168.1.2/32 md5
# 重启主节点
systemctl restart kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-01-01 00:00:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (postgres)
# 2. 配置从节点
# 备份主节点数据
pg_basebackup -h 192.168.1.1 -p 54321 -U fgedu -D /kingbase/fgdata -F p -X stream -P
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/1234567
pg_basebackup: starting background WAL receiver
30330/30330 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/1234567
pg_basebackup: base backup completed
# 创建recovery.conf
vi /kingbase/fgdata/recovery.conf
# 添加以下配置
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.1 port=54321 user=fgedu password=fgedu123’
trigger_file = ‘/kingbase/fgdata/failover.trigger’
# 重启从节点
systemctl restart kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-01-01 00:01:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (postgres)
# 3. 验证复制状态
# 在主节点上执行
ksql -U fgedu -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
—–+———-+———+——————+————-+—————–+————-+—————+————–+——-+———-+———–+———–+————+———–+———–+————+—————+————
1234 | 16384 | fgedu | walreceiver | 192.168.1.2 | | 54321 | 2024-01-01 00:01:00+08 | | streaming | 0/1234567 | 0/1234567 | 0/1234567 | 0/1234567 | | | | 1 | sync
(1 row)
# 在从节点上执行
ksql -U fgedu -d fgedudb -c “SELECT pg_is_in_recovery();”
pg_is_in_recovery
——————-
t
(1 row)
4.2 故障转移实战
故障转移实战:
# 1. 模拟主节点故障
# 在主节点上执行
systemctl stop kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Mon 2024-01-01 00:02:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (code=exited, status=0/SUCCESS)
# 2. 执行故障转移
# 在从节点上执行
touch /kingbase/fgdata/failover.trigger
# 3. 验证从节点提升为主节点
ksql -U fgedu -d fgedudb -c “SELECT pg_is_in_recovery();”
pg_is_in_recovery
——————-
f
(1 row)
# 4. 重新配置原主节点为从节点
# 启动原主节点
systemctl start kingbase
# 备份新主节点数据
pg_basebackup -h 192.168.1.2 -p 54321 -U fgedu -D /kingbase/fgdata -F p -X stream -P
# 创建recovery.conf
vi /kingbase/fgdata/recovery.conf
# 添加以下配置
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.2 port=54321 user=fgedu password=fgedu123’
trigger_file = ‘/kingbase/fgdata/failover.trigger’
# 重启原主节点
systemctl restart kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-01-01 00:03:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (postgres)
# 在主节点上执行
systemctl stop kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Mon 2024-01-01 00:02:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (code=exited, status=0/SUCCESS)
# 2. 执行故障转移
# 在从节点上执行
touch /kingbase/fgdata/failover.trigger
# 3. 验证从节点提升为主节点
ksql -U fgedu -d fgedudb -c “SELECT pg_is_in_recovery();”
pg_is_in_recovery
——————-
f
(1 row)
# 4. 重新配置原主节点为从节点
# 启动原主节点
systemctl start kingbase
# 备份新主节点数据
pg_basebackup -h 192.168.1.2 -p 54321 -U fgedu -D /kingbase/fgdata -F p -X stream -P
# 创建recovery.conf
vi /kingbase/fgdata/recovery.conf
# 添加以下配置
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.2 port=54321 user=fgedu password=fgedu123’
trigger_file = ‘/kingbase/fgdata/failover.trigger’
# 重启原主节点
systemctl restart kingbase
● kingbase.service – KingbaseES Database Server
Loaded: loaded (/etc/systemd/system/kingbase.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2024-01-01 00:03:00 CST; 10s ago
Process: 12345 ExecStart=/kingbase/app/bin/kbstart -D /kingbase/fgdata (code=exited, status=0/SUCCESS)
Main PID: 12346 (postgres)
4.3 集群性能测试
集群性能测试:
# 1. 安装压测工具
yum install -y sysbench
# 2. 准备测试数据
sysbench –db-driver=pgsql –pgsql-host=192.168.1.1 –pgsql-port=54321 –pgsql-user=fgedu –pgsql-password=fgedu123 –pgsql-db=fgedudb –table-size=1000000 –tables=10 prepare
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Creating table ‘sbtest1’…
Inserting 1000000 records into ‘sbtest1’
Creating secondary indexes on ‘sbtest1’…
Creating table ‘sbtest2’…
Inserting 1000000 records into ‘sbtest2’
Creating secondary indexes on ‘sbtest2’
…
# 3. 测试主节点写性能
sysbench –db-driver=pgsql –pgsql-host=192.168.1.1 –pgsql-port=54321 –pgsql-user=fgedu –pgsql-password=fgedu123 –pgsql-db=fgedudb –table-size=1000000 –tables=10 –threads=16 –time=60 –report-interval=10 –fgedudb=oltp_write_only run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the fgedudb with following options:
Number of threads: 16
Report intermediate results every 10 second(s)
Initializing random number generator from current time
Initializing worker threads…
Threads started!
[ 10s ] thds: 16 tps: 800.50 qps: 8005.00 (r/w/o: 0.00/8005.00/0.00) lat (ms,95%): 25.23 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 16 tps: 810.30 qps: 8103.00 (r/w/o: 0.00/8103.00/0.00) lat (ms,95%): 24.98 err/s: 0.00 reconn/s: 0.00
…
# 4. 测试从节点读性能
sysbench –db-driver=pgsql –pgsql-host=192.168.1.2 –pgsql-port=54321 –pgsql-user=fgedu –pgsql-password=fgedu123 –pgsql-db=fgedudb –table-size=1000000 –tables=10 –threads=16 –time=60 –report-interval=10 –fgedudb=oltp_read_only run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the fgedudb with following options:
Number of threads: 16
Report intermediate results every 10 second(s)
Initializing random number generator from current time
Initializing worker threads…
Threads started!
[ 10s ] thds: 16 tps: 1500.20 qps: 30004.00 (r/w/o: 30004.00/0.00/0.00) lat (ms,95%): 12.05 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 16 tps: 1510.50 qps: 30210.00 (r/w/o: 30210.00/0.00/0.00) lat (ms,95%): 11.80 err/s: 0.00 reconn/s: 0.00
…
yum install -y sysbench
# 2. 准备测试数据
sysbench –db-driver=pgsql –pgsql-host=192.168.1.1 –pgsql-port=54321 –pgsql-user=fgedu –pgsql-password=fgedu123 –pgsql-db=fgedudb –table-size=1000000 –tables=10 prepare
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Creating table ‘sbtest1’…
Inserting 1000000 records into ‘sbtest1’
Creating secondary indexes on ‘sbtest1’…
Creating table ‘sbtest2’…
Inserting 1000000 records into ‘sbtest2’
Creating secondary indexes on ‘sbtest2’
…
# 3. 测试主节点写性能
sysbench –db-driver=pgsql –pgsql-host=192.168.1.1 –pgsql-port=54321 –pgsql-user=fgedu –pgsql-password=fgedu123 –pgsql-db=fgedudb –table-size=1000000 –tables=10 –threads=16 –time=60 –report-interval=10 –fgedudb=oltp_write_only run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the fgedudb with following options:
Number of threads: 16
Report intermediate results every 10 second(s)
Initializing random number generator from current time
Initializing worker threads…
Threads started!
[ 10s ] thds: 16 tps: 800.50 qps: 8005.00 (r/w/o: 0.00/8005.00/0.00) lat (ms,95%): 25.23 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 16 tps: 810.30 qps: 8103.00 (r/w/o: 0.00/8103.00/0.00) lat (ms,95%): 24.98 err/s: 0.00 reconn/s: 0.00
…
# 4. 测试从节点读性能
sysbench –db-driver=pgsql –pgsql-host=192.168.1.2 –pgsql-port=54321 –pgsql-user=fgedu –pgsql-password=fgedu123 –pgsql-db=fgedudb –table-size=1000000 –tables=10 –threads=16 –time=60 –report-interval=10 –fgedudb=oltp_read_only run
sysbench 1.0.20 (using bundled LuaJIT 2.1.0-beta2)
Running the fgedudb with following options:
Number of threads: 16
Report intermediate results every 10 second(s)
Initializing random number generator from current time
Initializing worker threads…
Threads started!
[ 10s ] thds: 16 tps: 1500.20 qps: 30004.00 (r/w/o: 30004.00/0.00/0.00) lat (ms,95%): 12.05 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 16 tps: 1510.50 qps: 30210.00 (r/w/o: 30210.00/0.00/0.00) lat (ms,95%): 11.80 err/s: 0.00 reconn/s: 0.00
…
Part05-风哥经验总结与分享
5.1 集群主从最佳实践
- 合理规划集群架构:根据业务需求和系统规模,选择合适的集群架构
- 使用半同步复制:平衡性能和数据一致性,适合大多数生产环境
- 配置监控系统:实时监控集群状态和复制状态,及时发现问题,from DB视频:www.itpux.com
- 定期进行故障演练:定期进行故障转移演练,提高故障处理能力
- 合理配置网络:使用高速网络,减少网络延迟,提高复制性能
- 定期备份数据:定期备份主节点和从节点的数据,确保数据安全
5.2 常见问题与解决方案
- 复制延迟问题:
- 问题:主从复制延迟较大
- 解决方案:检查网络延迟,优化主节点性能,调整复制参数
- 复制中断问题:
- 问题:主从复制中断
- 解决方案:检查网络连接,检查主节点状态,重新配置复制
- 故障转移失败问题:
- 问题:故障转移失败
- 解决方案:检查从节点状态,检查trigger_file配置,手动执行故障转移
- 性能下降问题:
- 问题:集群性能下降
- 解决方案:优化数据库参数,优化SQL语句,增加硬件资源
5.3 集群主从监控与调优
- 监控指标:
- 复制延迟:监控主从复制的延迟时间
- 复制状态:监控主从复制的状态
- 资源使用率:监控CPU、内存、磁盘和网络的使用情况
- 错误率:监控集群的错误率
- 调优参数:
- 主节点参数:
- wal_buffers:设置为16MB-64MB
- max_wal_senders:设置为从节点数量+1
- synchronous_commit:根据业务需求设置
- 从节点参数:
- hot_standby:设置为on
- max_standby_archive_delay:设置为30s
- max_standby_streaming_delay:设置为30s
- 主节点参数:
- 优化策略:
- 使用SSD存储,提高IO性能
- 使用高速网络,减少网络延迟
- 合理分配资源,避免资源竞争
- 定期清理日志,保持系统整洁
风哥提示:数据库集群主从是构建高可用数据库系统的重要技术,通过合理的规划和配置,可以提高系统的可用性和可靠性,确保业务的持续运行。
,
,
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
