OpenGauss主从复制在容器环境下的高效实现【华为开发者空间】

举报
wzsのcloud 发表于 2024/11/19 13:11:45 2024/11/19
【摘要】 在华为开发者空间的云主机上,通过Docker部署OpenGauss主从复制数据库

前言

华为开发者空间是华为云专为全球开发者设计的开发平台,集成了昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等核心技术资源及工具。它致力于每位开发者都能轻松获取专属云主机,通过预装直观可视化操作系统、CodeArts IDE及多种编程语言插件,解决了本地开发环境的复杂性和稳定性问题,提供强大、安全、高效的开发体验。开发者每月可享受15小时云主机使用、5GB个人存储空间及3小时场景化沙箱资源,且云主机内置便捷通道直达技术社区与学习资源,打造出一个即开即用、可持续发展的个人工作空间,既是项目开发的舞台,也是学习成长的笔记簿和个人智慧的宝库。

接下来随我一起走进华为开发者空间,领取云主机,并部署OpenGauss主从复制数据库。

环境规划

主机类型 操作系统 Docker OpenGauss
华为云开发者空间云主机 openEuler 22.03 LTS 27.1.1 3.0.0

领取云主机

  1. 进入开发者空间,领取云主机

华为云开发者空间:https://developer.huaweicloud.com/space/devportal/desktop

image.png

  1. 选择云主机对应的规格,点击创建(可根据自身需求选择预装JAVA或者Python等相应的工具)

image.png

  1. 进入云主机,点击在浏览器中打开

image.png

正在连接中,需要等待3-5分钟,方可连接成功

image.png

Docker介绍

Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包轻量级的、可移植的容器。这些容器可以在任何支持Docker的操作系统上运行,无需进行额外的配置Docker提供了强大的隔离性和一致性,使得应用程序的部署、管理和扩展变得更加简单和高效

image.png

安装Docker

下载docker-ce.repo

本实例我们选择 华为开源镜像站docker-ce.repo文件

# 设置稳定的docker仓库(本实例我们选择华为云的docker仓库)
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
--2024-11-18 14:04:30--  https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
?????? mirrors.huaweicloud.com (mirrors.huaweicloud.com)... 123.249.118.101, 124.70.61.162, 1.92.76.132, ...
???? mirrors.huaweicloud.com (mirrors.huaweicloud.com)|123.249.118.101|:443... ????
??? HTTP ?????????... 200 OK
???1919 (1.9K) [application/octet-stream]
?????: ?/etc/yum.repos.d/docker-ce.repo?

/etc/yum.repos.d/docker-ce.repo       100%[=========================================================================>]   1.87K  --.-KB/s  ?? 0s      

2024-11-18 14:04:30 (123 MB/s) - ??? ?/etc/yum.repos.d/docker-ce.repo? [1919/1919])

# 查看所下载的repo文件
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ ls /etc/yum.repos.d/
docker-ce.repo  openEuler.repo  openEuler.repo.rpmnew

因为我们的系统是 OpenEuler 22.03,没有对应的镜像仓库,我们基于提供的centos仓库进行修改

# 将docker-ce.repo中的$releasever 替换为具体的版本号,例如:9.9
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo vim  /etc/yum.repos.d/docker-ce.repo 

# 清理缓存
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo yum clean all
Warning: failed loading '/etc/yum.repos.d/docker-ce.repo', skipping.
54 files removed

# 构建缓存
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo yum makecache 

至此docker仓库配置成功

安装docker软件包

不指定版本默认安装最新版,安装之前确保主机没有安装docker

# 查看docker版本 
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo yum list docker-ce --showduplicates | sort -r   

# 安装docker,默认最新版
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo yum install -y docker-ce

启动docker服务

# 查看docker版本
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker -v
Docker version 27.1.1, build 6312585

# 启动docker服务,并设置开机自启
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo systemctl start docker.service
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo systemctl enable docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.

# 运行正常(显示的是active)
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo systemctl status docker.service
● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
     Active: active (running) since Sat 2024-08-31 21:38:14 CST; 12h ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 178445 (dockerd)
      Tasks: 13
     Memory: 177.9M
     CGroup: /system.slice/docker.service
             └─ 178445 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
........................

配置镜像加速器

本实例我们选择华为云镜像加速器,也可根据自身需求配置相应的镜像加速器

# 创建指定文件夹docker
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo mkdir -p /etc/docker

