KingbaseES 提供数据库部署工具进行数据库集群的部署。KingbaseES 提供基于图形化和命令行操作的集群部署方式,本文档主要用于指导不支持 GUI 的服务器上的 KingbaseES 集群部署工作。
集群简介
KingbaseES软件能够提供一主一备以及一主多备的高可用集群架构,实现数据及实例级 (异地) 故障容灾,也能够提供多节点并行服务,内存融合及存储共享,实现高并发性能利用最大化,结合读写分离或备份使用同步实现数据保护最大化。
主要特征
- 同步模式:集群可根据业务数据保护级别灵活支持多种数据复制模式。比如:实时(sync)模式、异步(async)模式、优选同步(quorum)模式。
- 高效切换:集群支持便捷高效的主备集群切换,切换过程仅需秒级完成。
- 数据保护:集群内的任意一个备库均为一个完整的冗余数据库,且可以同时配置多个备库。
- 平衡资源负载:集群内的任意一个备库均可配置为读访问,支持用户访问备库,执行查询、报表统计分析、作为ETL数据源进行数据抽取,减轻主库的系统负载,提升资源利用率。
- 故障转移:当主库(计划外)发生故障时,集群支持自动切换,实现了库级和中心级的自动容灾功能。
- 业务连续性保障机制:集群引入VIP设计,VIP将始终运行于主库服务器,当主库或主库所在服务器发生故障,VIP将自动随数据库切换而漂移(至新主库服务器)。
- 多种自动恢复模式:集群可以配置不同的自动恢复模式来处理故障数据库,满足用户不同层次的需求,包括:关闭自动恢复功能,自动恢复备数据库,自动恢复主数据。
相关概念
数据库模式:只有两种数据库模式:主库primary或备库standby
主库primary:提供正常的数据库读写服务,能正常生成WAL日志,如果有备库standby连接此数据库,还能将本地生产WAL日志传输给备库。
备库standby:提供只读服务,不能生成WAL日志,可以连接某一个主库primary,从主库接收WAL日志并重做。
主库primary不能切换为备库。
--将备库切换为主
SELECT sys_promote();数据库状态
KingbaseES数据库有以下几种状态:
DB_STARTUP:数据库刚启动时的状态,此时数据库正在重放WAL,用户不可连接。
DB_IN_PRODUCTION:主数据库正常运行时的状态。
DB_SHUTDOWNING:数据库正在关闭过程中的状态。
DB_SHUTDOWNED:主数据库正常关闭后的状态。
DB_IN_CRASH_RECOVERY:主数据库崩溃(意外退出)后刚启动时的状态。
DB_SHUTDOWNED_IN_RECOVERY:备数据库正常关闭后的状态。
DB_IN_ARCHIVE_RECOVERY:备数据库正常运行时的状态,或者主数据库PITR时的状态。
WAL(REDO日志)
REDO日志在KingbaseES数据库系统中一般指WAL(Write-Ahead Logging,预写式日志),是保证数据完整性的标准解决方案——任何对数据页面的修改都必须先记录WAL并持久化到存储上。
WAL中按顺序记录了所有对数据页面的修改,每一条修改记录称为一条Record。一个事务包含至少一条SQL语句,而一条SQL会记录一条或多条record。事务提交时只需要保证将WAL从内存写入磁盘就可以完成,而不需要保证所有更改的数据文件都写入磁盘。WAL是按顺序写入文件,而数据文件的更改大部分是随机位置,所以WAL写入磁盘的成本更低,这种方案减少了事务提交时磁盘写入的次数,提高了事务并发性能。
当数据库系统发生崩溃后,可以读取磁盘中的WAL并按顺序重放日志来恢复数据文件,保证了数据的可靠性。
WAL的文件组织形式是按wal_segment_size进行划分的,默认情况下wal_segment_size为16MB,即WAL是由一系列16MB大小的文件组成的。每个文件称为WAL段文件,段文件的名称是24字符的十六进制字符串,分别是8字符时间线、16字符段文件号,例如:000000010000000A0000002C。

LSN介绍
数据库每产生一条Record都会按LSN大小顺序追加到WAL文件中,插入位置就是LSN(Log Sequence Number)。LSN是uint64类型数值,随着record单调递增。LSN对外的显示形式是"%08X/%08X",范围为0/0到FFFFFFFF/FFFFFFFF。
每一条Record都有一个LSN值表示其起始字节位置,Record的结束位置就是下一个Record的起始位置,那么相邻两条Record的LSN的差值就是前一条Record的字节长度。
归档介绍
WAL段文件存储在数据目录的sys_wal下,开启归档功能后,每完成一个WAL段文件,数据库会执行archive_command将该文件进行归档。可以通过配置archive_command将WAL段文件拷贝到其他目录或其他设备上。
每当一个WAL段文件完成后,会在sys_wal/archive_status下生成一个同名的ready空文件,例如:000000010000000A0000002C.ready。开启归档后,KingbaseES数据库会有一个archiver进程专门负责WAL段文件的归档。该进程会不断扫描sys_wal/archive_status目录,寻找ready文件,当发现ready文件后,尝试执行archive_command归档ready文件对应的WAL段文件。
archive_command可以配置为任意命令,KingbaseES推荐配置命令格式为:test ! -f /mnt/server/archivedir/%f && cp %p
/mnt/server/archivedir/%f。其中,%p和%f由归档进程archiver在执行归档命令前自动替换,%p表示需要归档的文件路径(包括文件名),%f表示文件名称。
完成archive_command后,归档进程archiver会将ready文件重命名为done文件,表示归档完成,例如:000000010000000A0000002C.done。当然archive_command也可能执行失败,表示归档失败,失败后归档进程会不断重试,直到成功为止。
开启归档后,如果WAL段文件未被归档,该文件不会被KingbaseES回收。
脑裂
在主备集群或读写分离集群中,都应该有且只有一个primary节点,其他节点都为standby。如果主备集群或读写分离集群中有多个primary节点,此场景称为脑裂。
脑裂问题会导致数据分歧,无法保证数据一致性。
数据节点
数据节点指集群中有primary或standby数据库的节点,应用访问的是数据节点。
witness节点
witness节点,也称为仲裁节点、观察节点,应用不访问此节点,此节点主要作为集群故障自动切换时的仲裁。
命令行工具
管理、控制集群的命令行工具主要有repmgr和kbha,这两个命令行工具提供了大量丰富的能力用来维护、管理集群。
工具组件:

