资源池化

特性简介

资源池化特性主要提供主备机共享一份存储的能力,提供一种新HA部署形态,解决传统HA部署下存储容量较单机翻倍的问题,满足降低存储容量及成本的诉求,同时备机支持实时一致性读。

架构介绍

资源池化整体架构图如下所示。

图 1 资源池化架构图

  • 磁阵设备并且已经安装ultrapath多路径软件,磁阵设备可用。

  • 分布式存储服务DSS(Distributed Storage Service)

    DSS组件分为DSSAPI和DSSSERVER。DSSSERVER是独立进程,直接管理磁阵裸设备,并对外提供类似分布式文件系统的能力;DSSAPI是动态库,集成在数据库内部。DSS组件通过共享内存和客户端API动态库,为数据库提供创建文件、删除文件、扩展和收缩文件、读写文件的能力。

  • 分布式内存服务DMS(Distributed Memory Service)

    DMS是动态库,集成在数据库内部,通过TCP/RDMA网络传输PAGE内容,将主备内存融合,提供内存池化能力,以此实现备机实时一致性读功能。

  • 主备页面交换通过RDMA加速,依赖CX5网卡,并且依赖OCK RDMA动态库。

功能特点

  • 主备共享一份数据,显著降低传统HA的存储容量。
  • 主备之间去除了日志复制功能,增加了主备页面交换功能,备机支持实时一致性读。
  • 默认情况下,主备之间是通过TCP网络进行页面实时交换。为了降低页面交换的延迟,可选通过OCK RDMA动态库加速备机实时一致性的性能。

适用场景与限制

  • 要求存储设备是磁阵,磁阵的LUN需要支持SCSI3的PR协议(包括PR OUT(“PERSISTENT RESERVE OUT”)PR IN(“PERSISTENT RESERVE IN”)和INQUIRY), 用于实现集群IO FENCE;除此之外, 还需要支持SCSI3的CAW协议(COMPARE AND WRITE), 用于实现共享磁盘锁。如Dorado 5000 V3磁阵设备。
  • 最高支持1主7备部署。
  • 由于资源池化依赖类似分布式文件系统的功能来实现备机实时一致性读能力,因此要求文件元数据变更越少越好。基于性能考虑,本特性只支持段页式表。
  • 只支持主备部署在同一磁阵设备上,不支持容灾部署,也不支持主备混合部署(如主和备部署在不同的磁阵设备上)。
  • 主备页面交换可选通过RDMA加速,依赖CX5网卡,并且依赖计算提供的OCK RDMA动态库。
  • 暂不支持备机重建及节点替换、节点修复等能力。
  • 不支持传统模式数据库和资源池化模式数据库相互升级。
  • 不支持ceph。

手动安装示例

与传统gs_initdb建库相比,资源池化建库将目录分为三种类型,每实例独占且不共享、每实例独占且共享、所有实例共享。其中需要共享的目录均需存放到磁阵设备上,而不共享的目录存放在本地盘上。另外备机建库只需要建隶属于自己的目录,不需要再次创建所有实例共享的目录结构。资源池化新增了相关GUC参数,以及将系统表存储方式从页式切换到段页式。

