Docker 搭建KingbaseES主备流复制

本章背景知识

大体步骤参考:[[流复制–V8R6手工搭建]]
docker安装集群 - 技术干货 - 金仓社区 (kingbase.com.cn)
本章使用三节点容器搭建主备流复制集群。

一、容器节点IP规划

IP地址说明
192.168.20.111节点一主机IP(主节点容器)
192.168.20.112节点二主机IP(备节点容器)
192.168.20.113节点三主机IP(备节点容器)

二、容器节点信息规划

部分说明
IP: 端口192.168.20.111:54321,192.168.20.112:54322,192.168.20.113:54323。
容器主机名c_node1,c_node2,c_node3。
容器名称kcm_kingbase01,kcm_kingbase02,kcm_kingbase03。

三、复制槽(replication slot)的作用

为了解决因为备节点宕机后,避免恢复时需要的WAL日志被主节点删除的问题,从V8R3开始“复制槽”取代 “wal_keep_segments”参数。
1、每个复制槽对应一个连接主节点的备节点。
2、如果某备节点宕机,该复制槽对应的wal segments不会被删除。
3、复制槽即使在备节点断开时仍然会记录下备节点的xmin值(复制槽需要主节点保留的最旧事务ID),从而确保主节点不会有清理备节点所依赖的wal segments。

四、手工搭建R6流复制的主要步骤

序号主节点容器备节点容器
1创建流复制所需的容器。创建流复制所需的容器。
2主节点需要创建数据库集簇。备节点不需要创建数据库集簇。
3主节点启用或禁用归档模式,不影响本章节的实验效果。备节点启用或禁用归档模式。不影响本章节实验效果。
5配置sys_hba.conf 支持replication。配置物理复制槽。N/A
6N/A通过sys_basebackup为备节点创建数据库集簇。
7主节点做事务操作。备节点验证数据是否能同步。

LAB01-导入流复制所需的镜像

一、下载网盘中 kignbase.v8r6c5b23.tar 的镜像

1、镜像已经包含kingbase数据库,版本为:kingbaseV8r6c5b23 。

ll kingbase.v8r6c5b23.tar

二、将镜像导入 Docker 服务器中

$ docker load -i kignbase.v8r6c5b23.tar

三、查看是否导入成功

$ docker images
REPOSITORY    TAG        IMAGE ID       CREATED         SIZE
kesimg86523   latest     64f5d3730270   24 hours ago    2.6GB

LAB02-创建流复制所需的网络

一、查看当前网络

docker network ls

二、创建 Docker 容器网络

$ docker network create --subnet=192.168.20.0/24 kcmnet

编者注:由于 Docker 自带的网络接口(docker0)不允许容器指定静态 IP 地址,所以需要新建私有网络。

三、查看当前网络

docker network ls

LAB03-创建流复制所需的容器

如果需要清空环境则需要执行以下命令。
```bash
docker rm -f `docker ps -aq`
```
此命令非常危险请只在测试环境上操作。

一、创建流复制所需的容器

1、创建 kcm_kingbase01 容器。

$ docker run -itd --privileged -h c_node1 --name kcm_kingbase01 --net kcmnet --ip 192.168.20.111  -p 54321:54321   --restart=on-failure:3  kesimg86523:latest /usr/sbin/init

2、创建 kcm_kingbase02 容器。

$ docker run -itd  --privileged -h c_node2 --name kcm_kingbase02  --net kcmnet --ip 192.168.20.112  -p 54322:54321   --restart=on-failure:3  kesimg86523:latest /usr/sbin/init

3、创建 kcm_kingbase03 容器。

$ docker run -itd  --privileged -h c_node3 --name kcm_kingbase03 --net kcmnet  --ip 192.168.20.113  -p 54323:54321   --restart=on-failure:3  kesimg86523:latest /usr/sbin/init

二、命令说明

选项说明
-it使用 tty 伪终端,并进入交互式模式。
-d使用守护进程运行容器。
-h容器主机名。
–restart-=on-faulure: 3当容器故障退出,重启 3 次,3 次之后不会再重启。
–net kcmnet指定流复制私有网络环境。

LAB04-备节点容器数据目录清空