repmgr
repmgr用于管理KingbaseRWC中的故障转移,可支持一主一备或一主多备,备库支持同步和异步模式。它提供了repmgr和repmgrd两个主要的工具。
repmgr
用于执行管理任务的命令行工具,例如:
- 设置备库;
- 将备库提升为主库;
- 主备切换;
- 显示集群状态。
repmgrd
- 主动监视集群各节点状态并执行某些任务的守护进程,主要包括:
- 监视和记录复制性能;
- 通过检测主库的故障并提升最合适的备库进行故障转移。
包含的对象
为了有效的管理集群,repmgr需要存储KingbaseRWC集群的信息,其包含以下对象:
表
repmgr.event:记录感兴趣的事件。
repmgr.nodes:集群中每个节点的连接和状态信息。
视图
repmgr.show_nodes:展示所有节点的连接和状态信息。
常用命令
repmgr primary register
repmgr primary register在KingbaseRWC中注册主节点,会自动安装repmgr扩展。必须在其他任何节点之前注册。
--dry_run 检查先决条件,模拟完整注册过程,但不会对数据做任何的修改
-F, --force 如果该节点先前被注册过,该参数的作用是覆盖之前的注册信息将生成以下事件通知:
cluster_created
primary_register
repmgr primary unregister
repmgr primary unregister在KingbaseRWC中注销主节点,通常是在主库出现故障,并且集群中现有备库提升为新的主库后,将故障主库从集群中删除时执行。
--dry_run 检查先决条件,模拟完整注销过程,但不会对数据做任何的修改
--node-id 可以在集群任意可用节点上执行注销操作,通过该参数传入需要注销的主库ID
-F, --force 在没有备库的情况下,可强制注销主节点将生成以下事件通知:
primary_unregister
repmgr standby clone
从KingbaseRWC集群任一节点(一般是主节点)克隆一个新的备库。
-d, --dbname=CONNINFO 用于连接上游节点的字符串
--dry_run 检查先决条件,模拟完整克隆过程,但不会对数据做任何的修改
-c, --fast-checkpoint 强制上游节点立刻做一次checkpoint
--copy-external-config-file[={samepath \| kbdata}]
将位于上游节点data目录外的配置文件复制到备用节点上相同的位置或备节点的data目录
-R, --remote-user=USERNAME SSH或securecmdd远程执行命令时使用的用户名称(默认kingbase)
--replication-user 建立流复制连接时使用的用户名(非必须)。
-S, --superuser=USERNAME 当指定--copy-external-config-file参数,如果流复制用户没有超级用户权限且没有在
sys_read_all_settings中定义,则需要提供一个超级用户
--no-upstream-connection 当使用Baeman时,不连接上游节点
--upstream-conninfo 写入recovery.conf中的primary_conninfo信息
--upstream-node-id 上游节点ID
--without-barman 即使配置了Barman,也不使用
--replication-conf-only 为克隆的实例创建流复制配置,通常被写在kingbase.auto.conf文件中
--recovery-min-apply-delay kingbase中有同名参数,在repmgr.conf中设置该值后,kingbase中的设置的值将被覆盖生成以下事件通知:
standby_clone
repmgr standby register
注册备节点到KingbaseRWC集群。
-F, --force 如果该节点先前被注册过,该参数的作用是覆盖之前的注册信息
--upstream-node-id 上游节点ID,流复制的source对应ID
--wait-start=VALUE 等待备库启动(超时以秒为单位,默认为30秒)
--wait-sync[=VALUE] 等待节点记录同步到备库(可选超时,以秒为单位)生成以下事件通知:
standby_register
standby_register_sync(--wait-sync)
repmgr standby unregister
注销备库,只从KingbaseRWC集群中删除此节点信息,并不会影响流复制。
--node-id 需要注销的节点ID生成以下事件通知:
standby_unregister
repmgr standby promote
如果当前主节点故障,提升一个备节点为新的主节点。
--dry_run 检查先决条件,模拟完整升主过程,但不会对数据做任何的修改
-F, --force 忽略warnings信息,继续升主操作
--siblings-follow 让跟随旧主节点的standby节点跟随新的主节点退出码
SUCCESS (0):备节点成功提升为主。
ERR_DB_CONN (6):repmgr不能连接到当前节点KingbaseES数据库。
ERR_PROMOTION_FAIL (8):节点不能提升为主,可能的原因有:
集群中已经存在主节点;
节点不是一个备库;
WAL日志重放被暂停;
执行提或操作失败。
事件通知
standby_promote
repmgr standby follow
跟随一个上游节点。
--dry_run 检查先决条件,模拟完整follow过程,但不会对数据做任何的修改
--upstream-node-id 指定follow的上游节点ID
-W, --wait 等待主库出现,repmgr将等待多少秒(默认:60秒)来验证此节点是否跟随新的主库,
等待时间通过repmgr.conf配置文件的primary_follow_timeout配置项来配置 退出码
SUCCESS (0):跟随成功。
ERR_BAD_CONFIG (1):检测到配置问题,导致命令无法执行。
ERR_NO_RESTART (4):无法重启节点。
ERR_DB_CONN (6):repmgr无法和其中一个节点建立数据库连接。
ERR_FOLLOW_FAIL (23):repmgr standby follow 命令失败。
事件通知
standby_follow
repmgr standby switchover
只能在备节点执行,把主节点降级为备库,把当前备节点提升为主库。
--always-promote 在任何时候都将备用数据库提升为主数据库,即使它数据落后或偏离原主数据库
原主数据库将关闭,需要手动操作才能重新加入集群
--dry_run 检查先决条件,模拟完整switchover过程,但不会对数据做任何的修改
-F, --force 忽略warnings信息,继续switchover操作
--force-rewind[=VALUE] 如有必要,会执行sys_rewind把数据同步为跟原主库一致
-R, --remote-user=USERNAME 远程SSH/securecmdd操作的系统用户名(默认为当前操作系统用户)
-S, --superuser=USERNAME 使用超级用户代替普通流复制用户执行需要超级用户权限的操作
--repmgrd-no-pause 不要在执行切换时暂停repmgrd
--siblings-follow 让跟随旧主节点的standby节点跟随新的主节点
--archive-mode={ignore|default|archive}
指定执行主备切换时对未归档文件处理方式
ignore:忽略未归档的WAL文件并快速关闭archive进程
default:未归档WAL文件数量不能超过限制(默认128个)
archive:等待所有未归档WAL文件归档完成,如果归档文件长时间(60秒)未减少将中止切换流程
--lsnpending=VALUE 主备之间允许的最大LSN延迟(默认512MB),超过此限制则不允许切换,单位:MB
--wait 等待WAL文件传输完成,使用此参数时,--lsnpending参数不再有效
--choose 检查哪些备库可以执行“repmgr standby switchover”命令退出码
SUCCESS (0):切换成功。
ERR_SWITCHOVER_FAIL (18):切换命令执行失败。
ERR_SWITCHOVER_INCOMPLETE (22):已执行切换,但遇到了问题。通常是以前的主数据库无法作为备数据库重新加入集群。
事件通知
standby_switchover
repmgr witness register
注册观察节点。
--dry-run 检查先决条件,模拟完整注册过程,但不会对数据做任何的修改
-h, --host primary节点IP或主机名
-F, --force 如果在集群中已有该节点信息,则覆盖已存在节点的信息事件通知
witness_register
repmgr witness unregister
注销观察节点。
--dry-run 检查先决条件,模拟完整注销过程,但不会对数据做任何的修改
-F, --force 如果观察节点没有运行仍然注销
--node-id 观察节点的ID(在其它节点上执行时需要)
-D --data-dir 观察节点的数据目录(在其他节点上执行时需要)事件通知
witness_unregister
repmgr node status
显示节点的基本信息和复制状态的概述,此命令必须在本地节点上运行。
--csv 以CSV格式打印信息退出码
SUCCESS (0):成功。
ERR_NODE_STATUS (25):检测到一个或多个错误。
repmgr node check
从复制角度对节点进行一些运行状况检查。
-S, --superuser=USERNAME 使用指定超级用户执行一些需要超级用户权限的操作
--csv 以CSV格式打印信息(不使用于单个检查)
--nagios 以Nagios格式打印信息(只使用于单个检查)
--archive-ready 检查尚未归档的WAL文件数量
--downstream 检查预期的下游节点是否都已连接
--upstream 检查节点是否连接到上游节点
--replication-lag 检查节点是否滞后(备节点有效)
--role 检查节点是否有预期的角色
--slots 检查节点是否存在非活跃的物理复制槽
--missing-slots 检查是否缺少物理复制槽
--repmgrd 检查守护进程repmgrd是否在运行
--data-directory-config 检查repmgr.conf的配置项是否与实际的数据目录匹配
--db-connection 检查数据库连接是否正常,如果异常打印连接信息退出码
0: OK
1: WARNING
2: ERROR
3: UNKNOWN
或者
SUCCESS (0):没检测到错误。
ERR_NODE_STATUS (25):检查到一个或多个错误
repmgr node rejoin
把已经停止了的节点重新加入KingbaseRWC集群。
--dry_run 检查先决条件,模拟完整rejoin过程,但不会对数据做任何的修改
--force-rewind[=VALUE] 在满足sys_rewind的情况下,执行sys_rewind
--config-files 执行sys_rewind后,需要保留的配置列表,目前sys_rewind会
使用源节点中的文件覆盖本地节点的配置文件,因此建议使用此选项来确保保留它们
--config-archive-dir 指定保存配置文件的临时目录,默认为/tmp。
-W/--no-wait 不等待节点重新加入集群
如果设置了此项,则repmgr会重启节点,但不会等待它连接到主节点
--no-check-wal 在节点重新加入集群时,不检查时间线或LSN,只在指定了--roce-rewind时有效事件通知
node_rejoin
repmgr node service
显示或执行系统服务命令以 停止 / 启动 / 重新启动 / 重新加载 节点。
--dry_run 检查先决条件,模拟完整action过程,但不会对数据做任何的修改
--action 要执行的操作("start", "stop", "restart" 或 "reload"中的一种)
--list-actions 列出每个操作将要执行的命令
--checkpoint 在停止或重启节点前触发一个checkpoint
-S, --superuser=USERNAME 使用指定超级用户执行一些需要超级用户权限的操作退出码
SUCCESS (0):成功。
ERR_LOCAL_COMMAND (5):命令执行失败。
repmgr cluster show
显示集群中所有节点的信息。
此命令会轮询每一个节点,并显示节点的角色(primary/standby/witness)和状态,并且可以在任何节点上执行。
--csv 以CSV格式打印信息
--compact 禁止显示连接信息列退出码
SUCCESS (0):成功。
ERR_BAD_CONFIG (1):检索repmgr元数据时遇到错误。
ERR_DB_CONN (6):repmgr不能连接到当前数据库。
ERR_NODE_STATUS (25):在复制配置中检测到一个或多个错误。
repmgr cluster matrix
显示集群矩阵,并汇总输出,矩阵中记录成功或失败。可在所有节点上执行。
--csv 以CSV格式打印信息示例:
--所有节点正常
$ repmgr -f /etc/repmgr.conf cluster matrix
Name | Id | 1 | 2 | 3
-------+----+----+----+----
node1 | 1 | * | * | *
node2 | 2 | * | * | *
node3 | 3 | * | * | *
--所有节点正常
$ repmgr -f /etc/repmgr.conf cluster matrix
Name | Id | 1 | 2 | 3
-------+----+----+----+----
node1 | 1 | * | * | x
node2 | 2 | * | * | x
node3 | 3 | ? | ? | ?退出码
SUCCESS (0):所有节点正常。
ERR_BAD_SSH (12):一个或多个节点无法使用SSH/securecmdd连接。
ERR_NODE_STATUS (25):一个或多个节点上的KingbaseES无法访问。
repmgr cluster crosscheck
集群交叉检查,交叉检查每个节点组合之间的连接,输出类似CLUSTER MATRIX的检查结果。
--csv 以CSV格式打印信息退出码
SUCCESS (0):所有节点正常。
ERR_BAD_SSH (12):一个或多个节点无法使用SSH/securecmdd访问。
ERR_NODE_STATUS (25):一个或多个节点上的KingbaseES无法访问。
repmgr cluster event
展示格式化后的集群事件。
--csv 以CSV格式打印信息
--limit 最大显示条目数,默认20
--all 显示所有条目(该参数会覆盖--limit)
--event 筛选特定的事件
--node-id 将条目限定为此ID的节点
--node-name 将条目限定为此名称的节点
--compact 忽略打印“Details”信息列repmgr cluster cleanup
清除监控历史信息,防止repmgr.monitoring_history表过度增长。
-k, --keep-history=VALUE 指定保留历史记录的天数(默认是0)事件通知
cluster_cleanup
repmgr service status
显示所有节点上repmgrd服务的状态。
--csv 以CSV格式打印信息
--detail 输出详细信息
--verbose 显示任何数据库连接错误连接的全文repmgr service pause
暂停所有节点上repmgrd服务的故障转移功能。
--dry_run 检查先决条件,模拟完整pause过程,但不会对数据做任何的修改退出码
SUCCESS (0):所有节点的repmgrd故障转移服务已被暂停。
ERR_REPMGRD_PAUSE (26):一个或多个节点上的repmgrd故障转移服务不能被暂停。
repmgr service unpause
恢复所有节点上repmgrd服务的故障转移功能。
--dry_run 检查先决条件,模拟完整unpause过程,但不会对数据做任何的修改退出码
SUCCESS (0):所有节点的repmgrd故障转移服务已恢复。
ERR_REPMGRD_PAUSE (26):一个或多个节点的repmgrd故障转移服务无法恢复。
repmgr daemon start
在本地节点上启动repmgrd守护程序。
--dry_run 检查先决条件,模拟完整start过程,并未真正启动
-w/--wait 等待repmgrd启动(默认15秒)
--no-wait 不等待repmgrd启动退出码
SUCCESS (0):命令执行成功。
ERR_BAD_CONFIG (1):repmgr.conf中没有配置repmgrd_service_start_command。
ERR_DB_CONN (6):repmgr无法连接到当前节点数据库。
ERR_REPMGRD_SERVICE (27):命令执行失败。
repmgr daemon stop
在本地节点上停止repmgrd守护程序。
--dry_run 检查先决条件,模拟完整stop过程,并未真正停止
-w/--wait 等待repmgrd停止(默认15秒)
--no-wait 不等待repmgrd停止退出码
SUCCESS (0):命令执行成功。
ERR_BAD_CONFIG (1):repmgr.conf中没有配置repmgrd_service_stop_command。
ERR_REPMGRD_SERVICE (27):repmgrd不能被停止。
repmgr daemon reload
重新加载守护进程repmgrd。
退出码
SUCCESS (0):命令执行成功。
ERR_CODE_PID_FILE (3):重载信号发送失败。
repmgr config show
显示守护进程repmgrd的当前参数。
[name] 显示守护进程repmgrd参数名称,若无此值显示当前全部参数退出码
SUCCESS (0):命令执行成功。
ERR_CODE_PID_FILE (3):当前节点上的repmgrd未运行。
repmgr config showall
显示守护进程repmgrd的当前所有参数。
退出码
SUCCESS (0):命令执行成功。
ERR_CODE_PID_FILE (3):当前节点上的repmgrd未运行。
repmgr config check
检查守护进程repmgrd当前运行参数与repmgr.conf中配置是否一致。
退出码
SUCCESS (0):命令执行成功。
ERR_CODE_PID_FILE (3):当前节点上的repmgrd未运行。
kbha
kbha是KingbaseRWC集群的复制管理守护进程。
Kbha启动repmgrd,并且执行KingbaseES的自动恢复。
-f, --config-file=PATH 指定repmgr配置文件的路径
-A, --action={rejoin|register|follow|daemon|loadvip|unloadvip|arping|stopdb|startdb|updateinfo|removeinfo|check_ip|config|reload} 以哪种方式处理程序,默认方式为守护进程
--dev=device name 如果参数-A设置为check_ip,则允许输入网络设备名称
--ip=ip address 如果参数-A设置为check_ip,则必须要检查输入的IP(支持IPV4和IPV6)
--upstream-node-id=NODE_ID 如果参数-A设置为rejoin或follow,则执行命令的节点将跟随NODE_ID节点
show 如果参数-A设置为config,打印kbha运行时的关键配置
show [name] 如果参数-A设置为config,打印指定的[name]参数配置
showall 如果参数-A设置为config,打印kbha运行时的所有参数配置
check 如果参数-A设置为config,检查kbha运行时的参数与配置文件中设置是否一致
-d, --dbname=DBNAME 指定要连接的数据库名称(默认值为kingbase)
-h, --host=HOSTNAME 指定要连接的数据库服务器主机名称
-p, --port=PORT 指定要连接的数据库服务器端口(默认值为54321)
-U, --username=USERNAME 指定要连接的数据库用户名(默认值为kingbase)
-?, --help 显示帮助信息,然后退出
-V, --version 输出版本信息,然后退出
-v, --verbose 显示附加日志内容输出(对调试有用)守护进程
集群每个节点都存在两个守护进程。
守护进程repmgrd主要是监控集群并保障处理集群中的故障,包括:故障转移、故障恢复、VIP管理等。高可用设计的前提是软件不是百分百可靠的,所以一旦repmgrd进程故障后,集群中数据库遇到故障便无法处理,集群高可用能力就失效了。
为了保护守护进程repmgrd,守护进程kbha通过repmgr_pid_file文件监控repmgrd进程状态,一旦发现repmgrd进程不存在,会尝试启动repmgrd进程,时间间隔为 3秒左右。
而守护进程kbha则由操作系统的crond定时服务负责启动,定时任务会每分钟尝试启动一次kbha进程。
这两点分别保证了守护进程kbha和repmgrd的高可用。
repmgrd
数据库的守护进程为repmgrd,主要负责数据库的状态检查和故障处理,包括:故障自动切换、故障自动恢复等。
每个数据库节点有一个repmgrd守护进程,主节点的repmgrd只监视本地数据库,备节点的repmgrd会同时监控本地数据库和主数据库。所有节点的状态信息存在repmgr.nodes表里,并通过流复制同步到所有备节点。
kbha
- repmgrd进程的守护进程kbha主要负责repmgrd进程的状态监控,以及一些环境的检查,包括:信任网关检查、存储检测等。
远程通信工具
集群由多个节点组成,分布在不同的服务器上。除了数据库之间利用TCP进行数据同步,集群的守护进程以及一些命令行工具还需要利用远程通信工具来跨节点执行命令。
sys_securecmdd是集群中自带的工具,集群监控、管理集群时通过sys_securecmdd安全执行命令。其主要包含以下文件:
类型 | 文件名 | 作用 |
服务端 | sys_securecmdd | 默认监听8890端口,接受客户端连接。 |
sys_secureftp | 服务端调用,用于接收文件。 | |
sys_HAscmdd.sh | 脚本,管理服务端。 | |
客户端 | sys_securecmd | 客户端,用于连接服务端。 |
密钥文件 | accept_hosts | 免密文件 |
key_file | 私钥文件 | |
其他文件 | securecmdd_config | 服务端配置文件 |
securecmd_config | 客户端配置文件 | |
sys_HAscmdd.conf | 脚本配置文件 | |
securecmdd.service | 服务模板文件,服务端可以使用此文件注册为服务。 | |
依赖库文件 | libcrypto.so.10 | 依赖openssl编译,为了不同环境能够使用,需要带上编译使用的库文件。 |
sys_HAscmdd.conf是用于配置sys_securecmdd的文件,其中参数说明如下:
参数名称 | 描述 | 取值约束 |
start_method | 启动sys_securecmdd进程并保证进程高可用的方式。systemd,通用机集群默认值,通过service服务启动 sys_securecmdd; crontab,专用机集群默认值,通过crond服务定时启动 sys_securecmdd。 | crontab或systemd,默认为systemd。 |
scmd_port | 进程sys_securecmdd的监听端口,修改后,需要使用 sys_HAscmdd.sh脚本初始化。 | INT,默认8890。 |
tcp_user_timeout | 网络层的TCP_USER_TIMEOUT参数未确认数据(没有ACK)保留时长,超时后强制关闭连接。 | INT,9000;单位固定为毫秒ms |
使用方法-使用root启动
如使用root用户启动scmd,则后续sys_HAscmdd.sh脚本执行的所有指令都需要通过root用户执行。
初始化
初始化,主要初始化sys_securecmdd、sys_securecmd需要的配置文件和秘钥协商。
将securecmd_config、securecmdd_config修改后拷贝到/opt/kes/etc目录下。
将accept_hosts、 key_file拷贝到/root/.es 和 当前用户 ~/.es 目录下。
sys_HAscmdd.sh init启动sys_securecmdd进程和进程高可用能力
start_method=systemd 将securecmdd.service服务文件拷贝到/etc/systemd/system目录下,并启动sys_securecmdd服务。
start_method=crontab 通过crontab指令设置sys_securecmdd的定时任务。
查看sys_securecmdd进程状态
sys_HAscmdd.sh status关闭sys_securecmdd进程和进程高可用能力
sys_HAscmdd.sh stop卸载sys_securecmdd的配置文件和服务
sys_HAscmdd.sh uninstall使用方法-使用普通用户启动
启动scmd的普通用户需要和集群用户一致。如使用普通用户启动scmd,则后续sys_HAscmdd.sh脚本执行的所有指令都需要通过该普通用户执行。
初始化
初始化,主要初始化sys_securecmdd、sys_securecmd需要的配置文件和秘钥协商。
将securecmd_config、securecmdd_config修改后拷贝到/opt/kes/etc/${username}目录下。如当前普通用户名为kingbase,则对应目录为/opt/kes/etc/kingbase。
将accept_hosts/key_file拷贝到当前用户 ~/.es 目录下。
sys_HAscmdd.sh init启动sys_securecmdd进程和进程高可用能力
start_method=crontab (普通用户只允许以crontab模式启动scmd服务)通过crontab指令设置sys_securecmdd的定时任务
sys_HAscmdd.sh start查看sys_securecmdd进程状态
sys_HAscmdd.sh status关闭sys_securecmdd进程和进程高可用能力
sys_HAscmdd.sh stop卸载sys_securecmdd的配置文件和服务
sys_HAscmdd.sh uninstall故障恢复介绍