说明: 此处的单步手动安装是指工程编译之后,可单步执行相关命令进行资源池化建库。openGauss常规安装请参照《安装指南》。

  • 前置条件

    • 工程已完成代码编译,编译请参见软件安装编译
    • 主机已经挂载磁阵LUN设备,并且已经安装ultrapath多路径软件,磁阵设备可用。
  • 操作步骤

    1. 为磁阵LUN盘符创建软链接,并赋予相应的用户权限(假设磁阵LUN对应的盘符为/dev/sde, /dev/sdf)。

      sudo ln -s /dev/sde /dev/tpcc_data
      sudo ln -s /dev/sdf /dev/tpcc_log
      sudo chmod 777 /dev/tpcc_data
      sudo chmod 777 /dev/tpcc_log
      
    2. 为需要磁阵RAWIO权限的可执行文件赋权。

      sudo -i setcap CAP_SYS_RAWIO+ep 绝对路径/perctrl
      

      perctrl:用于对dss相关工具和进程赋予读写权限的可执行工具。

    3. 创建DSS服务端进程及建资源池化库需要的配置文件。

      测试目录(假设为/data/test)

      └─dss_home/
      ├── cfg
      │   ├── dss_inst.ini
      │   └── dss_vg_conf.ini
      └── log // 启动前需存在log目录
      

      dss_init.ini配置内容如下:

      INST_ID=0
      _LOG_LEVEL=55
      _LOG_BACKUP_FILE_COUNT=128
      _LOG_MAX_FILE_SIZE =20M
      LSNR_PATH=/data/test/dss_home
      STORAGE_MODE=RAID
      _SHM_KEY=12
      

      上述配置中参数说明如下:

      • INST_ID配置实例号,取值范围[0, 63],每个主备下的dssserver进程各不相同。
      • _LOG_LEVEL日志级别。
      • _LOG_BACKUP_FILE_COUNT日志文件最多保留的个数。
      • _LOG_MAX_FILE_SIZE为单个日志文件最大大小。
      • LSNR_PATH为DSS客户端与服务端之间通信使用的domain socket保存的目录,一般设为DSS服务端进程的家目录。
      • STORAGE_MODE为DSS对应的存储设备类型,磁阵的话配置为RAID。
      • _SHM_KEY共享内存KEY,需要保证每个DSS各不相同。

      dss_vg_conf.ini配置内容如下,

       data:/dev/tpcc_data
       log: /dev/tpcc_log
      

      表示+data目录的内容存放在/dev/tpcc_data设备上,+log目录内容存放在/dev/tpcc_log设备上。这里要注意下,约定通过根目录名是否有+字符区分是文件系统中的文件,还是DSS中的文件。用户可以把DSS当做类似分布式文件系统来看待。

    4. 使用DSS客户端工具(dsscmd)在磁阵设备上初始化VG(类似于在裸盘上初始化文件系统的操作)。

      # 清空磁阵LUN开头数据
      dd if=/dev/zero bs=2048 count=100000 of=/dev/tpcc_data
      dd if=/dev/zero bs=2048 count=100000 of=/dev/tpcc_log
      # 创建VG
      dsscmd cv -g data -v /dev/tpcc_data -s 2048 -D /data/ss_test/dss_home
      dsscmd cv -g log  -v /dev/tpcc_log -s 65536 -D /data/ss_test/dss_home
      # 拉起dssserver
      dssserver -D /data/ss_test/dss_home &
      
    5. 通过gs_initdb建立资源池化库。

      gs_initdb -D /data/ss_test/dn_primary --nodename=single_node -w Gauss_234 --vgname="+data,+log" --enable-dss --dms_url="0:127.0.0.1:1611,1:127.0.0.1:1711" -I 0 --socketpath="UDS:/data/ss_test/dss_home/.dss_unix_d_socket"
      

      其中新增5个相关参数:

      • --vgname 卷组名,指定资源池化库建在哪个卷组下,这个名字与dss_vg_conf.ini文件中的配置项相关,卷组名需要出现在配置文件中,并且以‘+’字符开头。
      • --enable-dss 表示资源池化库要建到DSS里。
      • --dms_url “0:127.0.0.1:1611,1:127.0.0.1:1711”,格式为instance_id:ip:port。
      • -I 指定当前节点的实例号,取值范围[0,63]。
      • --socketpath 指定DSS客户端(这里指集成到数据库相关可执行文件中的DSS客户端动态库)与服务端通信使用的unix domain socket存放的位置。
    6. 建资源池化库成功,通过gs_ctl start命令拉取数据库进程。

      gs_ctl start -D /data/ss_test/dn_primary
      
    7. 按照上述步骤再重新执行安装备机。

