自动化部署 / 扩容openGauss —— Ansible for openGauss

news2024/11/17 7:29:37

前言

大家好,今天我们为大家推荐一套基于 Ansible 开发的,自动化部署及扩容 openGauss 的脚本工具:Ansible for openGauss(以下简称 AFO)。

通过AFO,我们只需简单修改一些配置文件,即可快速部署多种架构模式的 openGauss,以及对已有架构进行自动化扩容。下面我们就请这套工具的贡献者,上海联空网络科技有限公司(以下简称“联空网络”)的李海滨,给大家讲解它的设计理念和优点。

开发背景

Hi,大家好,我是来自联空网络安全品质中心的运维工程师,李海滨。我是一名 Ansible 爱好者,致力于将运维工作自动化。曾获得 FISCO BCOS 区块链开源社区 2021 年度 MVP 称号。

图片

联空网络成立于 2015 年 8 月,专注于提供医疗+互联网一站式技术和运营解决方案,帮助医疗用户更加轻松的拥抱互联网。目前,公司已经与 800+ 医疗机构用户形成合作关系,其中,百强医院合作 25+,三级医院 300+,上海地区客户覆盖率超 70%,覆盖全国 23 个省市。

当前自主创新、信息技术应用创新等需求日益增长,医疗行业用户十分关注软硬件产品解决方案的自主创新情况,为此联空网络积极响应,投入专业团队,对国内相关软硬件产品适配做可行性研判。

经过对国内数据库的深入了解,我们接触到了海量数据库,并获悉其是基于openGauss开源的商业发行版产品。openGauss 作为一款开源的关系型数据库管理系统,具有高性能、高可用性以及卓越的扩展能力。于是我们开始构想可以为研发团队提供 openGauss 环境,让其可以基于 openGauss 做代码适配。当客户选择使用海量数据库时,我们的软件就可以直接匹配。

为了方便反复部署测试,我拿出了擅长的 Ansible,为 openGauss 写一套自动化部署工具,以简化其安装、配置和管理过程。

完成初版开发后,我与 openGauss 社区取得了联系,表达了希望可以把这套工具贡献给社区,以开源回馈开源的想法。

感谢社区运营梅相如同学的大力支持,很快为我开设了代码仓库。又找来 openGauss 的开发工程师“行尘”同学,解答我在开发过程中遇到的一些问题。在此也很感谢“行尘”同学不厌其烦地回答,你们给予了我很大的帮助!

解决部署痛点

如果你有按照官方文档部署一套 openGauss 的经历,你会发现不论是单点还是集群,均需做不少的前期工作。例如要根据 CPU 和操作系统,下载对应版本的安装包。又需要根据不同的 Linux 操作系统,做一些额外配置。手工部署在这里不仅低效,而且容易有错漏。如果是多节点的部署,手工部署的弱势会被进一步放大。

我开发这套 Ansible 脚本的目标,就是尽可能地覆盖部署前、部署中和部署后的场景,并且把手工部署过程中遇到的一些坑,也通过自动化来解决掉。降低 openGauss 的部署门槛,推动 openGauss 的普及。

例如在 openEuler 20.03 系统里部署 openGauss 5.0,你会遇到 readline-devel 这个依赖包的版本是 8,而 openGauss 5.0 需要的是 libreadline.so.7,导致安装过程失败。我查找到解决方法后,加入到部署流程中,自动帮大家把这个坑给填了。代码在 roles\opengauss\tasks\os\openEuler.yml 里:

# openGauss 5.0.0 依赖 readline 7# openEuler 20.03 只有 readline 8- name: Create soft link  ansible.builtin.file:    src: "/lib64/libreadline.so.8"    dest: "/lib64/libreadline.so.7"    state: link

在给未部署 CM 的架构做扩容时,需要在主备之间做一次 switchover 后才能安装 CM。这些我们也加入到自动化流程中,免除了大家遇到这些问题还要花时间查找解决方法的麻烦。代码在 roles\opengauss\tasks\deploy\cluster_manager.yml 里:

     - name: Switchover on a standby node      ansible.builtin.command:        gs_ctl switchover -D {{ og_data_path }}/dn      changed_when: false      loop: "{{ dn_nodes | select('search', 'Standby') }}"      loop_control:        loop_var: node        extended: true      when: "ansible_loop.index == 1"      delegate_to: "{{ hostvars[node]['node_ip'] }}"
    - name: Switchover back to primary node      ansible.builtin.command:        gs_ctl switchover -D {{ og_data_path }}/dn      changed_when: false      loop: "{{ dn_nodes | select('search', 'Primary') }}"      loop_control:        loop_var: node      delegate_to: "{{ hostvars[node]['node_ip'] }}"
    - name: Start any stopped nodes      ansible.builtin.command:        gs_om -t start      changed_when: false