进程保护
守护进程repmgrd主要是监控集群并保障处理集群中的故障,包括:故障转移、故障恢复、VIP管理等。高可用设计的前提是软件不是百分百可靠的,所以一旦repmgrd进程故障后,集群中数据库遇到故障便无法处理,集群高可用能力就失效了。
为了保护守护进程repmgrd,守护进程kbha通过repmgr_pid_file文件监控repmgrd进程状态,一旦发现repmgrd进程不存在,会尝试启动repmgrd进程,时间间隔为 3秒左右。
而守护进程kbha则由操作系统的crond定时服务负责启动,定时任务会每分钟尝试启动一次kbha进程。
这两点分别保证了守护进程kbha和repmgrd的高可用。
故障自动转移
主库故障后,守护进程选择备库提升为主库对外提供服务,这个过程称为故障自动转移。
当备库上的守护进程repmgrd检查到主库异常时,会经过以下流程进行处理并最终完成故障自动切换。
尝试重连主节点
此流程,守护进程repmgrd会尝试重新连接主库,防止因网络抖动或其他故障导致检查结果不正确。
这个过程,repmgr的最大尝试次数为reconnect_attempts,相邻两次尝试时间间隔reconnect_interval秒,当reconnect_attempts * reconnect_interval 的循环结束,备库的repmgrd与主库连接依然没有重建,将进入准备流程。如果在这个过程中,成功重新连接上主库,则恢复正常监控状态,集群恢复正常。
准备流程
此流程,主要是进入竞选流程前的一些准备工作,保证竞选流程所有备库处于同一状态。
如果配置参数standby_disconnect_on_failover打开,则需要在进入竞选流程前关闭备库的walreceiver进程。守护进程repmgrd会向数据库的walreceiver进程发送SIGTERM信号,并循环使用信号0测试walreceiver进程是否已经退出。同时调整wal_retrieve_retry_interval的值防止walreceiver再次启动。整个关闭walreceiver的过程至少需要6秒钟,如果walreceiver进程没有正常退出,则最多等待约1分钟。
如果有其它备库,则检查并等待其它备库关闭walreceiver进程,如果其它备库walreceiver没有关闭,将等待并重试30秒。
检查确认集群是否配置了witness节点,是否有witness节点将会影响竞选流程。接下来进入竞选流程。
竞选流程
当主库故障前集群中有多于1个备库存活时,各个备库需要通过竞选逻辑,确认由哪一个备库作为新的主节点;当主库故障前集群中只有1个备库存活,该备库通过条件判断后作为唯一备库当选。
首先,依据不同synchronous配置模式,检查当前同步状态是否符合切换条件,不符合条件的放弃竞选流程;符合的继续下一步检查。
同步配置 | 切换条件 | 检查的意义 |
all | 主库故障前,前备库在 sys_stat_replication视图中state=streaming, sync_stat=sync | 保证主库故障前,该备库已经完成了 wal日志的catchup过程,并且是同步备机,避免丢数据。 |
quorum | 主库故障前,前备库在 sys_stat_replication视图中state=streaming, sync_stat=quorum | 保证主库故障前,该备库已经完成了 wal日志的catchup过程,避免丢数(一主多备的情况下quorum配置并不能保证该备机处于同步状态)。 |
sync、 custom | 主库故障前,前备库在 sys_stat_replication视图中state=streaming, sync_stat=sync | 保证主库故障前,该备库已经完成了 wal日志的catchup过程,并且是同步备机,避免丢数据。 |
async | 主库故障前获取到的主库 flush_lsn与本库 replay_lsn的差值小于参数 lsn_lag_threshold的值 | 保证主库故障前,异步备机与主库的wal日志差距不会过大。 |
检查集群中是否有其它备节点,如果没有,本节点默认竞选成功,退出竞选流程; 如果有,继续下一步检查。
将本地节点初始为candidate_node(当前最优节点),从本地库repmgr.nodes表中获取所有standby节点并进行遍历,遍历过程中会依次检查每一个节点并设置状态量:visible_nodes,如果节点能通过libkci连接成功,计数+1;nodes_with_primary_still_visible,如果节点的upstream_last_seen即与主库正常连通的最近记录时间与当前时间间隔小于repmgrd监控循环间隔(默认2s) * 2,计数+1。
对于同步模式下,节点流复制状态不是streaming+quorum/sync的节点过滤不可作为candidate_node。
最后依次比较下列4个条件更新candidate_node:LSN,值更大胜出;节点catchup状态false则不可作为candidate_node;priority,值更高的胜出;node_id,值更小的胜出。
遍历完成后,当前的candidate_node作为备选节点,在参数primary_visibility_consensus设置为true时,还会检查nodes_with_primary_still_visible的计数值,如果大于1代表上一个监控周期内仍有其它节点能联系到主库,放弃升主操作,否则继续下一步检查。
半数节点存活检查,此处会区分集群是否部署了witness节点:
1) 没有部署witness的集群:如果满足公式visible_nodes <= total_nodes/2.0 则竞选失败。即如果从本节点的视角看,可见的备节点数不足集群总的备节点数一半,中断流程,故障自动转移失败。
2) 部署了witness的集群:如果满足公式visible_nodes <=(total_nodes+1)/2.0, 不再直接放弃切换,如果同时满足条件 (存活的备节点数+1) >= (总备节点数+1)/2.0 时,与witness可见的备节点可以切换。
总结来说,没有witness部署的集群不支持大于半数节点失效场景下的切换;部署了witness节点的集群可以有限的支持大于半数节点失效时的切换。
注意
visible_nodes是包含本节点在内的所有从本节点视角下可见备节点数量(可见指的是libkci可连接),如果集群配置了witness节点,witness节点也包括在内;total_nodes 指的是当前repmgr.nodes表中状态为active且上游节点是故障的主节点的节点数量,如果集群配置了witness节点,witness节点也包括在内。
如果配置了standby_disconnect_on_failover,将参数wal_retrieve_retry_interval改回默认值。
竞选成功的进入升主流程,成为新的主节点;竞选失败的节点等待新的主节点出现,并跟随新的主节点建立流复制。
升主流程
ping trusted_servers, 获取trusted_servers配置的网关列表,分别ping,只要有1个ping通即成功,如果都不成功会尝试reconnect_attemts轮次。如果全部尝试失败,放弃升主; 成功则进行下一步。
如果仍能通过ssh连接原主库所在主机,则尝试ssh到主库上调用kbha -A stopdb保证主库停库。
如果集群配置了 vip (virtual ip),则挂载vip,挂载成功进行下一步,挂载失败则放弃升主。
执行promote操作,并在完成升主后执行checkpoint。
注意
加载vip的过程需要检查配置的vip在网络中是否已经存在,如已经存在会尝试卸载vip后再次在本机挂载; 挂载动作完成后还会执行arping命令,只有当挂载vip和arping都执行成功,才会进行promote操作,否则放弃升主。由于vip需要在升主动作之前执行,可能会出现在vip已经挂载而升主尚未完成期间,业务已经通过vip来到尚未升主的数据库节点,此时由于数据库仍处于只读状态,增删改操作会暂时无法执行,待数据库完成promote操作后业务才能完全恢复。
故障自动恢复
主库所在节点的repmgrd进程通过流复制监控其他数据库状态,一旦发现其他数据库对应的流复制断开,则认为该数据库异常,经过reconnect_attempts次检查,每次间隔monitor_interval_secs(默认2秒),如果数据库的流复制仍然断开,可以认为数据库故障。
根据自动恢复参数recovery配置为不同值,采取不同措施:
- manual,手动恢复,不处理数据库故障。
- standby,仅当故障数据库为备库时才处理,如果是故障主库,则不处理。
- automatic,任何故障数据都处理。
当主库上的守护进程repmgrd认为数据库故障后,如果故障数据库(根据配置)能够处理,就会准备开始执行故障自动恢复。开始执行故障自动恢复前,会等待auto_recovery_delay(默认20秒),在此期间,也会不断检测流复制。如果在此期间故障数据库成功和主库建立流复制,则认为该数据库重连成功,中断自动恢复流程;否则,等待时间结束后,开始自动恢复故障备库。
故障自动恢复流程:
- 主库的repmgrd进程远程到故障数据库调用kbha -A rejoin开始恢复。
- 尝试连接故障数据库:连接成功则查询故障数据库状态,如果为主库则中断恢复流程,如果为备库则关闭数据库,并进行下一步;连接失败,直接下一步。
- 通过pid文件和共享内存检测数据库是否成功关闭:如果pid对应进程存在或共享内存正在使用,中断恢复流程;否则,直接下一步。
- 执行sys_rewind修改故障数据库文件,使得故障库数据和主库保持一致。
- 配置流复制连接,在主库建立复制槽,然后启动故障数据库。
- 将故障数据库注册为备库,并更新状态。
- 恢复结束。
在恢复结束后,主库repmgrd进程会尝试连接完成恢复的数据库,确认其状态,有三种结果:
- 【故障数据库恢复成功】:连接成功,结束。
- 【故障数据库恢复失败】:连接失败,数据库未响应,如果尝试次数未达到3次则再次尝试,否则结束。
- 【故障数据库恢复超时】:连接失败,数据库有响应(数据库可能正在redo恢复),如果未超时(in_recovery_timeout,默认为3600秒)则再次尝试,否则结束。
不论结果如何,到此整个流程结束,主库的repmgrd重新开始进行其他数据库的状态检查。
网络断开
网络故障是最容易造成脑裂的故障,特别是主库或备库的网络断开,如果不能正确的知道是否为本节点的网络故障,容易造成脑裂。为了能够识别网络故障,KingbaseES引入了"信任网关(trusted_servers)"的概念,守护进程kbha通过判断和信任网关的连通性来判断本机是否出现了网络故障。
参数 | 取值 | 说明 |
trusted_servers | IP1[,IP2,IP3] | 配置为集群内部网络的网关设备的IP地址,例如路由器的IP地址。 |
ping_path | /bin | 操作系统ping命令的路径 |
检测信任网关的方法:命令"ping -c3 -w2 ${IP}"来不断探测信任网关(trusted_servers)的连通性,当ping所有的信任网关IP都返回异常时,认为信任网关异常,再次尝试,最多尝试reconnect_attempts次,如果每次都异常,那么就认为网络故障。
集群异常时,如果主库故障,在进行故障自动转移的升主流程中,第一步就会通过以上方法检测信任网关来判断网络状态:如果确认网络故障,则会中断流程,故障自动转移失败;如果网络正常,那么正常升主。故障自动转移成功后,新主库为了预防网络问题,会自动探测集群其他节点状态,尝试关闭其他主库。
集群状态正常时,守护进程kbha会不断通过以上方法检测信任网关。当确认网络故障后,kbha会自动关闭守护进程repmgrd,kbha会接管repmgrd负责的部分功能,大致功能表现如下:
功能 | 网络正常(kbha和repmgrd) | 网络故障(kbha) |
故障自动转移 | 支持 | 不支持 |
故障自动恢复 | 支持 | 不支持 |
VIP管理 | 支持 | 支持 |
同异步转换 | 支持 | 支持 |
集群多级别自动恢复 | 支持 | 支持(仅能恢复主库) |
存储检测 | 支持 | 支持 |
全局故障恢复(集群多级别自动恢复)
当出现整个集群故障、掉电后重新上电等情况下,对整个集群的自动恢复功能(目前只支持1级自动恢复)。当参数auto_cluster_recovery_level=1时,此功能开启;参数auto_cluster_recovery_level=0时,此功能关闭。此功能默认开启,如果需要修改此参数,在repmgr.conf文件中修改此参数后,需要重启repmgrd/kbha守护进程生效。
自启动功能在满足以下所有条件后才会生效并恢复集群:集群全部节点均故障、节点间网络正常、集群中只有1个节点为主库状态。
集群故障后,守护进程kbha检查集群其它节点状态,当其它节点都能连通,数据库均处于停库状态且没有其它数据库处于主库状态时,启动本地的主库。随后主库上的守护进程repmgrd通过故障自动恢复尝试恢复其它备库节点。
外部存储故障
当数据库数据目录对应的外部存储故障后,数据库的数据以及WAL可能无法正常写入或读取,会造成不可预知的风险。所以,集群需要能够检查存储并及时处理。
参数 | 取值 | 说明 |
use_check_disk | on | 开启存储故障后转移功能,如果发现存储存在问题,关闭本节点数据库。 |
off | 关闭功能,仅做检查并打印日志。 | |
mount_point_dir_list | path1[,path2] | 进行存储检查的路径,默认为"",如果配置为空,则检查data_directory;如果配置多个路径,使用','进行分隔。 |
mount_check_max_retries | 0-INT | 发现存储异常后,重试次数,默认为6。如果重试之后仍然异常,认为存储盘故障。 |
集群的守护进程kbha负责此功能:
- 每隔 60秒 检查一次存储;
- 在mount_point_dir_list配置的路径下进行检查,如果此参数等于"",则默认在data_direcotry路径下做检查;
- 检查方式:查看目录、创建临时文件、向临时文件写入8KB数据、从临时文件读取8KB数据,删除临时文件;
- 检查中任意项失败则认为集群异常,重试mount_check_max_retries。
每次重试间隔10秒
如果重试过程中,检查无问题,则重置重试次数,恢复正常检查。
如果重试完,检查仍然异常,认为磁盘故障。
认定磁盘故障后,根据参数不同采取不同的措施:如果重试完,检查仍然异常,认为磁盘故障;use_check_disk=off,仅打印报错信息。
同异步转换
集群通过配置数据库参数synchronous_standby_names和synchronous_commit两个参数来控制数据库之间数据同步的行为。其中synchronous_standby_names是同步备库的配置参数,配置此参数可以决定有哪些数据库可以作为同步备库或异步备库;而synchronous_commit则是同步级别的参数,配置此参数可以控制数据同步的级别,不同级别数据同步程度不一致。
以下代码清晰地展示了synchronous_commit五种配置的区别,简要概括:
- off: 事务信息到了主库缓存,返回给用户。
- local: 事务信息到了主库WAL文件,返回给用户。
- remote_write: 事务信息到了备库缓存,返回给用户。
- on: 事务信息到了备库WAL文件,返回给用户。
- remote_apply: 事务信息到了备库WAL文件且应用到数据文件,返回给用户。