RDMA使用示例

资源池化特性提供备机实时一致性读功能,主备之间页面交换可选择通过RDMA加速。此章节简要描述如何在资源池化中开启RDMA通信功能。

  • 前置条件

    开启RDMA功能依赖CX5网卡,并且依赖OCK RPC动态库。

  • 操作步骤

    1. 获取OCK RPC包。

      从指定openGauss接口人处获取。

    2. 部署OCK RPC包。

      1. 解压OCK RPC包。

        tar -zxf OCK_platform_rpc_22.0.0_EulerOS-aarch64.tar.gz
        cd OCK_platform_rpc_22.0.0_EulerOS-aarch64_release
        tar -zxf OCK_platform_rpc_EulerOS_aarch64.tar.gz
        tar -zxf OCK_platform_rpc_sbin.tar.gz
        cp rpc_sbin/ock_rpc_opengauss.sh ./
        
      2. 修改部署脚本ock_rpc_opengauss.sh参数。

        # Deployment user, which is the same as the opengauss user. 
        # It is a non-root user. Ensure that this user exists on all servers.
        USER_NAME="${USER}"
        
        # Deployment server, which can contain native
        HOST_IP=(30.30.xx.7 30.30.xx.8)
        
        # Deployment package. The package name starts with OCK_platform_rpc.
        PACKAGES="OCK_platform_rpc_aarch64_EulerOS.tar.gz"
        
        # Specifies the path from the SCP package to the server. 
        # If the path does not exist, the path is automatically created.
        PATH_TO_SCP="/home/ock/test"
        
        # Opengauss environment variable
        GAUSSHOME="/home/ock/mppdb_temp_install"
        
        # OCK_RPC environment variable. Do not change
        OCK_RPC_LIB_PATH="${GAUSSHOME}/lib"
        

        脚本中涉及参数如下:

        1. USER_NAME:DN所在机器用户名。
        2. HOST_IP :集群机器ip,包括本机机器。
        3. PACKAGES: 获取到的ock rpc二进制包名(与机器操作系统架构匹配)。
        4. PATH_TO_SCP: 拷贝路径。
        5. GAUSSHOME: 同openGauss配置的环境变量GAUSSHOME一致。
        6. OCK_RPC_LIB_PATH:ock rpc二进制所在路径,资源池化会通过动态加载方式使用,请务必配置正确。
      3. 执行部署脚本ock_rpc_opengauss.sh。

        sh ock_rpc_opengauss.sh
        

        说明: 实现功能:

        • 完成集群中OCK RPC二进制包的部署,解压和拷贝。
        • 配置好相关的环境变量$OCK_RPC_LIB_PATH。
        • 配置集群节点UCX环境变量。(UCX为基于RDMA开发的通信组件,OCK RPC是在UCX基础上开发的适配资源池化的通信组件。)
      4. 配置其他参数环境变量。

        export UCX_ZCOPY_THRESH="32768"
        export UCX_USE_MT_MUTEX=n
        export UCX_NET_DEVICES=mlx5_1:1
        

        参数说明:

        1. UCX_ZCOPY_THRESH优化参数,RDMA传输过程中减少内存申请。单位:byte。默认值:32768。(可选参数,建议默认值)。

        2. UCX_USE_MT_MUTEX优化参数,RDMA发送过程中保证数据一致性锁的类型,n:原子锁;y:互斥锁。(可选参数,建议使用原子锁,性能较好)。

        3. UCX_NET_DEVICES,UCX配置参数,用于指定网卡端口,可安装mlnx_ofed驱动,使用ibdev2netdev命令查看当前RDMA活动端口。(建议指定活动端口)。

          说明: 环境变量配置完之后,执行 source ~/.bashrc

    3. 执行1~5完成gs_initdb建库。

    4. 修改postgresql.conf配置文件。

      配置ss_interconnect_type=RDMA,添加配置项ss_rdma_work_config与ss_ock_log_path。参数说明及配置请参见资源池化参数

      示例:

      ss_interconnect_type=RDMA
      ss_rdma_work_config ='6 10'     (OCK RDMA使用用户态poll方式,并绑定cpu [6 10],空格分开)
      ss_ock_log_path=“/home/ock_test/log”(OCK RDMA 消息通信过程日志记录)
      
    5. 执行gs_ctl start命令拉取数据库进程。

      gs_ctl start -D /data/ss_test/dn_primary
      

