Skip to content

KingBaseES 基于备库的读写分离

基于备库的读写分离是 KingBaseES 提供的一种性能优化方案,通过将读操作分散到多个备库,减轻主库的读压力,提高系统的整体性能和可用性。

读写分离概述

工作原理

读写分离的基本原理是:

  1. 主库处理所有写操作和部分读操作
  2. 备库处理大部分读操作
  3. 应用程序通过中间件或驱动程序将读写请求路由到相应的数据库节点
  4. 主库和备库通过复制机制保持数据一致性

架构设计

基于备库的读写分离架构主要包含以下组件:

  • 主库:处理所有写操作,生成 WAL 日志
  • 备库集群:多个备库,处理读操作,通过复制机制与主库保持数据一致
  • 读写分离中间件:负责将读写请求路由到相应的数据库节点
  • 应用程序:通过中间件访问数据库,无需关心具体的数据库节点

适用场景

  • 读多写少的业务:如电商网站、新闻网站、报表系统等
  • 高并发访问场景:需要处理大量并发请求的业务
  • 性能瓶颈在主库读操作:主库的读操作成为性能瓶颈
  • 需要提高系统可用性:通过多节点部署提高系统的可用性

配置前准备

环境要求

组件要求
KingBaseES 版本V8 R6 及以上版本
主库配置已配置好归档和复制
备库配置至少 2 个备库,已配置为物理备库或逻辑备库
中间件支持 KingBaseES 的读写分离中间件(如 MyCat、ShardingSphere 等)
网络主备库之间网络连接稳定

软件准备

  • KingBaseES 安装包
  • 读写分离中间件(如需要)
  • 监控工具(用于监控读写分离的性能和状态)

详细配置步骤

1. 主库配置

1.1 修改 kingbase.conf 文件

ini
# ---------------------\n# WAL 配置\n# ---------------------\n# 启用归档模式
archive_mode = on

# 配置 WAL 级别
wal_level = replica

# 配置最大 WAL 发送进程数
max_wal_senders = 10

# 配置 WAL 保持段数
wal_keep_segments = 64

1.2 修改 pg_hba.conf 文件

添加备库的连接权限:

# 允许备库连接进行复制
host    replication     standby_user     192.168.1.100/32    md5

2. 备库配置

2.1 配置备库参数

编辑 kingbase.conf 文件:

ini
# 配置备库角色
primary_conninfo = 'host=192.168.1.100 port=54321 user=standby_user password=standby_password application_name=standby1'

# 配置备库是否允许只读访问
hot_standby = on

# 配置备库的最大连接数
max_connections = 200

# 配置备库的共享缓冲区
shared_buffers = 2GB

2.2 启动备库

bash
sys_ctl start -D /path/to/kingbase/standby_data

3. 读写分离中间件配置

以 MyCat 为例,配置读写分离:

3.1 配置 schema.xml 文件

xml
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
    <table name="test_table" primaryKey="id" dataNode="dn1" />
</schema>

<dataNode name="dn1" dataHost="host1" database="testdb" />

<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="jdbc:kingbase8://192.168.1.100:54321/testdb" user="root" password="123456">
        <readHost host="hostS1" url="jdbc:kingbase8://192.168.1.101:54321/testdb" user="root" password="123456" />
        <readHost host="hostS2" url="jdbc:kingbase8://192.168.1.102:54321/testdb" user="root" password="123456" />
    </writeHost>
</dataHost>

3.2 配置 server.xml 文件

xml
<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
</user>

4. 应用程序配置

修改应用程序的数据库连接字符串,连接到读写分离中间件:

java
// Java 应用配置示例
String url = "jdbc:kingbase8://192.168.1.200:8066/TESTDB";
String username = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, username, password);

验证读写分离

1. 验证主库写操作

sql
-- 在应用程序中执行写操作
INSERT INTO test_table (name) VALUES ('test');

-- 在主库中验证数据已写入
SELECT * FROM test_table WHERE name = 'test';

