使用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。

相关推荐
一个天蝎座 白勺 程序猿11 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
分布式存储与RustFS15 小时前
镜像仓库的层别堆本地盘:用 RustFS 给 Docker Registry 当 S3 后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
陈希12316 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
@兽血沸腾17 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
闲云自留地1 天前
K8s 的记忆大脑!ETCD 集群部署、etcdctl 命令与备份恢复全通关
容器·kubernetes·etcd
讯捷蓝达1 天前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
爱和冰阔落1 天前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng1 天前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮1 天前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹1 天前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器