部署过程中,有需要在 root 和 omm 账号之间多次切换的操作,Ansible 里用 become_user 就可以轻松自动切换。这些都是手工部署过程中的痛点。

已实现的功能

总结下来,目前我们这个工具能实现以下功能:

  1. 提供一个专属的 ansible-docker 子项目,只要控制机可运行 docker,即可运行一个 Ansible 容器,适配 AFO 的执行。对于不熟悉 Ansible 的同学非常友好。

  2. 自动适配 CPU 架构(条件受限,目前仅测试了 X86 架构)和操作系统(已支持 CentOS 和 openEuler 20.03),自动下载对应的 openGauss 安装包,自动对操作系统做适配修改。

  3. 实现从单节点到多节点的多种架构模式的一次性部署。

  4. 使用本工具部署的单点或集群,还能通过添加服务器,再次运行脚本,实现平滑扩容。实测可直接从单主扩容到 1 主 2 备 2 级联。

  5. 允许用户自定义一些变量,例如指定部署目录,指定 openGauss 版本(5.0 或以上),指定 sysctl 的参数配置。

  6. 免除手工部署中的问答环节,自动生成相关密码,自动填写。最后生成部署报告。

效率是如何提升的?

以配置网卡 MTU 为例,3 台服务器的执行时间如下:

Saturday 18 November 2023  20:54:50 +0800 (0:00:06.777)       0:01:03.288 ***** 
TASK [opengauss : Config MTU in /etc/sysconfig/network-scripts/ifcfg-enp0s8] *****************************************************************************************************************changed: [192.168.56.11]changed: [192.168.56.14]changed: [192.168.56.15]Saturday 18 November 2023  20:54:50 +0800 (0:00:00.517)       0:01:03.807 *****

Ansible 在 0.517 秒的时间内,完成了 3 台服务器的网卡 MTU 修改。因为,它是并行操作的。

以生成 cluster_config.xml 为例

3 台服务器的节点,手工写 cluster_config.xml,需要花费多少时间,各位可以自己计时看看。

而我们利用 Ansible 的模板功能,可以在 1 秒内生成该文件,编排非常清晰,一目了然。

假设服务器的分组配置 inventories/opengauss/hosts.ini 内容如下

[opengauss_primary]192.168.56.11
; 备机,可设置若干个或留空。[opengauss_standby]192.168.56.15
; 级联机,可设置若干个或留空。前提是 opengauss_standby 组不为空。[opengauss_cascade]192.168.56.14
; 以上 3 个分组的合并组,勿动。[opengauss:children]opengauss_primaryopengauss_standbyopengauss_cascade
; 备节点分组,总数不可大于 8。[opengauss_replicas:children]opengauss_standbyopengauss_cascade
; 机器的 SSH 信息,请根据你的实际情况修改。[opengauss:vars]; ssh 用户名,如果不是 root 用户,请确保它有 sudo 权限。ansible_ssh_user=vagrant; ssh 密码ansible_ssh_pass=vagrant; ssh 端口ansible_ssh_port=22

生成以下配置内容,仅需 1 秒钟。