SCRLock使用示例

介绍

SCRLock,全称smart cached remote lock,是一个带有本地锁缓存的分布式锁SDK。本章节主要介绍openGauss数据库SCRLock特性的安装使用,指导用户顺利完成操作。在资源池化场景下使用SCRLock提供分布式锁能力,提高分布式锁性能。

安装准备

获取安装包

请通过openGauss社区获取UWAL安装包:Link。

环境要求

表 1 环境要求

项目

配置描述

说明

网卡

具体型号根据实际情况确定,例如Mellanox的CX4/CX5系列网卡。

需要支持RDMA和以太网并开启RDMA协议,开启RDMA协议的具体步骤请参见《RDMA网络指导》

操作系统

  • Arm
    • openEuler 22.03 LTS
    • openEuler 20.03 LTS
    • openEuler 20.03 LTS SP1
    • openEuler 20.03 LTS SP3
  • x86
    • openEuler 22.03 LTS
    • openEuler 20.03 LTS
    • openEuler 20.03 LTS SP1
    • openEuler 20.03 LTS SP3

同一SP版本,因内核小版本不一致,或存在内核组件安装时报不兼容错误,需要修改OS weak-modules脚本,具体修改方法请参见《OS兼容性weak-modules脚本修改方法》

软件

MLNX_OFED_LINUX

开启RDMA协议,需要安装RDMA网卡驱动。OS和OFED的配套关系请参见表2

  • OCK_scrlock_openEuler-20.03-LTS-SP1-aarch64.tar.gz
  • OCK_scrlock_openEuler-20.03-LTS-SP1-x86_64.tar.gz
  • OCK_scrlock_openEuler-20.03-LTS-SP3-aarch64.tar.gz
  • OCK_scrlock_openEuler-20.03-LTS-SP3-x86_64.tar.gz
  • OCK_scrlock_openEuler-20.03-LTS-aarch64.tar.gz
  • OCK_scrlock_openEuler-20.03-LTS-x86_64.tar.gz
  • OCK_scrlock_openEuler-22.03-LTS-aarch64.tar.gz
  • OCK_scrlock_openEuler-22.03-LTS-x86_64.tar.gz

SCRLock安装包。openEuler-22.03-LTS-SP1、openEuler-22.03-LTS表示操作系统,aarch64、x86_64表示服务器架构,具体SCRLock安装包请用户根据实际情况选择。

表 2 OS和OFED配套关系

OS版本

OFED版本

x86

Arm

openEuler 20.03 LTS

MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler20.03-x86_64.tgz

MLNX_OFED_LINUX-5.4-3.1.0.0-openeuler20.03-aarch64.tgz

openEuler 20.03 LTS SP1

MLNX_OFED_LINUX-5.4-3.6.8.1-openeuler20.03sp1-x86_64.tgz

MLNX_OFED_LINUX-5.4-3.1.0.0-openeuler20.03sp1-aarch64.tgz

openEuler 20.03 LTS SP3

MLNX_OFED_LINUX-5.8-1.1.2.1-openeuler20.03sp3-x86_64.tgz

MLNX_OFED_LINUX-5.8-1.1.2.1-openeuler20.03sp3-aarch64.tgz

openEuler 22.03 LTS

MLNX_OFED_LINUX-5.8-1.1.2.1-openeuler22.03-x86_64.tgz

