命令行部署KingbaseES流复制+切换测试
阅读原文时间:2023年07月08日阅读:1

建立系统数据库安装用户组及用户,在所有的节点执行

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数据库软件:

  1. 主库安装数据库软件,备库无需安装

     浏览器输入以下网址,在安装包选择对应的CPU版本进行下载,然后在授权窗口下载license-企业版授权文件
     https://www.kingbase.com.cn/rjcxxz/index.htm
  2. 下载完成后进行数据库软件的安装

     修改下载的license_V8R6-企业版-365天.dat 为license.dat
     mv license_V8R6-企业版-365天.dat license.dat
     上传下载完成的软件安装包ISO镜像和lisence授权文件:
  3. 安装路径规划:主库备库路径尽量都保持一致(表空间/数据目录/归档日志目录…)

  4. 使用kingbase用户创建软件安装目录及数据存放目录:

     kingbaseES数据库软件安装地址:mkdir -p /home/kingbase/KingbaseES/V8/
     kingbaseES数据库数据存放地址:mkdir -p /home/kingbase/data

    备注:如果使用root用户进行创建,创建完成后需要手动进行权限更改chown -R kingbase:kingbase /home/kingbase/

  5. root用户进行安装包ISO文件挂载

     mount /home/kingbase/KingbaseES_V008R006C006B0021_Lin64_install.iso /mnt/
  6. 切换到kingbase用户进行软件安装

     cd /mnt
     命令行安装输入 ./setup.sh -i console 根据提示进行软件安装。
     图形界面安装,直接点击setup可执行文件进行安装,路径选择前面创建的路径
  7. 主节点安装完成后,将安装后的目录打包

     tar cvf KingbaseES.tar KingbaseES/
     主库第一次安装软件会进行数据库初始化。

    备注:如果安装的时候没有初始化数据库操作,需要在软件安装完成后进行数据库初始化操作(只在主库节点操作,备库节点不用做)

  8. 打包完成后传送到备库节点kingbase用户目录

     scp KingbaseES.tar kingbase@192.168.57.20:~
     kingbase用户登陆备库节点解压发送的tar包
  9. 配置系统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

主节点数据库初始化完成后开始流复制主节点参数配置(数据库软件版本保持一致)

  1. 主库(主节点):创建归档日志目录:

     cd /home/kingbase/data
     mkdir archive
  2. 配置sys_hba.conf支持远程主机replication

     sys_hba.conf 添加
     host    replication     all             192.168.10.0/0          trust
  3. 主备流复制参数配置

    主备流复制使用参数说明:

     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'

    添加后保存退出

  4. 启动kingbaseES数据库,如果已经启动,最好进行重启操作。

     sys_ctl -D /home/kingbase/data start or restart
  5. 在主库创建复制槽replication slot

     复制槽名称起任意名称:主要作用是记录备库应用日志,在备库宕机恢复运行的时候,根据复制槽记录的信息进行数据应用。保证主库在所有备库收到Wal之前不会删除被删除。
     1个复制槽对应1个备库。如 1主1备 就只需要创建1个复制槽,有多个备库就需创建多个复制槽。一个复制槽对应一个备库。
  6. 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

备库:

  1. 安装软件

  2. 创建备库数据存储目录(和主库一致)

  3. 手工对主库进行clone操作

    在备节点kingbase用户使用sys_basebackup工具进行clone操作。

     执行命令的时候最好加-R参数,会自动创建 standby.signal 标识身份文件,同时会在kingbase.auto.conf文件自动添加主库连接信息,当前所使用的复制槽名称。
     注意数据库是否为大小写敏感的库,如果敏感需要注意用户名、密码大小写
     复制槽输入在主库创建的复制槽名称:slot_node2
  4. 执行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信息。

  5. 进入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'
  6. 编辑备库连接字符串

    修改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文件中,不指定用户的口令。
  7. 启动备库数据库服务

     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
  8. 查看备库数据库进程

    主库

     [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
  9. 验证主备流复制

    主库执行

    查看复制槽状态

     兼容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)
  10. 测试数据同步

    主库

    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)
  11. 查看主备流复制同步模式

    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

主备切换测试:

  1. 停止主库:

     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
  2. 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. 复制槽              新主库需要手动创建复制槽,老主库需手动删除复制槽。