提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

起因是docker上部署了一个kingbase的库,但是在运维某次重启后,再也启动不起来了。这是个新项目,才建了没几张表,于是决定自己部署一个库,顺带加一个主从库来避免下次发生类似的情况措手不及

背景

1 宿主机是 Ubuntu 24.04.2,当前数据库服务器是个内网机器
2 两个数据库分别在两个docker容器中
3 两个docker在同一台宿主机


一、准备两个部署好金仓数据库的docker

在这里插入图片描述
两个docker容器,分别安装了各自的金仓数据库

二、连上同一个network

1 创建一个Network

portainer.io在界面上就可以快捷创建,就在左侧目录树Networks中
如果是初学看着这么多参数参数不知道怎么填的话,可以用命令行简单创建一个

docker network create kingbase-net

我这里建立的network叫kingbase-net,因为已经创建好了,为了截图创建了my_app_network。想了一下改成全改成我用的名字吧,方便下次使用copy。

2 完事以后在portainer.io分别找到主从docker,点进去,选择一下network

在这里插入图片描述

3 选择完点join network,下面列表就会加入该network

在这里插入图片描述

三、配置主库 (master)

1 .​​进入主库容器​

记得改docker名字,这里kingdb-gn-master是我的主库docer的名字

docker exec -it kingdb-gn-master bash

在这里插入图片描述

2、​​修改主库配置文件

​​找到文件kingbase.conf​​,这个文件在docker持久化的文件夹下。

下图为docker持久化位置,根据主库所在docker设置找到该路径下data文件夹,其中包含此文件
docker持久化位置
下图为文件位置
在这里插入图片描述
确保kingbase.conf​​文件包含以下关键参数(我装这个版本这些默认都有,所以没配置过,当前版本包名kingbase_v009r001c001b0030_single_x86_v1.tar)

wal_level = replica
max_wal_senders = 10
max_replication_slots = 10
archive_mode = on
archive_command = 'test ! -f /home/kingbase/userdata/data/archive/%f && cp %p /home/kingbase/userdata/data/archive/%f'
hot_standby = on

3、编辑 sys_hba.conf​​:

在文件末尾添加一行,允许从库网络段进行流复制:
此文件在上一张图已经标注出来

host replication all 172.19.0.0/16 trust

在这里插入图片描述

如果这个ip不知道填什么,就去docker选择的network看一眼,主从用的同一个network,看哪个都一样
在这里插入图片描述

其中ip是容器ip,前缀 /16​​定义了​​子网掩码​​,表示网络部分的位数。 。打个比方,比如我现在选择的network:172.19.0.2, /16意味着该规则覆盖了 172.19.0.1到 172.19.255.254的所有IP。

4 ​​创建归档目录​

mkdir -p /home/kingbase/userdata/data/archive

这里要注意,我当时创建docker,容器地址,即docker中数据是放在/home/kingbase/userdata/这个目录下的,看一下自己docker内软件数据路径是啥,目前不确定不同版本安装路径是否相同

docker创建前长这样
在这里插入图片描述
创建完成的可以直接查看该docker配置,找到容器内数据地址
在这里插入图片描述

5 重启主库服务​​ 使配置生效

跟上边已有用自己的容器文件夹

sys_ctl -D /home/kingbase/userdata/data restart

6 ​​创建复制用户

连接至 CHNEnergy_dev数据库:

ksql -U system -d your-dbName

2 创建专用于复制的用户:

CREATE USER repl_user WITH REPLICATION LOGIN PASSWORD 'your_password';

7、创建一个物理复制槽:

这个名字没改的必要,可以直接复制

SELECT sys_create_physical_replication_slot('slot_slave');--如果这句报错用下面这句
SELECT * FROM pg_create_physical_replication_slot('slot_slave');--我数据库适配模式改为pg后发现这句才能用

8 退出 ksql:

\q

四、 配置从库 (kingdb-gn-slave)

1、 进入从库容器​

docker exec -it kingdb-gn-slave bash

2、清空从库数据目录​​(​​重要:此操作会删除现有数据​​)

**

注意!!!

这里操作建议不要用正在运行的库,会直接删库

另外,这个路径是docker内路径,记不清回去看序号三的步骤4。

rm -rf /home/kingbase/userdata/data/*

3 从主库克隆基础数据​

使用 sys_basebackup工具从主库拉取完整的数据副本

sys_basebackup -h kingdb-gn-master -p 54321 -U repl_user -D /home/kingbase/userdata/data -Fp -Xs -P -R -S slot_slave

这里参数根据需要修改即可

参数解释​​:
-h kingdb-gn-master:主库的容器名(在 kingbase-net网络内可解析)。
-U repl_user:在主库创建的复制用户。
-D:从库的数据目录路径。
-R:自动生成 standby.signal文件并写入连接信息,这是关键一步。
-S slot_slave:指定使用在主库创建的复制槽。

昨天聚餐没来及写,我这里是出错了来着,没报错跳过看4。

原因是有隐藏文件夹没被删掉。这里是在Ubuntu中执行的,昨天截图没了,还有个记录文档,总知报错就是说data文件夹下不为空。

在这里插入图片描述
那就导航到该文件夹下,看看

cd /home/kingbase/userdata/data
ls -la

结果当时有个.xxx记不清叫啥了,反正(.)开头,不管是文件夹还是文件吧,全干掉

rm -rf ./* .[^.]* ..?*

完事再看一下,空了就再执行一次本步骤开头那句复制主库的命令行。(执行当时没截图,但是上边有个100%我记得,不确定就连一下从库,数据表全部复制过来了)

4、启动从库服务​

sys_ctl -D /home/kingbase/userdata/data start

五 验证主从复制状态

1、​​在主库检查复制状态​

进入主库的 ksql(连接你的目标数据库),执行以下查询:

-- 查看复制槽状态
SELECT * FROM sys_replication_slots;
-- 查看流复制连接状态
SELECT * FROM sys_stat_replication;

截图是直接在数据库界面工具中跑的,效果如下
在这里插入图片描述
在这里插入图片描述

插入数据验证

这个时候可以去主库随便选张表,插入一条数据,发现从库也有了。大功告成

总结

纯纯知道后边还要用,所以记录一下方便自己后边copy。至于其他数据库行不行,没试,不好说

更多推荐