其他说明:
异步的集群会有丢数风险。
同步的集群synchronous_commit < on 有丢数风险。
同步的集群synchronous_commit = on 备库有暂时查询不到的可能(但不会丢数)。
同步的集群synchronous_commit = remote_apply 主备数据强一致性。
从性能维度而言,从高到低:off > local > remote_write > on > remote_apply。
集群中默认设置synchronous_commit=remote_apply保证主库和同步备库强一致。那么接下来就是通过配置synchronous_standby_names决定集群中哪些数据库可以作为同步备库:
集群同异步功能 | 参数值 | 解释 | repmgrd采取操作 |
异步(async) | synchronous_standby_names='' | 所有备库都为异步 | 如果参数不为空,自动设置为空。 |
同步(sync) | synchronous_standby_names='1 (node2, node3)' | 第一个连接主库的备库为同步备库sync,其他备库为潜在同步备库potential(实际为异步); 当同步备库故障后,第一个 potential备库自动变为同步。 potential备库自动变为同步。 | 通过流复制查看,有备库连接主库时,且主备差异小于LSN_LAG (默认16M),集群切换为同步模式 ,设置数据库参数为实例中的格式。无备库连接主库时,集群将切换为异步模式,设置数据库参数为空。 |
优选同步(quorum) | synchronous_standby _names='ANY (node2, node3)' | 所有备库都显示为quorum,最先同步完成的备库为同步备库; 任意备库故障不影响其他备库。 | 同上 |
全同步(all) | synchronous_standby _names='ALL (node2, node3)' | 所有备库都为同步备库sync,需要等待所有同步备库都完成同步后主库才能提交; 任意备库故障,不影响其他备库。 | 如果参数不为示例中的格式,自动设置(由内核控制同异步)。 |
自定义(custom) | synchronous_standby _names的值与以下参数的配置有关: sync_nodes potential_nodes async_nodes | sync_nodes参数中指定的备库为同步备库,当同步备库故障后, potential_nodes中的备库会升为同步备库, potential_nodes参数中指定的备库为同步候选备库,async参数中指定的备库为异步备库 | sync_nodes中配置的节点,主备差异小于LSN_LAG(默认16M),其为同步备用节点; potential_nodes中配置的节点默认为同步候选节点,当sync_nodes中的备用节点故障后,将其调整为同步备用节点,当sync_nodes中故障的备用节点恢复后,potential_nodes中升为同步备用节点的备库自动降为同步候选节点; async_nodes参数中配置的节点,始终不会出现在 synchronous_standby_names数据库参数中。 |
集群同异步转换触发:
- 由主库端的repmgrd进程执行,每轮(默认间隔2秒)检测都会根据sys_stat_replication视图以及集群配置判断是否需要调整。
- 在特殊情况下(网关故障时repmgrd会退出),kbha会接管主库repmgrd的同异步转换工作。
- 执行repmgr standby promote/repmgr standby switchover/repmgr standby unregister时会触发并尝试更新同步配置。
同步转异步以及异步转回同步的判断逻辑:
- 首先获取repmgr.conf中配置的集群默认同异步配置synchronous。
- 获取当前实际的同步配置synchronous_standby_names。
- 获取当前集群流复制状态。
- 比较当前synchronous_standby_names值和流复制状态,决定是否需要转换同异步。
无流复制:如果当前已经是异步则不做操作,否则同步转异步。
有流复制:如果当前已经是同步则不做操作,否则查看主备差异,小于预期(默认16M)则异步转同步。
Virtual IP的管理与支持
VIP(Virtual Internet-Protocal,虚拟IP)是主备集群提供的一种功能,用于应用访问集群的接口。VIP会由主库的守护进程repmgrd加载到本地设备上,当主库故障发生故障自动转移时,VIP会自动漂移到新的主库上,应用方法VIP就不受主库故障的影响。
集群中关于VIP相关参数:
--集群加载VIP的命令
vip_add_cmd='ip addr add $\ *IP*\ $ dev $\ *DEV*\ $ label $\ *DEV*\ $:3'
arping_cmd='arping –U $\ *IP*\ $ -w 2 –c 2 –I $\ *DEV*\ $'
--集群卸载VIP的命令
vip_del_cmd='ip addr del $\ *IP*\ $ dev $\ *DEV*\ $'VIP变化的触发点:
- 主库注册:执行primary register操作时,在主库写入primary信息前加载vip。
- 主库注销:在删除primary信息后卸载vip操作。
- 故障切换:在切换过程中,备库执行promote前,先加载vip,如果vip仍然连通,需要尝试登陆到原主库卸载vip——此过程会不断重试,直到成功或者vip_timeout超时。
- 主备切换(switchover):需要先在原主库卸载vip,再在备库升主前加载vip。
- repmgrd监控主库进程:每隔check_vip_interval检查一次,如果vip不存在则加载。
- repmgrd监控备库进程:每隔check_vip_interval检查一次,如果vip存在则卸载。
- 网关故障:repmgrd进程会退出,其检测vip的逻辑由kbha进程代替。
在线自动块修复
集群中,主数据库访问持久化用户表数据、索引时,从磁盘读取数据块至共享缓冲区,如果检测到坏块,自动从备节点获取坏块的副本,并修复坏块。
参数
auto_bmr.enable_auto_bmr:是否开启自动块修复功能,取值范围0/1,默认为1,支持reload。
auto_bmr.auto_bmr_req_timeout:块自动修复的超时时间,取值范围0至INT_MAX,默认为60s,0表示不限制,支持set。
auto_bmr.auto_bmr_sess_threshold:session级最大块修复数量,取值范围0至INT_MAX,默认为100,0表示不限制,支持set。
auto_bmr.auto_bmr_sys_threshold:系统级最大块修复数量,取值范围0至INT_MAX,默认为1024,0表示不限制,支持reload。
约束
只支持主库自动块修复,需将auto_bmr.enable_auto_bmr参数设置为1,并且需创建auto_bmr扩展插件。
如果checksum没有打开,只检测块的头部是否有效;checksum打开时,同时检查块的头部和块数据是否有效。
如果开启zero_damaged_pages,此参数会在块修复结束后生效。