一、 清空 kcm_kingbase02 容器内的数据目录

docker$ docker exec -u kingbase -it kcm_kingbase02 /bin/bash
<contanier>$ sys_ctl stop 
<contanier>$ rm -rf /home/kingbase/data/*
<contanier>$ rm -rf /home/kingbase/data/.wallet
<contanier>$ exit

编者注:隐藏文件需要指定具体名称。

二、清空 kcm_kingbase03 容器内的数据目录

docker$ docker exec -u kingbase -it kcm_kingbase03 /bin/bash
<contanier>$ sys_ctl stop 
<contanier>$ rm -rf /home/kingbase/data/*
<contanier>$ rm -rf /home/kingbase/data/.wallet
<contanier>$ exit

LAB05-容器主机名DNS解析

一、容器配置 /etc/hosts 文件

1、c_node1。

$ docker exec -u root -it kcm_kingbase01 vi /etc/hosts

------------------写入以下内容------------------
192.168.20.111 c_node1
192.168.20.112 c_node2
192.168.20.113 c_node3

2、c_node2。

$ docker exec -u root -it kcm_kingbase02 vi /etc/hosts
------------------写入以下内容------------------
192.168.20.111 c_node1
192.168.20.112 c_node2
192.168.20.113 c_node3

3、c_node3。

$ docker exec -u root -it kcm_kingbase03 vi /etc/hosts
------------------写入以下内容------------------
192.168.20.111 c_node1
192.168.20.112 c_node2
192.168.20.113 c_node3

二、验证DNS解析

1、node1。

$ docker exec -u root -it kcm_kingbase01 ping -c 4 c_node1
$ docker exec -u root -it kcm_kingbase01 ping -c 4 c_node2
$ docker exec -u root -it kcm_kingbase01 ping -c 4 c_node3

2、node2。

$ docker exec -u root -it kcm_kingbase02 ping -c 4 c_node1
$ docker exec -u root -it kcm_kingbase02 ping -c 4 c_node2
$ docker exec -u root -it kcm_kingbase02 ping -c 4 c_node3

3、node3。

$ docker exec -u root -it kcm_kingbase03 ping -c 4 c_node1
$ docker exec -u root -it kcm_kingbase03 ping -c 4 c_node2
$ docker exec -u root -it kcm_kingbase03 ping -c 4 c_node3

LAB06-配置 kcm_kingbase01 主节点容器

一、配置归档及流复制参数

1、进入 kcm_kingbase01 容器。

$ docker exec -u kingbase -it kcm_kingbase01 /bin/bash

2、配置流复制参数。

<contanier>$ cat >> $KINGBASE_DATA/kingbase.conf <<EOF
wal_log_hints=on
wal_level = replica             # minimal, replica, or logical
max_wal_senders = 10            # max number of walsender processes
max_replication_slots = 10
wal_keep_segments = 1024	# in logfile segments, 16MB each; 0 disables 
hot_standby = on
synchronous_commit = on
synchronous_standby_names = '1(c_node1,c_node2,c_node3)'
hot_standby_feedback=on
fsync=on
EOF
<contanier>$ echo ''

二、配置主节点容器 sys_hba. conf 支持 replication

<contanier>$ cat >> $KINGBASE_DATA/sys_hba.conf <<EOF
host replication system 127.0.0.1/32 md5
host replication system 0.0.0.0/0 md5
EOF
echo ''
<contanier>$ grep -Ev "^$|#" $KINGBASE_DATA/sys_hba.conf

三、重启主节点容器上的数据服务

<contanier>$ sys_ctl restart -D $KINGBASE_DATA

四、主节点容器上创建 replication 复制槽

1、查看当前复制槽。

$ docker exec -u kingbase -it kcm_kingbase01 /bin/bash
<contanier>$  ksql  -U system -d test
test=# \x 
test=#  SELECT * FROM sys_replication_slots;

2、创建复制槽 slot_node2

<contanier>$  ksql  -U system -d test
test# SELECT * FROM sys_create_physical_replication_slot('slot_node2');

3、创建复制槽 slot_node3

test# SELECT * FROM sys_create_physical_replication_slot('slot_node3');

4、查看当前复制槽

test# SELECT slot_name, slot_type, active FROM sys_replication_slots;

LAB07-配置 kcm_kingbase02 备节点容器

一、sys_basebackup全量传输

1、进入 kcm_kingbase02 备节点。

$ docker exec -u kingbase -it kcm_kingbase02 /bin/bash

2、全量传输数据。

<contanier>$ sys_basebackup -h c_node1 -p 54321 -U system -Fp -X stream -v -P -D $KINGBASE_DATA

3、验证数据目录大小。

<contanier>$ ls -lh $KINGBASE_DATA
<contanier>$ du -sh $KINGBASE_DATA

二、配置 kingbase. conf

<contanier>$ cat >> $KINGBASE_DATA/kingbase.conf << EOF 
primary_conninfo='port=54321 host=c_node1 user=system password=kingbase application_name=c_node2' 
recovery_target_timeline='latest' 
primary_slot_name ='slot_node2'
EOF
<contanier>$ touch $KINGBASE_DATA/standby.signal

三、启动备节点数据库并开启流复制

1、启动数据库。

<contanier>$ sys_ctl start -D $KINGBASE_DATA

2、查看日志。

<contanier>$ tail -f $KINGBASE_DATA/sys_log/kingbase*.log

LAB08-配置 kcm_kingbase03 备节点容器

一、sys_basebackup 全量传输

1、进入kcm_kingbase03备节点。

$ docker exec -u kingbase -it kcm_kingbase03 /bin/bash

2、全量传输数据。

<contanier>$ sys_basebackup -h c_node1 -p 54321 -U system -Fp -X stream -v -P -D $KINGBASE_DATA

3、验证数据目录大小。

<contanier>$ ls -lh $KINGBASE_DATA
<contanier>$ du -sh $KINGBASE_DATA

二、配置 kingbase.conf

<contanier>$ cat >> $KINGBASE_DATA/kingbase.conf << EOF 
primary_conninfo='port=54321 host=c_node1 user=system password=kingbase application_name=c_node3' 
recovery_target_timeline='latest' 
primary_slot_name ='slot_node3'
EOF
<contanier>$  touch $KINGBASE_DATA/standby.signal

三、启动备节点数据库并开启流复制

1、启动数据库。

<contanier>$ sys_ctl start -D $KINGBASE_DATA

2、查看日志。

<contanier>$ tail -f $KINGBASE_DATA/sys_log/kingbase*.log

LAB09- 验证流复制环境

一、在主节点查看流复制状态

1、进入 kcm_kingbase01 主节点。

$ docker exec -u kingbase -it kcm_kingbase01 /bin/bash

2、查看 replication进程 (主节点上可以看到正在向从节点发送数据流。

<contanier>$  ps -ef|grep -v grep|grep -E 'sender|receiver'

3、查看流复制状态。

<contanier>$ ksql -U system -d test 
test=# SELECT * FROM sys_stat_replication;

4、查看复制槽信息。

<contanier>$  SELECT * FROM sys_replication_slots;

二、在主节点创建测试数据

1、进入 kcm_kingbase01 容器。

$ docker exec -u kingbase -it kcm_kingbase01 /bin/bash

2、生成测试数据。

<contanier>$ ksql -U system -d test 
test=#  CREATE database prod01; 
test=# \c prod01 system
test=# CREATE table t01 (id int ,name text);
test=# INSERT INTO t01 SELECT generate_series(1,1000),md5(random());
test=# SELECT * FROM t01 limit 2;

三、查看备节点容器数据 (kcm_kingbase02)

1、进入 kcm_kingbase02 容器。

$ docker exec -u kingbase -it kcm_kingbase02 /bin/bash

2、查看数据。

<contanier>$ ksql -U system -d test 
test=# \c prod01 system
test=# SELECT * FROM t01 limit 2;

四、查看备节点容器数据 (kcm_kingbase03)

1、进入 kcm_kingbase03 容器。

$ docker exec -u kingbase -it kcm_kingbase03 /bin/bash

2、查看数据。

<contanier>$ ksql -U system -d test 
test=# \c prod01 system
test=# SELECT * FROM t01 limit 2;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值