建立系统数据库安装用户组及用户,在所有的节点执行
root用户登陆服务器,创建用户组及用户并且设置密码
groupadd -g 2000 kingbase
useradd -G kingbase -g 2000 kingbase -m
passwd kingbase
备注:用户组及用户名称可以自定义,这里以kingbase用户为例
配置/etc/hosts文件
vim /etc/hosts
192.168.10.10 node1 #主库
192.168.10.20 node2 #备库
备注:/etc/hosts配置属于可选项目,这里配置主要是区分后续的复制槽,在一主多备的场景方便区分复制槽对应的主机
系统参数配置:所有节点都必须配置
系统内核参数/etc/sysctl.conf,详细配置请参考系统手册
示例 vim /etc/sysctl.conf
fs.aio-max-nr= 1048576
fs.file-max= 6815744
kernel.shmall= 2097152
kernel.shmmax= 2174483648
kernel.shmmni= 4096
kernel.sem= 5010 641280 5010 256
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
net.ipv4.tcp_rmem=8192 87380 16777216
net.ipv4.tcp_wmem=8192 65536 16777216
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_background_bytes=25
参数说明:
fs.aio-max-nr参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量
fs.file-max参数表示进程(比如一个worker进程)可以同时打开的最大句柄数,这个参数限制最大并发连接数。
kernel.shmall参数表示系统一次可以使用的共享内存总量(以页为单位)缺省值就是2097152,通常不需要修改
kernel.sshmmax参数定义了共享内存段的最大尺寸(以字节为单位)
kernel.shmmni参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096
kernel.sem参数表示设置的信号量
# 5010是参数semmsl的值,表示一个信号量集合中能够包含的信号量最大数目。
# 641280是参数semmns的值,表示系统内可允许的信号量最大数目。
# 5010是参数semopm的值,表示单个semopm()调用在一个信号量集合上可以执行的操作数量。
# 256是参数semmni的值,表示系统信号量集合总数
net.ipv4.ip_local_port_range参数表示应用程序可使用的IPv4端口范围
net.core.rmem_default参数表示套接字接收缓冲区大小的缺省值
net.core.rmem_max参数表示套接字接收缓冲区大小的最大值
net.core.wmem_default参数表示套接字发送缓冲区大小的缺省值
net.core.wmem_max=参数表示套接字发送缓冲区大小的最大值
数据库的推荐设置,提高网络性能
net.ipv4.tcp_rmem=8192 87380 16777216
net.ipv4.tcp_wmem=8192 65536 16777216
NUMA设置
大多数情况,可以在BIOS层面关闭NUMA支持,并且在OS启动参数中设置numa off参数,那么我们再OS上就可以不用关注NUMA问题了。
grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="numa=off"
如果在OS上没有关闭NUMA,也可以通过下面的手段让数据库在分配内存的时候不理会NUMA的远程内存。
vm.zone_reclaim_mode=0
vm.numa_balancing=0
numactl-interleave=all
避免OOM发生
m.swappiness = 0 # 建议设置为0
vm.overcommit_memory = 2 # 允许一定程度的Overcommit
vm.overcommit_ratio = 50 # 允许的Overcommit:$((($mem - $swap) * 100 / $mem))
文件缓存脏块回写策略
vm.dirty_background_ratio = 5(10–>5)
vm.dirty_ratio = 10~15
vm.dirty_background_bytes=25
当pagecache变脏了,需要将脏页刷出内存。linux中通过一些参数来控制何时进行内存回写。
vm.dirty_background_ratio/vm.dirty_background_bytes
内存中允许存在的脏页比率或者具体值。达到该值,后台刷盘。取决于外存读写速度的不同,通常将vm.dirty_background_ratio设置为5,而vm.dirty_background_bytes设置为读写速度的25%。
vm.dirty_ratio/vm.dirty_bytes
前台刷盘会阻塞读写,一般vm.dirty_ratio设置的比vm.dirty_background_ratio大,设置该值确保系统不会再内存中保留过多数据,避免丢失。
vm.dirty_expire_centisecs
脏页在内存中保留的最大时间。
vm.dirty_writeback_centisecs
刷盘进程(pdflush/flush/kdmflush)周期性启动的时间
预留足够的物理内存,用于文件的读写CACHE
根据业务系统的特点与硬件的IO能力调整脏块刷新频率
如果物理IO性能很强,则降低刷新频率,减少脏块比例,如果物理IO性能较弱,则往反方向调整。
设置完成后使用root用户执行 sysctl -p 使参数生效
系统资源限制
/etc/security/limits.conf
/etc/security/limits.d/20-nproc.conf
如果系统只有/etc/security/limits.conf文件,没有/etc/security/limits.d/20-nproc.conf文件,只需修改/etc/security/limits.conf文件,如果全部都有,那么2个文件都要修改
vim /etc/security/limits.conf
kingbase soft nofile 65536
kingbase hard nofile 65535
kingbase soft nproc 65536
kingbase hard nproc 65535
kingbase soft core unlimited
kingbase hard core unlimited
设置完成后,切换到kingbase用户使用ulimit -a进行查看
# 使用unlimited ,是最大数量则表示无限制
# * 表示所有用户,这里也可只设置root 和要安装的kingbase 用户设置其值
# nofile 是打开文件最大数目,nproc 为进程最大数目,core 为生成内核文件大小的上限
# soft 代表一个警告值,hard 为真正的阈值,超过就会报错,可以适当继续往高调
# PAM 的调整针对单个会话生效,调整后需重新登录root 和kingbase,用ulimit -n 查看生效情况
# 注意:设置nofile 的hard limit 不能大于/proc/sys/fs/nr_open,否则注销后将无法正常登陆
查看磁盘IO调度
查看当前I/O 调度策略cat /sys/block/{DEVICE-NAME}/queue/scheduler
• 修改I/O 调度策略为deadline(最后期限算法,根据算法保证请求不饿死)
• {DEVICE-NAME} = 硬盘名称
机械硬盘,推荐deadline 调度算法,较为适合业务单一并且IO 比较重的业务,比如数据库。
固态硬盘,推荐noop 调度算法。
查看系统支持IO 调度算法:
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 调度算法
cat /sys/block/{DEVICE-NAME}/queue/scheduler
如果是普通的机械硬盘建议修改磁盘IO调度策略为:deadline (最后期限算法,根据算法保证请求不饿死)
修改IO磁盘调度策略为deadline,示例如下:
linux6版本:
# echo deadline > /sys/block/sda/queue/scheduler
也可以写在grub中:
kernel /vmlinuz-2.6.18-274.3.1.el5 ro root=LABEL=/
elevator=deadline crashkernel=128M@16M quiet console=tty1
console=ttyS1,115200 panic=30 transparent_hugepage=never
initrd /initrd-2.6.18-274.3.1.el5.img
linux7版本
grubby --update-kernel=ALL --args="elevator=deadline"
暂时不建议使用透明大页,并且在一些高负载的大型数据库系统中建议关闭操作系统的透明大页功能
grubby --update-kernel=ALL --args="transparent_hugepage=never"
磁盘阵列一般都用write-back cache,因为他配置了电池,一般称为battery-backed write cache(BBC or BBWC)
安装kingbaseES数据库软件:
-
主库安装数据库软件,备库无需安装
浏览器输入以下网址,在安装包选择对应的CPU版本进行下载,然后在授权窗口下载license-企业版授权文件 https://www.kingbase.com.cn/rjcxxz/index.htm
-
下载完成后进行数据库软件的安装
修改下载的license_V8R6-企业版-365天.dat 为license.dat mv license_V8R6-企业版-365天.dat license.dat 上传下载完成的软件安装包ISO镜像和lisence授权文件:
-
安装路径规划:主库备库路径尽量都保持一致(表空间/数据目录/归档日志目录...)
-
使用kingbase用户创建软件安装目录及数据存放目录:
kingbaseES数据库软件安装地址:mkdir -p /home/kingbase/KingbaseES/V8/ kingbaseES数据库数据存放地址:mkdir -p /home/kingbase/data
备注:如果使用root用户进行创建,创建完成后需要手动进行权限更改chown -R kingbase:kingbase /home/kingbase/
-
root用户进行安装包ISO文件挂载
mount /home/kingbase/KingbaseES_V008R006C006B0021_Lin64_install.iso /mnt/
-
切换到kingbase用户进行软件安装
cd /mnt 命令行安装输入 ./setup.sh -i console 根据提示进行软件安装。 图形界面安装,直接点击setup可执行文件进行安装,路径选择前面创建的路径
-
主节点安装完成后,将安装后的目录打包
tar cvf KingbaseES.tar KingbaseES/ 主库第一次安装软件会进行数据库初始化。
备注:如果安装的时候没有初始化数据库操作,需要在软件安装完成后进行数据库初始化操作(只在主库节点操作,备库节点不用做)
-
打包完成后传送到备库节点kingbase用户目录
scp KingbaseES.tar [email protected]:~ kingbase用户登陆备库节点解压发送的tar包
-
配置系统kingbase用户环境变量:所有节点都配置(先只需配置主库节点,备库节点后面在进行配置)
vim .bash_profile export KDBHOME=/home/kingbase/KingbaseES/V8/Server export KDBDATA=/home/kingbase/data export LANG=zh_CN.UTF-8 export PATH=$PATH:$HOME/.local/bin:$HOME/bin:$KDBHOME/bin source .bash_profile使环境变量生效
初始化数据库命令,安装完主节点数据库软件,并且配置了kingbase用户环境变量
initdb -Usystem -Eutf8 -D /home/kingbase/data/ -mpg
initdb 初始化一个 Kingbase 数据库簇. 使用方法: initdb [选项]... [DATADIR] 选项: -A, --auth=METHOD default authentication method for local connections --auth-host=METHOD default authentication method for local TCP/IP connections --auth-local=METHOD default authentication method for local-socket connections -c, --config-protect enable encrypted config file, default is false [-D, --kingbase_data=]DATADIR 数据库路径 -E, --encoding=ENCODING set default encoding for new databases -g, --allow-group-access allow group read/execute on data directory --locale=LOCALE set default locale for new databases --lc-collate=, --lc-ctype=, --lc-messages=LOCALE --lc-monetary=, --lc-numeric=, --lc-time=LOCALE set default locale in the respective category for new databases (default taken from environment) --no-locale equivalent to --locale=C --enable-ci 是否大小写敏感,默认为敏感。off为敏感 on为不敏感 --pwfile=FILE read password for the new superuser from file -T, --text-search-config=CFG default text search configuration -U, --username=NAME 数据库超级用户名称 -W, --pwprompt prompt for a password for the new superuser -X, --waldir=WALDIR 指定wal日志路径,默认为DATADIR/sys_wal --wal-segsize=SIZE size of WAL segments, in megabytes -m, --dbmode=MODE 数据库兼容模式oracle/pg。默认为oracle(兼容oracle存储过程/函数/视图/类型...语法),pg模式为原生postgresql数据库 -e, --encrypt-algorithm=METHOD Specify encryption method -t, --aud-tblspc-enc enable sysaudit tablespace encrypt -K, --enckey=KEY Specify sysaudit tablesapace encrypt key -M, --passwordcheck enable user password check for initdb -I, --identity-pwdexp enable user password expire check --ssoname=NAME database security administrator --saoname=NAME database audit administrator --init-audit-rules enable to init audit rules --block-size=SIZE 设置block块大小8k/16k/32k。默认为8k
主节点数据库初始化完成后开始流复制主节点参数配置(数据库软件版本保持一致)
-
主库(主节点):创建归档日志目录:
cd /home/kingbase/data mkdir archive
-
配置sys_hba.conf支持远程主机replication
sys_hba.conf 添加 host replication all 192.168.10.0/0 trust
-
主备流复制参数配置
主备流复制使用参数说明:
wal_log_hints=on # 参数必须开启,在流复制主备需要进行切换时,主备时间线出现分歧,方便使用sys_rewind进行时间同步 full_page_writes=on # 参数必须开启,在流复制主备需要进行切换时,主备时间线出现分歧,方便使用sys_rewind进行时间同步 archive_mode=on # 开启归档模式。启用archive_mode时,通过设置archive_command将已完成的WAL段发送到归档存储。 # 除了off,disable,还有两种模式:on,always # 在正常操作期间,两种模式之间没有区别,但是当设置为always的情况下,WAL archiver在存档恢复或待机模式下也被启用。 # 在always模式下,从归档还原或流式复制流的所有文件都将被再次归档 # archive_mode和archive_command是单独的变量,因此可以在不更改存档模式的情况下更改archive_command # 此参数只能在服务器启动时设置。当wal_level设置为minimal时,无法启用archive_mode wal_level=replica # minimal 记录基本的数据操作,保证数据库的ACID # replica 在minmal的基础上,记录额外的事务类型操作和数据,保证主备同步一致 # logical 在replica的基础上,记录完整的数据(主要是更新操作中的旧数据,低于此级别只记录旧数据的某个标记 # 保证逻辑解码功能逻辑解码是为逻辑同步服务的,两个独立主库通过逻辑同步的方式同步表数据. archive_command='test ! -f /home/kingbase/data/sys_wal/archive_status/%f && cp %p /home/kingbase/archive/%f' # 定义对wal进行归档的命令。 # 当archive_mode配置参数启用并且archive_command配置参数是空字符串时, # wal archiving暂时被禁用,但是数据库会继续积累wal segment文件。 # archive_command参数值设置为/bin/true会禁用归档 # 但这样会导致wal文件归档中断,归档中断是无法进行归档恢复的,请注意这一点。 # archive_command = 'test ! -f /mnt/archivedir/%f && cp %p /mnt/archivedir/%f' # archive_command = 'gzip < %p > /mnt/archivedir/%f' archive_timeout=0 # archive_command执行本地shell命令来归档已完成的WAL文件段。仅对已完成的WAL段进行调用。 # 因此,如果你的服务器产生很少的WAL(或者在这种情况下有很长的时间),在事务完成和归档存储器中的安全记录之间可能会有很长的延迟。 # 为了限制未归档的数据的可能性,可以设置archive_timeout来强制服务器定期切换到新的WAL段文件。 # 当此参数大于零时只要从最后一个段文件切换开始经过了许多秒,服务器就会切换到一个新的段文件, # 并且存在任何数据库活动,包括一个检查点(如果没有检查点,则跳过检查点数据库活动)。 # 请注意,由于强制切换而提前关闭的归档文件的长度与完整文件的长度相同。 因此,使用一个非常短的archive_timeout是不明智的 # 这会使您的存档存储空间膨胀。一分钟左右的archive_timeout设置通常是合理的。 synchronous_commit=on # on off local remote_write remote_apply # 在流复制的环境下对性能的影响由小到大分别是: # off (async) > on (async) > remote_write (sync) > on|local (sync) > remote_apply (sync) # remote_apply 应用发起提交后,等到在备库上应用WAL(更新数据)后,它将返回COMMIT响应,并且可以在备库上进行引用。 # 由于完全保证了数据同步,因此它适合需要备库始终保持最新数据的负载分配场景。 # on 应用发起提交后,在备库上写入WAL之后,返回COMMIT响应。该选项是性能和可靠性之间的最佳平衡。 # remote_write 应用发起提交后,等到WAL已传输到备库后,返回COMMIT响应。 # local 应用发起提交后,写入主库WAL之后,返回COMMIT响应。 # off 应用发起提交后,直接返回COMMIT响应,而无需等待主库WAL完成写入。 synchronous_standby_names='node2' # 如果不配置此参数,默认为async同步方式。kingbaseES生成规则为''kingbase_*&+_++'',主库synchronous_standby_names参数为备机名称。 # 当自身是备库的时候synchronous_standby_names参数为自己 # 主库配置为备库节点名称。当自身为备库时,配置为备库节点名称。 max_wal_size=1GB # 两个检查点之间,wal可增长的最大大小,这是一个软限制 # 如果日志量大于max_wal_size,则WAL日志空间尽量保持在max_wal_size。因为会触发检查点,不需要的段文件将被移除直到系统回到这个限制以下 # 如果日志量小于max_wal_size,则WAL日志空间至少保持min_wal_size # 通常情况下,WAL日志空间大小在min_wal_size和max_wal_size之间动态评估。该估计基于在以前的检查点周期中使用的WAL文件数的动态平均值。 # 如果实际使用量超过估计值,动态平均数会立即增加 min_wal_size=100MB # 检查点后用来保留的,用于未来循环使用的wal文件。可以被用来确保有足够的 WAL 空间被保留来应付 WAL 使用的高峰 # WAL异常增长,或WAL一直膨胀且超过max_wal_size,执行检查点后,WAL使用量未见降低或WAL日志不会被删除重用,需要排查以下因素 # 独立于max_wal_size之外,wal_keep_segments + 1 个最近的 WAL 文件将总是被保留 # 启用了WAL 归档,旧的段在被归档之前不能被移除或者再利用 # 启用了复制槽功能,一个使用了复制槽的较慢或者失败的后备服务器也会导致WAL不能被删除或重用 # checkpoing未完成,长事务未提交 checkpoint_completion_target=0.5 # 100GB /(0.5*5*60)*1024≈670M/s 100GB /(0.9*5*60)*1024≈380M/s checkpoint_timeout=10min # 写入速度越低,对客户而言,体验越好,性能越高。反之,较低的值可能会引起I/O峰值,导致“卡死”的现象 shared_buffers=1GB # 最佳值为内存RAM 1/3 archive_cleanup_command # 提供一个清理不被standby server所需要的老的archived wal file # %r代表最后一个有效的restart point 的 wal file.该 wal file 是最早一个必须保留的文件,以便允许 restore 操作可以被 restart # 注意:restart point 是一个 point ,该 point 用于 standby server 重启 recovery 操作。 # 因此,所有早于 % r 的文件可以被安全的清理掉。本信息可以用来 truncate 掉 archive wal file,以便满足从当前 restore 可以 restart 的最小需求 # 常被用在单个 standby 配置的 archive_cleanup_command 参数中 # 当命令被一个 signal 终止或者 shell 中有错误时,一个 fatal error 会被抛出 max_connections=1000 log_filename = 'kingbase-%Y-%m-%d.log'
KingbaseES主备流复制参数配置
vi kingbase.conf文件末尾添加以下参数 wal_log_hints=on full_page_writes=on max_wal_size=1GB min_wal_size=100MB wal_level=replica archive_command='test ! -f /home/kingbase/data/sys_wal/archive_status/%f && cp %p /home/kingbase/archive/%f' archive_timeout=0 synchronous_commit=on synchronous_standby_names='node2' archive_mode=on checkpoint_completion_target=0.5 checkpoint_timeout=10min shared_buffers=1GB max_connections=1000 archive_cleanup_command = 'sys_archivecleanup -d /home/kingbase/data/archive %r' log_filename = 'kingbase-%Y-%m-%d.log'
添加后保存退出
-
启动kingbaseES数据库,如果已经启动,最好进行重启操作。
sys_ctl -D /home/kingbase/data start or restart
-
在主库创建复制槽replication slot
复制槽名称起任意名称:主要作用是记录备库应用日志,在备库宕机恢复运行的时候,根据复制槽记录的信息进行数据应用。保证主库在所有备库收到Wal之前不会删除被删除。 1个复制槽对应1个备库。如 1主1备 就只需要创建1个复制槽,有多个备库就需创建多个复制槽。一个复制槽对应一个备库。
-
ksql命令登陆数据库,创建并查询已创建的复制槽
ksql -Usystem -dtest -p54321 select pg_create_physical_replication_slot('slot_node2'); select * from pg_replication_slots; test=# select pg_create_physical_replication_slot('slot_node2'); pg_create_physical_replication_slot ------------------------------------- (slot_node2,) (1 行记录) test=# \x 扩展显示已打开. test=# select * from pg_replication_slots; -[ RECORD 1 ]-------+----------- slot_name | slot_node2 plugin | slot_type | physical datoid | database | temporary | f active | f active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn |
到此主库所有的配置都已完成,复制槽也创建完成。
注意:进行以下操作前,最好确认防火墙是关闭的,如果防火墙不允许关闭。需添加防火墙策略,允许数据库端口被访问
systemctl status firewalld.service Active: inactive显示running代表防火墙在运行 Active: inactive显示dead代表防火墙在关闭状态
root用户执行以下命令添加防火墙策略
firewall-cmd --permanent --zone=public --add-port=54321/tcp firewall-cmd --permanent --zone=public --add-port=54321/udp firewall-cmd --reload
备库:
-
安装软件
-
创建备库数据存储目录(和主库一致)
-
手工对主库进行clone操作
在备节点kingbase用户使用sys_basebackup工具进行clone操作。执行命令的时候最好加-R参数,会自动创建 standby.signal 标识身份文件,同时会在kingbase.auto.conf文件自动添加主库连接信息,当前所使用的复制槽名称。 注意数据库是否为大小写敏感的库,如果敏感需要注意用户名、密码大小写 复制槽输入在主库创建的复制槽名称:slot_node2
-
执行sys_basebackup clone命令
sys_basebackup -h 192.168.57.10 -Usystem -D /home/kingbase/data -P -v -X stream -F p -S slot_node2 -R
[kingbase@ora19c ~]$ sys_basebackup -h 192.168.57.10 -Usystem -D /home/kingbase/data -P -v -X stream -F p -S slot_node2 -R sys_basebackup: initiating base backup, waiting for checkpoint to complete sys_basebackup: checkpoint completed sys_basebackup: write-ahead log start point: 0/7000028 on timeline 1 sys_basebackup: starting background WAL receiver 39453/39453 kB (100%), 1/1 tablespace sys_basebackup: write-ahead log end point: 0/70000F8 sys_basebackup: waiting for background process to finish streaming ... sys_basebackup: syncing data to disk ... sys_basebackup: base backup completed
注意在clone主库的过程中不要出现error信息。
-
进入data目录查看是否成功创建standby.signal备库身份标识文件
[kingbase@ora19c data]$ ll total 64 -rw------- 1 kingbase kingbase 3 Oct 19 08:13 SYS_VERSION drwxrwxr-x 2 kingbase kingbase 6 Oct 19 08:13 archive -rw------- 1 kingbase kingbase 225 Oct 19 08:13 backup_label drwx------ 6 kingbase kingbase 54 Oct 19 08:13 base -rw------- 1 kingbase kingbase 39 Oct 19 08:13 current_logfiles drwx------ 2 kingbase kingbase 4096 Oct 19 08:13 global -rw------- 1 kingbase kingbase 334 Oct 19 08:13 initdb.conf -rw------- 1 kingbase kingbase 333 Oct 19 08:13 kingbase.auto.conf -rw------- 1 kingbase kingbase 28134 Oct 19 08:13 kingbase.conf -rw------- 1 kingbase kingbase 0 Oct 19 08:13 standby.signal drwx------ 3 kingbase kingbase 19 Oct 19 08:13 sys_aud drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_bulkload drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_commit_ts drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_csnlog drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_dynshmem -rw------- 1 kingbase kingbase 4831 Oct 19 08:13 sys_hba.conf -rw------- 1 kingbase kingbase 1628 Oct 19 08:13 sys_ident.conf drwxrwxr-x 2 kingbase kingbase 6 Oct 19 08:13 sys_log drwx------ 4 kingbase kingbase 68 Oct 19 08:13 sys_logical drwx------ 4 kingbase kingbase 36 Oct 19 08:13 sys_multixact drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_notify drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_replslot drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_serial drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_snapshots drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_stat drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_stat_tmp drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_tblspc drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_twophase drwx------ 3 kingbase kingbase 60 Oct 19 08:13 sys_wal drwx------ 2 kingbase kingbase 18 Oct 19 08:13 sys_xact
sys_basebackup 加-R参数会自动生成。如果clone主库没有加-R参数,需要手动创建standby.signal
手动创建 standby.signal 备库身份标识 touch standby.signal 并且需要在kingbase.auto.conf 手动添加 primary_conninfo信息 [kingbase@ora19c data]$ cat kingbase.auto.conf # Do not edit this file manually! # It will be overwritten by the ALTER SYSTEM command. primary_conninfo = 'user=system passfile=''/home/kingbase/.kbpass'' host=192.168.57.10 port=54321 application_name=''kingbase_*&+_++'' sslmode=prefer sslcompression=0 gssencmode=disable target_session_attrs=any' primary_slot_name = 'slot_node2'
-
编辑备库连接字符串
修改application_name为当前备库名称[kingbase@ora19c data]$ cat kingbase.auto.conf # Do not edit this file manually! # It will be overwritten by the ALTER SYSTEM command. primary_conninfo = 'user=system passfile=''/home/kingbase/.kbpass'' host=192.168.57.10 port=54321 application_name=''kingbase_*&+_++'' sslmode=prefer sslcompression=0 gssencmode=disable target_session_attrs=any' primary_slot_name = 'slot_node2'
在kingbase.auto.conf中配置明文口令存在风险,可以采取以下方案:
1. 配置主库端sys_hba.conf文件,支持指定的网段做‘replication’采用‘trust’方式认证。 2. 在备库kingbase.auto.conf文件中,不指定用户的口令。
-
启动备库数据库服务
sys_ctl start -D /data/kingbase/v8r6_041/data waiting for server to start....2022-03-29 22:46:49.429 CST [9781] LOG: sepapower extension initialized ...... server started
-
查看备库数据库进程
主库
[kingbase@postgres data]$ ps -ef |grep kingbase kingbase 738 31408 0 09:48 ? 00:00:00 kingbase: walsender system 192.168.57.20(48390) streaming 0/8000130 kingbase 1966 31840 0 10:06 pts/5 00:00:00 ps -ef kingbase 1967 31840 0 10:06 pts/5 00:00:00 grep --color=auto kingbase root 20349 1252 0 06:02 ? 00:00:00 sshd: kingbase [priv] kingbase 20354 20349 0 06:02 ? 00:00:00 sshd: kingbase@pts/2 kingbase 20355 20354 0 06:02 pts/2 00:00:00 -bash kingbase 31408 1 0 09:19 ? 00:00:00 /home/kingbase/KingbaseES/V8/KESRealPro/V008R006C006B0021/Server/bin/kingbase -D /home/kingbase/data kingbase 31409 31408 0 09:19 ? 00:00:00 kingbase: logger kingbase 31411 31408 0 09:19 ? 00:00:00 kingbase: checkpointer kingbase 31412 31408 0 09:19 ? 00:00:00 kingbase: background writer kingbase 31413 31408 0 09:19 ? 00:00:00 kingbase: walwriter kingbase 31414 31408 0 09:19 ? 00:00:00 kingbase: autovacuum launcher kingbase 31415 31408 0 09:19 ? 00:00:00 kingbase: archiver failed on 000000010000000000000001 kingbase 31416 31408 0 09:19 ? 00:00:00 kingbase: stats collector kingbase 31417 31408 0 09:19 ? 00:00:00 kingbase: ksh writer kingbase 31418 31408 0 09:19 ? 00:00:00 kingbase: ksh collector kingbase 31419 31408 0 09:19 ? 00:00:00 kingbase: kwr collector kingbase 31420 31408 0 09:19 ? 00:00:00 kingbase: logical replication launcher root 31839 9330 0 09:26 pts/5 00:00:00 su - kingbase kingbase 31840 31839 0 09:26 pts/5 00:00:00 -bash
备库
[kingbase@ora19c ~]$ ps -ef |grep kingbase kingbase 7381 1 0 08:29 ? 00:00:00 /home/kingbase/KingbaseES/V8/KESRealPro/V008R006C006B0021/Server/bin/kingbase -D /home/kingbase/data kingbase 7382 7381 0 08:29 ? 00:00:00 kingbase: logger kingbase 7383 7381 0 08:29 ? 00:00:00 kingbase: startup recovering 000000010000000000000008 kingbase 7384 7381 0 08:29 ? 00:00:00 kingbase: checkpointer kingbase 7385 7381 0 08:29 ? 00:00:00 kingbase: background writer kingbase 7386 7381 0 08:29 ? 00:00:00 kingbase: stats collector kingbase 7387 7381 0 08:29 ? 00:00:01 kingbase: walreceiver streaming 0/8000130 root 7697 3237 0 08:48 pts/0 00:00:00 su - kingbase kingbase 7698 7697 0 08:48 pts/0 00:00:00 -bash kingbase 7730 7698 0 08:49 pts/0 00:00:00 ps -ef
-
验证主备流复制
主库执行查看复制槽状态
兼容pg模式使用 pg_replication_slots 兼容oracle模式使用 sys_replication_slots test=# select * from pg_replication_slots; -[ RECORD 1 ]-------+----------- slot_name | slot_node2 plugin | slot_type | physical datoid | database | temporary | f active | t active_pid | 738 xmin | catalog_xmin | restart_lsn | 0/8000130 confirmed_flush_lsn |
查看主备流复制状态
兼容pg模式使用 pg_stat_replication 兼容oracle模式使用 sys_stat_replication test=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 738 usesysid | 10 usename | system application_name | node2 client_addr | 192.168.57.20 client_hostname | client_port | 48390 backend_start | 2022-10-22 09:48:02.659429-04 backend_xmin | state | streaming sent_lsn | 0/8000130 write_lsn | 0/8000130 flush_lsn | 0/8000130 replay_lsn | 0/8000130 write_lag | flush_lag | replay_lag | sync_priority | 1 sync_state | sync reply_time | 2022-10-19 08:52:42.848097-04
查询主备当前所属角色:
兼容pg模式使用 pg_is_in_recovery 兼容oracle模式使用 sys_is_in_recovery 主库返回f false 备库返回t true test=# select pg_is_in_recovery(); -[ RECORD 1 ]-----+-- pg_is_in_recovery | f test=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 row)
-
测试数据同步
主库
test=# \dt public.* 没有找到任何名称为 "public.*" 的关联.
备库
test=# \dt public.* Did not find any relation named "public.*".
主库执行:
test=# create table test(id int); CREATE TABLE
备库查看:
test=# select * from test; id ---- (0 rows)
-
查看主备流复制同步模式
show synchronous_standby_names ; show synchronous_commit ; select * from pg_stat_replication ; test=# show synchronous_standby_names ; synchronous_standby_names --------------------------- node2 (1 行记录) test=# show synchronous_commit ; synchronous_commit -------------------- on (1 行记录) test=# select * from pg_stat_replication ; -[ RECORD 1 ]----+------------------------------ pid | 738 usesysid | 10 usename | system application_name | node2 client_addr | 192.168.57.20 client_hostname | client_port | 48390 backend_start | 2022-10-22 09:48:02.659429-04 backend_xmin | state | streaming sent_lsn | 0/8018160 write_lsn | 0/8018160 flush_lsn | 0/8018160 replay_lsn | 0/8018160 write_lag | flush_lag | replay_lag | sync_priority | 1 sync_state | sync reply_time | 2022-10-19 09:01:32.185707-04
sync_state = sync 同步模式为sync
主备切换测试:
-
停止主库:
sys_ctl -D /home/kingbase/data stop [kingbase@postgres ~]$ sys_ctl -D /home/kingbase/data/ stop waiting for server to shut down....... done server stopped
-
kingbase用户登录备节点:
执行命令
sys_ctl promote -D /home/kingbase/data: 切换当前备库为主库
备库执行:
[kingbase@ora19c ~]$ sys_ctl promote -D /home/kingbase/data/ waiting for server to promote.... done server promoted [kingbase@ora19c ~]$ [kingbase@ora19c ~]$ ps -ef|grep kingbase kingbase 7381 1 0 08:29 ? 00:00:00 /home/kingbase/KingbaseES/V8/KESRealPro/V008R006C006B0021/Server/bin/kingbase -D /home/kingbase/data kingbase 7382 7381 0 08:29 ? 00:00:00 kingbase: logger kingbase 7384 7381 0 08:29 ? 00:00:00 kingbase: checkpointer kingbase 7385 7381 0 08:29 ? 00:00:00 kingbase: background writer kingbase 7386 7381 0 08:29 ? 00:00:00 kingbase: stats collector root 7697 3237 0 08:48 pts/0 00:00:00 su - kingbase kingbase 7698 7697 0 08:48 pts/0 00:00:00 -bash kingbase 7953 7381 0 09:07 ? 00:00:00 kingbase: walwriter kingbase 7954 7381 0 09:07 ? 00:00:00 kingbase: autovacuum launcher kingbase 7955 7381 0 09:07 ? 00:00:00 kingbase: archiver failed on 00000002.history kingbase 7956 7381 0 09:07 ? 00:00:00 kingbase: ksh writer kingbase 7957 7381 0 09:07 ? 00:00:00 kingbase: ksh collector kingbase 7958 7381 0 09:07 ? 00:00:00 kingbase: kwr collector kingbase 7959 7381 0 09:07 ? 00:00:00 kingbase: logical replication launcher kingbase 7963 7698 0 09:07 pts/0 00:00:00 ps -ef kingbase 7964 7698 0 09:07 pts/0 00:00:00 grep --color=auto kingbase
备库提升为主库的过程会自动删除standby.signal文件
[kingbase@ora19c data]$ ll total 72 drwxrwxr-x 2 kingbase kingbase 6 Oct 19 08:13 archive -rw------- 1 kingbase kingbase 225 Oct 19 08:13 backup_label.old drwx------ 6 kingbase kingbase 54 Oct 19 08:13 base -rw------- 1 kingbase kingbase 39 Oct 19 08:29 current_logfiles drwx------ 2 kingbase kingbase 4096 Oct 19 08:30 global -rw------- 1 kingbase kingbase 334 Oct 19 08:13 initdb.conf -rw------- 1 kingbase kingbase 323 Oct 19 08:27 kingbase.auto.conf -rw------- 1 kingbase kingbase 28134 Oct 19 08:13 kingbase.conf -rw------- 1 kingbase kingbase 105 Oct 19 08:29 kingbase.opts -rw------- 1 kingbase kingbase 78 Oct 19 09:07 kingbase.pid drwx------ 3 kingbase kingbase 19 Oct 19 08:13 sys_aud drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_bulkload drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_commit_ts drwx------ 2 kingbase kingbase 54 Oct 19 08:40 sys_csnlog drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_dynshmem -rw------- 1 kingbase kingbase 4831 Oct 19 08:13 sys_hba.conf -rw------- 1 kingbase kingbase 1628 Oct 19 08:13 sys_ident.conf drwxrwxr-x 2 kingbase kingbase 37 Oct 19 08:29 sys_log drwx------ 4 kingbase kingbase 68 Oct 19 09:07 sys_logical drwx------ 4 kingbase kingbase 36 Oct 19 08:13 sys_multixact drwx------ 2 kingbase kingbase 18 Oct 19 08:29 sys_notify drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_replslot drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_serial drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_snapshots drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_stat drwx------ 2 kingbase kingbase 71 Oct 19 09:07 sys_stat_tmp drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_tblspc drwx------ 2 kingbase kingbase 6 Oct 19 08:13 sys_twophase -rw------- 1 kingbase kingbase 3 Oct 19 08:13 SYS_VERSION drwx------ 3 kingbase kingbase 156 Oct 19 09:07 sys_wal drwx------ 2 kingbase kingbase 18 Oct 19 08:13 sys_xact
修改kingbase.auto.conf 注释连接串 primary_conninfo,复制槽primary_slot_name
[kingbase@ora19c data]$ cat kingbase.auto.conf # Do not edit this file manually! # It will be overwritten by the ALTER SYSTEM command. primary_conninfo = 'user=system passfile=''/home/kingbase/.kbpass'' host=192.168.57.10 port=54321 application_name=''node2'' sslmode=prefer sslcompression=0 gssencmode=disable target_session_attrs=any' primary_slot_name = 'slot_node2' 修改kingbase.conf文件synchronous_standby_names为之前老的主库主机名称 synchronous_standby_names='node1'
创建复制槽
test=# select pg_create_physical_replication_slot('slot_node2'); pg_create_physical_replication_slot ------------------------------------- (slot_node2,) (1 row) test=# \x Expanded display is on. test=# select * from pg_replication_slots; -[ RECORD 1 ]-------+----------- slot_name | slot_node2 plugin | slot_type | physical datoid | database | temporary | f active | f active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn |
重新加载配置文件:
sys_ctl -D /home/kingbase/data reload
老主库文件查看:
[kingbase@postgres ~]$ cd data/ [kingbase@postgres data]$ ll 总用量 68 drwxrwxr-x 2 kingbase kingbase 6 10月 22 07:17 archive drwx------ 6 kingbase kingbase 54 10月 22 06:05 base -rw------- 1 kingbase kingbase 39 10月 22 09:19 current_logfiles drwx------ 2 kingbase kingbase 4096 10月 22 09:20 global -rw------- 1 kingbase kingbase 334 10月 22 06:05 initdb.conf -rw------- 1 kingbase kingbase 88 10月 22 06:05 kingbase.auto.conf -rw------- 1 kingbase kingbase 28134 10月 22 09:19 kingbase.conf -rw------- 1 kingbase kingbase 105 10月 22 09:19 kingbase.opts drwx------ 3 kingbase kingbase 19 10月 22 06:05 sys_aud drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_bulkload drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_commit_ts drwx------ 2 kingbase kingbase 54 10月 22 06:05 sys_csnlog drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_dynshmem -rw------- 1 kingbase kingbase 4831 10月 22 07:28 sys_hba.conf -rw------- 1 kingbase kingbase 1628 10月 22 06:05 sys_ident.conf drwxrwxr-x 2 kingbase kingbase 37 10月 22 08:21 sys_log drwx------ 4 kingbase kingbase 68 10月 22 10:20 sys_logical drwx------ 4 kingbase kingbase 36 10月 22 06:05 sys_multixact drwx------ 2 kingbase kingbase 18 10月 22 09:19 sys_notify drwx------ 3 kingbase kingbase 24 10月 22 09:26 sys_replslot drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_serial drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_snapshots drwx------ 2 kingbase kingbase 116 10月 22 10:20 sys_stat drwx------ 2 kingbase kingbase 6 10月 22 10:20 sys_stat_tmp drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_tblspc drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_twophase -rw------- 1 kingbase kingbase 3 10月 22 06:05 SYS_VERSION drwx------ 3 kingbase kingbase 4096 10月 22 10:20 sys_wal drwx------ 2 kingbase kingbase 18 10月 22 06:05 sys_xact
手动创建备库标识standby.signal文件
touch standby.signal [kingbase@postgres data]$ touch standby.signal [kingbase@postgres data]$ ll 总用量 68 drwxrwxr-x 2 kingbase kingbase 6 10月 22 07:17 archive drwx------ 6 kingbase kingbase 54 10月 22 06:05 base -rw------- 1 kingbase kingbase 39 10月 22 09:19 current_logfiles drwx------ 2 kingbase kingbase 4096 10月 22 09:20 global -rw------- 1 kingbase kingbase 334 10月 22 06:05 initdb.conf -rw------- 1 kingbase kingbase 88 10月 22 06:05 kingbase.auto.conf -rw------- 1 kingbase kingbase 28134 10月 22 09:19 kingbase.conf -rw------- 1 kingbase kingbase 105 10月 22 09:19 kingbase.opts -rw-rw-r-- 1 kingbase kingbase 0 10月 22 10:28 standby.signal drwx------ 3 kingbase kingbase 19 10月 22 06:05 sys_aud drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_bulkload drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_commit_ts drwx------ 2 kingbase kingbase 54 10月 22 06:05 sys_csnlog drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_dynshmem -rw------- 1 kingbase kingbase 4831 10月 22 07:28 sys_hba.conf -rw------- 1 kingbase kingbase 1628 10月 22 06:05 sys_ident.conf drwxrwxr-x 2 kingbase kingbase 37 10月 22 08:21 sys_log drwx------ 4 kingbase kingbase 68 10月 22 10:20 sys_logical drwx------ 4 kingbase kingbase 36 10月 22 06:05 sys_multixact drwx------ 2 kingbase kingbase 18 10月 22 09:19 sys_notify drwx------ 3 kingbase kingbase 24 10月 22 09:26 sys_replslot drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_serial drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_snapshots drwx------ 2 kingbase kingbase 116 10月 22 10:20 sys_stat drwx------ 2 kingbase kingbase 6 10月 22 10:20 sys_stat_tmp drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_tblspc drwx------ 2 kingbase kingbase 6 10月 22 06:05 sys_twophase -rw------- 1 kingbase kingbase 3 10月 22 06:05 SYS_VERSION drwx------ 3 kingbase kingbase 4096 10月 22 10:20 sys_wal drwx------ 2 kingbase kingbase 18 10月 22 06:05 sys_xact
修改kingbase.auto.conf文件,添加连接串信息
primary_conninfo = 'user=system passfile=''/home/kingbase/.kbpass'' host=192.168.57.20 port=54321 application_name=''node1'' sslmode=prefer sslcompression=0 gssencmode=disable target_session_attrs=any' primary_slot_name = 'slot_node2'
修改kingbase.conf文件:
synchronous_standby_names='node1'
修改sys_hba.connf文件
由于之前添加信息为192.168.10.0网段,无需修改启动老主库
[kingbase@postgres data]$ sys_ctl -D /home/kingbase/data/ start waiting for server to start....2022-10-22 10:38:09.315 EDT [3797] LOG: sepapower extension initialized 2022-10-22 10:38:09.322 EDT [3797] LOG: starting KingbaseES V008R006C006B0021 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46), 64-bit 2022-10-22 10:38:09.322 EDT [3797] LOG: listening on IPv4 address "0.0.0.0", port 54321 2022-10-22 10:38:09.322 EDT [3797] LOG: listening on IPv6 address "::", port 54321 2022-10-22 10:38:09.325 EDT [3797] LOG: listening on Unix socket "/tmp/.s.KINGBASE.54321" 2022-10-22 10:38:09.468 EDT [3797] LOG: redirecting log output to logging collector process 2022-10-22 10:38:09.468 EDT [3797] HINT: Future log output will appear in directory "sys_log". done server started
登陆老主库删除之前的复制槽
[kingbase@postgres data]$ ksql -Usystem -dtest ksql (V8.0) 输入 "help" 来获取帮助信息. test=# select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_l sn | confirmed_flush_lsn ------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+---------- ---+--------------------- slot_node2 | | physical | | | f | f | | | | 0/80F8000 | (1 行记录) test=# \df pg_drop_replication_slot 函数列表 架构模式 | 名称 | 结果数据类型 | 参数数据类型 | 类型 ------------+--------------------------+--------------+--------------+------ pg_catalog | pg_drop_replication_slot | void | name | 函数 (1 行记录) test=# select pg_drop_replication_slot('slot_node2'); pg_drop_replication_slot -------------------------- (1 行记录) test=# select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_ls n | confirmed_flush_lsn -----------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+----------- --+--------------------- (0 行记录) test=#
确认老的主库当前的角色为备库
test=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 行记录)
新主库执行
test=# select * from pg_replication_slots; -[ RECORD 1 ]-------+----------- slot_name | slot_node2 plugin | slot_type | physical datoid | database | temporary | f active | t active_pid | 8246 xmin | catalog_xmin | restart_lsn | 0/90001A8 confirmed_flush_lsn | test=# select * from pg_stat_replication; -[ RECORD 1 ]----+------------------------------ pid | 8246 usesysid | 10 usename | system application_name | node1 client_addr | 192.168.57.10 client_hostname | client_port | 39634 backend_start | 2022-10-19 09:24:17.833373-04 backend_xmin | state | streaming sent_lsn | 0/90001A8 write_lsn | 0/90001A8 flush_lsn | 0/90001A8 replay_lsn | 0/90001A8 write_lag | flush_lag | replay_lag | sync_priority | 1 sync_state | sync reply_time | 2022-10-22 10:42:59.975417-04
查看当前主库(之前的备库)当前角色
test=# select pg_is_in_recovery(); -[ RECORD 1 ]-----+-- pg_is_in_recovery | f
至此,手工主备流复制创建成功,主从相互切换均无问题。
关于手动主从切换:数据库切换升主会生成 id(自己维护) + 1 的history的文件,每切换一次+1 主备都有此文件。
以下文件在手动主备切换后需要手工修改指向:
1. kingbase.auto.conf 修改新主库primary_conninfo指向切换后的老主库。
2. kingbase.conf 修改新主库synchronous_standby_names指向切换后的老主库,备库为自身。
3. standby.signal 手动touch 身份标识文件。
4. sys_hba.conf 允许复制角色的访问。
5. 复制槽 新主库需要手动创建复制槽,老主库需手动删除复制槽。