可用于快速构建和部署 openGauss 数据库的容器化环境,支持创建主备 CM 集群。提供镜像构建脚本,支持 x86 和 arm 平台,支持单节点或跨节点容器网络配置,可通过脚本快速启动多实例集群。【此简介由AI生成】
当前访问频次受限,请登录后继续访问
main 分支说明
main 分支已修改安装目录和数据目录。其中,数据目录与单机容器保持一致,支持将单机容器扩容到带 CM 的主备容器场景。 支持主备容器使用宿主机网络。 支持自定义 CM 和数据库端口。 支持挂载数据目录和 app 目录。
容器打包说明
下载 openGauss-container 仓库代码,构建脚本在该仓库中统一管理。
- 构建镜像需要 openGauss 社区发布的企业版本包:openGauss-All-7.0.0-openEuler20.03-CPU平台.tar.gz,请将其放置到
openGauss-docker/dockerfiles目录下。- 运行 buildDockerImage.sh 脚本时,如果未指定 -i 参数,默认提供 SHA256 检查,需要您手动将校验结果写入 sha256_file_amd64 文件。
## 修改sha256校验文件内容 cd `openGauss-docker/dockerfiles` sha256sum openGauss-All-7.0.0-openEuler20.03-aarch64.tar.gz > sha256_file_arm64
- 请使用 openGauss 社区发布的 openEuler20.03 对应的 arm 和 x86 平台包。
构建命令:
sh buildDockerImage.sh -v 7.0.0 -i
容器部署说明(支持容器网络与宿主机网络)
参数说明
- --sysctl kernel.sem="250 640000 1000 25600" 指定系统信号量大小
- --security-opt seccomp=unconfined 提供运行所需权限,否则数据库运行时可能因缺少 mbind 而报错。
- --net 指定使用容器网络或宿主机网络
- -h= 指定容器内名称
- --ip 指定容器 IP。主备节点通过 IP 通信,安装前需要确定 IP。(通过 --net host 使用宿主机网络部署主备时不需要该参数)
- -e primaryhost= 集群区分主备,指定主节点 IP
- -e primaryname= 指定主节点名称
- -e standbyhosts= 指定备节点 IP,多个备节点 IP 以逗号分隔
- -e standbynames= 指定备节点容器内名称,多个备节点名称以逗号分隔
- -e GS_PASSWORD= 设置数据库密码
- -e dbport= 指定数据库端口,将监听 port、port+1、port+4;默认值为 5432。如果主备使用容器网络通信,不会占用宿主机端口,因此可以不用配置
- -e cmport= 指定 CM 使用的端口,将监听 port、port+1、port+2;默认值为 25000。如果主备使用容器网络通信,不会占用宿主机端口,因此可以不用配置
- -v 宿主机与容器目录挂载,涉及两个目录:数据目录 /var/lib/opengauss 必须挂载到宿主机,避免数据丢失;二进制目录 /usr/local/opengauss 非必选,建议挂载,否则误删除容器后需要重新安装。
- opengauss-cm:7.0.0 容器镜像名称
- -e single 指定是否以单机模式启动。single=1 表示单机主备模式,不带 CM;single=0 表示 CM 集群模式。
- -e instance_type=primary | standby | cascade_standby 单机模式下初始化容器时指定主备角色参数
- --ulimit nofile=1000000:1000000 指定文件句柄数为 100 万
容器内说明
维护文件:/usr/local/opengauss/cluster_maintain_file。enctrypoint.sh 作为守护进程,会检测数据库进程是否不存在并重新拉起;如需主动停止数据库进程进行维护,可创建该文件后执行手动重启等操作。
使用宿主机网络 net=host 运行主备容器
启动时需要传入以下参数:
primary_nodeip="20.20.20.54"
standby1_nodeip="20.20.20.56"
primary_nodename=primary
standby1_nodename=standby1
OG_NETWORK=host
GS_PASSWORD=test@123
启动实例 1
docker run -d -it -P --sysctl kernel.sem="250 6400000 1000 25600" --ulimit nofile=1000000:1000000 --security-opt seccomp=unconfined --name opengauss-01 --net ${OG_NETWORK} -h=$primary_nodename -e primaryhost="$primary_nodeip" -e primaryname="$primary_nodename" -e standbyhosts="$standby1_nodeip" -e standbynames="$standby1_nodename" -e GS_PASSWORD=$GS_PASSWORD -v /usr2/zxb/cmtest:/var/lib/opengauss -e dbport=22100 -e cmport=22200 opengauss-cm:7.0.0
启动实例2
docker run -d -it -P --sysctl kernel.sem="250 6400000 1000 25600" --ulimit nofile=1000000:1000000 --security-opt seccomp=unconfined --name opengauss-02 --net ${OG_NETWORK} -h=$standby1_nodename -e primaryhost="$primary_nodeip" -e primaryname="$primary_nodename" -e standbyhosts="$standby1_nodeip" -e standbynames="$standby1_nodename" -e GS_PASSWORD=$GS_PASSWORD -v /usr2/zxb/cmtest:/var/lib/opengauss -e dbport=22100 -e cmport=22200 opengauss-cm:7.0.0
如果存在多个备机,请在 -e standbynames 与 -e standbyhosts 中分别传入多个节点名称和 ip,多个值之间以逗号分隔。 例如: e standbyhosts="172.0.10.5,172.0.10.6" -e standbynames="standby1,standby2"
通过自定义容器网络运行主备容器
todo
从不带 CM 的单机容器(Server 仓库发布的容器镜像)扩展主备,并部署至带 CM 容器 -- 使用宿主机网络
1. 通过主机网络搭建主备容器(不带 CM -- Server 仓库的容器)
docker run --name opengauss-og1 --privileged=true --network=host -d -e GS_PASSWORD=Test@123 -v /usr2/zxb/cmtest:/var/lib/opengauss opengauss:7.0.0
docker run --name opengauss-og2 --privileged=true --network=host -d -e GS_PASSWORD=Test@123 -v /usr2/zxb/cmtest:/var/lib/opengauss opengauss:7.0.0 -M standby
将容器端口配置为 22100(在 5432 端口被占用的情况下,可自定义配置)
echo "port=22100" >> /usr2/zxb/cmtest/data/postgresql.conf
启动容器
docker start opengauss-og1
docker start opengauss-og2
2. 配置主备参数
配置主机参数
primary_name=opengauss-og1
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"replconninfo1='localhost=20.20.20.54 localport=22101 localheartbeatport=22104 localservice=22105 remotehost=20.20.20.56 remoteport=22101 remoteheartbeatport=22104 remoteservice=22105'\""
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'remote_read_mode=off'"
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'replication_type=1'"
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"application_name='dn_master'\""
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.54/32 trust'"
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.56/32 trust'"
配置备机参数
standby_name=opengauss-og2
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"replconninfo1='localhost=20.20.20.56 localport=22101 localheartbeatport=22104 localservice=22105 remotehost=20.20.20.54 remoteport=22101 remoteheartbeatport=22104 remoteservice=22105'\""
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'remote_read_mode=off'"
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'replication_type=1'"
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"application_name='dn_standby1'\""
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.54/32 trust'"
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.56/32 trust'"
3. 备机以后端方式启动
docker stop ${standby_name}
docker rm ${standby_name}
docker run --name ${standby_name} --privileged=true --network=host -d -e GS_PASSWORD=Test@123 -v /usr2/zxb/cmtest:/var/lib/opengauss -it --entrypoint /bin/bash opengauss:7.0.0
4. 备机全量拉取主机数据
docker exec ${standby_name} su - omm -c "gs_ctl build -D /var/lib/opengauss/data -M standby"
5. 备机以 standby 方式重启(去掉 -it --entrypoint /bin/bash)
docker stop ${standby_name}
docker rm ${standby_name}
docker run --name ${standby_name} --privileged=true --network=host -d -e GS_PASSWORD=Test@123 -v /usr2/zxb/cmtest:/var/lib/opengauss opengauss:7.0.0 -M standby
查询
docker exec ${standby_name} su - omm -c "gs_ctl query -D /var/lib/opengauss/data"
6. 停止主备容器
docker stop ${standby_name}
docker stop ${primary_name}
7. 分别使用带CM的容器镜像启动主备容器
注意保证挂载的数据目录和不带CM的容器一致。 其他参数参考上面介绍。
主机启动
primary_nodeip="20.20.20.54"
standby1_nodeip="20.20.20.56"
primary_nodename=primarycm
standby1_nodename=standby1cm
OG_NETWORK=host
GS_PASSWORD=test@123
docker run -d -it -P --sysctl kernel.sem="250 6400000 1000 25600" --security-opt seccomp=unconfined --name opengauss-01 --net ${OG_NETWORK} -h=$primary_nodename -e primaryhost="$primary_nodeip" -e primaryname="$primary_nodename" -e standbyhosts="$standby1_nodeip" -e standbynames="$standby1_nodename" -e GS_PASSWORD=$GS_PASSWORD -v /usr2/zxb/cmtest:/var/lib/opengauss -e dbport=22100 -e cmport=22200 opengauss-cm:7.0.0
备机启动
primary_nodeip="20.20.20.54"
standby1_nodeip="20.20.20.56"
primary_nodename=primarycm
standby1_nodename=standby1cm
OG_NETWORK=host
GS_PASSWORD=test@123
docker run -d -it -P --sysctl kernel.sem="250 6400000 1000 25600" --security-opt seccomp=unconfined --name opengauss-02 --net ${OG_NETWORK} -h=$standby1_nodename -e primaryhost="$primary_nodeip" -e primaryname="$primary_nodename" -e standbyhosts="$standby1_nodeip" -e standbynames="$standby1_nodename" -e GS_PASSWORD=$GS_PASSWORD -v /usr2/zxb/cmtest:/var/lib/opengauss -e dbport=22100 -e cmport=22200 opengauss-cm:7.0.0
安装 2 个单机版集群,配置主备并部署 CM 高可用工具
1. 部署两个单机
选择 opengauss-og1 作为主节点,将 opengauss-og2 扩展为备节点
docker run --name opengauss-og1 --privileged=true --network=host -d -e GS_PASSWORD=Test@123 -e dbport=5800 -e single=1 -v /usr2/zxb/cmtest:/var/lib/opengauss opengauss-cm:7.0.0
docker run --name opengauss-og2 --privileged=true --network=host -d -e GS_PASSWORD=Test@123 -e dbport=5800 -e single=1 -v /usr2/zxb/cmtest:/var/lib/opengauss opengauss-cm:7.0.0
2. 配置主机参数
primary_name=opengauss-og1
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"replconninfo1='localhost=20.20.20.56 localport=5801 localheartbeatport=5804 localservice=5805 remotehost=20.20.20.54 remoteport=5801 remoteheartbeatport=5804 remoteservice=5805'\""
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'remote_read_mode=off'"
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'replication_type=1'"
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"application_name='dn_master'\""
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.54/32 trust'"
docker exec ${primary_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.56/32 trust'"
主机需要将实例角色修改为 1,后续重启时才会选择正确的角色:
sed -i "s/INSTANCE_TYPE=*.*/INSTANCE_TYPE=1/g" /home/omm/.bashrc
3. 配置备节点参数
standby_name=opengauss-og2
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"replconninfo1='localhost=20.20.20.54 localport=5801 localheartbeatport=5804 localservice=5805 remotehost=20.20.20.56 remoteport=5801 remoteheartbeatport=5804 remoteservice=5805'\""
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'remote_read_mode=off'"
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c 'replication_type=1'"
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -c \"application_name='dn_standby1'\""
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.54/32 trust'"
docker exec ${standby_name} su - omm -c "gs_guc reload -D /var/lib/opengauss/data -h 'host all omm 20.20.20.56/32 trust'"
4. 备机以 -M standby 方式重启,全量 build 数据
进入备机容器(omm 用户)内,添加维护文件
touch /usr/local/opengauss/cluster_maintain_file
将环境变量中的角色修改为备机:
sed -i "s/INSTANCE_TYPE=*.*/INSTANCE_TYPE=2/g" /home/omm/.bashrc
停止备机实例,以 standby 方式启动
gs_ctl stop -D /var/lib/opengauss/data
gs_ctl start -D /var/lib/opengauss/data -M standby
gs_ctl build -D /var/lib/opengauss/data -M standby
rm /usr/local/opengauss/cluster_maintain_file
5. 在主备节点安装 cm 工具(在 omm 用户下执行),确保 primaryname 和 standbynames 与容器内的 hostname 一致。
export single=0
export GS_PASSWORD=Test@123
export primaryhost="20.20.20.56"
export standbyhosts="20.20.20.54"
export primaryname=openGauss56
export standbynames=openGauss54
sh /deploy_cm.sh