块自动修复功能当检测到坏块和坏块修复成功时,在日志中有对应的WARNING提示信息。检测到坏块时提示信息如下所示:
2021-10-12 18:59:06.264 CST [9128] WARNING: page **is** invalid:base/16089/16385, blockNum: 3修复坏块成功时提示信息如下所示:
2021-10-12 18:59:06.292 CST [9128] WARNING: repair invalid page:base/16089/16385, blockNum: 3 successfully.如果在日志中有类似如下提示:
WARNING: Exec get buffer page failed,errMsg:ERROR: function public.get_lsn_reached_page(integer, integer, integer, integer, integer,integer) does **not** exist LINE 1: select public.get_lsn_reached_page(1663, 16832, 16881, 0, 1,... HINT: No function matches the given name **and** argument types. You might need to add explicit type casts.需创建auto_bmr扩展插件:
test=\ *# create extension auto_bmr;*
CREATE EXTENSION如果系统修复的块数量超过系统级最大块修复数量,可通过select reset_auto_bmr_sys_bad_blk()重置系统块修复数量。
test=\ *# select reset_auto_bmr_sys_bad_blk();*
reset_auto_bmr_sys_bad_blk
----------------------------
(1 行记录)如果一个session修复的块数量超过session级最大块修复数量,可通过select reset_auto_bmr_sess_bad_blk()重置session修复的块数量。
test=\ *# select reset_auto_bmr_sess_bad_blk();*
reset_auto_bmr_sess_bad_blk
-----------------------------
(1 行记录)witness
witness是集群中的特殊节点,其不提供数据库服务,主要是为了避免由于网络隔离导致的误切换,同时在极端场景下辅助进行故障自动切换。
- 未引入witness的集群,为了避免由于网络隔离导致的误切换,集群不支持下述条件的故障自动切换:
存活的备节点<=有效备节点数/2(有效备节点的意思是在主节点发生故障前仍正常存活的备节点)
- 在引入witness后,集群支持极端场景下故障自动切换:
存活节点数量<=有效备节点数/2(1主2备、1主3备、1主4备的集群支持在主备节点同时故障仅剩1个备节点存活时的切换)
witness部署示意图如下:

witness支持的场景介绍:
- 1主1备+witness的集群:在本节点无法联系主节点时,会参考witness对主节点的可见性,决定是否升主
- 1主2备+witness的集群:
主节点故障时,2个备节点正常的切换不受影响;
主节点故障时,在仅存活1个备节点和witness节点时能够正常切换;
主节点故障时,若仅witness节点也故障,不影响2个备节点切换。
- 1主3备+witness的集群:
在主节点故障后,3个备节点存活的正常切换不受影响
在主节点故障后,仅存活1个或2个备节点和witness节点时正常切换;
在主节点故障后,1个备节点和witness节点正常连接,其余2个备节点出现网络隔离时,与witness节点相连的备节点可以切换,隔离的2个备节点不会出现升主;
主节点故障时,若仅witness节点也故障,不影响3个备节点切换。
- 1主4备+witness的集群
在主节点故障后,4个备节点存活的正常切换不受影响
在主节点故障后,存活1个或2个或3个备节点和witness节点时能正常切换;
在主节点故障后,1个备节点和witness节点正常连接,其余3个备节点出现网络隔离时,与witness节点相连的备节点可以切换;隔离的3个备节点不会出现升主;
主节点故障时,若仅witness节点也故障,不影响4个备节点切换。
- 多于4个备节点+witness的集群
主节点故障后,满足条件就可以切换:存活且与witness可见节点数+witness节点的数量>=(备节点数+witness数)/ 2
即,在1主5备+witness的集群,不能支持仅剩1个备节点时的切换;1主5备的集群如发生网络隔离分区,出现4个备节点分区互相可见的情况下,这4个节点会自行裁决并提升出新的主节点。
服务器环境配置
服务器规划
节点名称 | IP | 操作系统 | 平台 | cpu | 内存 | 硬盘 | 备注 |
node1 | X86_64 | 192.168.40.152 | Centos 7.9 x86_64 | 64 | 2G | 40G | 主节点 |
node2 | X86_64 | 192.168.40.153 | Centos 7.9 x86_64 | 64 | 2G | 40G | 备节点 |
node3 | X86_64 | 192.168.40.154 | Centos 7.9 x86_64 | 64 | 2G | 40G | 备节点 |
最小配置要求 :
项 | 最低标准 |
CPU | 主流的32位或64位CPU |
内存 | 1GB以上 |
硬盘 | 1GB以上空闲空间 |
--修改主机名
hostnamectl set-hostname node1
exec bash
hostnamectl set-hostname node2
exec bash
hostnamectl set-hostname node3
exec bash网络拓普图

系统参数配置
配置yum
上传CentOS-7-x86_64-DVD-2009.iso至服务器/soft目录并挂载
#配置本地yum源
cd /etc/yum.repos.d
mkdir bk
mv *.repo bk/
cat > /etc/yum.repos.d/centos79.repo << "EOF"
[local]
name=centos79
baseurl=file:///mnt
gpgcheck=0
enabled=1
EOF
mount /soft/CentOS-7-x86_64-DVD-2009.iso /mnt安装依赖包
--图形化的依赖包
yum groupinstall "GNOME Desktop"
yum groupinstall "X Window System"
yum install -y xorg-x11-xauth #安装x11组件包
yum -y install wqy-zenhei-fonts* #安装中文字库
yum install gui
yum install gnome
yum install xorg
--集群需要的依赖包
yum install -y net-tools
yum install -y unzip
yum install -y lsof操作系统时间
检查服务器时间
--检查服务器时间
date
--若操作系统时间不准确,进行修改
date -s "时间"防火墙
--centos6及之前版本或者使用iptables的系统
查看状态:
service iptables status
关闭防火墙:
service iptables stop
关闭防火墙开机自启动:
chkconfig iptables off
--centos7或者是使用firewalld的系统
#查看状态:
systemctl status firewalld
#关闭防火墙:
systemctl stop firewalld
#关闭防火墙开机自启动:
systemctl disable firewalldSELinux安全设置
cp /etc/selinux/config /etc/selinux/config_bak_`date +%F`
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0 ip命令路径
使用which ip 命令确认ip命令存在且可正常使用 得到ip命令的路径path,使用chmod u+s $path/ip,确保普通用户有权限执行
--ip命令的路径
[root@localhost ~]# which ip
/usr/sbin/ip
--赋予权限
chmod u+s $path/ip
参数说明
针对某个程序任何用户都有读写这个程序的权限,可以像root用户一样操作。注意事项:只有集群中设置了VIP才需要设置、检查此项。
arping命令路径
如果配置了VIP,集群默认使用自带的arping,无需检查。
ulimit资源限制
cp /etc/security/limits.conf /etc/security/limits.conf_bak_`date +%F`
cat >> /etc/security/limits.conf << "EOF"
* soft nofile 65536
* hard nofile 65535
* soft nproc 65536
* hard nproc 65535
* soft core unlimited
* hard core unlimited
EOF
参数说明:
#使用unlimited ,是最大数量则表示无限制
#*表示所有用户,这里也可只设置root和要安装的kingbase用户设置其值
#nofile是打开文件最大数目,nproc为进程最大数目,core为生成内核文件大小的上限
# soft代表一个警告值,hard为真正的阈值,超过就会报错,可以适当继续往高调
# PAM的调整针对单个会话生效,调整后需重新登录root和kingbase,用ulimit -n查看生效情况注意事项:设置nofile的hard limit不能大于/proc/sys/fs/nr_open,否则注销后将无法正常登陆。
操作系统内核参数
sysctl.conf文件配置
cp /etc/sysctl.conf /etc/sysctl.conf_bak_`date +%F`
sed -ri '/net.ipv4.ip_forward/s#0#1#' /etc/sysctl.conf
cat >> /etc/sysctl.conf <<EOF
#add by kingbase
#重新加载生效修改操作系统信号量
kernel.sem = 5010 641280 5010 256
#关闭sysrq功能
kernel.sysrq = 0
#关闭路由转发
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
#处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
# 确保无人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
#关闭ipv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
#内核放弃建立连接之前发送SYN 包的数量
net.ipv4.tcp_syn_retries = 2
#内核放弃建立连接之前发送SYNACK 包的数量
net.ipv4.tcp_synack_retries = 2
#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_max_tw_buckets = 6000
#启用timewait 快速回收
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将TIME-WAIT sockets 重新用于新的TCP 连接
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 10
# 开启SYN洪水攻击保护
net.ipv4.tcp_syncookies = 1
#限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 3276800
#未收到客户端确认信息的连接请求的最大值
net.ipv4.tcp_max_syn_backlog = 16384
#限制仅仅是为了防止简单的DoS 攻击
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
#网络传输队列配置
net.ipv4.tcp_wmem = 8192 87380 16777216
#修改网络传输队列类型
net.core.default_qdisc=fq_codel
fs.file-max = 2000000
#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.route.gc_timeout = 100
#系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128
net.core.somaxconn=1024
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144
EOF
--修改后生效
sysctl -p如果出现ssh/sys_securecmd心跳超时建议修改网络传输队列类型;特别是队列类型是pfifo_fast 很有可能出现心跳超时问题,例如:
tc qdisc replace dev 网卡名称 root fq_codel # 当前生效(重启设备会失效)
echo "net.core.default_qdisc=fq_codel" >> /etc/sysctl.conf # 永久生效(需重启设备)systemd服务设置
vim /etc/systemd/logind.conf
#修改IPC ,某些操作系统会默认打开,会造成程序信号丢失等问题(只有redhat7及以上和一些特殊的国产linux的版本需要修改,改之前可先查看此配置项中的此项是否为默认yes)
RemoveIPC=nosystem.conf文件配置
vim /etc/systemd/system.conf
#修复服务最大进程数限制,某些操作系统会有此限制
DefaultTasksAccounting=no 或DefaultTasksMax=65536
#执行以下命令生效,重启服务
systemctl daemon-reload
systemctl restart systemd-logind.servicesystemd 228版本存在limit限制过低问题,会导致服务启动的程序超过限制后资源不可用的情况
--用service cron status 任一服务,查看其状态 Centos7.9无
root @ greatwall-os :~# service cron status
● cron.service - Regular background program processing
daemon
Loaded: loaded (/lib/systemd/system/cron.service;
enabled;xxx...)
Active: active (running) since 五 2019-08-16 11:28:58
CST; 1 weeks ago
Docs: man:cron(8)
Main PID: 3120 (cron)
Tasks: 204 (limit: 512)可以观察到出现 limit : 512 默认限制。
在出现此情况时,修改 DefaultTasksAccounting=no会默认关闭
所有服务limit限制,修改后用 systemctl daemon-reload ;
systemctl daemon-reexec 生效。之后用同样方式查看
服务cron limit,若还未去除,需重启系统生效。
sshd_config文件配置
允许root登录,修改PermitRootLogin 的参数为yes
启用图形化,修改XLLForwarding yes
--允许root登录
vim /etc/ssh/sshd_config
#PermitRootLogin yes 更改为 PermitRootLogin yes
#XLLForwarding no 更改为 XLLForwarding yes
--重启服务生效
systemctl restart sshd 测试root ssh 自己ip和其他设备ip的耗时,若超过5s以上均为异常,需解决,否则会影响部署及HA的流程。
建议的参数调整:
GSSAPIAuthentication 改为no
UseDNS 改为no(谨慎)
IO调度策略即rc.local文件配置
--查看当前I/O调度策略
cat /sys/block/{DEVICE-NAME}/queue/scheduler
--临时修改:echo deadline > /sys/block/{DEVICE-NAME}/queue/scheduler
--永久修改:vim /etc /rc.d/rc.local
echo deadline >/sys/block/{DEVICE-NAME}/queue/scheduler修改I/O调度策略为deadline(最后期限算法,根据算法保证请求不饿死){DEVICE-NAME} = 硬盘名称
#机械硬盘,推荐deadline调度算法,较为适合业务单一并且IO比较重的业务,比如数据库。
#固态硬盘,推荐noop调度算法。
--查看系统支持IO调度算法
-bash-4.2# dmesg\| grep -i scheduler
[ 1.203287] io scheduler noop registered
[1.203289] io scheduler deadline registered (default)
[ 1.203311] io scheduler cfq registered
[ 1.203314] io scheduler mq-deadline registered
[ 1.203316] io scheduler kyber registered
--查看某块盘的IO调度算法:
-bash-4.2# cat /sys/block/sda/queue/scheduler cfq创建用户
cat /etc/passwd | grep kingbase(是否存在,存在则执行下条命令删除)
userdel -rf kingbase
groupadd -g 1010 kingbase
useradd -d /home/kingbase -g kingbase -u 1010 kingbase
echo kingbase | passwd --stdin kingbase # 更改kingbase 即操作系统kingbase账户密码
chage -M 99999 kingbase
id kingbase
uid=1001(kingbase) gid=1001(kingbase) groups=1001(kingbase)vi /etc/cron.allow
kingbase
chmod 755 /usr/bin/crontab
chmod u+s /usr/bin/crontab
chmod 766 /var/spool/cron规划目录
安装目录和数据目录暂时不能修改,默认路径/home/kingbase/cluster/项目名/集群名下。
--安装目录和数据目录
mkdir -p /data
mkdir -p /KDBV9R1
chown -R kingbase:kingbase /data
chmod -R 700 /data
chown -R kingbase:kingbase /KDBV9R1注意:
安装目录和数据目录暂时不能修改,默认路径/home/kingbase/cluster/项目名/集群名下。安装过程中会提示指定安装目录和数据目录,如果目录不存在安装程序会自动创建。
需每个节点都创建归档目录,不然部署集群过程中会报错。
介质准备
访问金仓数据库官网下载金仓最新版本的数据库
目前金仓官方提供了所有可支持的平台的数据库版本和license,KingbaseES数据库最新版本为V8R6,先前分为单机版和集群版2种安装介质,现已合成1个安装介质,不再区分单机版和集群版。
安装介质下载并上传
数据库软件官方下载地址:https://www.kingbase.com.cn/xzzx/index.htm

挂载到一个节点即可
授权文件下载并上传
授权文件官方下载地址:https://www.kingbase.com.cn/xzzx/index.htm

上传到一个节点的/opt目录下并解压
集群部署
挂载安装包
--挂载安装包
[root@localhost opt]# mount /opt/KingbaseES_V009R001C002B0014_Lin64_install.iso /mnt
mount: /dev/loop0 is write-protected, mounting read-only安装数据库软件
一个节点操作即可
1、进入install目录,执行sh setup.sh,开始使用图形化方式安装数据库(不能用root用户)
运行桌面上的Xmanager - Passive
su - kingbase
echo $LANG
export LANG=en_US.UTF-8
export DISPLAY=192.168.19.74:0.0
cd /mnt
sh setup.sh -i console2、输入Y同意协议,继续下一步
Add: 3 layer, B block, Information Industrial Park, Rongda Road 7, Chaoyang
District, Beijing, 100102 China
Tel: 86-10-5885 1118
Http: //www.kingbase.com.cn
National Hotline: 400-601-1188
Support E-mail: support@kingbase.com.cn
DO YOU ACCEPT THE TERMS OF THIS LICENSE AGREEMENT? (Y/N):
DO YOU ACCEPT THE TERMS OF THIS LICENSE AGREEMENT? (Y/N): y
3、选择安装类型
选择客户端
Please choose the Install Set to be installed by this installer.
->1- Full
2- Client
3- Custom
ENTER THE NUMBER FOR THE INSTALL SET, OR PRESS <ENTER> TO ACCEPT THE DEFAULT
: 24、点击选择,选择安装路径,也可以直接下一步,则使用默认安装路径,本文采用自定义安装目录
Choose Install Folder
---------------------
Please choose a destination folder for this installation.
Where would you like to install?
Default Install Folder: /opt/Kingbase/ES/V8
ENTER AN ABSOLUTE PATH, OR PRESS <ENTER> TO ACCEPT THE DEFAULT
: /KDBV9R1
INSTALL FOLDER IS: /KDBV9R1
IS THIS CORRECT? (Y/N): y5、接下来是安装前的确认,直接进行安装即可
Pre-Installation Summary
------------------------
Please Review the Following Before Continuing:
Product Name:
KingbaseES V8
Install Folder:
/KDBV9R1
Product Features:
INTERFACE,
DEPLOY,
KSTUDIO,
KDTS
Install Disk Space Information
Require Disk space : 4653 MB Free Disk Space : 29918 MB6、接下来就是自动安装的过程了,稍等
Ready To Install
----------------
InstallAnywhere is now ready to install KingbaseES V8 onto your system at the
following location:
/KDBV9R1
PRESS <ENTER> TO INSTALL:
===============================================================================
Installing...
-------------
[==================|==================|==================|==================]
[------------------|------------------|------------------|-------------
Installation Complete
---------------------
Congratulations. KingbaseES V8 has been successfully installed to:
/KDBV9R1
PRESS <ENTER> TO EXIT THE INSTALLER:
Complete.问题处理
linux打开图形化界面报错
--问题描述
Graphical installers are not supported by the VM. The console mode should be used instead...
--尝试办法1
修改ssh配置
vi /etc/ssh/sshd_config
...
#AllowAgentForwarding yes
AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost no
#PermitTTY yes
#PrintMotd yes
#PrintLastLog yes
#TCPKeepAlive yes
重启服务
systemctl restart sshd
安装依赖
yum install -y xorg-x11-xauth #安装x11组件包
yum -y install wqy-zenhei-fonts* #安装中文字库
--尝试办法2
xshell用kingbase连接
--最终解决办法
export DISPLAY=192.168.16.122:0.0
改成
export DISPLAY=192.168.19.74:0.0启动部署工具
部署工具介绍
数据库部署工具由纯java编写,用户仅需知道所需部署服务器的ip、port等信息,再根据工具的引导,输入集群脚本的关键参数,完成集群的引导步骤即可部署一套完整的集群服务,同时还提供集群状态监控服务。部署完成后,集群状态可被实时监控,在出现错误后提供日志供予错误分析,还可在查看监控的同时,修改集群参数,进行配置下发,以达到最好的状态。
功能概括:
- 集群项目名称:首先,创建一个项目。用项目来概括一个集群的总单位。项目管理是对集群进行一个分组的管理,将隶属于一个项目的集群放在一起统一进行管理。例如:XX所的集群A、集群B,两个集群并列显示。
- 集群:包含创建集群、集群删除、集群启停、暂停/恢复自动功能、主备切换、集群状态查看、修改集群密码、修改配置参数为一体的功能模块。集群创建时,根据用户输入,创建集群的“节点通用配置”,创建完成后,集群名称下生成三个子节点:“节点通用配置”、“节点管理”、“监控管理”。
- 节点通用配置:在创建集群时,填写参数配置集群的所有节点的操作系统、数据库、repmgr通用配置,目的是为了减少在创建节点的过程中,重复的填写相同的内容。
- 节点管理:对当前部署集群的节点进行管理,包含新增节点,删除节点,节点信息查看等功能。节点部署过程中,可对节点进行环境检测,并提供“一键修改系统参数”、“关闭防火墙”等功能。
- 监控管理:是对整个集群的运行状态进行监控,包括:服务器状态和数据库状态。
警告
部署工具部署集群后,不支持手工在服务器修改集群相关配置参数,若进行修改,会导致工具无法获取其修改信息而导致集群异常。
启动数据库部署工具
命令行进入到安装目录下$InstallDir/ClientTools/guitools/DeployTools,执行./deploy,启动数据库部署工具。
su - kingbase
echo $LANG
export LANG=en_US.UTF-8
export LANG=zh_CN.UTF-8
export DISPLAY=192.168.19.74:0.0
cd /KDBV9R1/ClientTools/guitools/DeployTools
./deploy

问题处理
启动数据库部署工具没反应
--问题描述
V8R6会出现以下错误:
[kingbase@localhost DeployTools]$ ./deploy
tools: Fatal IO error 0 (成功) on X server 192.168.19.74:0.0.
Deploy: 无法打开显示:
Deploy:
JVM terminated. Exit code=1
/KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools//../../../install/jre/bin/java
-Dorg.eclipse.swt.browser.XULRunnerPath=/KDBV8R6/xulrunner
-jar /KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools//plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
-os linux
-ws gtk
-arch x86_64
-showsplash
-launcher /KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools/deploy
-name Deploy
--launcher.library /KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools//plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.200.v20150204-1316/eclipse_1607.so
-startup /KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools//plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
--launcher.overrideVmargs
-exitdata 1a
--showsplash
-vm /KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools//../../../install/jre/bin/java
-vmargs
-Dorg.eclipse.swt.browser.XULRunnerPath=/KDBV8R6/xulrunner
-jar /KDBV8R6/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools//plugins/org.eclipse.equinox.launcher_1.3.0.v20140415-2008.jar
--解决办法
主节点,内存由2G扩展到4G解决了,不晓得是否是内容不足导致,反正是图形化界面显示了,该问题在V9R1版本已不存在创建项目
1、在开启的“数据库部署工具”中,关闭欢迎窗口。然后点击左上角的“窗口”菜单

2、鼠标右键单击“集群项目名称”,工具弹出右键菜单,选择“创建项目”,如下图:



界面属性介绍如下:
projectName:新建项目的名称,只能是英文、数字、下划线或者三者组合,不能为空
根据实际的情况填入信息,然后点击界面右下角的按钮。按钮功能如下:
OK:验证当前所输入的信息是否正确有效之后,创建项目,并将该信息记录到隐藏文件下的配置文件中。
Cancel:放弃本次操作,并关闭当前创建项目的窗口

创建集群
右键单击刚刚创建的项目节点,弹出菜单,选择“创建集群”。右键菜单如下图:

创建集群窗口,分为节点通用配置和db&repmgr配置两项。
节点通用配置
项目创建成功后,在创建集群时,进行节点通用配置。
注意事项:创建集群成功后,节点通用配置参数将不能再修改。
界面如下:

节点通用配置界面属性说明
配置项 | 描述 |
集群名称 | 新建的集群名称,只能是英文、数字、下划线或者三者组合,不能为空。 |
节点通用配置 | 当前配置适用于整个集群的所有节点,可以免除创建节点时重复 填写相同的值。 |
节点类型 | 选择当前创建的集群是通用机或者专用机,默认为通用机。 |
securecmd端口 | 工具连接节点或者直接向节点发起指令时, 创建连接所使用到的securecmd服务端口号,默认为8890,可根据环境修改 |
常规用户 | 部署集群所使用的账户,集群将会创建在该账户之下。 如果用户不存在,工具负责创建(创建用户命令为:useradd -g -m ), 并设置默认密码(123456)。 |
默认路径 | 集群安装的路径,路径由工具根据项目名称,集群名称拼接而成 且不可修改。 |
db&repmgr配置
填写完成后点击“下一步”进入到db&repmgr配置,如下图:

基本设置界面属性介绍

配置项 | 描述 |
选择数据库zip包 | 点击选择按钮,选择db.zip。 补充: db.zip文件位置 /KDBV9R1/KESRealPro/V009R001C002B0014/ClientTools/guitools/DeployTools/zip/db.zip |
大小写不敏感 | 默认不勾选,即大小写敏感。 补充: Oracle模式下,大小写敏感可选;MySQL/Postgresql,大小写敏感不可选 |
max_connections | 数据库最大 连接数,默认100个,不能为空。参数最小值不能小于100, 最大值无限制。 |
listenerPort | 数据库监听端口号,默认54321,不能为空。 |
dbUser | 数据库用户名,默认system,不能为空。 |
dbPassword | 数据库密码,默认12345678ab,不能为空。 |
replication mode | 同步/异步模式:1.quorum 2.sync 3.async 4.all。 |
archive_path | 数据库归档路径。若不采用默认路径,支持事先规划 默认开启归档 |
dbmode | 数据库兼容模式, Oracle、PostgreSQL、MySQL两种模式,默认兼容Oracle。 |
加密算法 | 数据库认证采取的加密 方式,scram-sha-256、md5,默认是scram-sha-256。 |
ip类型 | 支持IPV4和IPV6两种地址类型。 |
trust_server | 集群的信任网关,网关可以填写多 个用英文逗号分隔,多个信任网关中有一个可用即可。 |
使用hostname | 开启后工具支持多网段域名部署 |
使用多网冗余部署 | 开启后connection_timeout参数改为10,关闭为5。 此功能需开启“使用hostname”才可使用。 |
ping_path | 系统环境中ping指令所在路径。 |
hamgr_dbname | 默认是esrep, 且不可修改。repmgr所依赖的表就存放在此数据库中。 |
hamgr_dbuser | 默认是esrep, 且不可修改。登录esrep数据库的用户为esrep。 |
data_directory | 集群数据库data存放路径。V9R1支持自定义规划路径 |
sys_bindir | 集群数据库bin存放路径。 |
repmgrd_pid_file | 记录repmgrd pid文件路径, 默认值:${cluster_path}/kingbase/etc/repmgrd.pid, 参数值不允许修改。 写入repmgr.conf文件,参数名为:repmgrd_pid_file |
kbha_pid_file | 记录kbha pid文件路径, 默认值:${cluster_path}/kingbase/etc/kbha.pid, 参数值不允许修改。 写入repmgr.conf文件,参数名为:kbha_pid_file |
repmgrd_log_file | 记录repmgrd日志文件路径, 默认值:${cluster_path}/kingbase/log/hamgr.log, 参数值不允许修改。 写入repmgr.conf文件,参数名为:log_file |
kbha_log_file | 记录kbha日志文件路径, 默认值:${cluster_path}/kingbase/log/kbha.log, 参数值不允许修改。 写入repmgr.conf文件,参数名为:kbha_log_file。 |
running_under_failure_trusted_se rvers | 网关故障后数据库是否继续运行,可选值为 on 或 off, 默认为on。on:网关故障后,数据库不受影响,正常运行; off:网关故障后,集群会关闭数据库保证数据不发生分歧。 补充: 信任网关是一个集群中所有节点都能ping通的ip,不需要任何安装部署,只需要这个ip能够保持稳定,不宕机就可以了,是作为集群节点是否存活的一种探测手段 网关故障不影响集群服务运行 |
data_checksums | 用于控制是否开启数据校验和功能,默认是开启状态。 on: 开启数据校验和功能; off:关闭数据校验和功能; 写 入repmgr_config.conf文件,参数名为:data_checksums。 补充: 数据校验功能是为了校验数据块是否有损坏,对于重要系统,建议开启这个功能,开启后对性能有一定影响。 |
流复制通信超时 时间 | 流复制之间的数据传输超时时间, 超过这个时间没有数据传输则表示流复制断开了, 会进行重连。默认30000毫秒 |
注意事项
1.max_connections的值只能修改为更大的值,不能修改为更小的值。
2.执行which ping命令,查看操作系统中真实的ping_path路径,修改ping_path路径为查看的实际路径。 3.集群部署完成后,请不要修改repmgrd_pid_file、kbha_pid_file参数的值,修改后可能会造成同时启动多个kbha或repmgrd进程。
4.Oracle模式下,大小写敏感可选;MySQL/Postgresql,大小写敏感不可选。
5.默认开启归档
高级设置界面属性介绍
本文档采用关闭故障自动转移

配置项 | 描述 |
wal_keep_segments | 最小预留xlog文件个数,默认为512个,不能为空。 |
max_wal_senders | 支持最大集群备机个数,默认为32,此配置项不能 大于max_connections,最少是n+4个,n为集群节点个数, 不能为空。 |
hot_standby_feedback | 备机读事物时避免主机vacuum造成的数据无法查询的 取消冲突,默认为on,开启状态。 |
control_file_copy | 控制文件多副本,最多可配置8个文件,写入到es_rep.conf里 |
审计表空间加密 | 若勾选,则初始化数据库时增加'-t'作为参数执行。 若输入框中输入内容, 则初始化数据库时增加'-t -K ${输入的内容}'作为参数执行。 |
log_checkpoints | 数据库日志中记录检查点和重启点。包括一些统计信息, 写入缓冲区的数据和写入所花的时间。 on、off。默认为on。 |
log_replication_commands | 数据库日志中记录每一个复制命令。 on、off。默认为on。 |
wal_compression | 打开此参数可以减小WAL所占的空间且无需承受不可恢复的 数据损坏风险。但代价是需要额外的CPU开销,以便在WAL 记录期间进行压缩以及在WAL重放时解压。 on、off。默认为on。 |
db_other_options | 在Oracle兼容模式下, initdb初始化数据库流程需添加兼 容V7参数 –scenario-tuning, 调用scenario_tuning.sql SQL脚本,生成V7兼容视图、字段, 以支持V7部分系统视图。 |
encoding | 模板数据库的编码格式,默认数据库的编码格式, 未选择encoding的情况下不可选择Collate和CType , 默认为default,将设置为服务器环境配置的字符集 |
Collate | 这个值决定了字符串类型排序的规则, 值为“C”时表示没有规则,即以二进制值大小为比较规则。 在初始化设置后不能被修改。 |
CType | 这个值决定了字符的分类,例如大小写和数字, 值为“C”时表示没有规则,即以二进制值大小为比较规则。 在初始化设置后不能被修改。 |
virtual_ip | DB节点的虚拟ip(用于切换时ip的移动,一直跟随着主DB)。 目前支持多cluster,VIP就可以为空。如果要填写则必须 为有效的IP格式,且必须为无法ping通的IP地址。 |
virtual_ip_mask | 虚拟ip的掩码长度,默认为24。 掩码长度需要配置为加载虚拟ip的网卡的实际掩码长度。 |
ip_path | 系统环境中ip指令所在路径。 |
auto_cluster_recovery_level | 全故障自动恢复配置。0:关闭;1:打开,默认为1。 |
use_chek_disk | |
conn_options | connect_timeout=10 keepalives=1 keepalives_idle=10 keepalives_interval=1 keepalives_count=3 tcp_user_timeout=9000 |
scmd_options | -q -o ConnectTimeout=10 -o StrictHostKeyChecking=no -p 8890 -o ServerAliveInterval=2 -o ServerAliveCountMax=3 |
waldir | 指定链接的wal日志目录,将data目录中sys_wal目录 作为软连接的形式存在。 |
scmd_options | 集群节点ssh通信的配置项,连接超时10秒。 |
conn_options | 集群节点连接的配置项。 |
failover | 节点故障自动切换,automatic、manual,默认值 为automatic。 |
服务可用优先 /数据保护优先 | 单选项。根据选项不同,reconnect_attempts, reconnect_interval,recovery,synchronous_commit 四个参数的默认值不同。 默认选项为数据保护优先 |
reconnect_attempts | 集群中连接的重试次数。 服务可用优先默认值为3,数据保护优先默认值为10。 |
reconnect_interval | 集群中连接的重试间隔。 服务可用优先默认值为5,数据保护优先默认值为6。 |
recovery | 节点故障自动恢复,automatic、standby、manual。 manual,关闭自动恢复,故障节点无论是主机还是备机, 都不进行自动恢复;standby,故障节点是备机才自动恢复; automatic,所有故障节点都自动恢复。 服务可用优先默认值为automatic, 数据保护优先默认值为standby。 |
synchronous_commit | 指定在命令返回"success"指示给客户端之前, 一个事务是否需要等待WAL记录被写入磁盘。 on、off、local、remote_write、remote_apply。 服务可用优先默认值为on,数据保护优先默认值为remote_apply |
注意事项
在使用NetworkManager管理网络服务的情况下,如果手动删除了virtual_ip所在网卡上所有的物理IP,有可能导致virtual_ip丢失,且在物理IP被重新添加上之前,virtual_ip不会自动添加。
执行which ip命令,查看操作系统中真实的ip_path路径,修改ip_path,路径为查看的实际路径。

节点管理
新增主节点
展开当前创建的集群,右键选择菜单的“新增节点”,如下图所示:

ssh配置
工具开启“增加节点”流程窗口,如下图所示:

ssh配置项说明
配置项 | 描述 |
使用ssh启动securecmd | 单选项,默认选中。 此项选中时,ssh端口、root密码、选择securecmd文件、 securecmd路径四项需配置。 可使用ssh方式上传并启用securecmd。 补充: securecmd文件位置 /KDBV9R1/KESRealPro/V008R006C008B0014/ClientTools/guitools/DeployTools/zip/securecmdd.zip |
主机名或IP地址 | 当前节点(服务器)的IP地址或主机名。 当“开启hostname”选项未勾选时,此处名称为IP地址。 |
ssh端口 | 节点所在的物理机器的ssh端口,默认22。不可为空。 |
root密码 | 节点所在的物理机器的root密码,不能为空。 |
选择securecmd文件 | securecmd安装包,不可为空。 |
securecmd路径 | 节点服务器上securecmd部署路径,不可为空。 必须位于/home/${常规用户}目录下。 |
使用已部署的securecmd | 单选项,默认不选中 此项。选中时,securecmd需要用户手动在节点服务中配置, 用户可点击“下一步”进入节点配置页面。 |
ssh配置项示例

节点配置

节点配置配置项说明
配置项 | 描述 |
显示名称 | 用户自定义的节点名称(服务器的别名), 最终将会显示在左侧的树形菜单中。 |
主机名或IP地址 | 当前节点(服务器)的IP地址或主机名。 当“开启hostname”选项未勾选时,此处名称为IP地址。 |
securecmd端口,常规用户 ,默认路径 | 此三项均来自通用配置中,无需再次填写,且无法修改。 详细介绍参见通用配置参数介绍。 |
系统节点名称 | 系统节点名称记录在数据库配置文件中的节点(服务器)别名, 目前采用node + ip最后一段的拼接的方式命名。无法更改 |
网卡名称 | 此项主要是针对填写VIP选项的集群。使用VIP必须填写该VIP 要绑定的对应网卡名称。 支持获取多个网卡。点击“获取网卡”,列出所有状态UP的网卡 列表,并将与当前节点服器IP相同的网卡名称显示列表第一位。 可以从获取的网卡列表中选择一个,也可以手动进行填写。若没填写VIP选项的集群,选项为灰色不可填写 |
网卡物理IP地址 | 此项主要是针对填写VIP选项的集群。 填写网卡名称后,需要输入对应的网卡IP地址。 点击“获取”,工具显示对应的物理IP地址。 若存在多个地址,默认只显示第一个。 也可手动进行填写。 |
选择license文件 | 此项主要是针对非保密机集群。 需要选择集群节点所需要的license的上传路径。 |
节点配置示例

节点环境检测
检测合格后进入到系统环境检测步骤界面,此时需点击下方的检测按钮。如下图所示:

点击“检查”按钮, 环境参数的信息检测都会输出到这个界面中。输出信息中可能会出现红色和黄色提示,被标为红色ERROR的提示,意为不允许安装集群,用户需解决后,才可继续进行下一步。黄色警告意为不解决可能会导致集群出现问题隐患。例如:
(1)防火墙,有些用户和系统必须开,那么就需要用户将集群使用到的端口号添加到防火墙白名单中。
(2)检查发现[ulimit.open proc] is null,则需要检查一下集群用户的shell环境。 如下图所示:

点击“一键修改系统参数”按钮, 修改的系统参数项,都会输出到这个界面中。 如下图所示:

点击“关闭防火墙”按钮, 关闭防火墙的日志打印,都会输出到这个界面中。 如下图所示:

预览信息
点击上图中“下一步”按钮,系统进入预览信息界面,当前界面将会把配置信息进行汇总并显示,如下图所示:

集群部署
点击上图中“确定”按钮,系统进入集群部署界面,如下图:

图中按钮功能如下:
- 重新部署:当集群安装过程中出现中断(例如:数据库启动超时),部署集群的流程也随之中断,这个时候根据报错排查问题后,“重新部署”按钮就可以重新部署集群。
- 部署:执行部署集群操作。
- 取消:放弃本次部署操作,并且在后台中将生成的集群相关的文件删除。
这里点击“部署”按钮,系统开始执行集群部署操作。执行过程截图如下:

部署时的界面打印。此界面将执行命令,返回结果等均进行输出,便于错误时候的查询报错信息。也便于学习和理解KingbaseES的部署流程步骤。
到此,集群部署顺利完成。
以此类推,进行第二个节点的部署。
补充:部署过程中步骤
- 上传安装包解压
- License操作
- 初始化数据库
- 创建etc目录
- es_rep.conf文件配置
- repmgr.conf文件配置
- node_tools_conf文件配置
- 创建主节点
- 检测节点注册
- 启动节点
新增备节点
展开当前创建的集群,右键选择菜单的“新增节点”,如下图所示:

ssh配置
工具开启“增加节点”流程窗口,如下图所示:

ssh配置项说明
配置项 | 描述 |
使用ssh启动securecmd | 单选项,默认选中。 此项选中时,ssh端口、root密码、选择securecmd文件、 securecmd路径四项需配置。 可使用ssh方式上传并启用securecmd。 补充: securecmd文件位置 /KDBV9R1/KESRealPro/V009R001C002B0014/ClientTools/guitools/DeployTools/zip/securecmdd.zip |
主机名或IP地址 | 当前节点(服务器)的IP地址或主机名。 当“开启hostname”选项未勾选时,此处名称为IP地址。 |
ssh端口 | 节点所在的物理机器的ssh端口,默认22。不可为空。 |
root密码 | 节点所在的物理机器的root密码,不能为空。 |
选择securecmd文件 | securecmd安装包,不可为空。 |
securecmd路径 | 节点服务器上securecmd部署路径,不可为空。 必须位于/home/${常规用户}目录下。 |
使用已部署的securecmd | 单选项,默认不选中 此项。选中时,securecmd需要用户手动在节点服务中配置, 用户可点击“下一步”进入节点配置页面。 |
ssh配置项示例

节点配置
节点配置配置项说明
配置项 | 描述 |
显示名称 | 用户自定义的节点名称(服务器的别名), 最终将会显示在左侧的树形菜单中。 |
主机名或IP地址 | 当前节点(服务器)的IP地址或主机名。 当“开启hostname”选项未勾选时,此处名称为IP地址。 |
securecmd端口,常规用户 ,默认路径 | 此三项均来自通用配置中,无需再次填写,且无法修改。 详细介绍参见通用配置参数介绍。 |
系统节点名称 | 系统节点名称记录在数据库配置文件中的节点(服务器)别名, 目前采用node + ip最后一段的拼接的方式命名。无法更改 |
网卡名称 | 此项主要是针对填写VIP选项的集群。使用VIP必须填写该VIP 要绑定的对应网卡名称。 支持获取多个网卡。点击“获取网卡”,列出所有状态UP的网卡 列表,并将与当前节点服器IP相同的网卡名称显示列表第一位。 可以从获取的网卡列表中选择一个,也可以手动进行填写。若没填写VIP选项的集群,选项为灰色不可填写 |
网卡物理IP地址 | 此项主要是针对填写VIP选项的集群。 填写网卡名称后,需要输入对应的网卡IP地址。 点击“获取”,工具显示对应的物理IP地址。 若存在多个地址,默认只显示第一个。 也可手动进行填写。 |
选择license文件 | 此项主要是针对非保密机集群。 需要选择集群节点所需要的license的上传路径。 |
节点环境检测
检测合格后进入到系统环境检测步骤界面,此时需点击下方的检测按钮。如下图所示:

点击“检查”按钮, 环境参数的信息检测都会输出到这个界面中。输出信息中可能会出现红色和黄色提示,被标为红色ERROR的提示,意为不允许安装集群,用户需解决后,才可继续进行下一步。黄色警告意为不解决可能会导致集群出现问题隐患。例如:
(1)防火墙,有些用户和系统必须开,那么就需要用户将集群使用到的端口号添加到防火墙白名单中。
(2)检查发现[ulimit.open proc] is null,则需要检查一下集群用户的shell环境。 如下图所示:

点击“一键修改系统参数”按钮, 修改的系统参数项,都会输出到这个界面中。 如下图所示:

点击“关闭防火墙”按钮, 关闭防火墙的日志打印,都会输出到这个界面中。 如下图所示:

预览信息
点击上图中“下一步”按钮,系统进入预览信息界面,当前界面将会把配置信息进行汇总并显示,如下图所示:

集群部署
点击上图中“确定”按钮,系统进入集群部署界面,如下图:

图中按钮功能如下:
- 重新部署:当集群安装过程中出现中断(例如:数据库启动超时),部署集群的流程也随之中断,这个时候根据报错排查问题后,“重新部署”按钮就可以重新部署集群。
- 部署:执行部署集群操作。
- 取消:放弃本次部署操作,并且在后台中将生成的集群相关的文件删除。
这里点击“部署”按钮,系统开始执行集群部署操作。执行过程截图如下:

部署时的界面打印。此界面将执行命令,返回结果等均进行输出,便于错误时候的查询报错信息。也便于学习和理解KingbaseES的部署流程步骤。

到此,集群部署顺利完成。
以此类推,进行第三个节点的部署,详细过程省略。

集群管理
集群查看
双击集群名称后,显示集群状态。弹出菜单如下图所示:

显示集群状态中包含: 上游节点、PID、是否暂停、最后一次观测到的时间等。右下角有刷新按钮,方便更新集群状态。
集群运行信息:
ID -- 数据库节点ID
Name -- 数据库在集群内部名称
Role -- 数据库节点角色,有primary和standby两种
Status -- 状态, *running 和 running两种状态是正常运行状态,还有其他的状态,都是异常
Upstream -- 上游节点名称,即:从哪个节点同步数据
Hamgrd -- 管理软件remgrd的运行状态
PID -- 管理软件repmgrd的进程ID
Paused -- 管理软件repmgrd是否暂停
Upstream last seen-- 本节点距离上一次同步数据的时间(单位:秒)
作者:董小姐yyds
Oracle 11g OCM,KCP,PGCE,墨天轮技术专家,青学会成员
擅长主流Oracle、MySQL、PG安装部署、故障定位处理、性能优化,
金仓、达梦、openGauss系等各种商用和开源国产数据库
微信:margaretdy
公众号:董小姐yyds
视频号:DongxiaojieYYDS
墨天轮:https://www.modb.pro/u/3121
CSDN:https://blog.csdn.net/qq961573863?type=blog
知乎:https://www.zhihu.com/people/fuwaxiaohuan




