人大金仓 KingBaseES V9 学习之路:集群部署实战探索
一、人大金仓 KingBaseES 简述
人大金仓数据库产品包括:通用型KingbaseES、分析型KingbaseAnalyticsDB、分布式KSOne。
- KingbaseES是一款面向全行业、全客户关键应用的企业级大型通用数据库管理系统,适用于联机事务处理、查询密集型数据仓库、要求苛刻的互联网应用等场景
- KingbaseAnalyticsDB是一款采用shared-nothing分布式架构,具有高性能,高扩展性能力的MPP数据库产品。适用于数据仓库、决策支持、高级分析等分析类应用场景。
- KSOne 是一款面向交易型业务、 实时分析、时间序列等场景的 HTAP 分布式数据库,为海量数据、海量并发用户、高负载压力、高连续性要求的业务系统提供强有力支撑。
金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司[简称人大金仓]的核心产品,具有大型通用、"三高"(高可靠、高性能、高安全)、"三易"(易管理、易使用、易扩展)、运行稳定等特点,是唯一入选国家自主创新产品目录的数据库产品,也是国家级、省部级实际项目中应用最广泛的国产数据库产品。
人大金仓数据库管理系统 KingbaseES(KES) 是面向全行业、全客户关键应用的企业级大型通用数据库管理系统,适用于联机事务处理、查询密集型数据仓库、要求苛刻的互联网应用等场景,提供全部应用开发及系统管理功能,提供性能增强特性,可支持主备集群、读写分离集群、多活共享存储集群等全集群架构,具有高性能、高安全、高可用、易使用、易管理、易维护的特点,支持所有国内外主流CPU、操作系统与云平台部署。
KingBaseES数据库六大核心特性:
- 迁移开发 简单高效
向导式智能数据迁移工具,无损、快速数据迁移,兼容97%以上的Oracle语法,迁移平滑、成本更低,库内多模计算能力,多层次支撑应用开发,精准数据编辑,多版本并发编辑与合并GIS对象
- 高度容错 稳定可靠
国家电网智能电网调度系统,10余年7x24稳定运行,秒级RTO及全面容错体系,数据库7x24小时不间断运行,全新架构共享存储集群,最大支持16节点,多层次高可用技术体系,系统可用性高达99.999%
- 性能强劲 表现出众
读写分离集群,只读性能线性增长,承载“万”级用户并发数,多CPU并行处理数据,单机单实例,BenchmarkSQL tpmc达175万+
- 系统自治 简单易用
性能诊断信息自动收集和分析,辅助调优工具,1小时即可完成原来1天的调优工作,自动内存管理调整,集群故障节点自动恢复
- 纵深防御 确保安全
国家信息安全产品认证,安全四级销售许可证,信息技术产品安全分级评估证书(EAL4+),商用密码产品认证证书
- 全面兼容 深度适配
具备来自上下游1600多家公司6000+份兼容认证,全面适配国家专用项目相关产品,深度适配国内外主要GIS产品, 形成联合解决方案,云联合方案覆盖主流云厂商
二、部署概要
KingBaseES产品授权包括企业版、专业版、标准版以及开发版。彼此区别如下:
- 人大金仓数据库管理系统KES标准版是为了满足政府部门、中小型企业客户的简单应用而推出的一款精简数据库产品,该产品提供除集群、GIS以外的全部应用开发与系统管理功能,支持 TB 级海量数据,支持多用户并发访问,支持所有国内外主流的CPU、操作系统与云平台部署。
- 人大金仓数据库管理系统 KES 企业版是面向全行业、全客户关键应用的大型通用数据库管理系统,适用于联机事务处理、查询密集型数据仓库、要求苛刻的互联网应用等场景,提供全部应用开发及系统管理功能,提供性能增强特性,可支持主备集群、读写分离集群、多活共享存储集群等全集群架构,具有高性能、高安全、高可用、易使用、易管理、易维护的特点,支持所有国内外主流CPU、操作系统与云平台部署。
- 人大金仓数据库管理系统KES专业版是一款入选双名录的产品,可满足党政客户、中小企业客户的中等规模、非核心业务应用场景的要求,提供全部应用开发及系统管理功能,支持主备集群、读写分离集群等集群架构,支持所有国内外主流CPU、操作系统与云平台部署。
- 人大金仓数据库管理系统KES开发版是为了满足用户的产品试用、日常开发需求而推出的一个精简版本,提供除集群、GIS以外的全部应用开发及系统管理功能。该版本可用10个数据库连接,试用1年,不能用于商业用途。
目前产品已更新到V9版本,当前金仓数据库管理系统KingbaseES的最新发布版本为V009R001C001B0025。
本文通过搭建虚拟机环境来部署最新发布KingbaseES V9企业版数据库。
下载相关介质连接https://www.kingbase.com.cn/xzzx/index.htm?type=kadb
此外官方提供相关临时授权
三、拓扑规划
实验环境
节点名称 | 官方软硬件要求 | 虚拟机配置 | IP | 配置 |
|---|---|---|---|---|
appnode1 | CPU:X86、龙芯、飞腾、鲲鹏 内存:512MB以上 硬盘:10GB以上空闲空间 支持各种主流的Linux操作系统64位发行版本 | 2 Core 4 GiB redhat7.8 | 192.168.126.10 | 主备节点 |
dbnode1 | CPU:X86、龙芯、飞腾、鲲鹏 内存:512MB以上 硬盘:10GB以上空闲空间 支持各种主流的Linux操作系统64位发行版本 | 2 Core 4 GiB redhat7.8 | 192.168.126.11 | 备节点 |
adminnode | CPU:X86、龙芯、飞腾、鲲鹏 内存:512MB以上 硬盘:10GB以上空闲空间 支持各种主流的Linux操作系统64位发行版本 | 2 Core 4 GiB redhat7.8 | 192.168.126.110 | Yum&&NTP&&witness点/测试备节点 |
四、环境准备
1、修改主机名和IP
举例:
#设置新的主机名
hostnamectl set-hostname appnode1
#查看主机名
hostnamectl status
vi /etc/hosts
2、关闭防火墙
# 关闭防火墙
sudo systemctl stop firewalld
# 禁用防火墙
sudo systemctl disable firewalld
# 查看防火墙状态
sudo systemctl status firewalld
3、配置时间同步
(1)检查NTP服务是否开启
# systemctl status chronyd.service
(2)查看chrony服务是否同步
# chrony tracking
(3)修改chrony服务,此处设置主控机(这里假设为192.168.126.110)作为时间同步服务器,先修改主控机(服务端)设置
# vi /etc/chrony.conf
添加allow 0.0.0.0/0 添加local stratum 10
注释掉上方的server iburst
(4)重启服务
# systemctl restart chronyd.service
(5) 其他所有节点,需同步主控机,各节点操作如下
# vi /etc/chrony.conf
注释server iburst,新增
server 192.168.126.110 iburst
重启
# systemctl restart chronyd.service
检查是否同步
# chronyc sources -v
查看时间同步源状态
#chronyc sourcestats -v
立刻手工同步
#chronyc -a makestep
校验时间服务器
#chronyc tracking
4、禁用 SELinux
# 查看/etc/selinux/config
cat /etc/selinux/config
# 永久禁用 SELinux
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
sudo sed -i 's/^SELINUX=permissive$/SELINUX=disabled/' /etc/selinux/config
# 查看 SELinux 当前的状态
sestatus && getenforce && cat /etc/selinux/config
#重启
#reboot
5、操作系统相关参数调整
1.修改sshd相关参数(解决SSH慢问题)
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
echo UseDNS no>> /etc/ssh/sshd_config
cat /etc/ssh/sshd_config | grep UseDNS
sudo sed -i 's/^#*UseDNS yes$/UseDNS no/' /etc/ssh/sshd_config
sudo sed -i 's/GSSAPIAuthentication yes/#GSSAPIAuthentication yes\nGSSAPIAuthentication no/' /etc/ssh/sshd_config
cat /etc/ssh/sshd_config | grep GSSAPIAuthentication
sudo systemctl restart sshd
systemctl restart sshd.service
2.修改sysctl.conf内核参数
所有节点服务器配置如下文件:
# vim /etc/sysctl.conf
添加以下内容:
fs.aio-max-nr= 1048576
fs.file-max= 6815744
kernel.shmall= 2097152
kernel.shmmax= 4294967295
kernel.shmmni= 4096
kernel.sem= 250 32000 100 128
net.ipv4.ip_local_port_range= 9000 65500
net.core.rmem_default= 262144
net.core.rmem_max= 4194304
net.core.wmem_default= 262144
net.core.wmem_max= 1048576
生效
sysctl -p
cat << EOF >>/etc/sysctl.conf
fs.aio-max-nr= 1048576
fs.file-max= 6815744
kernel.shmall= 2097152
kernel.shmmax= 4294967295
kernel.shmmni= 4096
kernel.sem= 250 32000 100 128
net.ipv4.ip_local_port_range= 9000 65500
net.core.rmem_default= 262144
net.core.rmem_max= 4194304
net.core.wmem_default= 262144
net.core.wmem_max= 1048576
EOF
3.修改limits.conf资源使用参数
所有节点服务器配置如下文件:
# vim /etc/security/limits.conf
添加如下内容:
kingbase soft nofile 1000000
kingbase hard nofile 1000000
kingbase soft stack 32768
kingbase hard stack 32768
cat << EOF >>/etc/security/limits.conf
kingbase soft nofile 1000000
kingbase hard nofile 1000000
kingbase soft stack 32768
kingbase hard stack 32768
EOF
6、创建kingbase用户
不用root用户,创建kingbase用户进行部署,配置ssh互信和sudo免密
#创建用户&&设置密码
useradd kingbase && passwd kingbase
7、配置免密码登录
编辑/etc/sudoers文件,文末加入:
kingbase ALL=(ALL) NOPASSWD:ALL
如果想要控制某个用户(或某个组用户)只能执行root权限中的一部分命令,
或者允许某些用户使用sudo时不需要输入密码,一般修改/etc/sudoers文件
cat << EOF >>/etc/sudoers
kingbase ALL=(ALL) NOPASSWD:ALL
EOF
测试kingbase用户登录
$ sudo -su root
8、创建kingbase用户ssh key
切换用户
# su - kingbase
执行命令,一直按回车键就行
$ ssh-keygen -t rsa
9、指定公钥文件
$ ssh-copy-id -i ~/.ssh/id_rsa.pub kingbase@192.168.126.11
$ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.126.11
10、创建root用户ssh key
# ssh-keygen -t rsa
11、指定公钥文件
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.126.11
# ssh-copy-id -i ~/.ssh/id_rsa.pub kingbase@192.168.126.11
12、创建工作目录上传安装包及授权文件
1.kingbase用户,新建以下目录
#创建目录
$ mkdir -p KingbaseES/V9R1
$ mkdir data
$ mkdir license
备注:数据目录不必事先创建。安装过程中会提示指定数据目录,如果目录不存在安装程序会自动创建。
2.上传 Kingbase server安装包
由于下载介质为KingbaseES_V009R001C001B0025_Lin64_install.iso,本次直接挂载虚拟光驱
3、上传授权文件
五、安装与配置
KingBaseES V9支持图形界面和命令行两种方式安装。命令行安装如下:
1、命令行安装
$ sh ./setup.sh -i console
ENTER继续
输入Y继续
选择1-Full 继续
输入许可文件绝对路径 /home/kingbase/license/license_34149_0.dat
输入安装目录 /home/kingbase/KingbaseES/V9R1/
确认Y继续
提示安装信息,继续
输入数据目录 /home/kingbase/data
默认继续
默认继续
system 继续
确认密码继续
选择默认 继续
本次选择兼容MySQL继续
大小写敏感默认YES -选择2 NO(MySQL)继续
默认继续
默认继续
默认继续
备注:完成安装数据库完成,继续回车结束。如果单机部署需要开机自启动数据库服务,需要执行如上图内容,本次不需要执行。
BUG:上图输出文字V8错误,应该是V9。
2、配置系统 kingbase 用户环境变量
$ vi .bash_profile
#使该环境变量生效
source .bash_profile
3、配置集群
1.文件及文件名约束
集群部署所需要的所有文件需要已存在设备上,且 install.conf文件、cluster_install.sh、trust_cluster.sh 都需要在同一设备的同一目录下,需安装数据库后获取对应文件,以下是集群部署所需要的所有文件
#用户单独准备:
license.dat #授权文件
#将/home/kingbase/license/license_34149_0.dat传输到${install_dir}/ClientTools/guitools/DeployTools/zip/目录下:
$ cd /home/kingbase/KingbaseES/V9R1/ClientTools/guitools/DeployTools/zip
$ mv /home/kingbase/license/license_34149_0.dat ./license.dat
#从${install_dir}/ClientTools/guitools/DeployTools/zip/目录下获取:
- db.zip #数据库压缩包
- cluster_install.sh #部署脚本
- install.conf #部署配置文件
- trust_cluster.sh #配置SSH免密脚本
$ cd /home/kingbase/KingbaseES/V9R1/ClientTools/guitools/DeployTools/zip
2.部署执行约束
- 执行脚本的操作只能在集群主机上执行,通用机需用普通用户执行脚本。
- 配置文件中所有要求写路径的参数都必须是绝对路径,不支持相对路径。
- license_file 参数只需写 license 文件名即可,无需写路径。
- 脚本支持使用非 22 端口进行 ssh 连接,如果想要修改 ssh连接端口,除了更改配置文件 install.conf之外,还需修改系统/etc/ssh/sshd_config 文件中的 Port 项,然后重启 sshd服务才能正常部署集群。修改系统文件以及重启 sshd 服务均需要使用 root用户执行。
3.编辑 install.conf 配置文件
提供 install.conf 配置文件用于配置集群部署所需参数(下划线为根据实际情况需要调整确认参数,其他默认)
## install.conf
##集群部署脚本配置说明:
路径:与cluster_install.sh脚本位于同一路径下。
参数:可以在配置文件中设置,也可以在cluster_install.sh脚本中设置(优先采用此文件中的配置)。
约束条件:
1. 在运行脚本的设备与集群中安装的设备之间,包括root用户之间、普通用户之间、root用户与普通用户之间,需要手动配置SSH加密。
2. 通用计算机只能在配置了SSH加密的普通用户上执行,而BMJ只能在root用户上执行,且所有操作都必须在主主机上执行。
3. db.zip包的解压是在诸如lib、bin、share等目录级别完成的,中间不能多出一层目录,像"kingbase/bin"这样的目录是不被支持的。
######################################################################
# Required parameters
#####################################################################
[install]
## whether it is BMJ, if so, on_bmj=1, if not on_bmj=0, defaults to on_bmj=0
on_bmj=0
## the cluster node IP which needs to be deployed, is separated by spaces, for example: all_ip=(192.168.1.10 192.168.1.11)
## or all_ip=(host1 host2)
## means deployed cluster of DG ==> ha_running_mode='DG'
all_ip=(192.168.126.10 192.168.126.11)
## only set if need to setup witness node in cluster. The value is the IP of witness node, for example: witness_ip="192.168.1.12"
# witness_ip="192.168.126.110"
## it must be NULL when ha_running_mode='TPTC'
## the path of cluster to be deployed, for example: install_dir="/home/kingbase/tmp_kingbase" [if it is BMJ, you do not need to configure this parameter]
## the directory structure after deployment:
## ${install_dir}/kingbase/data the data directory
## ${install_dir}/kingbase/archive log archive directory
## ${install_dir}/kingbase/etc configuration file directory
## ${install_dir}/kingbase/bin、lib、share、log install file directory
## the last layer of directory could not add '/'
install_dir="/home/kingbase/KingbaseES/V9R1"
## the absolute path of zip package, for example: zip_package="/home/kingbase/db.zip" [if it is BMJ or deploy_by_sshd=0, you do not need to configure this parameter]
## zip、tar and tar.gz package can be supported.
zip_package="/home/kingbase/KingbaseES/V9R1/ClientTools/guitools/DeployTools/zip"
## the name of license.dat [if it is BMJ or deploy_by_sshd=0, you do not need to configure this parameter]
## if there are multiple license files, please write down all of them.
## make sure that the write order of license.dat file is the same as that of all_ip, if the same license file can be used in different devices, you can just write once.
## since the license file must named with "license.dat", if you have more than one license files, please use different name to distinguish them.
## example: license_file=(license.dat) or license_file=(license.dat-1 license.dat-2)
license_file=( license.dat)
# database initializes user configuration
db_user="system" # the user name of database
db_password="" # the password of database.
db_port="54321" # the port of database, defaults is 54321
db_mode="mysql" # database mode: pg, oracle, mysql
db_auth="scram-sha-256" # database authority: scram-sha-256, md5, scram-sm3, sm4, default is scram-sha-256
db_case_sensitive="no" # database case sensitive settings: yes, no. default is yes - case sensitive; no - case insensitive
# (NOTE. cannot set to 'no' when db_mode="pg", and cannot set to 'yes' when db_mode="mysql").
db_checksums="yes" # the checksum for data: yes, no. default is yes - a checksum is calculated for each data block to prevent corruption; no - nothing to do.
archive_mode="on" # enables archiving; off, on, or always
db_encoding="UTF8" # Cararcter set encoding to use in the new database.Specify a tring constant,or an integer encoding number, default value provided by locale command.
db_collate="" # Collation order(LC_COLLATE) to use in the new database,This affects the sort order applied to strings, default value provided by locale command.
db_ctype="" # Character classification(LC_CTYPE) to use int the new database. This affects the categorization of characters, default value provided by locale command.
other_db_init_options="" # addional initdb options,such as "--scenario-tuning" (NOTE. cannot set --scenario-tuning when db_mode="mysql")
sync_security_guc="no" # sync security GUC parameters in cluster (exclude witness): yes, no. default is no.
# yes - for auto sync security GUC, create extension kdb_schedule and security_utils; no - nothing to do.
tcp_keepalives_idle="2" # (integer; default: 7200; since Linux 2.2)
# The number of seconds a connection needs to be idle before TCP begins sending out keep-alive counts. Keep-alives are sent only when the
# SO_KEEPALIVE socket option is enabled. The default value is 7200 seconds (2 hours). An idle connection is terminated after approximately an
# additional 11 minutes (9 counts an interval of 75 seconds apart) when keep-alive is enabled.
tcp_keepalives_interval="2" # (integer; default: 75; since Linux 2.4)
# The number of seconds between TCP keep-alive counts.
tcp_keepalives_count="3" # (integer; default: 9; since Linux 2.2)
# The maximum number of TCP keep-alive counts to send before giving up and killing the connection if no response is obtained from the other end.
tcp_user_timeout="9000" # (since Linux 2.6.37)
connection_timeout="10" # connection timeout when use ssh or sys_securecmdd
wal_sender_timeout="30000" # in milliseconds; 0 disables
wal_receiver_timeout="30000" # time that receiver waits for
# communication from master
# in milliseconds; 0 disables
## the trust ip, which separated by English ',', and spaces are not allowed.
## For example: trusted_servers="192.168.28.1,192.168.29.1" or trusted_servers="host1,host2"
trusted_servers="192.168.126.110"
## if failed to ping trusted_servers, the database can still be running? on, off. default is on - do nothing, the database will running; off - will stop the database.
running_under_failure_trusted_servers='on'
#####################################################################
# Optional parameters
#####################################################################
## the path of data directory, BMJ defaults to "/opt/Kingbase/ES/V8/data", the general machine defaults to "install_dir/kingbase/data"
data_directory="/home/kingbase/data"
## if seperate sys_wal from data directory, set the sys_wal location to waldir.
## the location should not be under the data directory
## the location should be an absolute path
## the waldir should be an empty path or nonexistent, initdb would create the location if it's nonexistent
waldir=''
## the vitural IP, for example: virtual_ip="192.168.28.188/24"
virtual_ip="192.168.126.16/24"
## the net device, after configuring the vitural IP, net_device must been configured.
## please make sure that the writing order of net_device is the same as all_ip, if the net_device is the same, it should also be written together.
## do not need to consider net_device on witness node if configured witness_ip
## for example: net_device=(ens192 ens192) or net_device=(ens192 eth0)
net_device=(ens33)
## the net device ip, after configuring the vitural IP, net_device_ip must been configured.
## please make sure that the writing order of net_device_ip is the same as all_ip
## do not need to consider net_device_ip on witness node if configured witness_ip
## for example: net_device_ip=(10.10.11.128 10.10.11.129)
net_device_ip=(192.168.126.10 192.168.126.11)
## the path of ip, arping, ping command, defaults is /sbin or /bin
## by default, the arping_path is located in the bin directory of the database installation directory, if arping_path is null, then use default value.
## for example, if there is BMJ, arping_path=/opt/Kingbase/ES/V8/Server/bin
ipaddr_path="/sbin"
arping_path=""
ping_path="/bin"
## super user, defaults is root
super_user="root"
## ordinary user, defaults is kingbase
execute_user="kingbase"
## other cluster parameters
deploy_by_sshd=1 # choose whether to use sshd when deploy, 0 means not to use (deploy by sys_securecmdd), 1 means to use (deploy by sshd), default value is 1; when on_bmj=1, it will auto set to no(deploy_by_sshd=0)
use_scmd=0 # Is the cluster running on sys_securecmdd or sshd? 1 means yes (on sys_securecmdd), 0 means no (on sshd), default value is 1; when on_bmj=1, it will auto set to yes(use_scmd=1)
reconnect_attempts="10" # the number of retries in the event of an error
reconnect_interval="6" # retry interval
recovery="standby" # the way of cluster recovery: standby/automatic/manual
ssh_port="22" # the port of ssh, default is 22
scmd_port="8890" # the port of sys_securecmdd, default is 8890
## ssl option, default value is '0', will not use ssl in cluster.
## set use_ssl=1 in database, and the cluster will use 'sslmode=require' to connect to database.
use_ssl=0
## all nodes failed recovery option, default value 1, do auto recovery when all nodes failed when network is OK and only one primary in cluster.
## 0 means disable the all fails recovery feature
auto_cluster_recovery_level='1'
## enable the disk check, default value is 'off', will do nothing when disk is error.
## if set to 'on', stop the database when disk is error.
use_check_disk='off'
## setting for kingbase synchronous_standby_names mode, values in "quorum\sync\all\async"
## quorum: the first do WAL replay standby can be sync node
## sync: the first standby in synchronous_standby_names, which connect to primary now, is sync node
## all: all the standbys in synchronous_standby_names, which connect to primary now, are sync node, and if there is no standby connect to primary, it is equal to async
## async: no standby is sync node
## For ha_running_mode='TPTC' the synchronous default value is 'all'.
## For ha_running_mode='DG', the synchronous default value is 'quorum'.
synchronous=''
## For ha_running_mode='TPTC', if the sync nodes have the same location with primary ?
## 0: some nodes could be sync nodes. (don't care what the location is)
## 1: only the nodes have same location with primary, could be sync nodes.
## the default is 0. (when ha_running_mode='DG' or synchronous='async', this parameter has no effect)
sync_in_same_location=0
4.SSH 免密配置
目前在通用机上支持两种部署方式:
方式一、通过 sshd 服务自动分发文件并部署,需要配置节点间 ssh 免密
方式二、手动分发文件,启动 sys_securecmdd 工具并进行部署,需要节点间sys_securecmdd 工具秘钥协商。
两种方式都有如下免密登陆要求:
所有即将部署集群的设备之间,root 用户和 root 用户、root 用户和普通用户、普通用户和普通用户免密登陆,同一主机的root 用户免密登陆、root 用户和普通用户免密登陆、普通用户免密登陆。
本次采用SSH免密配置部署方式。
使用trust_cluster.sh进行 SSH免密配置,免密配置后,请验证即将要部署集群的所有设备的 root用户和普通用户之间的免密是否配置正确。
使用trust_cluster.sh配置免密方法:
1)上传install.conf和trust_cluster.sh到需要部署集群的任意一台设备上
2)配置install.conf文件,配置all_ip、execute_user和super_user三个参数
3)确保所有节点(all_ip)上都存在execute_user和super_user两个用户
4)使用super_user用户执行trust_cluster.sh
5)执行过程中需要输入每个节点super_user的密码,请输入
6)免密完成
5.主从集群部署
集群部署用户执行 sh cluster_install.sh命令进行集群部署,部署脚本将按照配置自动完成集群部署工作(在主节点操作)。
如果已开启数据库服务,请执行之前关闭数据库服务。
$ sh cluster_install.sh
start up the database on "192.168.126.10" ...
/home/kingbase/KingbaseES/V9R1/kingbase/bin/sys_ctl -w -t 60 -l /home/kingbase/KingbaseES/V9R1/kingbase/logfile -D /home/kingbase/data start
waiting for server to start.... done
start up the standby on "192.168.126.11" ...
/home/kingbase/KingbaseES/V9R1/kingbase/bin/sys_ctl -w -t 60 -l /home/kingbase/KingbaseES/V9R1/kingbase/logfile -D /home/kingbase/data start
waiting for server to start.... done
start up the whole cluster ... OK
6.部署后检查
部署成功后,执行命令"/home/kingbase/KingbaseES/V9R1/kingbase/bin/repmgr cluster show"查看集群是否正常。
集群部署完成后,会涉及两个数据库用户:
- system,超级用户,默认密码12345678ab,初始化数据库时使用的默认用户
- esrep,超级用户,默认密码Kingbaseha110,集群部署过程中创建的用户,专门用于集群
同时,在集群部署完成后,会有多个文件保存数据库用户的密码,用作不同的用途:
- ~/.encpwd,数据库免密文件,加密保存system和esrep用户的密码,集群中的守护进程、命令行工具或其他应用在集群节点使用system或esrep用户连接数据库时,默认使用此文件中的密码。
- ${集群}/etc/all_nodes_tools.conf,监控配置文件,加密保存system用户的密码,信息收集进程postgres_exporter读取此文件中的用户和密码连接本地数据库,获取数据库信息并提供给监控工具kmonitor。
注:以上文件每个节点都有一份,所有节点的同名文件内容都相同。
在修改集群用户(system或esrep)密码时,需要同步修改以上密码文件,才能保证集群部分功能能够正常使用。KingbaseES提供了命令工具以便一键修改数据库密码和对应的密码文件:
sys_monitor.sh change_password user new_password
—修改集群使用的用户的密码
六、卸载 KingBaseES 集群
1、删除数据库服务
如果在安装后执行root.sh脚本在系统中注册了数据库服务,需要在卸载前执行rootuninstall.sh脚本删除已注册的数据库服务。具体步骤如下:
1.打开新终端;
2.切换到root用户;
3.运行${安装目录}/install/script/rootuninstall.sh 。
#cd /home/kingbase/KingbaseES/V9R1/install/script
# ./rootuninstall.sh
2、卸载数据库软件
以kingbase用户登录系统后,进入${安装目录}/Uninstall目录,执行以下命令:
1.命令行静默卸载
$ cd KingbaseES/V9R1/Uninstall/
$ sh Uninstaller -i silent
2.命令行交互卸载
sh Uninstaller -I console
继续
七、集群启停
1、启动数据库服务
$ sys_monitor.sh start
2、停止数据库服务
$ sys_monitor.sh stop
八、集群主备切换
集群主备切换时指主动让主备角色互换,这种场景和故障自动转移的情况有所不同。自动故障转移是主库故障后,备库升主以替代原主库,这个流程是意外发生、不受控制的。而主备切换一般是在运维过程中由运维人员手动触发的,使主备角色互换。
1、集群组件介绍
- repmgr:
用于执行管理任务的命令行工具
repmgr用于管理KingbaseRWC中的故障转移,可支持一主一备或一主多备,备库支持同步和异步模式。它提供了repmgr和repmgrd两个主要的工具。
- 远程通信工具:
sys_securecmdd是集群中自带的工具,集群监控、管理集群时通过sys_securecmdd安全执行命令。sys_securecmd是客户端。
- 守护进程:
每个数据库节点有一个repmgrd守护进程,主节点的repmgrd只监视本地数据库,备节点的repmgrd会同时监控本地数据库和主数据库。所有节点的状态信息存在repmgr.nodes表里,并通过流复制同步到所有备节点。
每个数据库节点都有一个kbha守护进程,其主要监控并守护repmgrd进程,同时对环境进行监控,包括:磁盘状态、信任网关状态。
kbha是KingbaseRWC集群的复制管理守护进程,Kbha启动repmgrd,并且执行KingbaseES的自动恢复。
2、主备同步流程
流程说明
① 数据库WalWriter把产生的WAL日志写入磁盘;
② WAL日志写入磁盘后,由walsender进程将新增的日志读取出来并通过流的形式发送给备库;
③ 备库walreceiver进程将接收到的WAL日志写入本地WAL段文件;
④ 备库startup进程读取WAL日志进行重放,完成数据同步。
3、主备切换
数据库上查看WAL发送进程或WAL接收进程命令
newdb=# select client_addr,sent_lsn,write_lsn,flush_lsn,replay_lsn,sync_state,sync_priority from sys_stat_replication;
数据库层面查看WAL发送进程和WAL接收进程,例如在主库上查询pg_stat_replication视图,如果返回记录说明是主库,备库上查询此视图无记录,如下所示:
$ repmgr cluster show
$ repmgr node status
显示节点的基本信息和复制状态的概述
$ repmgr standby switchover --siblings-follow
只能在备节点执行,把主节点降级为备库,把当前备节点提升为主库。
--siblings-follow:使其他备机跟随新的主机。确保整个集群中的所有备机都指向新的主机。
命令以及详细参数请参考: repmgr standby switchover
$ repmgr cluster show
$ repmgr node status
数据库上查看WAL发送进程或WAL接收进程命令
newdb=# select client_addr,sent_lsn,write_lsn,flush_lsn,replay_lsn,sync_state,sync_priority from sys_stat_replication;
数据库层面查看WAL发送进程和WAL接收进程,例如在主库上查询pg_stat_replication视图,如果返回记录说明是主库,备库上查询此视图无记录,如下所示:
vip已漂移
九、故障库恢复
一般情况下,故障数据库会由守护进程将其作为备库恢复至集群。但如果故障为主库,默认情况(recovery=standby)下是不会自动将其恢复为备库的,另外,如果用户关闭了自动恢复功能(recovery=manual)或者暂停了集群(repmgr service pause),那么任何故障数据库都不会自动恢复至集群,这时就需要运维人员手动操作将故障数据库恢复至集群。
#在故障的数据库节点执行
repmgr node rejoin -h ${主库IP} -d esrep -U esrep -p ${主库port} [--force-rewind] [--no-check-wal]
#可以执行简化后的命令
kbha -A rejoin -h ${主库IP}
参数说明:
--force-rewind,当故障数据库和当前主库数据分歧后,需要指定此参数使用sys_rewind使得故障数据库和新主库保持数据一致;
--no-check-wal,一般情况下不允许时间线高的数据库恢复为时间线低的主库的备库,此选项可以忽略时间线和lsn检查,必须和--force-rewind一起使用;
关于脑裂
在主备集群或读写分离集群中,都应该有且只有一个primary节点,其他节点都为standby。如果主备集群或读写分离集群中有多个primary节点,此场景称为脑裂。脑裂问题会导致数据分歧,无法保证数据一致性。
若集群在启动过程中,出现“双主”的故障,对于“双主”故障,需要人工参与,判断集群中那个节点是最新的主库,重新恢复集群。
十、在线扩容缩容
KingbaseES提供数据库扩缩容工具进行数据库集群的在线扩缩容。对于不支持GUI的服务器。约束要求:
- 免密配置约束
- 文件及文件名约束
- 扩缩容执行约束
注意事项:
1、执行脚本的操作扩容时只能在需要扩容的机器上执行,缩容时只能在集群主机上或者集群需要缩容的机器上执行,通用机需用普通用户执行脚本。
2、 配置文件中所有要求写路径的参数都必须是绝对路径,不支持相对路径。
3、 扩容时license_file参数只需写license文件名即可,无需写路径。
4、脚本支持使用非22端口进行ssh连接,如果想要修改ssh连接端口,除了更改配置文件install.conf之外,还需修改系统/etc/ssh/sshd_config文件中的Port项,然后重启sshd服务才能正常扩缩容集群。修改系统文件以及重启sshd服务均需要使用root用户执行。
5、脚本支持使用非8890端口进行scmd连接,如果想要修改scmd连接端口,除了更改配置文件install.conf之外还需修改系统install_dir /share目录sys_HAscmdd.conf文件中的scmd_port项,然后使用systemctl stop securecmdd命令停止已有secure_cmdd服务,再以root权限 使用命令install_dir/bin/sys_HAscmdd.sh init/start初始化和启动secure_cmdd 服务。
1、在线扩容:
1.检查数据库已有集群状态正常
2.获取集群扩容所需文件
检测到原集群状态正常后,需获取原集群安装目录/ClientTools/guitools/DeployTools/zip/下的:
- 服务器压缩包db.zip、
- 一键部署脚本cluster_install.sh、
- 配置文件install.conf、
- 配置SSH免密脚本 trust_cluster.sh
- 用户单独准备license.dat授权文件
需注意文件权限属主需为集群安装用户。
3.配置install.conf
编辑install.conf配置文件,参见扩容配置文件install.conf配置,进行相关参数配置。如需修改ssh连接端口,先修改install.conf文件中ssh_port项的值,然后修改系统/etc/ssh/sshd_config文件中的Port项的值,最后需要重启sshd服务。
提供install.conf配置文件用于配置集群扩容所需参数,提供参数如下:
参数名称 | 默认值/建议值 | 备注 |
|---|---|---|
expand_type | 必须配置,说明 需要扩容的数据库节点类型,0表示为 standby节点,1表示为witness节点。 | |
primary_ip | 必须配置,说明需要扩容的集群的 主节点IP,可以配置IPv4或IPv6地址。 | |
expand_ip | 必须配置,说明需要扩容的 节点的IP,可以配置IPv4或IPv6地址。 | |
node_id | 必须配置, 说明扩容加入集群后的节点的序号。 | |
install_dir | 必须配置,说明扩容节点对应的安装目录路径,该路径 在待扩容节点需是一个不存在的目录 ,且该安装目录需与原集群保持一致 ,专用机不需要配置,字符串不能以 / 字符结尾 | |
zip_package | 必须配置,说明压缩包的路径 ,专用机和手动分发压缩包 不需要配置 | |
net_device | 可选配置,若配置了[virtual _ip],则此参数必须配置,值为VIP所 在网卡的网卡名称,仅需配置单个。 | |
net_device_ip | 可选配置,若配置了[virtual_i p],则此参数必须配置,值为VIP所在 网卡的物理IP地址,仅需配置单个。 因为[virtual_ip]只能配置 为IPv4,此参数也必须配置为IPv4。n et_device_ip可以是VIP所在网卡的物 理ip地址列表中的任何一个,默认为 第一个,且不区分虚拟IP与物理IP。 | |
license_file | 必须配置,说明 license文件的名字,仅需配置一个。 | |
deploy_by_sshd | 0 | 可选配置,扩容方式。通用机是 否通过sshd服务对集群扩容。在专用 机上不能通过sshd服务扩容(值为0) |
ssh_port | 22 | 可选配置 ,指定sshd/ssh连接端口,默认22。 |
scmd_port | 8890 | 可选配置,指定sys_securecmdd/sy s_securecmd连接端口,默认为8890。 |
配置参考:
4.SSH免密配置
使用trust_cluster.sh进行SSH免密配置,免密配置后,请验证即将要扩容集群的所有设备的root用户和普通用户之间的免密是否配置正确。
5.集群扩容
集群部署用户执行 sh cluster_install.sh expand命令进行集群扩容,脚本将按照配置自动完成集群扩容工作。
6.扩容后检查
扩容成功后,请去到主库或扩容的备库所在节点的集群目录下,执行命令"repmgr cluster show",确认是否真正成功扩容集群。
2、在线缩容:
1.检查数据库已有集群状态正常
2.获取集群缩容所需文件
原集群部署目录一键部署脚本cluster_install.sh
原集群部署目录配置文件install.conf
3.配置install.conf
编辑install.conf配置文件,参见缩容配置文件install.conf配置,进行相关参数配置。如需修改ssh连接端口,先修改install.conf文件中ssh_port项的值,然后修改系统/etc/ssh/sshd_config文件中的Port项的值,最后需要重启sshd服务。
提供install.conf配置文件用于配置集群缩容所需参数,提供参数如下:
参数名称 | 默认值/建议值 | 备注 |
|---|---|---|
shrink_type | 必须配置, 说明需要缩容的数据库节点类型,0表示 为standby节点,1表示为witness节点。 | |
primary_ip | 必须配置,说明需要缩容的集群 的主节点IP,可以配置IPv4或IPv6地址。 | |
shrink_ip | 必须配置,说明需要缩容 的节点的IP,可以配置IPv4或IPv6地址。 | |
node_id | 必须配置,说明 需要缩容的节点在集群中的节点的序号。 | |
install_dir | 必须配置,说明缩容节点对应 的安装目录路径,该路径需是一个存在的 目录,专用机不需要配置,字符串不能以 / 字符结尾。 | |
ssh_port | 22 | 可选 配置,指定sshd/ssh连接端口,默认22。 |
scmd_port | 8890 | 可选配置,指定sys_securecmdd /sys_securecmd连接端口,默认为8890。 |
参考配置如下:
4.集群缩容
集群部署用户执行 sh cluster_install.sh shrink命令进行集群缩容,脚本将按照配置自动完成集群缩容工作。
5.缩容后检查
缩容成功后,请去到主库所在节点的集群目录下,执行命令"repmgr cluster show",确认是否真正成功缩容集群。
3、关于witness节点的扩缩容
witness节点,也称为仲裁节点、观察节点,应用不访问此节点,此节点主要作为集群故障自动切换时的仲裁。
witness节点是一个正常的KingbaseES实例,不是流复制群集的一部分;其目的是,如果发生故障转移情况,则提供证明它是主服务器本身不可用的证据,而不是例如在不同物理位置之间的网络分裂。
提供install.conf配置文件用于配置集群扩缩容所需参数大致和普通节点扩缩容配置文件一致,主要区别为参数:expand_type = 1,如下图是扩容过程参考:
$ repmgr cluster show
4、补充说明:
1、脚本在线扩容缩容暂未集成两地三中心功能。
2、扩容失败时,原集群数据节点数据不受影响,脚本退出后,再次扩容时,根据脚本提示进行操作即可。
3、缩容由于备库挂掉,而失败时,保留复制槽,此时数据库不可用,复制槽同样不可用,对读写分离集群功能不影响。
十一、问题整理:
1、执行查看集群命令报错如下:
[kingbase@appnode1 bin]$ ./repmgr cluster show
[ERROR] following errors were found in the configuration file:
"node_id": required parameter was not found
"node_name": required parameter was not found
"data_directory": required parameter was not found
"conninfo": required parameter was not found
[DETAIL] configuration file is: "/home/kingbase/KingbaseES/V9R1/KESRealPro/V009R001C001B0025/Server/bin/../etc/repmgr.conf"
解决办法:
配置正确环境变量:/home/kingbase/KingbaseES/V9R1/kingbase/bin
2、扩容时报错
[ERROR] the install dir "/home/kingbase/KingbaseES/V9R1/kingbase" on "192.168.126.11" is already exist, please remove it first.
[ERROR] target data directory appears to be a Kingbase data directory
[DETAIL] target data directory is "/home/kingbase/data"
[HINT] use -F/--force to overwrite the existing data directory
解决办法:
删除未清除的节点信息目录及文件 /home/kingbase/KingbaseES/V9R1/kingbase /home/kingbase/data