# 创建并配置文件
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo vim /etc/docker/daemon.json

# 查看配置文件
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo cat /etc/docker/daemon.json
{
    "registry-mirrors": [ "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com" ]
}

# 重新加载配置文件
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo systemctl daemon-reload

# 重新启动docker服务
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo systemctl restart docker.service

# 查看修改镜像加速
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker info
.................................
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com/
 Live Restore Enabled: false

补充:因为镜像源的问题可能会导致镜像拉取超时,导致拉取失败,可以配置多个镜像仓库进行拉取镜像测试

# 配置镜像仓库
[root@docekr ~]# cd /etc/docker/
[root@docekr docker]# vim daemon.json
[root@docekr docker]# cat daemon.json 
{
    "registry-mirrors": [
  "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",
    "https://docker.m.daocloud.io",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://your_preferred_mirror",
    "https://dockerhub.icu",
    "https://docker.registry.cyou",
    "https://docker-cf.registry.cyou",
    "https://dockercf.jsdelivr.fyi",
    "https://docker.jsdelivr.fyi",
    "https://dockertest.jsdelivr.fyi",
    "https://mirror.aliyuncs.com",
    "https://dockerproxy.com",
    "https://mirror.baidubce.com",
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.iscas.ac.cn",
    "https://docker.rainbond.cc"
    ]
}

opengauss介绍

openGauss是一款全面友好开放的企业级开源关系型数据库管理系统,它深度融合华为在数据库领域的研发经验,提供面向多核架构的极致性能、全链路业务与数据安全、基于AI的调优和高效运维能力,支持标准的SQL规范,具有高性能、高可用、高安全、易运维、全开放的特点,并允许任何人免费使用、修改和分发,采用木兰宽松许可证协议。

image.png

容器化部署opengauss

单节点部署

  1. 拉取镜像
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker pull enmotech/opengauss:3.0.0
  1. 创建单节点容器进行测试
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker run --name opengauss -d --restart always --privileged=true  -e GS_PASSWORD=Admin@123456 -v /data/opengauss/mysql:/var/lib/opengauss  -u root -p 15432:5432 enmotech/opengauss:3.0.0
  1. 查看容器状态
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS                                                                                          PORTS                                           NAMES
6afd18c82f9c   enmotech/opengauss:3.0.0   "entrypoint.sh gauss…"   32 seconds ago   Up 31 sec                                                                                onds   0.0.0.0:15432->5432/tcp, [::]:15432->5432/tcp   opengauss
  1. 进入容器,并进行基本操作
# 进入容器
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker exec -it opengauss /bin/bash

# 切换用户
root@6afd18c82f9c:/# su - omm

# 进入数据库
omm@6afd18c82f9c:~$ gsql

# 查看表
omm=# \db
      List of tablespaces
    Name    | Owner | Location
------------+-------+----------
 pg_default | omm   |
 pg_global  | omm   |
(2 rows)

# 退出数据库
omm=# \q

主从复制部署

openGauss主从复制是一种数据备份和冗余技术,通过该技术可以实现主数据库与从数据库之间的数据同步,当主数据库发生故障时,可以快速切换到从数据库,以保证数据库的高可用性和业务连续性

image.png

  1. 下载运行脚本,OpenGauss官方为我们提供了脚本文件,我们只需要下载修改即可快速部署出主从复制结构的OpenGauss数据库

脚本参数解析:

