使用 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
修改配置
- 编辑 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。