2. 验证备库读操作

sql
-- 在应用程序中执行读操作
SELECT * FROM test_table;

-- 在每个备库中查看连接数,验证读操作是否分散到多个备库
SELECT count(*) FROM pg_stat_activity;

3. 验证读写分离中间件

sql
-- 查看中间件的连接状态
SHOW @@connection;

-- 查看中间件的数据源状态
SHOW @@datasource;

4. 验证数据一致性

sql
-- 在主库中插入一条数据
INSERT INTO test_table (name) VALUES ('test2');

-- 等待几秒钟,然后在备库中查询数据
SELECT * FROM test_table WHERE name = 'test2';

监控与维护

1. 监控读写分离状态

使用 SQL 监控

sql
-- 查看主库的连接数
SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend';

-- 查看备库的连接数
SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend';

-- 查看主库的 WAL 生成速率
SELECT 
    (pg_current_wal_lsn() - pg_wal_lsn_offset(pg_current_wal_lsn(), 60)) AS one_minute_ago_lsn,
    pg_wal_lsn_diff(pg_current_wal_lsn(), pg_wal_lsn_offset(pg_current_wal_lsn(), 60)) AS wal_generated
FROM pg_stat_wal;

-- 查看备库的复制延迟
SELECT pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS replay_lag;

使用监控工具

  • KingBaseES Manager (KEM):提供图形化的读写分离监控
  • Prometheus + Grafana:通过 exporter 收集读写分离的指标
  • Zabbix:配置监控模板,监控读写分离的状态和性能

2. 日常维护

  • 定期监控主备库的连接数和负载
  • 定期检查复制延迟,确保备库与主库的数据一致性
  • 定期备份主备库的数据
  • 定期进行故障恢复演练,验证读写分离的可靠性
  • 监控中间件的性能和状态,及时发现和解决问题

故障排除

1. 备库无法接收读请求

症状:应用程序无法连接到备库,或备库拒绝读请求

排查步骤

  1. 检查备库的状态

    sql
    SELECT pg_is_in_recovery();
  2. 检查备库的 hot_standby 配置

    sql
    SHOW hot_standby;
  3. 检查备库的连接数

    sql
    SELECT count(*) FROM pg_stat_activity;
  4. 检查备库的日志文件

    bash
    tail -n 100 /path/to/kingbase/standby_data/log/kingbase.log

解决方案

  • 确保备库处于正常状态
  • 确保 hot_standby 配置为 on
  • 增加备库的 max_connections 参数
  • 检查并修复备库的日志错误

2. 读写分离中间件故障

症状:应用程序无法连接到中间件,或中间件无法路由请求

排查步骤

  1. 检查中间件的状态

    bash
    ps -ef | grep mycat
  2. 检查中间件的日志文件

    bash
    tail -n 100 /path/to/mycat/logs/wrapper.log
  3. 检查中间件的配置文件

解决方案

  • 重启中间件
  • 修复中间件的配置文件
  • 检查中间件的网络连接

3. 数据一致性问题

症状:备库的数据与主库不一致,或应用程序读取到旧数据

排查步骤

  1. 检查复制延迟

    sql
    SELECT pg_wal_lsn_diff(pg_last_wal_receive_lsn(), pg_last_wal_replay_lsn()) AS replay_lag;
  2. 检查主库的 WAL 发送状态

    sql
    SELECT * FROM pg_stat_replication;
  3. 检查备库的 WAL 接收状态

    sql
    SELECT * FROM pg_stat_wal_receiver;

解决方案

  • 优化网络配置,减少复制延迟
  • 增加主库的 WAL 保持段数
  • 调整备库的恢复参数,如 max_worker_processes
  • 考虑使用同步复制,确保数据零丢失

版本差异

特性V8 R6V8 R7
备库只读性能一般优化了备库的只读性能
并行查询支持有限支持增强了并行查询的支持
复制延迟较高优化了复制延迟
备库级联复制不支持支持
读写分离监控基本支持增强了监控指标