<?xml version="1.0" encoding="utf-8"?><ROOT>  <CLUSTER>    <PARAM name="clusterName" value="openGauss" />    <PARAM name="gaussdbAppPath" value="/opt/openGauss/install/app" />    <PARAM name="gaussdbLogPath" value="/var/log" />    <PARAM name="tmpMppdbPath" value="/opt/openGauss/tmp"/>    <PARAM name="gaussdbToolPath" value="/opt/openGauss/install/om" />    <PARAM name="corePath" value="/opt/openGauss/corefile"/>    <PARAM name="nodeNames" value="og3232249867      ,og3232249870      ,og3232249871    "/>    <PARAM name="backIp1s" value="192.168.56.11      ,192.168.56.14      ,192.168.56.15    "/>  </CLUSTER>
  <DEVICELIST>
    <!-- CLUSTER PRIMARY -->    <DEVICE sn="og3232249867">      <PARAM name="name" value="og3232249867"/>      <PARAM name="instanceId" value="3232249867"/>      <PARAM name="azName" value="AZ1"/>      <PARAM name="azPriority" value="1"/>      <PARAM name="backIp1" value="192.168.56.11"/>      <PARAM name="sshIp1" value="192.168.56.11"/>
      <!-- Data Node -->      <PARAM name="dataNum" value="1"/>      <PARAM name="dataPortBase" value="15400"/>      <PARAM name="dataNode1" value="/opt/openGauss/data/dn        ,og3232249870,/opt/openGauss/data/dn        ,og3232249871,/opt/openGauss/data/dn      "/>      <PARAM name="dataNode1_syncNum" value="0"/>
      <!-- CLUSTER MANAGER -->      <PARAM name="cmsNum" value="1"/>      <PARAM name="cmServerPortBase" value="15300"/>      <PARAM name="cmServerlevel" value="1"/>      <PARAM name="cmDir" value="/opt/openGauss/data/cm"/>      <PARAM name="cmServerRelation" value="og3232249867        ,og3232249870        ,og3232249871      "/>      <PARAM name="cmServerListenIp1" value="192.168.56.11        ,192.168.56.14        ,192.168.56.15      "/>      <PARAM name="cmServerHaIp1" value="192.168.56.11        ,192.168.56.14        ,192.168.56.15      "/>    </DEVICE>    <DEVICE sn="og3232249870">      <PARAM name="name" value="og3232249870"/>      <PARAM name="azName" value="AZ1"/>      <PARAM name="azPriority" value="1"/>      <PARAM name="backIp1" value="192.168.56.14"/>      <PARAM name="sshIp1" value="192.168.56.14"/>
      <!-- CLUSTER MANAGER -->      <PARAM name="cmServerPortStandby" value="15800"/>      <PARAM name="cmDir" value="/opt/openGauss/data/cm"/>
      <!-- CASCADE ROLE -->      <PARAM name="cascadeRole" value="on"/>    </DEVICE>
    <DEVICE sn="og3232249871">      <PARAM name="name" value="og3232249871"/>      <PARAM name="azName" value="AZ1"/>      <PARAM name="azPriority" value="1"/>      <PARAM name="backIp1" value="192.168.56.15"/>      <PARAM name="sshIp1" value="192.168.56.15"/>
      <!-- CLUSTER MANAGER -->      <PARAM name="cmServerPortStandby" value="15800"/>      <PARAM name="cmDir" value="/opt/openGauss/data/cm"/>    </DEVICE>  </DEVICELIST></ROOT>

我们甚至考虑到了在机房里使用小尺寸显示器查看 cluster_config.xml 的场景,对 xml 做了换行处理,避免出现单行过长的问题。

自动化思路

AFO 主要的工作流如下:

  1. 对部署环境的信息进行采集。

  2. 将用户自定义的变量和脚本默认变量合并,优先使用自定义变量。

  3. 检查是否已部署 openGauss,如无,进入初次部署流程。

  4. 如果已部署 openGauss,则检查用户是否有添加新节点,进入节点扩容流程。

  5. 节点扩容流程里又分 2 步,先扩容备机节点,再扩容级联节点。因为级联节点只连接备机。

  6. 如果集群节点数量为 3 或以上,且未部署 CM,则进入 CM 部署流程。

  7. 最后,检查确认集群已正常运行,生成部署报告。

结果展示

以 3 台 VirtualBox 虚拟机为例,统一 8U+16GB 配置,都在 1 块物理 SATA 盘上读写。

另外,虚拟机都已经提前安装好相关依赖包,openGauss 安装包也已经下载到本地。排除网络下载速度的不确定因素。

单节点,4 分 40 秒(下图右下角)完成部署。

图片

1 主 1 备,7 分 48 秒(下图右下角)完成部署。

图片

从单点数据库,扩容为 1 主 1 备 1 级联,耗时 23 分(下图右下角)完成部署。

扩容模式需要额外的流程,因此耗时比直接部署 3 节点的要多。

图片

最后生成部署报告

图片

项目代码

这套工具已经收录在 openGauss 社区的官方代码库,欢迎大家前往下载试用,并向我们多多提出宝贵意见。

代码地址:https://gitee.com/opengauss/ansible-for-opengauss

使用前,请仔细阅读:https://gitee.com/opengauss/ansible-for-opengauss/blob/master/docs/01-ansible-in-docker.md 开启自动化部署的旅程。