MLNX_OFED_LINUX-5.8-1.1.2.1-openeuler22.03-aarch64.tgz

安装卸载

一键部署SCRLock特性

SCRLock提供简易部署脚本,输入安装路径、安装用户和安装的节点信息,即可一键部署。

  • 前置条件

    • 开启RDMA功能依赖CX4/CX5网卡。
    • openGauss已部署完成。
    • 获取对应操作系统和CPU架构的SCRLock安装包,例如:OCK_scrlock_openEuler-20.03-LTS-SP1-aarch64.tar.gz。
    • 主备节点已存在“${GAUSSHOME}/lib“目录。
    • 所有需要部署SCRLock的服务器,需要相同的用户和密码,并且该用户需要具备执行rmmodrpmdepmodmodprobe命令权限。
  • 操作步骤

    1. 以<SCRLock-install-user>登录节点并上传安装包,在安装包所在目录执行以下命令解压缩安装包。

      tar -xzvf OCK_scrlock_openEuler-20.03-LTS-SP1-aarch64.tar.gz
      

      解压目录内的文件如下。

      文件名

      说明

      OCK_scrlock_openEuler_aarch64.tar.gz

      源文件

      OCK_scrlock_openEuler_aarch64.tar.gz.txt

      签名文件

      OCK_scrlock_openEuler_aarch64.tar.gz.cms

      描述文件

    2. 解压源文件压缩包。

      tar -xzvf OCK_scrlock_openEuler_aarch64.tar.gz
      

      解压后得到如下文件。

      文件名

      说明

      scrlock_lib

      so文件

      scripts

      安装脚本

      umdk_rpm

      rpm依赖包

      bin

      签名验证文件

    3. 使用“bin“目录下的verification二进制,进行软件包签名验证。

      ./bin/verification OCK_scrlock_openEuler_aarch64.tar.gz OCK_scrlock_openEuler_aarch64.tar.gz.cms OCK_scrlock_openEuler_aarch64.tar.gz.txt
      

      说明: verification可执行二进制需要三个参数,按先后顺序分别是:源文件、签名文件、描述文件。

      • 验证成功控制台会输出:

        Starting to verify OCK_scrlock_openEuler_aarch64.tar.gz...
        Verify the source file passed.
        Verify the sha file passed.
        
      • 验证失败控制台会输出:

        Starting to verify OCK_scrlock_openEuler_aarch64.tar.gz...
        ...
        Verify the source file failed.
        

        或者

        Starting to verify OCK_scrlock_openEuler_aarch64.tar.gz...
        ...
        Verify the sha file failed.
        

        说明: 校验失败说明此安装包已被篡改,建议重新获取安装包后再次校验。

    4. 安装包验证成功后,进入“scripts“目录,准备执行部署脚本。

      cd scripts
      
    5. 执行部署脚本,并根据提示输入<SCRLock-install-user>密码。

      sh scrlock_install.sh -H '192.168.4.164 192.168.4.165 192.168.4.166' -U omm -G dbgrp -D /home/omm/lib
      

      说明:

      • -H:集群IP地址。例如:'192.168.4.164 192.168.4.165 192.168.4.166'
      • -U:数据库管理用户名。例如:omm
      • -G:数据库管理用户组。例如:dbgrp
      • -D:“${GAUSSHOME}/lib“库路径。例如:“/home/omm/lib“
      • -h:查看帮助信息。 由于部署脚本的操作需要高权限用户,请在操作执行完成后关闭高权限用户SSH远程登录服务器的权限,以提升系统安全性。
    6. 切换至数据库管理用户。

      su - omm
      
    7. (可选)kill om_monitor进程。

      gs_om -t killmonitor
      
    8. 加载环境变量。

      source ~/.bashrc
      

      须知: 68也需要在备节点执行。

启用SCRLock特性

