使用docker搭建集群-使用 Docker 搭建 KingbaseES 集群

使用 Docker 搭建 KingbaseES 集群

核心思路是先拉取官方镜像启动主库,再通过流复制挂载备库,让它们通过 WAL 日志实时同步。下面以流复制集群为例,带你一步步操作。

第1步:拉取镜像

从 电科金仓官网 下载 Docker 镜像(.tar 文件),导入本地镜像库 :

bash 复制代码
docker load -i kdb_x86_64_V009R001C002B0014.tar
docker images | grep kingbase

启动主库(Master)

创建持久化目录并启动容器 :

bash 复制代码
mkdir -p /home/kingbase/db/docker/data

docker run -tid --privileged \
  -p 54321:54321 \
  -v /home/kingbase/db/docker/data:/home/kingbase/userdata \
  -e NEED_START=yes \
  -e DB_USER=kingbase \
  -e DB_PASSWORD=123456 \
  -e DB_MODE=oracle \
  --name kingbase_master \
  kingbase_v009r001c002b0014_single_x86:v1 /usr/sbin/init

查看网络配置:

bash 复制代码
cat /etc/hosts

修改配置

  1. 编辑 kingbase.conf
bash 复制代码
vi kingbase.conf

找到以下参数并修改(用 / 搜索,比如 /listen_addresses 回车):

text 复制代码
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 128MB
hot_standby = on

如果某行前面有 #,去掉 # 取消注释。

保存退出:按 ESC,输入 :wq,回车。

2. 编辑 sys_hba.conf

复制代码
bash
vi sys_hba.conf
在文件末尾添加一行:
text 复制代码
host    replication     all     172.17.0.0/16     md5

保存退出:按 ESC,输入 :wq,回车。

重启主库:

bash 复制代码
sys_ctl -D /home/kingbase/userdata/data restart

🚀 继续下一步:启动备库容器(新窗口)

打开一个新的 CMD 窗口(保留当前窗口),执行:

bash 复制代码
## 创建备库数据目录
mkdir c:\docker\kingbase_standby_data

启动备库容器

复制代码
docker run -tid --privileged ^
  -p 54322:54321 ^
  -v c:\docker\kingbase_standby_data:/home/kingbase/userdata ^
  -e NEED_START=no ^
  -e DB_USER=kingbase ^
  -e DB_PASSWORD=123456 ^
  -e DB_MODE=oracle ^
  --name kingbase_standby ^
  kingbase_v009r001c010b0004_single_x86:v1

📋 验证备库容器已启动

bash 复制代码
docker ps | findstr kingbase_standby

进入备库容器

bash 复制代码
docker exec -it kingbase_standby 

清空备库数据目录

bash 复制代码
rm -rf /home/kingbase/userdata/*
ls /home/kingbase/userdata/

📥 从主库拉取数据

bash 复制代码
sys_basebackup -h 172.17.0.2 -p 54321 -U kingbase -D /home/kingbase/userdata -Fp -Xs -P -R

如果提示密码,输入 123456。

🚀 启动备库

bash 复制代码
sys_ctl -D /home/kingbase/userdata start

✅ 验证备库状态

bash 复制代码
sys_ctl -D /home/kingbase/userdata status

[kingbase@0fe2fccb74e9 ~]$ sys_ctl -D /home/kingbase/userdata start
waiting for server to start....2026-07-26 11:34:08.645 UTC [158] LOG:  config the real archive_command string as soon as possible to archive WAL files
2026-07-26 11:34:08.688 UTC [158] LOG:  sepapower extension initialized
2026-07-26 11:34:08.748 UTC [158] LOG:  starting KingbaseES V009R001C010
2026-07-26 11:34:08.752 UTC [158] LOG:  listening on IPv4 address "0.0.0.0", port 54321
2026-07-26 11:34:08.753 UTC [158] LOG:  listening on IPv6 address "::", port 54321
2026-07-26 11:34:08.790 UTC [158] LOG:  listening on Unix socket "/tmp/.s.KINGBASE.54321"
2026-07-26 11:34:09.226 UTC [158] LOG:  redirecting log output to logging collector process
2026-07-26 11:34:09.226 UTC [158] HINT:  Future log output will appear in directory "sys_log".
................ done
server started
[kingbase@0fe2fccb74e9 ~]$ sys_ctl -D /home/kingbase/userdata status
sys_ctl: server is running (PID: 158)
/home/kingbase/install/kingbase/bin/kingbase "-D" "/home/kingbase/userdata"

验证集群

1️⃣ 在主库查看复制状态

回到主库容器(或新窗口):

bash 复制代码
docker exec -it kingbase bash
su - kingbase
ksql -U kingbase -d test
执行:

```sql
SELECT client_addr, state, sync_state, application_name 
FROM sys_stat_replication;

test=# SELECT client_addr, state, sync_state, application_name
test-# FROM sys_stat_replication;
 client_addr |   state   | sync_state | application_name
-------------+-----------+------------+------------------
 172.17.0.3  | streaming | async      | internal_backup
(1 row)

在备库验证只读模式

打开新窗口:

bash 复制代码
docker exec -it kingbase_standby bash
su - kingbase
ksql -U kingbase -d test
执行:

```sql
SELECT pg_is_in_recovery();

如果返回 t,说明是备库(只读)。

再执行:

sql 复制代码
SELECT COUNT(*) FROM users;

应该能查到数据。

复制代码
[kingbase@0fe2fccb74e9 ~]$ ksql -U kingbase -d test
License Type: 企业版.
Type "help" for help.

test=# SELECT pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 t
(1 row)

test=# SELECT COUNT(*) FROM users;
  count
---------
 1000100
(1 row)

test=#

查看主库复制状态

复制代码
docker exec -it kingbase ksql -U kingbase -d test -c "SELECT * FROM sys_stat_replication;"

查看备库状态

复制代码
docker exec -it kingbase_standby ksql -U kingbase -d test -c "SELECT pg_is_in_recovery();"

查看备库日志

复制代码
docker logs kingbase_standby

停止备库

复制代码
docker stop kingbase_standby

启动备库

复制代码
docker start kingbase_standby

进入主库

复制代码
docker exec -it kingbase bash

进入备库

复制代码
docker exec -it kingbase_standby bash

当前为异步复制:主库宕机可能丢失少量数据。生产环境可配置同步复制。

备库只读:不能执行写操作(INSERT/UPDATE/DELETE)。

数据持久化:数据存储在 c:\docker\kingbase_data 和 c:\docker\kingbase_standby_data。

端口映射:主库 54321,备库 54322。

相关推荐
zhougl9961 小时前
Gateway 和 Nginx 路由区别
运维·nginx·gateway
余—笙2 小时前
Docker安装rabbitmq并安装延迟队列插件
docker·容器·rabbitmq
听风3473 小时前
Arch Linux 软件安装完全指南
linux·运维·archlinux·pacman
沉迷学习 日益消瘦3 小时前
10-Gateway API
运维·kubernetes·gateway
智购科技智能售货柜4 小时前
无人售货机连不上服务器?MQTT 频繁掉线排查全流程~YH
运维·服务器
心念枕惊4 小时前
Docker--Docker Swarm集群
运维·docker·容器
難釋懷4 小时前
Nginx-proxy缓存断点续传缓存 range
运维·nginx·缓存
井川廊咏4 小时前
【总集篇】Linux | 如何创建一个 home 目录在 /data 磁盘的 sudo 用户(补档)
linux·运维·服务器
敖行客 Allthinker4 小时前
docker容器安装Python反推镜像步骤(适用于临时调试用)
python·docker·容器