OG_SUBNET [172.11.0.0/24] 容器所在网段
GS_PASSWORD [Enmo@123] 定义数据库密码
MASTER_IP [172.11.0.101] 主数据库IP地址
SLAVE_1_IP [172.11.0.102] 备数据库IP地址
MASTER_HOST_PORT [5432] 主库数据库服务端口
MASTER_LOCAL_PORT [5434] 主库通信端口
SLAVE_1_HOST_PORT [6432] 备库数据库服务端口
SLAVE_1_LOCAL_PORT [6434] 备库通信端口
MASTER_NODENAME [opengauss_master] 主节点名称
SLAVE_NODENAME [opengauss_slave1] 备节点名称
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo wget https://raw.githubusercontent.com/enmotech/enmotech-docker-opengauss/master/create_master_slave.sh
  1. 执行脚本,输入对应信息,创建容器
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo sh create_master_slave.sh
Please input OG_SUBNET (容器所在网段) [172.11.0.0/24]: 172.11.0.0/24
OG_SUBNET set 172.11.0.0/24
Please input GS_PASSWORD (定义数据库密码)[Enmo@123]: Enmo@123
GS_PASSWORD set Enmo@123
Please input MASTER_IP (主库IP)[172.11.0.101]: 172.11.0.101
MASTER_IP set 172.11.0.101
Please input SLAVE_1_IP (备库IP)[172.11.0.102]: 172.11.0.102
SLAVE_1_IP set 172.11.0.102
Please input MASTER_HOST_PORT (主库数据库服务端口)[5432]: 5432
MASTER_HOST_PORT set 5432
Please input MASTER_LOCAL_PORT (主库通信端口)[5434]: 5434
MASTER_LOCAL_PORT set 5434
Please input SLAVE_1_HOST_PORT (备库数据库服务端口)[6432]: 6432
SLAVE_1_HOST_PORT set 6432
Please input SLAVE_1_LOCAL_PORT (备库通信端口)[6434]: 6434
SLAVE_1_LOCAL_PORT set 6434
Please input MASTER_NODENAME [opengauss_master]: opengauss_master
MASTER_NODENAME set opengauss_master
Please input SLAVE_NODENAME [opengauss_slave1]: opengauss_slave1
SLAVE_NODENAME set opengauss_slave1
Please input openGauss VERSION [3.0.0]: 3.0.0
openGauss VERSION set 3.0.0
starting
88f3e3511a545bd0c4f0ca73e76bf1f9188e6eb88f0a7e9518d5aad397b224e6
OpenGauss Database Network Created.
498061349ff1dff265df6aa07f8dddd6f5f9959b99de20983f9c1e84925acf71
OpenGauss Database Master Docker Container created.
260943f39f238bb6d3b521c31504da91d5c9fdf6336b039b906a3d506a3e1a4d
OpenGauss Database Slave1 Docker Container created.
  1. 查询容器运行状态
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED              STATUS              PORTS                                                 NAMES
260943f39f23   enmotech/opengauss:3.0.0   "entrypoint.sh -M st…"   48 seconds ago       Up 47 seconds       5432/tcp, 0.0.0.0:6432->6432/tcp, :::6432->6432/tcp   opengauss_slave1
498061349ff1   enmotech/opengauss:3.0.0   "entrypoint.sh -M pr…"   About a minute ago   Up About a minute   0.0.0.0:5432->5432/tcp, :::5432->5432/tcp             opengauss_master
  1. 查看主从复制状态
# 进入到master节点
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker exec -it opengauss_master /bin/bash
root@opengauss_master:/# su - omm

# 数据库运行状态,可以看到主从端都正常
omm@opengauss_master:~$ gs_ctl query -D /var/lib/opengauss/data/
[2024-11-15 12:18:31.467][338][][gs_ctl]: gs_ctl query ,datadir is /var/lib/opengauss/data
 HA state:
        local_role                     : Primary
        static_connections             : 1
        db_state                       : Normal
        detail_information             : Normal

 Senders info:
        sender_pid                     : 311
        local_role                     : Primary
        peer_role                      : Standby
        peer_state                     : Normal
        state                          : Streaming
        sender_sent_location           : 0/40002E8
        sender_write_location          : 0/40002E8
        sender_flush_location          : 0/40002E8
        sender_replay_location         : 0/40002E8
        receiver_received_location     : 0/40002E8
        receiver_write_location        : 0/40002E8
        receiver_flush_location        : 0/40002E8
        receiver_replay_location       : 0/40002E8
        sync_percent                   : 100%
        sync_state                     : Sync
        sync_priority                  : 1
        sync_most_available            : On
        channel                        : 172.11.0.101:5434-->172.11.0.102:45076

 Receiver info:
No information
  1. 验证主从复制