启用SCRLock特性,需要通过修改配置文件,重启数据库使其生效。

  • 前提条件
    • 主备节点已安装包含SCRLock特性的openGauss版本。
    • 已完成SCRLock特性的一键部署。
  • 操作步骤
    1. 以数据库管理用户登录管理节点。

    2. 配置数据库的postgresql.conf文件。

      1. 打开postgresql.conf文件。

        vim postgresql.conf
        
      2. 按“i”进入编辑模式,找到如下参数,根据实际情况进行修改。参数说明请参见表1

        ss_enable_scrlock = off
        ss_enable_srclock_sleep_mode = off
        ss_scrlock_server_port = 8000
        ss_scrlock_worker_count = 2
        ss_scrlock_worker_bind_core = ''
        ss_scrlock_server_bind_core = ''
        

        表 1 SCRLock的配置参数

        参数名称

        参数类型

        参数说明

        取值范围

        默认值

        ss_enable_scrlock

        布尔型

        用于开启或关闭SCRLock。

        • on,表示开启SCRLock。
        • off,表示关闭SCRLock。

        off

        ss_enable_scrlock_sleep_mode

        布尔型

        用于开启或关闭SCRLock睡眠模式。

        • on,表示开启睡眠模式。
        • off,表示关闭睡眠模式。

        on

        ss_scrlock_server_port

        整型

        表示SCRLock服务端侦听端口号。

        1024~65535

        8000

        ss_scrlock_worker_count

        整型

        表示SCRLock客户端worker数量。

        2~16

        2

        ss_scrlock_worker_bind_core

        字符串

        表示SCRLock worker占用起止CPU。

        "开始CPU编号 结束CPU编号",CPU编号中间空格分开,例如:"10 15"

        ""

        ss_scrlock_server_bind_core

        字符串

        表示SCRLock server占用起止CPU。

        "开始CPU编号 结束CPU编号",CPU编号中间空格分开,例如:"10 15"

        ""

      3. 按“Esc”键,输入 :wq!,按“Enter”保存并退出编辑。

    3. 重启数据库使SCRLock特性生效。

      1. 停止openGauss。

        cm_ctl stop
        
      2. 启动openGauss。

        cm_ctl start
        

        说明: 如果启动失败请根据openGauss日志目录下的“postgresql-YYYY-MM-DD_HHMMSS.log”日志信息排查错误。

    4. 验证SCRLock特性是否启用成功。

      gsql -d postgres -p 16600 -c "show ss_enable_scrlock"
      

      如果回显如下内容,则启用成功。

      ss_enable_scrlock
      -------------------
      on
      (1 row)
      

      说明:

      • -p 16600:16600为数据库端口号,请根据实际情况修改。
      • 如需查看启用SCRLock特性的日志文件,可以执行以下命令动态查看最后20行。
      tail -fn20 ${GAUSSLOG}/pg_log/scrlock*.log
      

关闭SCRLock特性

关闭SCRLock特性,需要重启数据库使配置生效。

  • 操作步骤
    1. 配置数据库根目录下的postgresql.conf文件。

      1. 打开postgresql.conf文件。

        vim postgresql.conf
        
      2. 按“i”进入编辑模式。将参数“ss_enable_scrlock“的值改为“off“,关闭SCRLock特性。

        ss_enable_scrlock = off
        
      3. 按“Esc”键,输入 :wq!,按“Enter”保存并退出编辑。

    2. 停止openGauss。

      cm_ctl stop
      
    3. (可选)如需卸载SCRLock特性可执行此步骤。删除SCRLock动态库文件,并清除环境变量。

      rm -f /home/omm/lib/libscrlock.so
      unset OCK_SCRLOCK_LIB_PATH
      

      其中,“/home/omm/lib/”表示libscrlock.so所在目录的绝对路径。

    4. 重启openGauss。

      cm_ctl start
      
意见反馈
编组 3备份
    openGauss 2024-04-27 00:42:12
    取消