最佳实践

1. 架构设计

  • 备库数量:根据读请求的数量,配置足够的备库,建议至少 2 个备库
  • 备库配置:备库的硬件配置建议不低于主库,特别是 CPU 和内存
  • 网络设计:使用专用的网络链路进行复制,减少网络延迟
  • 中间件选择:选择成熟、稳定的读写分离中间件

2. 性能优化

  • 连接池配置:合理配置应用程序的连接池,避免连接泄漏
  • 查询优化:优化应用程序的查询,减少复杂查询的数量
  • 缓存策略:对于频繁访问的数据,使用缓存减少数据库的读压力
  • 负载均衡:使用中间件的负载均衡功能,将读请求均匀分配到多个备库

3. 高可用性

  • 多可用区部署:将主备库部署在不同的可用区,提高系统的可用性
  • 自动故障切换:配置自动故障切换,当主库故障时,自动将备库提升为主库
  • 监控告警:配置监控告警,及时发现和解决问题
  • 定期演练:定期进行故障恢复演练,验证系统的可靠性

4. 安全配置

  • 权限管理:严格控制数据库用户的权限,只授予必要的权限
  • 加密传输:使用 SSL/TLS 加密数据库连接
  • 防火墙配置:配置防火墙规则,只允许必要的端口访问
  • 定期备份:定期备份主备库的数据,确保数据安全

常见问题(FAQ)

1. 读写分离的优势是什么?

读写分离的主要优势包括:

  • 减轻主库的读压力,提高系统的整体性能
  • 提高系统的可用性,当主库故障时,备库可以继续提供读服务
  • 支持水平扩展,通过增加备库的数量,提高系统的读性能
  • 可以根据业务需求,灵活调整主备库的配置

2. 如何选择合适的读写分离中间件?

选择读写分离中间件时,需要考虑以下因素:

  • 支持 KingBaseES 数据库
  • 稳定性和可靠性
  • 性能和吞吐量
  • 功能完整性(如负载均衡、故障切换、监控等)
  • 社区支持和文档
  • 易用性和维护成本

3. 如何处理读写分离中的数据延迟问题?

处理数据延迟问题的方法包括:

  • 优化网络配置,减少复制延迟
  • 使用同步复制,确保数据零丢失
  • 对于对数据一致性要求高的业务,可以将其直接路由到主库
  • 使用缓存,减少对数据库的直接访问
  • 调整备库的恢复参数,提高恢复速度

4. 读写分离是否支持事务?

是的,读写分离支持事务,但需要注意以下几点:

  • 事务中的写操作会被路由到主库
  • 事务中的读操作会被路由到同一节点(主库或备库),以确保数据一致性
  • 对于跨节点的事务,需要使用分布式事务,这会增加系统的复杂性和性能开销

5. 如何监控读写分离的性能?

监控读写分离性能的方法包括:

  • 使用 SQL 命令查询主备库的连接数、负载和复制延迟
  • 使用监控工具(如 Prometheus + Grafana、Zabbix 等)监控读写分离的性能和状态
  • 使用中间件提供的监控功能,监控读写分离的路由和负载情况
  • 定期进行性能测试,评估系统的性能和吞吐量

总结

基于备库的读写分离是 KingBaseES 提供的一种有效的性能优化方案,可以帮助企业提高系统的整体性能和可用性。通过将读操作分散到多个备库,减轻主库的读压力,同时提高系统的可用性和扩展性。

在配置读写分离时,需要注意以下几点:

  • 确保主备库的配置正确,特别是复制配置
  • 选择合适的读写分离中间件
  • 合理配置备库的数量和硬件资源
  • 定期监控读写分离的性能和状态
  • 定期进行故障恢复演练,验证系统的可靠性

V8 R7 版本对读写分离进行了多项优化,包括提高备库的只读性能、优化复制延迟、增强并行查询支持等,建议在新部署或升级时优先考虑使用 V8 R7 版本。