参与贡献

  1. 欢迎对 Ansible 熟悉的同学,加入我们,改进完善我们的项目。

  2. 更欢迎大家提交 issue,提出宝贵的意见和建议。

  3. 也欢迎可以提供测试资源的同学,与我联系。目前我们需要 ARM 平台的测试环境。

TODO

  1. 增加 openGauss 相关生态软件的自动化部署,例如图形化管理,监控管理。

  2. 增加 ARM 平台的适配。

  3. 增加数据库定时备份的配置流程。

  4. 增加对 1 主 1 备架构的主备自动切换配置。

  5. 有限度地提供 gs_guc 自动化配置,方便运维人员对数据库参数做修改更新。

  6. 更多的想法,由你们来补充。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1250477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++数学表达式解析求值库推荐

让程序支持自定义的数学计算器是常用功能&#xff0c;找了几个用来数学表达式解析求值的库&#xff0c;有几个看起来很不错。 各个数学表达式求值的综合对比 对比结果如下&#xff0c;ExprTK得分最高&#xff0c; TinyExpr得分最低&#xff0c; GitHub - ArashPartow/math-par…

【Linux】EVIOCGBIT

EVIOCGBIT(ev, len) 该怎么理解&#xff1f; 我们可以推断出&#xff0c;它是一个宏&#xff0c;它的前两个参数已经确定了&#xff0c;具体的功能由后两个参数(ev,len)来决定。Linux-4.9.88\include\uapi\linux\input.h #define EVIOCGBIT(ev,len) _IOC(_IOC_READ, E, 0x20 …

关于提示SLF4J: Class path contains multiple SLF4J bindings的问题解决

今天搭建hbase的时候启动hbase的时候shell面板输入了一大堆日志&#xff0c;如下&#xff1a; stopping hbase.....................SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar:file:/opt/software/hadoop-3.1.3/share/hadoop/common/l…

基于ThinkPHP8 + Vue3 + element-ui-plus + 微信小程序(原生) + Vant2 的 BBS论坛系统设计【PHP课设】

一、BBS论坛功能描述 我做的是一个论坛类的网页项目&#xff0c;每个用户可以登录注册查看并发布文章&#xff0c;以及对文章的点赞和评论&#xff0c;还有文件上传和个人签名发布和基础信息修改&#xff0c;管理员对网站的数据进行统计&#xff0c;对文章和文件的上传以及评论…

Python3.7 win7系统安装openCV方案

为了使用机房电脑处理数字图像问题&#xff0c;在win7系统安装了python opencv, 测试使用的是官网下载python3.7.7版本&#xff0c;如果官网安装&#xff0c;直接安装即可 pip install python-opencv 这样会自动安装对应版本的numpy 如果官网安装很慢&#xff0c;想使用镜像安…

英特尔和 ARM 将合作开发移动芯片技术,如何看待双方合作?

英特尔和 ARM 将合作开发移动芯片技术&#xff0c;如何看待双方合作&#xff1f; 最近市场传出Arm要自产芯片&#xff0c;供智能手机与笔电等使用后&#xff0c;外媒指Arm自产芯片将由英特尔晶圆代工部门打造&#xff0c;变成英特尔晶圆代工客户。将采用英特尔18A工艺&#xff…

SAP从放弃到入门系列之-制造商零件编号-MPN 物料

文章目录 一、概念二、 配置点配置点1&#xff1a;启用MPN配置点2&#xff1a;MPN配置参数文件配置点3&#xff1a;激活库存管理的MPN所有功能变化1&#xff1a;MM01界面有库存管理制造商零部件号的字段&#xff1a;变化2&#xff1a;MM60界面的查询条件多了MPN物料号变化3&…

【C++代码】链表

算法&#xff1a;搜索、查找、排序、双指针、回溯、分治、动态规划、贪心、位运算、数学等。 数据结构&#xff1a;数组、栈、队列、字符串、链表、树、图、堆、哈希表等。 数据结构是为实现对计算机数据有效使用的各种数据组织形式&#xff0c;服务于各类计算机操作。不同的…

BUUCTF [MRCTF2020]ezmisc 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 感谢Galaxy师傅供题。 密文&#xff1a; 下载附件&#xff0c;解压得到.png图片。 从这里也可以看出图片经过修改&#xff0c;无法正常显示。 解题思路&#xff1a; 1、在010 E…

