kingbase教程FG193-金仓数据库容器化高可用部署
内容简介:本文档详细介绍金仓数据库容器化高可用部署的方法和实战案例,包括容器化技术、高可用架构、部署步骤等。风哥教程参考kingbase官方文档kingbase8系统管理员手册、kingbase8高可用指南等。
Part01-基础概念与理论知识
1.1 容器化技术概述
容器化技术是一种轻量级的虚拟化技术,通过容器来隔离应用和其依赖环境,实现应用的快速部署、扩展和管理。主要容器技术包括:
- Docker:最流行的容器化平台,提供容器的创建、运行和管理功能
- Podman:一个无守护进程的容器运行时,与Docker兼容
- containerd:一个行业标准的容器运行时
1.2 高可用架构概述
高可用架构是指系统在面对各种故障时仍能保持正常运行的能力。金仓数据库的高可用架构主要包括:
- MGR(Managed Replication)集群:金仓数据库的原生高可用解决方案
- 主从复制:基于WAL日志的异步或同步复制
- 级联复制:通过级联方式扩展复制拓扑
- 异地灾备:在不同地理位置部署备份节点,学习交流加群风哥微信: itpux-com
1.3 容器化高可用部署优势
容器化高可用部署的优势包括:
- 快速部署:容器镜像可以快速部署到任何环境
- 一致性:容器确保应用在不同环境中运行一致
- 资源隔离:容器之间相互隔离,避免资源竞争
- 易于扩展:可以快速扩展容器实例数量
- 高可用:通过容器编排工具实现自动故障转移
- 易于管理:使用容器编排工具统一管理容器
Part02-生产环境规划与建议
2.1 容器化架构设计
容器化架构设计:
- 单节点容器化:将金仓数据库部署在单个容器中,适用于开发和测试环境
- 多节点容器化:将金仓数据库部署在多个容器中,实现高可用,学习交流加群风哥QQ113257174
- 容器编排:使用Kubernetes等容器编排工具管理容器
2.2 高可用策略选择
高可用策略选择:
- MGR集群:使用金仓数据库的MGR集群实现高可用
- 主从复制:使用主从复制实现高可用
- 读写分离:结合主从复制实现读写分离,提高性能
2.3 资源规划
资源规划:
- CPU:根据数据库负载分配足够的CPU资源
- 内存:根据数据库大小和并发连接数分配足够的内存
- 存储:使用高性能存储,如SSD
- 网络:确保网络带宽足够,延迟低,更多视频教程www.fgedu.net.cn
Part03-生产环境项目实施方案
3.1 容器化部署步骤
容器化部署步骤:
- 准备Docker环境:安装Docker和Docker Compose
- 创建Docker镜像:基于金仓数据库官方镜像或自定义镜像
- 配置容器:设置环境变量、挂载卷等
- 启动容器:运行容器并验证部署
3.2 高可用配置
高可用配置:
- 配置主从复制:设置主库和从库的复制关系
- 配置MGR集群:设置MGR集群的节点和参数
- 配置负载均衡:使用负载均衡器分发请求
- 配置监控:监控集群状态和性能,更多学习教程公众号风哥教程itpux_com
3.3 监控与维护
监控与维护:
- 监控容器状态:使用Docker或Kubernetes的监控工具
- 监控数据库状态:使用金仓数据库的监控工具
- 备份与恢复:定期备份数据库并测试恢复
- 更新与升级:定期更新容器镜像和数据库版本
Part04-生产案例与实战讲解
4.1 Docker容器化部署
Docker容器化部署:
# Docker容器化部署
# 步骤1:安装Docker
$ yum install -y docker
$ systemctl start docker
$ systemctl enable docker
# 步骤2:拉取金仓数据库镜像
$ docker pull kingbase/kingbasees:v8r6
# 步骤3:创建数据卷
$ docker volume create kingbase_data
# 步骤4:启动容器
$ docker run -d \
–name kingbase \
-p 54321:54321 \
-v kingbase_data:/kingbase/data \
-e KINGBASE_USER=fgedu \
-e KINGBASE_PASSWORD=fgedu123 \
-e KINGBASE_DATABASE=fgedudb \
kingbase/kingbasees:v8r6
# 步骤5:验证部署
$ docker ps
# 输出日志
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1234567890ab kingbase/kingbasees:v8r6 “/bin/sh -c ‘kingbase…” 5 minutes ago Up 5 minutes 0.0.0.0:54321->54321/tcp kingbase
# 步骤6:连接数据库
$ psql -h fgedu.localhost -p 54321 -U fgedu -d fgedudb
# 输出日志
psql (12.3)
Type “help” for help.
fgedudb=> SELECT version();
# 输出日志
version
——————————————————————————————————————————
KingbaseES V8.6.0 Build 41144 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)
4.2 Docker Compose高可用部署
Docker Compose高可用部署:
# Docker Compose高可用部署
# 步骤1:创建docker-compose.yml文件
$ vi docker-compose.yml
version: ‘3.8’
services:
kingbase-primary:
image: kingbase/kingbasees:v8r6
container_name: kingbase-primary
ports:
– “54321:54321”
volumes:
– primary_data:/kingbase/data
environment:
– KINGBASE_USER=fgedu
– KINGBASE_PASSWORD=fgedu123
– KINGBASE_DATABASE=fgedudb
– KINGBASE_REPLICATION_MODE=primary
– KINGBASE_REPLICATION_USER=repl
– KINGBASE_REPLICATION_PASSWORD=repl123
networks:
– kingbase-network
kingbase-replica1:
image: kingbase/kingbasees:v8r6
container_name: kingbase-replica1
ports:
– “54322:54321”
volumes:
– replica1_data:/kingbase/data
environment:
– KINGBASE_USER=fgedu
– KINGBASE_PASSWORD=fgedu123
– KINGBASE_DATABASE=fgedudb
– KINGBASE_REPLICATION_MODE=replica
– KINGBASE_PRIMARY_HOST=kingbase-primary
– KINGBASE_PRIMARY_PORT=54321
– KINGBASE_REPLICATION_USER=repl
– KINGBASE_REPLICATION_PASSWORD=repl123
networks:
– kingbase-network
depends_on:
– kingbase-primary
kingbase-replica2:
image: kingbase/kingbasees:v8r6
container_name: kingbase-replica2
ports:
– “54323:54321”
volumes:
– replica2_data:/kingbase/data
environment:
– KINGBASE_USER=fgedu
– KINGBASE_PASSWORD=fgedu123
– KINGBASE_DATABASE=fgedudb
– KINGBASE_REPLICATION_MODE=replica
– KINGBASE_PRIMARY_HOST=kingbase-primary
– KINGBASE_PRIMARY_PORT=54321
– KINGBASE_REPLICATION_USER=repl
– KINGBASE_REPLICATION_PASSWORD=repl123
networks:
– kingbase-network
depends_on:
– kingbase-primary
haproxy:
image: haproxy:2.4
container_name: haproxy
ports:
– “54320:54320”
– “8080:8080”
volumes:
– ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
networks:
– kingbase-network
depends_on:
– kingbase-primary
– kingbase-replica1
– kingbase-replica2
volumes:
primary_data:
replica1_data:
replica2_data:
networks:
kingbase-network:
driver: bridge
# 步骤2:创建haproxy.cfg文件
$ vi haproxy.cfg
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend kingbase
bind *:54320
default_backend kingbase_servers
backend kingbase_servers
balance roundrobin
server kingbase-primary kingbase-primary:54321 check
server kingbase-replica1 kingbase-replica1:54321 check
server kingbase-replica2 kingbase-replica2:54321 check
frontend stats
bind *:8080
stats enable
stats uri /stats
stats refresh 10s
# 步骤3:启动服务
$ docker-compose up -d
# 步骤4:验证部署
$ docker-compose ps
# 输出日志
Name Command State Ports
———————————————————————————————
haproxy /docker-entrypoint.sh hapr … Up 0.0.0.0:8080->8080/tcp, 0.0.0.0:54320->54320/tcp
kingbase-primary /bin/sh -c ‘kingbase …’ Up 0.0.0.0:54321->54321/tcp
kingbase-replica1 /bin/sh -c ‘kingbase …’ Up 0.0.0.0:54322->54321/tcp
kingbase-replica2 /bin/sh -c ‘kingbase …’ Up 0.0.0.0:54323->54321/tcp
# 步骤5:连接数据库
$ psql -h fgedu.localhost -p 54320 -U fgedu -d fgedudb
# 输出日志
psql (12.3)
Type “help” for help.
fgedudb=> SELECT version();
# 输出日志
version
——————————————————————————————————————————
KingbaseES V8.6.0 Build 41144 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)
4.3 容器化高可用测试
容器化高可用测试:
# 容器化高可用测试
# 步骤1:测试主库写入
$ psql -h fgedu.localhost -p 54320 -U fgedu -d fgedudb -c “INSERT INTO fgedu_test (id, name) VALUES (1, ‘fgedudb’);”
# 步骤2:测试从库读取
$ psql -h fgedu.localhost -p 54322 -U fgedu -d fgedudb -c “SELECT * FROM fgedu_test;”
# 输出日志
id | name
—-+——
1 | fgedudb
# 步骤3:模拟主库故障
$ docker stop kingbase-primary
# 步骤4:测试故障转移
$ psql -h fgedu.localhost -p 54320 -U fgedu -d fgedudb -c “INSERT INTO fgedu_test (id, name) VALUES (2, ‘fgedu2’);”
# 步骤5:检查数据一致性
$ psql -h fgedu.localhost -p 54323 -U fgedu -d fgedudb -c “SELECT * FROM fgedu_test;”
# 输出日志
id | name
—-+——-
1 | fgedudb
2 | fgedu2
# 步骤6:恢复主库
$ docker start kingbase-primary
# 步骤7:验证主库重新加入集群
$ docker logs kingbase-primary
# 输出日志
…
2026-04-09 10:00:00.000 CST [1] LOG: database system is ready to accept connections
…
4.4 生产环境容器化部署最佳实践
生产环境容器化部署最佳实践:,from DB视频:www.itpux.com
# 生产环境容器化部署最佳实践
# 步骤1:使用自定义镜像
$ vi Dockerfile
FROM kingbase/kingbasees:v8r6
# 安装依赖
RUN yum install -y epel-release && yum install -y cronie
# 添加配置文件
COPY postgresql.conf /kingbase/app/etc/postgresql.conf
COPY pg_hba.conf /kingbase/app/etc/pg_hba.conf
# 添加初始化脚本
COPY init.sh /root/init.sh
RUN chmod +x /root/init.sh
# 暴露端口
EXPOSE 54321
# 启动命令
CMD [“/root/init.sh”]
# 步骤2:构建镜像
$ docker build -t kingbase/kingbasees-custom:v8r6 .
# 步骤3:使用持久化存储
$ docker run -d \
–name kingbase \
-p 54321:54321 \
-v /data/kingbase:/kingbase/data \
-e KINGBASE_USER=fgedu \
-e KINGBASE_PASSWORD=fgedu123 \
-e KINGBASE_DATABASE=fgedudb \
kingbase/kingbasees-custom:v8r6
# 步骤4:配置监控
$ docker run -d \
–name prometheus \
-p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
$ docker run -d \
–name grafana \
-p 3000:3000 \
grafana/grafana
# 步骤5:配置备份
$ vi backup.sh
#!/bin/bash
# backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 备份目录
BACKUP_DIR=”/backup”
# 创建备份目录
mkdir -p ${BACKUP_DIR}
# 执行备份
docker exec kingbase /kingbase/app/bin/ksql -U fgedu -d fgedudb -c “SELECT pg_start_backup(‘full_backup’);”
docker cp kingbase:/kingbase/data ${BACKUP_DIR}/kingbase_data_$(date +%Y%m%d%H%M%S)
docker exec kingbase /kingbase/app/bin/ksql -U fgedu -d fgedudb -c “SELECT pg_stop_backup();”
# 清理过期备份
find ${BACKUP_DIR} -name “kingbase_data_*” -mtime +7 -delete
$ chmod +x backup.sh
$ crontab -e
# 添加定时任务,每天凌晨1点执行备份
0 1 * * * /path/to/backup.sh
# 步骤6:配置日志管理
$ docker run -d \
–name fluentd \
-p 24224:24224 \
-v /path/to/fluentd.conf:/fluentd/etc/fluentd.conf \
fluent/fluentd
# 步骤7:定期更新镜像
$ docker pull kingbase/kingbasees:v8r6
$ docker stop kingbase
$ docker rm kingbase
$ docker run -d \
–name kingbase \
-p 54321:54321 \
-v /data/kingbase:/kingbase/data \
-e KINGBASE_USER=fgedu \
-e KINGBASE_PASSWORD=fgedu123 \
-e KINGBASE_DATABASE=fgedudb \
kingbase/kingbasees:v8r6
Part05-风哥经验总结与分享
5.1 容器化高可用部署常见问题与解决方案
容器化高可用部署常见问题与解决方案:
- 数据持久化问题:使用Docker卷或绑定挂载确保数据持久化
- 网络问题:配置容器网络,确保容器之间可以通信
- 资源限制问题:设置容器的资源限制,避免资源竞争
- 高可用配置问题:正确配置主从复制或MGR集群
- 监控问题:配置合适的监控工具,及时发现问题
5.2 容器化高可用部署最佳实践
容器化高可用部署最佳实践:
- 使用自定义镜像:根据实际需求构建自定义镜像
- 使用持久化存储:确保数据安全和持久化
- 配置资源限制:合理设置容器的CPU和内存限制
- 使用容器编排工具:如Kubernetes管理容器
- 配置监控和告警:及时发现和处理问题
- 定期备份:确保数据安全
- 定期更新镜像:保持系统安全和稳定
5.3 容器化部署脚本分享
以下是一个容器化部署脚本示例:
#!/bin/bash
# containerized_deployment.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 配置信息
IMAGE_NAME=”kingbase/kingbasees:v8r6″
CONTAINER_NAME=”kingbase”
PORT=”54321″
DATA_DIR=”/data/kingbase”
BACKUP_DIR=”/backup/kingbase”
# 记录日志
log() {
echo “$(date ‘+%Y-%m-%d %H:%M:%S’) – $1” >> containerized_deployment.log
}
# 检查Docker是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
log “Docker未安装,开始安装…”
yum install -y docker
systemctl start docker
systemctl enable docker
log “Docker安装完成”
else
log “Docker已安装”
fi
}
# 拉取镜像
pull_image() {
log “拉取镜像:${IMAGE_NAME}”
docker pull ${IMAGE_NAME}
log “镜像拉取完成”
}
# 创建数据目录
create_data_dir() {
log “创建数据目录:${DATA_DIR}”
mkdir -p ${DATA_DIR}
chmod 755 ${DATA_DIR}
log “数据目录创建完成”
}
# 创建备份目录
create_backup_dir() {
log “创建备份目录:${BACKUP_DIR}”
mkdir -p ${BACKUP_DIR}
chmod 755 ${BACKUP_DIR}
log “备份目录创建完成”
}
# 启动容器
start_container() {
log “启动容器:${CONTAINER_NAME}”
docker run -d \
–name ${CONTAINER_NAME} \
-p ${PORT}:${PORT} \
-v ${DATA_DIR}:/kingbase/data \
-e KINGBASE_USER=fgedu \
-e KINGBASE_PASSWORD=fgedu123 \
-e KINGBASE_DATABASE=fgedudb \
${IMAGE_NAME}
log “容器启动完成”
}
# 验证部署
verify_deployment() {
log “验证部署”
sleep 5
docker ps | grep ${CONTAINER_NAME}
if [ $? -eq 0 ]; then
log “容器运行正常”
# 验证数据库连接
psql -h fgedu.localhost -p ${PORT} -U fgedu -d fgedudb -c “SELECT version();”
if [ $? -eq 0 ]; then
log “数据库连接正常”
else
log “数据库连接失败”
fi
else
log “容器运行失败”
fi
}
# 配置备份
configure_backup() {
log “配置备份”
cat > /root/backup.sh << EOF
#!/bin/bash
# backup.sh
BACKUP_DIR=”${BACKUP_DIR}”
mkdir -p {BACKUP_DIR}
docker exec ${CONTAINER_NAME} /kingbase/app/bin/ksql -U fgedu -d fgedudb -c “SELECT pg_start_backup(‘full_backup’);”
docker cp ${CONTAINER_NAME}:/kingbase/data {BACKUP_DIR}/kingbase_data_(date +%Y%m%d%H%M%S)
docker exec ${CONTAINER_NAME} /kingbase/app/bin/ksql -U fgedu -d fgedudb -c “SELECT pg_stop_backup();”
find {BACKUP_DIR} -name “kingbase_data_*” -mtime +7 -delete
EOF
chmod +x /root/backup.sh
# 添加定时任务
(crontab -l 2>/dev/null; echo “0 1 * * * /root/backup.sh”) | crontab –
log “备份配置完成”
}
# 主函数
main() {
log “开始容器化部署”
check_docker
pull_image
create_data_dir
create_backup_dir
start_container
verify_deployment
configure_backup
log “容器化部署完成”
}
# 执行主函数
main
风哥提示:容器化高可用部署是现代数据库部署的重要方式,通过容器化技术和高可用架构的结合,可以实现数据库的快速部署、弹性扩展和高可用保障,为企业提供更加可靠、高效的数据库服务。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
