kingbase教程FG146-金仓数据库集群主从架构实践
本文档详细介绍了金仓数据库集群主从架构的实践,包括集群主从架构的概念、特性、部署方式、配置方法等内容。风哥教程参考金仓官方文档集群管理、高可用等内容,适合数据库管理员和系统工程师学习和使用。
Part01-基础概念与理论知识
1.1 集群主从架构概述
1.1.1 集群主从架构定义
集群主从架构是一种数据库高可用架构,由一个主节点和多个从节点组成。主节点负责处理所有的写操作和部分读操作,从节点通过复制机制同步主节点的数据,当主节点发生故障时,从节点可以接管成为新的主节点,确保系统的连续性。
1.1.2 集群主从架构特点
- 高可用性:当主节点发生故障时,从节点可以接管,确保系统的连续性
- 负载均衡:可以将读操作分发到从节点,提高系统的整体性能
- 数据安全:多个节点存储数据,提高数据的安全性和可靠性
- 可扩展性:可以通过增加从节点来扩展系统的读性能
1.1.3 集群主从架构的应用场景
- 关键业务系统:对可用性要求高的业务系统,如金融、电信等
- 读密集型应用:读操作远多于写操作的应用,如电商、新闻网站等
- 数据备份:通过从节点实现数据备份,提高数据安全性
- 灾备方案:通过异地部署从节点,实现灾备功能
1.2 金仓数据库集群特性
1.2.1 金仓数据库集群类型
- RWC集群:读写分离集群,由一个主节点和多个从节点组成
- RAC集群:实时应用集群,多个节点共享存储,提供高可用性和负载均衡
- TDC集群:分布式事务集群,支持水平扩展
- ADC集群:分析型数据集群,用于大数据分析
1.2.2 金仓数据库主从复制特性
- 物理复制:基于WAL日志的物理复制,数据一致性高
- 逻辑复制:基于逻辑日志的复制,支持跨版本复制
- 同步复制:主节点等待从节点确认后再提交事务,数据一致性最高
- 异步复制:主节点不等待从节点确认,性能更高
- 半同步复制:主节点等待至少一个从节点确认后再提交事务,平衡一致性和性能,风哥提示:
1.2.3 金仓数据库集群管理工具
- KingbaseES Manager:图形化集群管理工具
- ksql:命令行工具,用于管理集群
- sys_ctl:数据库控制工具,用于启动、停止数据库
- repmgr:复制管理工具,用于管理主从复制
1.3 集群模式与部署方式
1.3.1 集群模式
集群模式:
- 一主一从:最简单的集群模式,一个主节点和一个从节点
- 一主多从:一个主节点和多个从节点,提高读性能
- 级联复制:从节点作为其他从节点的主节点,减少主节点的负载
- 双主架构:两个主节点,互为主从,提高可用性
1.3.2 部署方式
- 同城部署:所有节点部署在同一城市,网络延迟低
- 异地部署:节点部署在不同城市,实现灾备功能
- 混合部署:结合同城和异地部署,兼顾性能和灾备
Part02-生产环境规划与建议
2.1 集群规划
2.1.1 节点规划
节点规划:
- 主节点:处理所有写操作,需要较高的性能
- 从节点:处理读操作,需要足够的存储空间
- 仲裁节点:用于解决脑裂问题,确保集群的一致性
- 监控节点:用于监控集群的状态和性能
2.1.2 网络规划
- 网络带宽:主从节点之间需要足够的带宽,确保复制延迟最小
- 网络延迟:主从节点之间的网络延迟应尽可能低,建议在1ms以内
- 网络冗余:配置多网络接口,确保网络的可靠性
- 防火墙:配置防火墙规则,允许主从节点之间的通信
2.1.3 存储规划
- 存储类型:使用高性能存储,如SSD,学习交流加群风哥微信: itpux-com
- 存储容量:根据数据量和增长趋势,规划足够的存储容量
- 存储冗余:使用RAID等技术,提高存储的可靠性
- 备份策略:制定合理的备份策略,确保数据安全
2.2 硬件与网络要求
2.2.1 硬件要求
硬件要求:
- CPU:至少8核以上,推荐16核或更高
- 内存:至少16GB以上,推荐32GB或更高
- 存储:至少500GB SSD,推荐1TB或更高
- 网络:千兆网卡,推荐万兆网卡
2.2.2 网络要求
- 网络带宽:主从节点之间至少1Gbps带宽
- 网络延迟:主从节点之间网络延迟不超过1ms
- 网络稳定性:网络连接稳定,无丢包现象
- 网络隔离:集群节点应在同一网络隔离区内
2.2.3 操作系统要求
- 操作系统:Oracle Linux 9.3 / RHEL 9.3 / 8.x / 7.x、国产麒麟操作系统 Kylin v10 SP3、欧拉等
- 内核版本:建议使用最新的内核版本
- 文件系统:使用ext4或xfs文件系统
- 内核参数:优化内核参数,如网络、内存、I/O等
2.3 高可用设计
2.3.1 高可用架构设计
- 故障检测:使用心跳机制检测节点状态
- 故障转移:当主节点故障时,自动将从节点提升为新的主节点
- 脑裂防护:使用仲裁机制,防止脑裂问题
- 自动恢复:当故障节点恢复后,自动重新加入集群
2.3.2 负载均衡设计
- 读负载均衡:将读操作分发到从节点,提高系统性能,学习交流加群风哥QQ113257174
- 连接池:使用连接池管理数据库连接,提高连接效率
- 代理层:使用代理层,如PgBouncer、HAProxy等,实现负载均衡
- 应用层路由:在应用层实现读写分离,将写操作发送到主节点,读操作发送到从节点
2.3.3 监控与告警设计
- 监控指标:监控集群状态、复制延迟、系统资源使用情况等
- 告警机制:当集群出现异常时,及时发送告警
- 监控工具:使用Zabbix、Prometheus+Grafana等监控工具
- 日志管理:集中管理集群日志,便于问题排查
Part03-生产环境项目实施方案
3.1 集群部署步骤
3.1.1 环境准备
# 环境准备
# 节点信息
# 主节点:192.168.1.100
# 从节点:192.168.1.101
# 配置主机名
$ hostnamectl set-hostname master
$ hostnamectl set-hostname slave
# 配置hosts文件
$ vi /etc/hosts
192.168.1.100 master
192.168.1.101 slave
# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
# 安装依赖
$ yum install -y epel-release
$ yum install -y wget net-tools ntp
# 同步时间
$ systemctl start ntpd
$ systemctl enable ntpd
# 节点信息
# 主节点:192.168.1.100
# 从节点:192.168.1.101
# 配置主机名
$ hostnamectl set-hostname master
$ hostnamectl set-hostname slave
# 配置hosts文件
$ vi /etc/hosts
192.168.1.100 master
192.168.1.101 slave
# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
# 安装依赖
$ yum install -y epel-release
$ yum install -y wget net-tools ntp
# 同步时间
$ systemctl start ntpd
$ systemctl enable ntpd
3.1.2 数据库安装
# 数据库安装
# 下载金仓数据库
$ wget https://www.kingbase.com.cn/download/KingbaseES_V8R6_Linux_x86_64.tar.gz
# 解压安装包
$ tar -zxvf KingbaseES_V8R6_Linux_x86_64.tar.gz
# 安装数据库
$ cd KingbaseES_V8R6_Linux_x86_64
$ ./setup.sh –install-dir=/kingbase/app
# 创建数据目录
$ mkdir -p /kingbase/fgdata
# 初始化数据库
$ /kingbase/app/bin/initdb -D /kingbase/fgdata
# 启动数据库
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
# 下载金仓数据库
$ wget https://www.kingbase.com.cn/download/KingbaseES_V8R6_Linux_x86_64.tar.gz
# 解压安装包
$ tar -zxvf KingbaseES_V8R6_Linux_x86_64.tar.gz
# 安装数据库
$ cd KingbaseES_V8R6_Linux_x86_64
$ ./setup.sh –install-dir=/kingbase/app
# 创建数据目录
$ mkdir -p /kingbase/fgdata
# 初始化数据库
$ /kingbase/app/bin/initdb -D /kingbase/fgdata
# 启动数据库
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
3.1.3 集群配置
# 集群配置
# 主节点配置
$ vi /kingbase/fgdata/kingbase.conf
# 监听地址
listen_addresses = ‘*’
# 端口
port = 54321
# WAL级别
wal_level = logical
# 最大连接数
max_connections = 1000
# 最大WAL发送进程数
max_wal_senders = 10
# 保留的WAL段数
wal_keep_segments = 1024
# 同步复制
synchronous_commit = on
# 同步复制节点
synchronous_standby_names = ‘slave’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
# 允许从节点连接
host replication repuser 192.168.1.101/32 md5
# 重启主节点
$ /kingbase/app/bin/sys_ctl restart -D /kingbase/fgdata
# 创建复制用户
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE ROLE repuser REPLICATION LOGIN PASSWORD ‘repuser123’;”
# 从节点配置
$ vi /kingbase/fgdata/kingbase.conf
# 监听地址
listen_addresses = ‘*’
# 端口
port = 54321
# WAL级别
wal_level = logical
# 最大连接数
max_connections = 1000
# 最大WAL发送进程数
max_wal_senders = 10
# 保留的WAL段数
wal_keep_segments = 1024
# 同步复制
synchronous_commit = on
# 同步复制节点
synchronous_standby_names = ‘slave’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
# 允许主节点连接
host replication repuser 192.168.1.100/32 md5
# 主节点配置
$ vi /kingbase/fgdata/kingbase.conf
# 监听地址
listen_addresses = ‘*’
# 端口
port = 54321
# WAL级别
wal_level = logical
# 最大连接数
max_connections = 1000
# 最大WAL发送进程数
max_wal_senders = 10
# 保留的WAL段数
wal_keep_segments = 1024
# 同步复制
synchronous_commit = on
# 同步复制节点
synchronous_standby_names = ‘slave’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
# 允许从节点连接
host replication repuser 192.168.1.101/32 md5
# 重启主节点
$ /kingbase/app/bin/sys_ctl restart -D /kingbase/fgdata
# 创建复制用户
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE ROLE repuser REPLICATION LOGIN PASSWORD ‘repuser123’;”
# 从节点配置
$ vi /kingbase/fgdata/kingbase.conf
# 监听地址
listen_addresses = ‘*’
# 端口
port = 54321
# WAL级别
wal_level = logical
# 最大连接数
max_connections = 1000
# 最大WAL发送进程数
max_wal_senders = 10
# 保留的WAL段数
wal_keep_segments = 1024
# 同步复制
synchronous_commit = on
# 同步复制节点
synchronous_standby_names = ‘slave’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
# 允许主节点连接
host replication repuser 192.168.1.100/32 md5
3.2 主从复制配置
3.2.1 基础备份
# 基础备份
# 在从节点执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -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/10000028 on timeline 1
pg_basebackup: starting background WAL receiver
23866/23866 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/10000130
pg_basebackup: waiting for background process to finish streaming
pg_basebackup: base backup completed
# 在从节点执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -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/10000028 on timeline 1
pg_basebackup: starting background WAL receiver
23866/23866 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/10000130
pg_basebackup: waiting for background process to finish streaming
pg_basebackup: base backup completed
3.2.2 配置从节点
# 配置从节点
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动从节点
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动从节点
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
3.2.3 验证复制状态
# 验证复制状态
# 在主节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;”
# 输出
-[ RECORD 1 ]—-+——————————
pid | 12345
usesysid | 16384
usename | repuser
application_name | walreceiver
client_addr | 192.168.1.101
client_hostname | slave
client_port | 54321
backend_start | 2024-01-01 10:00:00.000000+08
backend_xmin |
state | streaming
sent_lsn | 0/10000130
write_lsn | 0/10000130
flush_lsn | 0/10000130
replay_lsn | 0/10000130
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
# 在从节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;”
# 输出
-[ RECORD 1 ]———+——————————
pid | 67890
status | streaming
receive_start_lsn | 0/10000000
receive_start_tli | 1
written_lsn | 0/10000130
flushed_lsn | 0/10000130
received_tli | 1
last_msg_send_time | 2024-01-01 10:00:00.000000+08
last_msg_receipt_time | 2024-01-01 10:00:00.000000+08
latest_end_lsn | 0/10000130
latest_end_time | 2024-01-01 10:00:00.000000+08
slot_name |
sender_host | 192.168.1.100
sender_port | 54321
conninfo | user=repuser password=******** dbname=replication host=192.168.1.100 port=54321 fallback_application_name=walreceiver
# 在主节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;”
# 输出
-[ RECORD 1 ]—-+——————————
pid | 12345
usesysid | 16384
usename | repuser
application_name | walreceiver
client_addr | 192.168.1.101
client_hostname | slave
client_port | 54321
backend_start | 2024-01-01 10:00:00.000000+08
backend_xmin |
state | streaming
sent_lsn | 0/10000130
write_lsn | 0/10000130
flush_lsn | 0/10000130
replay_lsn | 0/10000130
write_lag |
flush_lag |
replay_lag |
sync_priority | 1
sync_state | sync
# 在从节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;”
# 输出
-[ RECORD 1 ]———+——————————
pid | 67890
status | streaming
receive_start_lsn | 0/10000000
receive_start_tli | 1
written_lsn | 0/10000130
flushed_lsn | 0/10000130
received_tli | 1
last_msg_send_time | 2024-01-01 10:00:00.000000+08
last_msg_receipt_time | 2024-01-01 10:00:00.000000+08
latest_end_lsn | 0/10000130
latest_end_time | 2024-01-01 10:00:00.000000+08
slot_name |
sender_host | 192.168.1.100
sender_port | 54321
conninfo | user=repuser password=******** dbname=replication host=192.168.1.100 port=54321 fallback_application_name=walreceiver
3.3 故障转移与恢复
3.3.1 手动故障转移
# 手动故障转移
# 1. 停止主节点
$ /kingbase/app/bin/sys_ctl stop -D /kingbase/fgdata
# 2. 在从节点创建触发文件,提升为新的主节点
$ touch /kingbase/fgdata/trigger
# 3. 验证从节点状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT pg_is_in_recovery();”
# 输出
pg_is_in_recovery
——————-
f
(1 row)
# 4. 更新应用连接配置,指向新的主节点
# 修改应用的数据库连接配置,将主机地址改为新的主节点地址
# 1. 停止主节点
$ /kingbase/app/bin/sys_ctl stop -D /kingbase/fgdata
# 2. 在从节点创建触发文件,提升为新的主节点
$ touch /kingbase/fgdata/trigger
# 3. 验证从节点状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT pg_is_in_recovery();”
# 输出
pg_is_in_recovery
——————-
f
(1 row)
# 4. 更新应用连接配置,指向新的主节点
# 修改应用的数据库连接配置,将主机地址改为新的主节点地址
3.3.2 自动故障转移
# 自动故障转移
# 安装repmgr
$ yum install -y repmgr
# 配置repmgr
$ vi /kingbase/app/etc/repmgr.conf
node_id=1
node_name=’master’
conninfo=’host=master port=54321 user=repmgr dbname=repmgr’
data_directory=’/kingbase/fgdata’
# 在从节点配置repmgr
$ vi /kingbase/app/etc/repmgr.conf
node_id=2
node_name=’slave’
conninfo=’host=slave port=54321 user=repmgr dbname=repmgr’
data_directory=’/kingbase/fgdata’
# 创建repmgr数据库
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE DATABASE repmgr;”
$ /kingbase/app/bin/ksql -U system -d repmgr -c “CREATE USER repmgr WITH SUPERUSER PASSWORD ‘repmgr123’;”
# 注册主节点
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf primary register
# 注册从节点
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby clone –primary-host=master –primary-user=repmgr –primary-port=54321
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby register
# 启动repmgrd服务
$ /kingbase/app/bin/repmgrd -f /kingbase/app/etc/repmgr.conf -d
# 测试自动故障转移
# 停止主节点
$ /kingbase/app/bin/sys_ctl stop -D /kingbase/fgdata
# 查看集群状态
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf cluster show
# 安装repmgr
$ yum install -y repmgr
# 配置repmgr
$ vi /kingbase/app/etc/repmgr.conf
node_id=1
node_name=’master’
conninfo=’host=master port=54321 user=repmgr dbname=repmgr’
data_directory=’/kingbase/fgdata’
# 在从节点配置repmgr
$ vi /kingbase/app/etc/repmgr.conf
node_id=2
node_name=’slave’
conninfo=’host=slave port=54321 user=repmgr dbname=repmgr’
data_directory=’/kingbase/fgdata’
# 创建repmgr数据库
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE DATABASE repmgr;”
$ /kingbase/app/bin/ksql -U system -d repmgr -c “CREATE USER repmgr WITH SUPERUSER PASSWORD ‘repmgr123’;”
# 注册主节点
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf primary register
# 注册从节点
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby clone –primary-host=master –primary-user=repmgr –primary-port=54321
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby register
# 启动repmgrd服务
$ /kingbase/app/bin/repmgrd -f /kingbase/app/etc/repmgr.conf -d
# 测试自动故障转移
# 停止主节点
$ /kingbase/app/bin/sys_ctl stop -D /kingbase/fgdata
# 查看集群状态
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf cluster show
3.3.3 故障恢复
# 故障恢复
# 1. 修复故障节点
# 修复硬件故障或网络故障
# 2. 重新加入集群
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby clone –primary-host=slave –primary-user=repmgr –primary-port=54321
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby register
# 3. 验证集群状态
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf cluster show
# 1. 修复故障节点
# 修复硬件故障或网络故障
# 2. 重新加入集群
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby clone –primary-host=slave –primary-user=repmgr –primary-port=54321
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf standby register
# 3. 验证集群状态
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf cluster show
Part04-生产案例与实战讲解
4.1 两节点主从集群部署
4.1.1 案例背景
某企业需要部署一个两节点主从集群,确保数据库的高可用性和数据安全性。
4.1.2 解决方案
两节点主从集群部署:
- 环境准备:配置两台服务器,安装操作系统和依赖
- 数据库安装:在两台服务器上安装金仓数据库
- 主节点配置:配置主节点的参数和权限
- 从节点配置:执行基础备份,配置从节点
- 验证复制:验证主从复制状态
- 故障转移测试:测试故障转移功能
# 两节点主从集群部署步骤
## 1. 环境准备
# 节点信息
# 主节点:192.168.1.100,主机名:master
# 从节点:192.168.1.101,主机名:slave
# 配置主机名
$ hostnamectl set-hostname master
$ hostnamectl set-hostname slave
# 配置hosts文件
$ vi /etc/hosts
192.168.1.100 master
192.168.1.101 slave
# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
# 安装依赖
$ yum install -y epel-release
$ yum install -y wget net-tools ntp
# 同步时间
$ systemctl start ntpd
$ systemctl enable ntpd
## 2. 数据库安装
# 下载金仓数据库
$ wget https://www.kingbase.com.cn/download/KingbaseES_V8R6_Linux_x86_64.tar.gz
# 解压安装包
$ tar -zxvf KingbaseES_V8R6_Linux_x86_64.tar.gz
# 安装数据库
$ cd KingbaseES_V8R6_Linux_x86_64
$ ./setup.sh –install-dir=/kingbase/app
# 创建数据目录
$ mkdir -p /kingbase/fgdata
# 初始化数据库
$ /kingbase/app/bin/initdb -D /kingbase/fgdata
# 启动数据库
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 3. 主节点配置
# 配置kingbase.conf
$ vi /kingbase/fgdata/kingbase.conf
listen_addresses = ‘*’
port = 54321
wal_level = logical
max_connections = 1000
max_wal_senders = 10
wal_keep_segments = 1024
synchronous_commit = on
synchronous_standby_names = ‘slave’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
host replication repuser 192.168.1.101/32 md5
# 重启主节点
$ /kingbase/app/bin/sys_ctl restart -D /kingbase/fgdata
# 创建复制用户
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE ROLE repuser REPLICATION LOGIN PASSWORD ‘repuser123’;”
## 4. 从节点配置
# 执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -X stream -P
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动从节点
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 5. 验证复制状态
# 在主节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;”
# 在从节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;”
# 测试数据同步
# 在主节点创建表并插入数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE TABLE fgedu_test (id SERIAL PRIMARY KEY, name VARCHAR(100));”
$ /kingbase/app/bin/ksql -U system -d postgres -c “INSERT INTO fgedu_test (name) VALUES (‘fgedu1’), (‘fgedu2’);”
# 在从节点验证数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM fgedu_test;”
## 6. 故障转移测试
# 停止主节点
$ /kingbase/app/bin/sys_ctl stop -D /kingbase/fgdata
# 在从节点创建触发文件,提升为新的主节点
$ touch /kingbase/fgdata/trigger
# 验证从节点状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT pg_is_in_recovery();”
# 在新的主节点插入数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “INSERT INTO fgedu_test (name) VALUES (‘fgedu3’);”
# 启动原主节点,作为新的从节点
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
# 验证数据同步
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM fgedu_test;”
## 1. 环境准备
# 节点信息
# 主节点:192.168.1.100,主机名:master
# 从节点:192.168.1.101,主机名:slave
# 配置主机名
$ hostnamectl set-hostname master
$ hostnamectl set-hostname slave
# 配置hosts文件
$ vi /etc/hosts
192.168.1.100 master
192.168.1.101 slave
# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
# 安装依赖
$ yum install -y epel-release
$ yum install -y wget net-tools ntp
# 同步时间
$ systemctl start ntpd
$ systemctl enable ntpd
## 2. 数据库安装
# 下载金仓数据库
$ wget https://www.kingbase.com.cn/download/KingbaseES_V8R6_Linux_x86_64.tar.gz
# 解压安装包
$ tar -zxvf KingbaseES_V8R6_Linux_x86_64.tar.gz
# 安装数据库
$ cd KingbaseES_V8R6_Linux_x86_64
$ ./setup.sh –install-dir=/kingbase/app
# 创建数据目录
$ mkdir -p /kingbase/fgdata
# 初始化数据库
$ /kingbase/app/bin/initdb -D /kingbase/fgdata
# 启动数据库
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 3. 主节点配置
# 配置kingbase.conf
$ vi /kingbase/fgdata/kingbase.conf
listen_addresses = ‘*’
port = 54321
wal_level = logical
max_connections = 1000
max_wal_senders = 10
wal_keep_segments = 1024
synchronous_commit = on
synchronous_standby_names = ‘slave’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
host replication repuser 192.168.1.101/32 md5
# 重启主节点
$ /kingbase/app/bin/sys_ctl restart -D /kingbase/fgdata
# 创建复制用户
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE ROLE repuser REPLICATION LOGIN PASSWORD ‘repuser123’;”
## 4. 从节点配置
# 执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -X stream -P
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动从节点
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 5. 验证复制状态
# 在主节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;”
# 在从节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;”
# 测试数据同步
# 在主节点创建表并插入数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE TABLE fgedu_test (id SERIAL PRIMARY KEY, name VARCHAR(100));”
$ /kingbase/app/bin/ksql -U system -d postgres -c “INSERT INTO fgedu_test (name) VALUES (‘fgedu1’), (‘fgedu2’);”
# 在从节点验证数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM fgedu_test;”
## 6. 故障转移测试
# 停止主节点
$ /kingbase/app/bin/sys_ctl stop -D /kingbase/fgdata
# 在从节点创建触发文件,提升为新的主节点
$ touch /kingbase/fgdata/trigger
# 验证从节点状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT pg_is_in_recovery();”
# 在新的主节点插入数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “INSERT INTO fgedu_test (name) VALUES (‘fgedu3’);”
# 启动原主节点,作为新的从节点
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
# 验证数据同步
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM fgedu_test;”
4.1.3 实施效果
- 高可用性:当主节点发生故障时,从节点可以接管,确保系统的连续性
- 数据安全:通过主从复制,确保数据的安全性和可靠性
- 性能提升:可以将读操作分发到从节点,提高系统的整体性能
- 易于管理:通过repmgr等工具,实现集群的自动化管理
4.2 多节点集群部署
4.2.1 案例背景
某企业需要部署一个多节点集群,提高系统的可用性和读性能。,更多视频教程www.fgedu.net.cn
4.2.2 解决方案
多节点集群部署:
- 环境准备:配置多台服务器,安装操作系统和依赖
- 数据库安装:在所有服务器上安装金仓数据库
- 主节点配置:配置主节点的参数和权限
- 从节点配置:执行基础备份,配置所有从节点
- 验证复制:验证主从复制状态
- 负载均衡配置:配置负载均衡,分发读操作
# 多节点集群部署步骤
## 1. 环境准备
# 节点信息
# 主节点:192.168.1.100,主机名:master
# 从节点1:192.168.1.101,主机名:slave1
# 从节点2:192.168.1.102,主机名:slave2
# 配置主机名
$ hostnamectl set-hostname master
$ hostnamectl set-hostname slave1
$ hostnamectl set-hostname slave2
# 配置hosts文件
$ vi /etc/hosts
192.168.1.100 master
192.168.1.101 slave1
192.168.1.102 slave2
# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
# 安装依赖
$ yum install -y epel-release
$ yum install -y wget net-tools ntp haproxy
# 同步时间
$ systemctl start ntpd
$ systemctl enable ntpd
## 2. 数据库安装
# 下载金仓数据库
$ wget https://www.kingbase.com.cn/download/KingbaseES_V8R6_Linux_x86_64.tar.gz
# 解压安装包
$ tar -zxvf KingbaseES_V8R6_Linux_x86_64.tar.gz
# 安装数据库
$ cd KingbaseES_V8R6_Linux_x86_64
$ ./setup.sh –install-dir=/kingbase/app
# 创建数据目录
$ mkdir -p /kingbase/fgdata
# 初始化数据库
$ /kingbase/app/bin/initdb -D /kingbase/fgdata
# 启动数据库
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 3. 主节点配置
# 配置kingbase.conf
$ vi /kingbase/fgdata/kingbase.conf
listen_addresses = ‘*’
port = 54321
wal_level = logical
max_connections = 1000
max_wal_senders = 10
wal_keep_segments = 1024
synchronous_commit = on
synchronous_standby_names = ‘slave1,slave2’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
host replication repuser 192.168.1.101/32 md5
host replication repuser 192.168.1.102/32 md5
# 重启主节点
$ /kingbase/app/bin/sys_ctl restart -D /kingbase/fgdata
# 创建复制用户
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE ROLE repuser REPLICATION LOGIN PASSWORD ‘repuser123’;”
## 4. 从节点配置
# 在slave1执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -X stream -P
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动slave1
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
# 在slave2执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -X stream -P
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动slave2
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 5. 验证复制状态
# 在主节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;”
# 在从节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;”
# 测试数据同步
# 在主节点创建表并插入数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE TABLE fgedu_test (id SERIAL PRIMARY KEY, name VARCHAR(100));”
$ /kingbase/app/bin/ksql -U system -d postgres -c “INSERT INTO fgedu_test (name) VALUES (‘fgedu1’), (‘fgedu2’);”
# 在从节点验证数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM fgedu_test;”
## 6. 配置负载均衡
# 配置HAProxy
$ vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.1/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen postgresql
bind *:5000
mode tcp
balance roundrobin
option tcpka
option postgresql-check
server master 192.168.1.100:54321 check port 54321 inter 2s rise 2 fall 3
server slave1 192.168.1.101:54321 check port 54321 inter 2s rise 2 fall 3
server slave2 192.168.1.102:54321 check port 54321 inter 2s rise 2 fall 3
# 启动HAProxy
$ systemctl start haproxy
$ systemctl enable haproxy
# 测试负载均衡
$ /kingbase/app/bin/ksql -U system -d postgres -h fgedu.localhost -p 5000 -c “SELECT version();”
## 1. 环境准备
# 节点信息
# 主节点:192.168.1.100,主机名:master
# 从节点1:192.168.1.101,主机名:slave1
# 从节点2:192.168.1.102,主机名:slave2
# 配置主机名
$ hostnamectl set-hostname master
$ hostnamectl set-hostname slave1
$ hostnamectl set-hostname slave2
# 配置hosts文件
$ vi /etc/hosts
192.168.1.100 master
192.168.1.101 slave1
192.168.1.102 slave2
# 关闭防火墙
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭SELinux
$ setenforce 0
$ vi /etc/selinux/config
SELINUX=disabled
# 安装依赖
$ yum install -y epel-release
$ yum install -y wget net-tools ntp haproxy
# 同步时间
$ systemctl start ntpd
$ systemctl enable ntpd
## 2. 数据库安装
# 下载金仓数据库
$ wget https://www.kingbase.com.cn/download/KingbaseES_V8R6_Linux_x86_64.tar.gz
# 解压安装包
$ tar -zxvf KingbaseES_V8R6_Linux_x86_64.tar.gz
# 安装数据库
$ cd KingbaseES_V8R6_Linux_x86_64
$ ./setup.sh –install-dir=/kingbase/app
# 创建数据目录
$ mkdir -p /kingbase/fgdata
# 初始化数据库
$ /kingbase/app/bin/initdb -D /kingbase/fgdata
# 启动数据库
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 3. 主节点配置
# 配置kingbase.conf
$ vi /kingbase/fgdata/kingbase.conf
listen_addresses = ‘*’
port = 54321
wal_level = logical
max_connections = 1000
max_wal_senders = 10
wal_keep_segments = 1024
synchronous_commit = on
synchronous_standby_names = ‘slave1,slave2’
# 配置pg_hba.conf
$ vi /kingbase/fgdata/pg_hba.conf
host replication repuser 192.168.1.101/32 md5
host replication repuser 192.168.1.102/32 md5
# 重启主节点
$ /kingbase/app/bin/sys_ctl restart -D /kingbase/fgdata
# 创建复制用户
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE ROLE repuser REPLICATION LOGIN PASSWORD ‘repuser123’;”
## 4. 从节点配置
# 在slave1执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -X stream -P
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动slave1
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
# 在slave2执行基础备份
$ /kingbase/app/bin/pg_basebackup -h 192.168.1.100 -U repuser -D /kingbase/fgdata -X stream -P
# 创建recovery.conf文件
$ vi /kingbase/fgdata/recovery.conf
standby_mode = ‘on’
primary_conninfo = ‘host=192.168.1.100 port=54321 user=repuser password=repuser123’
trigger_file = ‘/kingbase/fgdata/trigger’
# 启动slave2
$ /kingbase/app/bin/sys_ctl start -D /kingbase/fgdata
## 5. 验证复制状态
# 在主节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;”
# 在从节点查看复制状态
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;”
# 测试数据同步
# 在主节点创建表并插入数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “CREATE TABLE fgedu_test (id SERIAL PRIMARY KEY, name VARCHAR(100));”
$ /kingbase/app/bin/ksql -U system -d postgres -c “INSERT INTO fgedu_test (name) VALUES (‘fgedu1’), (‘fgedu2’);”
# 在从节点验证数据
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM fgedu_test;”
## 6. 配置负载均衡
# 配置HAProxy
$ vi /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.1/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen postgresql
bind *:5000
mode tcp
balance roundrobin
option tcpka
option postgresql-check
server master 192.168.1.100:54321 check port 54321 inter 2s rise 2 fall 3
server slave1 192.168.1.101:54321 check port 54321 inter 2s rise 2 fall 3
server slave2 192.168.1.102:54321 check port 54321 inter 2s rise 2 fall 3
# 启动HAProxy
$ systemctl start haproxy
$ systemctl enable haproxy
# 测试负载均衡
$ /kingbase/app/bin/ksql -U system -d postgres -h fgedu.localhost -p 5000 -c “SELECT version();”
4.2.3 实施效果
- 高可用性:多个从节点,提高系统的可用性
- 性能提升:通过负载均衡,提高系统的读性能
- 数据安全:多个节点存储数据,提高数据的安全性
- 可扩展性:可以根据需要增加从节点,扩展系统的读性能
4.3 集群监控与维护
4.3.1 案例背景
某企业需要监控和维护数据库集群,确保集群的稳定运行。
4.3.2 解决方案
集群监控与维护:
- 监控配置:配置监控工具,监控集群状态
- 告警设置:设置告警规则,及时发现问题
- 日常维护:定期进行集群维护,如备份、补丁等
- 问题排查:当集群出现问题时,及时排查和解决
# 集群监控与维护步骤
## 1. 配置监控
# 安装Prometheus和Grafana
$ yum install -y prometheus grafana
# 配置Prometheus
$ vi /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘kingbase’
static_configs:
– targets: [‘192.168.1.100:9187’, ‘192.168.1.101:9187’, ‘192.168.1.102:9187’]
# 安装PostgreSQL exporter
$ wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.13.0/postgres_exporter-0.13.0.linux-amd64.tar.gz
$ tar -zxvf postgres_exporter-0.13.0.linux-amd64.tar.gz
$ cd postgres_exporter-0.13.0.linux-amd64
$ ./postgres_exporter –help
# 启动PostgreSQL exporter
$ export DATA_SOURCE_NAME=”postgresql://system:fgedu123@fgedu.localhost:54321/postgres?sslmode=disable”
$ ./postgres_exporter &
# 启动Prometheus和Grafana
$ systemctl start prometheus
$ systemctl enable prometheus
$ systemctl start grafana
$ systemctl enable grafana
# 配置Grafana
# 1. 打开Grafana界面:http://fgedu.localhost:3000
# 2. 登录:admin/admin
# 3. 添加数据源:选择Prometheus
# 4. 配置URL:http://fgedu.localhost:9090
# 5. 导入Dashboard:使用PostgreSQL Dashboard模板
## 2. 配置告警
# 配置Prometheus告警规则
$ vi /etc/prometheus/rules/kingbase.rules.yml
groups:
– name: kingbase
rules:
– alert: KingbaseDown
expr: pg_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: “Kingbase instance down”
description: “Kingbase instance {{ $labels.instance }} is down”
– alert: KingbaseReplicationLag
expr: pg_replication_lag > 300
for: 5m
labels:
severity: warning
annotations:
summary: “Kingbase replication lag”
description: “Kingbase replication lag on {{ $labels.instance }} is {{ $value }} seconds”
# 配置Prometheus告警管理器
$ vi /etc/prometheus/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: [‘alertname’]
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: ’email’
receivers:
– name: ’email’
email_configs:
– to: ‘admin@fgedu.net.cn’
from: ‘prometheus@fgedu.net.cn’
smarthost: ‘smtp.fgedu.net.cn:587’
auth_username: ‘prometheus’
auth_password: ‘password’
# 重启Prometheus
$ systemctl restart prometheus
## 3. 日常维护
# 定期备份
$ vi /kingbase/scripts/backup.sh
#!/bin/bash
# backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
DATE=$(date +”%Y%m%d_%H%M%S”)
BACKUP_DIR=”/kingbase/backup”
mkdir -p $BACKUP_DIR
/kingbase/app/bin/kbackup -U system -d fgedudb -f “$BACKUP_DIR/fgedudb_$DATE.backup”
# 设置执行权限
$ chmod +x /kingbase/scripts/backup.sh
# 配置crontab
$ crontab -e
0 0 * * * /kingbase/scripts/backup.sh
# 定期检查复制状态
$ vi /kingbase/scripts/check_replication.sh
#!/bin/bash
# check_replication.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
LOG_FILE=”/kingbase/log/check_replication_$(date +”%Y%m%d”).log”
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 开始检查复制状态” >> $LOG_FILE
# 检查主节点复制状态
/kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;” >> $LOG_FILE
# 检查从节点复制状态
/kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;” >> $LOG_FILE
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 检查完成” >> $LOG_FILE
# 设置执行权限
$ chmod +x /kingbase/scripts/check_replication.sh
# 配置crontab
$ crontab -e
*/10 * * * * /kingbase/scripts/check_replication.sh
## 4. 问题排查
# 查看集群状态
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf cluster show
# 查看数据库日志
$ tail -n 100 /kingbase/fgdata/log/server.log
# 检查复制延迟
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT slot_name, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag_bytes FROM pg_replication_slots;”
# 检查系统资源
$ top
$ free -m
$ df -h
$ iostat -x
## 1. 配置监控
# 安装Prometheus和Grafana
$ yum install -y prometheus grafana
# 配置Prometheus
$ vi /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
– job_name: ‘kingbase’
static_configs:
– targets: [‘192.168.1.100:9187’, ‘192.168.1.101:9187’, ‘192.168.1.102:9187’]
# 安装PostgreSQL exporter
$ wget https://github.com/prometheus-community/postgres_exporter/releases/download/v0.13.0/postgres_exporter-0.13.0.linux-amd64.tar.gz
$ tar -zxvf postgres_exporter-0.13.0.linux-amd64.tar.gz
$ cd postgres_exporter-0.13.0.linux-amd64
$ ./postgres_exporter –help
# 启动PostgreSQL exporter
$ export DATA_SOURCE_NAME=”postgresql://system:fgedu123@fgedu.localhost:54321/postgres?sslmode=disable”
$ ./postgres_exporter &
# 启动Prometheus和Grafana
$ systemctl start prometheus
$ systemctl enable prometheus
$ systemctl start grafana
$ systemctl enable grafana
# 配置Grafana
# 1. 打开Grafana界面:http://fgedu.localhost:3000
# 2. 登录:admin/admin
# 3. 添加数据源:选择Prometheus
# 4. 配置URL:http://fgedu.localhost:9090
# 5. 导入Dashboard:使用PostgreSQL Dashboard模板
## 2. 配置告警
# 配置Prometheus告警规则
$ vi /etc/prometheus/rules/kingbase.rules.yml
groups:
– name: kingbase
rules:
– alert: KingbaseDown
expr: pg_up == 0
for: 5m
labels:
severity: critical
annotations:
summary: “Kingbase instance down”
description: “Kingbase instance {{ $labels.instance }} is down”
– alert: KingbaseReplicationLag
expr: pg_replication_lag > 300
for: 5m
labels:
severity: warning
annotations:
summary: “Kingbase replication lag”
description: “Kingbase replication lag on {{ $labels.instance }} is {{ $value }} seconds”
# 配置Prometheus告警管理器
$ vi /etc/prometheus/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: [‘alertname’]
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: ’email’
receivers:
– name: ’email’
email_configs:
– to: ‘admin@fgedu.net.cn’
from: ‘prometheus@fgedu.net.cn’
smarthost: ‘smtp.fgedu.net.cn:587’
auth_username: ‘prometheus’
auth_password: ‘password’
# 重启Prometheus
$ systemctl restart prometheus
## 3. 日常维护
# 定期备份
$ vi /kingbase/scripts/backup.sh
#!/bin/bash
# backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
DATE=$(date +”%Y%m%d_%H%M%S”)
BACKUP_DIR=”/kingbase/backup”
mkdir -p $BACKUP_DIR
/kingbase/app/bin/kbackup -U system -d fgedudb -f “$BACKUP_DIR/fgedudb_$DATE.backup”
# 设置执行权限
$ chmod +x /kingbase/scripts/backup.sh
# 配置crontab
$ crontab -e
0 0 * * * /kingbase/scripts/backup.sh
# 定期检查复制状态
$ vi /kingbase/scripts/check_replication.sh
#!/bin/bash
# check_replication.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
LOG_FILE=”/kingbase/log/check_replication_$(date +”%Y%m%d”).log”
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 开始检查复制状态” >> $LOG_FILE
# 检查主节点复制状态
/kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_replication;” >> $LOG_FILE
# 检查从节点复制状态
/kingbase/app/bin/ksql -U system -d postgres -c “SELECT * FROM pg_stat_wal_receiver;” >> $LOG_FILE
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – 检查完成” >> $LOG_FILE
# 设置执行权限
$ chmod +x /kingbase/scripts/check_replication.sh
# 配置crontab
$ crontab -e
*/10 * * * * /kingbase/scripts/check_replication.sh
## 4. 问题排查
# 查看集群状态
$ /kingbase/app/bin/repmgr -f /kingbase/app/etc/repmgr.conf cluster show
# 查看数据库日志
$ tail -n 100 /kingbase/fgdata/log/server.log
# 检查复制延迟
$ /kingbase/app/bin/ksql -U system -d postgres -c “SELECT slot_name, pg_wal_lsn_diff(pg_current_wal_lsn(), restart_lsn) AS lag_bytes FROM pg_replication_slots;”
# 检查系统资源
$ top
$ free -m
$ df -h
$ iostat -x
4.3.3 实施效果
- 实时监控:实时监控集群状态,及时发现问题
- 自动告警:当集群出现异常时,及时发送告警
- 定期维护:定期进行集群维护,确保集群的稳定运行
- 快速排查:当集群出现问题时,快速排查和解决
Part05-风哥经验总结与分享
5.1 集群最佳实践
5.1.1 部署最佳实践
集群部署最佳实践:
- 硬件配置:选择高性能的硬件,确保集群的稳定性和性能,更多学习教程公众号风哥教程itpux_com
- 网络配置:确保网络带宽充足,网络延迟低
- 存储配置:使用高性能存储,如SSD,确保数据的读写性能
- 参数优化:根据实际情况,优化数据库参数
- 安全配置:配置防火墙,限制访问,确保集群的安全性
5.1.2 复制最佳实践
复制最佳实践:
- 复制模式:根据业务需求,选择合适的复制模式(同步、异步、半同步)
- 复制监控:定期监控复制状态,确保复制正常
- 复制延迟:控制复制延迟,确保数据的一致性
- 复制用户:创建专门的复制用户,限制权限
- 备份策略:定期备份数据,确保数据安全
5.1.3 高可用最佳实践
高可用最佳实践:
- 故障检测:使用心跳机制,及时检测节点故障
- 故障转移:配置自动故障转移,确保系统的连续性
- 脑裂防护:使用仲裁机制,防止脑裂问题
- 负载均衡:配置负载均衡,提高系统的性能
- 监控告警:配置监控和告警,及时发现和解决问题
5.2 常见问题与解决方案
5.2.1 复制问题
问题:复制延迟
解决方案:
解决方案:
- 检查网络带宽和延迟
- 优化主节点的WAL生成速度
- 增加从节点的资源配置
- 使用异步复制,提高性能
- 定期清理WAL日志,避免磁盘空间不足
5.2.2 故障转移问题
问题:故障转移失败
解决方案:
解决方案:
- 检查网络连接是否正常,from DB视频:www.itpux.com
- 检查从节点的状态
- 检查触发文件是否正确创建
- 检查repmgr配置是否正确
- 手动执行故障转移,测试功能是否正常
5.2.3 性能问题
问题:集群性能下降
解决方案:
解决方案:
- 检查系统资源使用情况
- 优化数据库参数
- 配置负载均衡,分发读操作
- 定期维护,如重建索引、更新统计信息等
- 考虑增加从节点,提高系统的读性能
5.2.4 脑裂问题
问题:集群脑裂
解决方案:
解决方案:
- 使用仲裁节点,解决脑裂问题
- 配置网络心跳,及时检测网络故障
- 设置合理的故障检测时间
- 定期测试故障转移功能,确保其正常工作
- 使用STONITH(Shoot The Other Node In The Head)机制
5.3 集群未来发展趋势
5.3.1 云原生集群
- 容器化部署:使用Docker和Kubernetes部署集群
- 云服务:使用云服务提供商的数据库集群服务
- 弹性伸缩:根据负载自动调整集群规模
- Serverless:使用Serverless架构,按需付费
5.3.2 分布式集群
- 水平扩展:通过增加节点来扩展系统容量
- 分片技术:将数据分片存储在不同节点上
- 一致性哈希:使用一致性哈希,提高数据分布的均匀性
- 自动分片:自动进行数据分片,减少人工干预
5.3.3 智能集群
- AI驱动:使用AI技术优化集群管理
- 自动优化:自动优化集群参数,提高性能
- 智能监控:使用机器学习技术预测和预防问题
- 自愈能力:自动检测和修复集群问题
5.3.4 混合云集群
- 混合部署:结合公有云和私有云部署集群
- 灾备方案:将从节点部署在公有云,实现异地灾备
- 数据同步:使用混合云数据同步技术,确保数据一致性
- 成本优化:根据业务需求,灵活选择云资源
风哥提示:集群主从架构是实现数据库高可用性的重要方案,掌握集群的部署和管理对于确保业务系统的稳定运行非常重要。在实际工作中,需要根据业务需求选择合适的集群模式,并做好监控和维护工作。
通过本文档的学习,您应该了解了金仓数据库集群主从架构的实践,包括集群主从架构的概念、特性、部署方式、配置方法等内容。在实际工作中,您可以根据这些内容,部署和管理数据库集群,确保系统的高可用性和数据安全性。
本文档风哥教程参考金仓官方文档集群管理、高可用等内容,结合实际生产经验编写,希望对您的工作有所帮助。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