【从浅识到熟知Linux】基本指定之find、grep、head和tail

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;一篇又一篇&#xff0c;学写越上头。 文章前言&#xff1a;本文介绍find、grep、head和tail指令用法并给出示例和截图。 文章目录 find基本…

华为ospf路由协议防环和次优路径中一些难点问题分析

第一种情况是ar3的/0/0/2口和ar4的0/0/2口发布在区域1时&#xff0c;当ar1连接ar2的线断了以后&#xff0c;骨干区域就断了&#xff0c;1.1.1.1到2.2.2.2就断了&#xff0c;ping不通了。但ar5和ar6可以ping通2.2.2.2和1.1.1.1&#xff0c;ar3和ar4不可以ping通2.2.2.2和1.1.1.1…

分布式锁,分布式锁应该具备哪些条件,分布式锁的实现方式有:基于Zookeeper实现、Redis实现、数据库实现

文章目录 分布式锁0-1分布式锁--包含CAP理论模型概述分布式锁&#xff1a;分布式锁应该具备哪些条件&#xff1a;分布式锁的业务场景&#xff1a; 分布式锁的实现方式有&#xff1a;基于Zookeeper - 分布式锁实现思想优缺点基于Redis - 分布式锁实现思想实现思想的具体步骤&…

新版画中画documentPictureInPicture API使用

关于该API&#xff0c;chrome dev有一篇比较好入门的文章&#xff0c;如果你没看过强烈推荐你先看这篇基础用法&#xff0c;该文章只针对API的特性和chrome dev文章进行扩展性说明。 提前说明&#xff0c;目前该API是非w3c草案功能&#xff0c;从chrome 116开始已经强推到stabl…

计算机网络四大地址转换(IP,MAC、端口、域名)

计算机网络有四大地址&#xff0c;分别是 ip地址、 MAC地址、域名、端口 计算机网络地址 他们之间是如何转换&#xff0c;通过什么协议转换的 IP地址到MAC地址&#xff0c;通过ARP协议 MAC地址得到IP地址&#xff0c;通过RARP协议 通过域名的到IP地址 是通过DNS查询 端口是…

Clion在Windows下build时出现undefined reference,即使cmake已经正确链接第三方库(如protobuf)?

你是否正在使用clion自带的vcpkg来安装了protobuf&#xff1f; 或者你是否自己使用visual studio自己编译了libprotobuf.lib&#xff1f; 你是否已经正确在CmakeLists.txt中添加了以下命令&#xff1a; find_package(Protobuf CONFIG REQUIRED) include_directories(${Protobu…

硬盘上不小心删除了重要文档?试试这6个成功率高的数据恢复工具!

您是否不小心重新格式化了存储卡或删除了想要保留的照片&#xff1f;最好的照片恢复软件可以提供帮助&#xff01;如果您使用数码相机拍摄的时间足够长&#xff0c;那么当您错误地删除了想要保留的图像、重新格式化了错误的 SD 卡&#xff0c;或者发现您的珍贵照片由于某种莫名…

STM32-SPI1控制AD7705(Sigma-Delta-ADC芯片)

STM32-SPI1控制AD7705&#xff08;Sigma-Delta-ADC芯片&#xff09; 原理图手册说明功能方框图引脚功能 片内寄存器通信寄存器&#xff08;RS2、RS1、RS00、0、0&#xff09;设置寄存器时钟寄存器数据寄存器&#xff08;RS2、RS1、RS00、1、1&#xff09;测试寄存器&#xff08…

EEG 脑电信号处理合集(2): 信号预处理

脑电信号在采集完以后&#xff0c;需要进行一系列的预处理操作&#xff0c;然后才能用于后续的科学研究和计算。预处理是脑电信号分析最基本且重要的一步。基于python环境MNE库。 1 使用带通滤波器&#xff0c;信号滤波&#xff0c;去噪&#xff0c;去工频干扰 data_path sam…

PyQt6运行QTDesigner生成的ui文件程序

2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计18条视频&#xff0c;包括&#xff1a;2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~、第2讲 PyQt6库和工具库Q…

广州华锐互动:AR可视化展示昆虫让教学过程更直观生动

随着科技的不断发展&#xff0c;AR&#xff08;增强现实&#xff09;技术已经逐渐走进我们的生活。通过AR技术&#xff0c;我们可以将虚拟的信息叠加到现实世界中&#xff0c;让现实世界变得更加丰富多彩。在这篇文章中&#xff0c;我们将以昆虫为主题&#xff0c;探讨AR增强现…