# 数据同步验证,在主库建个用户和表,去从库进行查看
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker exec -it opengauss_master /bin/bash
root@opengauss_master:/# su -  omm
omm@opengauss_master:~$ gsql -r
gsql ((openGauss 3.0.0 build 02c14696) compiled at 2022-04-01 18:12:34 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

# 创建用户
omm=# create user wzs with password "hello@1234";
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE

# 创建表
omm=# create table test1(id int,name varchar(20));
CREATE TABLE

# 插入数据
omm=# insert into test1 values (1,'zhangsan');
INSERT 0 1

# 查看表内容
omm=# select *  from test1;
 id |   name
----+----------
  1 | zhangsan
(1 row)

# 退出数据库
omm=# \q

# 退出容器
omm@opengauss_master:~$ exit
logout
root@opengauss_master:/# exit
exit

去从数据库进行查看

[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo docker exec -it opengauss_slave1 /bin/bash
root@opengauss_slave1:/# su - omm

# 指定端口号,gsql默认指定的是5432
omm@opengauss_slave1:~$ gsql -r -p 6432
gsql ((openGauss 3.0.0 build 02c14696) compiled at 2022-04-01 18:12:34 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

omm=# \d
                         List of relations
 Schema | Name  | Type  | Owner |             Storage
--------+-------+-------+-------+----------------------------------
 public | test1 | table | omm   | {orientation=row,compression=no}
(1 row)

omm=# select * from test1;
 id |   name
----+----------
  1 | zhangsan
(1 row)

# 查看用户(可以看到我们创建的用户)
omm=# select * from pg_user;
 usename | usesysid | usecreatedb | usesuper | usecatupd | userepl |  passwd  |
valbegin | valuntil |   respool    | parent | spacelimit | useconfig | nodegroup
 | tempspacelimit | spillspacelimit | usemonitoradmin | useoperatoradmin | usepo
licyadmin
---------+----------+-------------+----------+-----------+---------+----------+-
---------+----------+--------------+--------+------------+-----------+----------
-+----------------+-----------------+-----------------+------------------+------
----------
 omm     |       10 | t           | t        | t         | t       | ******** |
         |          | default_pool |      0 |            |           |
 |                |                 | t               | t                | t
 gaussdb |    16385 | f           | f        | f         | f       | ******** |
         |          | default_pool |      0 |            |           |
 |                |                 | f               | f                | f
 repuser |    16389 | f           | f        | f         | t       | ******** |
         |          | default_pool |      0 |            |           |
 |                |                 | f               | f                | f
 wzs     |    16393 | f           | f        | f         | f       | ******** |
         |          | default_pool |      0 |            |           |
 |                |                 | f               | f                | f
(4 rows)

omm=# \q
omm@opengauss_slave1:~$ exit
logout
root@opengauss_slave1:/# exit
exit

至此,主从复制数据库部署成功

补充(gsql)

果有需要可以自行安装opengauss客户端工具gsql,进行连接数据库(本篇文章只针对测试环境,生产环境需要根据自身业务需求安装对应工具

客户端工具下载地址:https://support.huaweicloud.com/tg-dws/dws_07_0002.html

image.png

安装客户端工具

# 创建文件夹
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo mkdir /gsql && cd /gsql

# 安装解压命令
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo yum install -y unzip

# 下载软件包并放到指定目录
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo ls
unzip dws_client_8.2.x_redhat_x64.zip

# 解压软件包
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo unzip dws_client_8.2.x_redhat_x64.zip

# 设置环境变量
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo vim ~/.bashrc
# 这以下数据加载文件末尾
................................
export PATH=/gsql/bin:$PATH
export LD_LIBRARY_PATH=/gsql/lib:$LD_LIBRARY_PATH

# 重新加载配置文件,使其生效
[developer@cdb4db8f96f64111a397468a6b8bc33b ~]$ sudo source ~/.bashrc

# 连接数据库测试
[root@openEuler ~]# gsql -d postgres -U gaussdb  -W'Admin@123456' -h 10.4.60.183 -p15432
gsql ((GaussDB 8.2.0 build f062e27d) compiled at 2023-01-28 17:53:03 commit 3629 last mr 5138 release)
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.

postgres=> \q

写在最后

华为开发者空间的云主机这一强大平台上,我通过Docker成功部署了OpenGauss主从复制数据库。这次实践不仅让我深刻体验到了技术的可行性与高效性,更让我对云主机在提供稳定、灵活且可扩展的计算资源方面的能力赞不绝口。通过这一过程,我亲眼见证了云计算与容器化技术如何大幅提升数据库的可用性、可靠性和扩展性,同时也对华为开发者空间云主机在支持复杂数据库架构、优化性能及保障数据安全方面的卓越表现有了更深的认识。

我正在参加【有奖征集 第34期】华为开发者空间一行代码快速上云,参与视频、文章投稿赢2000元开发者礼包
链接: https://bbs.huaweicloud.com/blogs/438987

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。