暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

如何在小内存服务器上玩转 OB 企业版部署

1621


概述

本文主要分享如何在 10C24G 的虚拟机上部署企业版 OCP ,并通过 OCP 在同样规格的虚拟机上部署 OB 企业版 集群。
 
OB 展示了社区版在 2C8G 的资源规格上的能力,企业版说的很少。倒不是 OB 企业版做不到,而是企业版 OB 的运维平台 OCP 对资源要求颇高。这可能让不少初学者有点失望。虽然社区版也可以用,但是只有企业版才有 ORACLE 租户(兼容ORACLE) 能力,并且 OCP 的运维和诊断功能对学习 OB 也非常有帮助。此外,OBCP 的学习和认证都要使用到 OB 企业版周边工具 ,如 OCP、ODC、OMS 等。
 

本文分享展示了如何在 10C24G 的虚拟机上部署企业版 OCP ,这个过程并不会顺利(否则,官网也不会要求服务器资源规格那么高)。这期间会碰到很多问题,本文会分析这些问题的原理或者解决办法。这些问题的解决方法思路在后期使用 OCP 运维 OB 的时候也会很有帮助。或者说这些问题也能帮助我们加深对企业版 OCP 和 OB 的理解。

本文并不是严格的安装部署文档,建议参考之前也看一遍官方安装文档:https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000943776

 由于下载的企业版不是最新版本,文中观点都是个人观点。如有不当,欢迎留言指出。谢谢!


OCP 安装部署

服务器资源

服务器资源是有 2 台, 10C24G,120G 磁盘 。一台部署 OCP (10.0.0.63),一台部署 OB (10.0.0.62)。部署 OB的虚拟机其实 10G 也就够了,有 24G 后面可以创建多个租户或者做一些性能测试。
OCP 服务器的资源使用主要是 OCP 容器、OBProxy 容器和元数据库 OB容器。后来 OBProxy 容器由于只有一个 obproxy进程,就合并到 OB 容器中。OB容器的镜像是 OB企业版2.27版本,OCP 主要使用它的 MySQL租户(兼容MySQL)功能。所以这个 OB容器其实也可以用社区版替换掉。毕竟社区版的最新版本 4.1 已经发布并且在 4C8G 上的性能也相比 OB 2.2企业版提高了很多。
官网介绍企业版部署 OCP 会使用另外一个产品 OAT 。OAT 会将 OB相关服务器、OB相关产品(OCP、ODC、OMS)的部署都管理起来。后面会先介绍官网推荐的企业版部署方法。

服务器配置

硬件配置

下面的硬件配置信息仅供参考。 
  • CPU
    [root@OB03 t-oceanbase-antman]# lscpu
    Architecture: x86_64
    CPU op-mode(s): 32-bit, 64-bit
    Byte Order: Little Endian
    CPU(s): 10
    On-line CPU(s) list: 0-9
    Thread(s) per core: 1
    Core(s) per socket: 1
    Socket(s): 10
    NUMA node(s): 1
    Vendor ID: GenuineIntel
    CPU family: 6
    Model: 63
    Model name: Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz
    Stepping: 2
    CPU MHz: 2399.998
    BogoMIPS: 4799.99
    Hypervisor vendor: VMware
    Virtualization type: full
    L1d cache: 32K
    L1i cache: 32K
    L2 cache: 256K
    L3 cache: 20480K
    NUMA node0 CPU(s): 0-9
    Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm invpcid_single ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt arat spec_ctrl intel_stibp arch_capabilities
    • 内存
    虚拟机是 24G 内存,OS 实际可用内存大概 22G 。
      [root@OB03 t-oceanbase-antman]# grep MemTotal proc/meminfo
      MemTotal:       24688000 kB

      内核参数

      内核参数是官网公开的配置。
        #  for oceanbase
        net.core.somaxconn = 2048
        net.core.netdev_max_backlog = 10000
        net.core.rmem_default = 16777216
        net.core.wmem_default = 16777216
        net.core.rmem_max = 16777216
        net.core.wmem_max = 16777216




        net.ipv4.ip_local_port_range = 3500 65535
        net.ipv4.ip_forward = 0
        net.ipv4.conf.default.rp_filter = 1
        net.ipv4.conf.default.accept_source_route = 0
        net.ipv4.tcp_syncookies = 0
        net.ipv4.tcp_rmem = 4096 87380 16777216
        net.ipv4.tcp_wmem = 4096 65536 16777216
        net.ipv4.tcp_max_syn_backlog = 16384
        net.ipv4.tcp_fin_timeout = 15
        net.ipv4.tcp_max_syn_backlog = 16384
        net.ipv4.tcp_tw_reuse = 1
        net.ipv4.tcp_slow_start_after_idle=0
        net.ipv4.ip_local_reserved_ports = 62881-63881




        vm.swappiness = 0
        kernel.core_pattern = data/1/core-%e-%p-%t
        vm.min_free_kbytes = 2097152
        vm.overcommit_memory = 0




        fs.aio-max-nr=1048576
        vm.max_map_count=655360
        #vm.nr_hugepages = 8200

        这里我在配置中禁用了 LINUX 的大页机制。

        文件系统

        不管是 OCP 服务器还是 OB 服务器,都建议有两个独立的文件系统  /data/1 和  /data/log1 。一个放 OB 数据文件,一个放 OB 日志文件。OCP 的元数据库也是 OB,跟 OCP 部署在同一个服务器上(生产环境可以分离部署)。这里 OCP 服务器还有个 docker 软件存储目录  /docker 。

          sdb               8:16   0  120G  0 disk
          └─sdb1 8:17 0 120G 0 part
          ├─centos-lv0 253:2 0 70G 0 lvm data/1
          └─centos-lv1 253:3 0 46G 0 lvm data/log1

          OB 软件

          OB 企业版软件下载地址:https://www.oceanbase.com/softwarecenter-enterprise

          下载的软件如下:

            [root@OB03 ob]# ls -lrth
            total 5.0G
            -rwxr-xr-x 1 root root 597M Apr 4 11:05 oat_3.2.0_20220819_x86.tgz
            -rwxr-xr-x 1 root root 86M Apr 4 11:06 ob-loader-dumper-4.0.1-SNAPSHOT.zip
            -rwxr-xr-x 1 root root 802M Apr 4 11:09 obodc4.1.2.tar.gz
            -rwxr-xr-x 1 root root 21M Apr 4 11:09 obproxy-3.2.9.0-20230116143405.el7.x86_64.rpm
            -rwxr-xr-x 1 root root 642M Apr 4 11:12 oceanbase-3.2.4.1-101000052023010822.el7.x86_64.rpm
            -rwxr-xr-x 1 root root 3.2M Apr 4 11:12 oceanbase-client-2.4.0.jar
            -rwxr-xr-x 1 root root 213M Apr 4 11:17 oma-3.4.0.tar.gz
            -rw-r--r-- 1 root root 197M Apr 6 09:45 t-oceanbase-antman-1.4.2-20220430002909.alios7.x86_64.rpm
            -rw-r--r-- 1 root root 1.5G Apr 6 10:22 metaob_OB2277_OBP320_x86_20220429.tgz
            -rwxr-xr-x 1 root root 962M Apr  6 10:22 ocp334.tar.gz


            部署 docker

            OB 要通过 OCP 自动化部署,OCP 的部署使用到 Docker 技术。企业版用产品 OAT 来自动化部署 OCP。OAT 的部署也是要用到 Docker 技术。并且都要求 Docker 版本不低于 19.0。

            下面是 Docker 的部署过程。

            • 卸载旧的 docker 版本

              sudo yum remove docker \
              docker-client \
              docker-client-latest \
              docker-common \
              docker-latest \
              docker-latest-logrotate \
              docker-logrotate \
                      docker-engine
              • 在线安装新版本
                sudo yum install -y yum-utils \
                device-mapper-persistent-data \
                  lvm2

                docker 的 yum 仓库建议使用阿里云的国内源更快。

                  sudo yum-config-manager \
                  --add-repo \
                  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo




                  sudo yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
                  systemctl start docker


                  [root@OB03 yum.repos.d]# docker --version
                  Docker version 23.0.3, build 3e7cbfd
                  [root@OB03 ob]# systemctl status docker
                  ● docker.service - Docker Application Container Engine
                  Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
                  Active: active (running) since Thu 2023-04-06 09:09:35 CST; 24s ago
                  Docs: https://docs.docker.com
                  Main PID: 12142 (dockerd)
                  Tasks: 14
                  Memory: 23.6M
                  CGroup: system.slice/docker.service
                  └─12142 usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock




                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.524621721+08:00" level=info msg="[core] [Channel #4 SubChannel #5] Subchannel Connectivity change to READY" module=grpc
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.524644961+08:00" level=info msg="[core] [Channel #4] Channel Connectivity change to READY" module=grpc
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.548434296+08:00" level=info msg="Loading containers: start."
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.867217989+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemo...d IP address"
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.945262815+08:00" level=info msg="Loading containers: done."
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.965295713+08:00" level=info msg="Docker daemon" commit=59118bf graphdriver=overlay2 version=23.0.3
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.965445413+08:00" level=info msg="Daemon has completed initialization"
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.982764158+08:00" level=info msg="[core] [Server #7] Server created" module=grpc
                  Apr 06 09:09:35 OB03 systemd[1]: Started Docker Application Container Engine.
                  Apr 06 09:09:35 OB03 dockerd[12142]: time="2023-04-06T09:09:35.992431130+08:00" level=info msg="API listen on run/docker.sock"
                  Hint: Some lines were ellipsized, use -l to show in full.


                  部署 OAT

                  OB 企业版周边产品(OCP、OMS、ODC)都是推荐用产品 OAT 部署。

                  OAT 的部署介绍详细参考官方文档:https://www.oceanbase.com/docs/enterprise-oat-doc-cn-10000000000603664

                  下面是过程中关键步骤说明。

                  启动 OAT docker 容器

                  首先加载 OAT 镜像。

                    mkdir -p oat_dir
                    docker load -i oat_3.2.0_20220819_x86.tgz




                    [root@OB03 ob]# docker images
                    REPOSITORY TAG IMAGE ID CREATED SIZE
                    reg.docker.alibaba-inc.com/oceanbase/oat 3.2.0_20220819_x86 ed24d1cd4382 7 months ago 1.27GB

                    启动 OAT 容器。

                      oat_image=`docker images | grep oat | awk '{printf $1":"$2"\n"}'`
                      docker create --name oat -v data_dir:/data -p 7000:7000 --restart on-failure:5 $oat_image
                      docker start oat
                      [root@OB03 ob]# docker ps
                      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
                      468da175a818 reg.docker.alibaba-inc.com/oceanbase/oat:3.2.0_20220819_x86 "/oat/distribution/p…" 15 seconds ago Up 7 seconds 3306/tcp, 0.0.0.0:7000->7000/tcp, :::7000->7000/tcp oat
                      启动成功后,有监听  7000 。
                        [root@OB03 ob]# netstat -ntlp |grep 7000
                        tcp 0 0 0.0.0.0:7000 0.0.0.0:* LISTEN 13991/docker-proxy
                        tcp6       0      0 :::7000                 :::*                    LISTEN      13997/docker-proxy


                        登录使用 OAT

                        登录地址:http://10.0.0.63:7000/login

                        默认登录方式:

                        • 用户名:admin
                        • 密码:aaAA11__

                        第一次登录要改密码。


                        添加服务器

                        这个服务器是用于部署 OCP 或其他产品的。
                        • 添加凭据
                        生产环境凭据建议用公钥认证或者配置免密方式。这里测试环境直接用密码。
                         
                        点击“确定”,生成任务。
                        OAT 产品思路也是自动化运维思路,运维任务会被拆分为很多步骤。每一步都有相应日志,如果失败了可以查看日志,修复后重跑或跳过处理。

                        添加服务器任务失败,原因是服务器 CPU 和内存小于 32C128G 。
                        可见企业版对 OCP 部署的服务器要求更高,这里不知道如何修改代码,只好放弃使用 OAT 部署 。

                        随后清理 OAT 相关容器。
                          docker stop oat
                          docker rm oat
                           

                          手动部署 OCP

                          下面改为使用企业版命令行部署工具  antman 产品来部署 OCP 。OAT 的 OCP 部署步骤大体上跟  antman 手动部署 OCP 过程相同。详细部署文档请参考官网:https://www.oceanbase.com/docs/enterprise-oceanbase-ocp-cn-10000000000817979 
                           

                          安装 antman RPM 包

                          直接安装 RPM 包。
                            yum -y localinstall t-oceanbase-antman-1.4.2-20220430002909.alios7.x86_64.rpm
                            安装后软件目录默认在:/root/t-oceanbase-antman 。
                             

                            创建配置文件

                            首先要初始化一个 antman 配置文件。
                              sh init_obcluster_conf.sh
                              根据提示填写,这里选择单节点安装,调整 OCP、OB的 docker 镜像名称以及 Docker 资源。
                               
                              下面是配置文件的被修改部分。
                                 1 ## obcluster.conf
                                2 ##
                                3 SINGLE_OCP_MODE=TRUE
                                4 ################################ 根据环境必须修改 MUST CHANGE ACCORDING ENVIRONMENT ################################
                                5 ############ 填写机器IP和 metaob 容器内的root/admin密码 Edit Machine IP and Password Of root/admin ############
                                6 ZONE1_RS_IP=10.0.0.63
                                7 OBSERVER01_ROOTPASS='aaAA11__' # metaob容器使用,非宿主机账号,宿主机SSH信息请使用指定环境变量的方式,详见 install.sh -h
                                8 OBSERVER01_ADMINPASS='aaAA11__'
                                9




                                11 ############ 填写负载均衡配置 Edit Configuration of Load Balance ############
                                12 # LB_MODE: nlb/dns/f5/none, default: dns for 3 ocp, none for 1 ocp 20220418 增加 nlb 支持
                                13 LB_MODE=none




                                44 ############ 根据服务器CPU、内存设置容器资源编排 Allocate Container Resources According To Server ############
                                45 OB_DOCKER_CPUS=32
                                46 OB_DOCKER_MEMORY=18G
                                47 OB_SYSTEM_MEMORY=3G # Do not modify OS_SYSTEM_MEMORY unless you know what you are doing!
                                48 OCP_DOCKER_CPUS=6
                                49 OCP_DOCKER_MEMORY=4G
                                50 OBPROXY_DOCKER_CPUS=4
                                51 OBPROXY_DOCKER_MEMORY=1G
                                52




                                54 ############ 填写OCP各组件容器的版本信息 Edit Docker Image, Repo And Tag of OCP Components ############
                                55 # OB docker
                                56 OB_DOCKER_IMAGE_PACKAGE=metaob_OB2277_OBP320_x86_20220429.tgz
                                57 OB_IMAGE_REPO=reg.docker.alibaba-inc.com/antman/ob-docker
                                58 OB_IMAGE_TAG=OB2277_OBP320_x86_20220429
                                59 # OCP docker
                                60 OCP_DOCKER_IMAGE_PACKAGE=ocp334.tar.gz
                                61 OCP_IMAGE_REPO=reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one
                                62 OCP_IMAGE_TAG=3.3.4-20221202162515
                                配置文件主要是指定加载的相关镜像,容器资源信息。容器只有 OCP 和 OB 容器。
                                 

                                单步安装

                                使用 OceanBase 提供的 工具  antman 在命令行下部署 OCP 相关组件。
                                下面是安装命令帮助。
                                  [root@OB03 t-oceanbase-antman]# ./install.sh -h
                                  NOTE:
                                  Please generate config file with init_obcluster_conf.sh before run this script.
                                  Script will read SSH_AUTH, SSH_USER, SSH_PORT, SSH_PASSWORD, SSH_KEY_FILE from env if exist
                                  SSH_AUTH can be set either "password" or "pubkey"
                                  SSH_KEY_FILE is take effect only when SSH_AUTH=pubkey
                                  If SSH_USER is not "root", make sure the user can execute [sudo bash] without password and etc/sudoers has no requiretty setting.
                                  The default value is:
                                  SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD='' SSH_KEY_FILE=/root/.ssh/id_rsa




                                  Usage: ./install.sh [OPTIONS]




                                  Options:
                                  -h, --help Print help and exit
                                  -d, --debug Print debug information
                                  -V, --version Print version
                                  -i, --install-steps string For example 1,3-5,7-
                                  -c, --clear-steps string For example 1,3-5,7-
                                  -r, --replace product_name old_repo_tag For example: odc reg.docker.alibaba-inc.com/oceanbase/odc-server:3.2.0
                                  -f, --config-file string Read in a config file
                                  -l, --load-balance Load balance mode




                                  Steps:
                                  1. check ssh authorization
                                  2. install load balancer (default: dns for clustered ocp, none for single ocp)
                                  3. install ob server
                                  4. init ocp metadb
                                  5. install temp OCP
                                  6. install obproxy
                                  7. install OCP
                                  8. POSTCHECK
                                  9. install OMS (optional)
                                  10. install ODC (optional)
                                  11. install OCP Grafana (optional)
                                  12. install OCP Opensearch (optional)

                                  这里有很多步骤,根据需要使用。有些步骤可以跳过。

                                  1.检查 ssh 权限

                                  检查安装服务期到目标服务器的 ssh 连通性。可以提前打通通道,或者设置密码环境变量。
                                    export SSH_PASSWORD=123456
                                    输出:
                                      [root@OB03 t-oceanbase-antman]# sh install.sh -i 1
                                      run install.sh with DEBUG=FALSE, INSTALL_STEPS=1 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                      [2023-04-06 10:33:22.753104] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                      [2023-04-06 10:33:22.756709] INFO [conf file is upper case format.]
                                      [2023-04-06 10:33:24.807404] INFO [start antman API service]
                                      [2023-04-06 10:33:24.856561] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                      LB_MODE=none
                                      [2023-04-06 10:33:25.131512] INFO [step1: check ssh authorization, logfile: root/t-oceanbase-antman/logs/ssh_auth.log]
                                      [2023-04-06 10:33:25.305833] INFO [step1: ssh authorization done]
                                       

                                      2.安装 OCP 元数据库

                                      这个是 OCP 的元数据库容器,也是一个 OB 数据库 Docker 镜像,版本 V2.2.7 。由于元数据库只有 OCP 自己用,所以官方并不会经常去更新这个版本。OCP的元数据库都是 MySQL 租户,所以这个元数据库理论上也可以换成 OB 社区版最新版。

                                      注意:生产库,OCP 的元数据库不要跟业务共用。

                                       
                                      输出:

                                        [root@OB03 t-oceanbase-antman]# ./install.sh -i 3
                                        run install.sh with DEBUG=FALSE, INSTALL_STEPS=3 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                        [2023-04-06 10:32:03.590593] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                        [2023-04-06 10:32:03.594926] INFO [conf file is upper case format.]
                                        [2023-04-06 10:32:05.645495] INFO [start antman API service]
                                        [2023-04-06 10:32:05.695376] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                        LB_MODE=none
                                        [2023-04-06 10:32:05.988876] ERROR [docker ob avail tenant memory is (18 - 3)G, docker memory limit(18G) too small.]

                                        报错,提示可用于创建容器内存太小。

                                        修改安装文件  install.sh
                                        绕过这个限制。修改1561 行。

                                         

                                        重新运行,再次失败。

                                          [2023-04-06 10:38:23.906242] INFO [RANDOM_PROXY_PASSWORD is TRUE]
                                          [2023-04-06 10:38:23.935674] INFO [start container: docker run -d -it --cap-add SYS_RESOURCE --name META_OB_ZONE_1 --net=host -e OBCLUSTER_NAME=obcluster -e DEV_NAME=ens192 -e ROOTSERVICE_LIST="10.0.0.63:2882:2881" -e DATAFILE_DISK_PERCENTAGE=90 -e CLUSTER_ID=1680747944 -e ZONE_NAME=META_OB_ZONE_1 -e OBPROXY_PORT=2883 -e MYSQL_PORT=2881 -e RPC_PORT=2882 -e OCP_VIP=10.0.0.63 -e OCP_VPORT=8080 -e app.password_root='aaAA11__' -e app.password_admin='aaAA11__' -e OBPROXY_OPTSTR="obproxy_sys_password=81cfb7555c750488a15e86024b8960d6faf41943,observer_sys_password=f8d6a7e700ad3dc9b332b1a8ec3bab24c7386df1,enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=4G,client_max_connections=16384,enable_compression_protocol=false" -e OPTSTR="cpu_count=32,system_memory=3G,memory_limit=12G,__min_full_resource_pool_memory=1073741824,_ob_enable_prepared_statement=false,memory_limit_percentage=90" --cpu-period 100000 --cpu-quota 3200000 --cpuset-cpus 0-31 --memory 18G -v home/admin/oceanbase:/home/admin/oceanbase -v data/log1:/data/log1 -v data/1:/data/1 --restart on-failure:5 reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429]
                                          docker: Error response from daemon: Requested CPUs are not available - requested 0-31, available: 0-9.
                                          See 'docker run --help'.
                                          [2023-04-06 10:38:24.028353] INFO [installing OB docker and starting OB server on 10.0.0.63, pid: 29402, log: root/t-oceanbase-antman/logs/install_OB_docker.log and home/admin/logs/ob-server/ inside docker]
                                          [2023-04-06 10:38:24.471394] ERROR [install_OB_docker.sh finished but reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429 NOT started on 10.0.0.63]
                                          [2023-04-06 10:38:24.475061] ERROR [ANTMAN-303: OB docker on 10.0.0.63 is NOT started]
                                          [2023-04-06 10:38:24.487297] ERROR [ANTMAN-314: ERROR occurred in install_ob, install.sh exit]

                                          还需要修改 OB Docker 容器的启动参数里的 CPU,限制一下里面的 OB 和 OCP 的 CPU。从这也可以看出 Docker 不支持 CPU 的超额分配。

                                           
                                            [root@OB03 t-oceanbase-antman]# ./install.sh -i 3
                                            run install.sh with DEBUG=FALSE, INSTALL_STEPS=3 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                            [2023-04-06 10:53:52.477570] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                            [2023-04-06 10:53:52.481924] INFO [conf file is upper case format.]
                                            [2023-04-06 10:53:54.535820] INFO [start antman API service]
                                            [2023-04-06 10:53:54.585700] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                            LB_MODE=none
                                            OCP_VERSION is 3.3.4
                                            [2023-04-06 10:53:55.609266] INFO [step3: check whether OBSERVER port 2881,2882 are in use or not on 10.0.0.63]
                                            [2023-04-06 10:53:56.307446] INFO [step3: OBSERVER port 2881,2882, 2022 are idle on 10.0.0.63]
                                            [2023-04-06 10:53:56.311096] INFO [step3: installing ob cluster, logfile: root/t-oceanbase-antman/logs/install_ob.log]
                                            [2023-04-06 10:54:11.927849] INFO [load docker image: docker load -i root/t-oceanbase-antman/metaob_OB2277_OBP320_x86_20220429.tgz]
                                            Loaded image: reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429
                                            [2023-04-06 10:54:42.195708] INFO [RANDOM_PROXY_PASSWORD is TRUE]
                                            [2023-04-06 10:54:42.225063] INFO [start container: docker run -d -it --cap-add SYS_RESOURCE --name META_OB_ZONE_1 --net=host -e OBCLUSTER_NAME=obcluster -e DEV_NAME=ens192 -e ROOTSERVICE_LIST="10.0.0.63:2882:2881" -e DATAFILE_DISK_PERCENTAGE=90 -e CLUSTER_ID=1680747944 -e ZONE_NAME=META_OB_ZONE_1 -e OBPROXY_PORT=2883 -e MYSQL_PORT=2881 -e RPC_PORT=2882 -e OCP_VIP=10.0.0.63 -e OCP_VPORT=8080 -e app.password_root='aaAA11__' -e app.password_admin='aaAA11__' -e OBPROXY_OPTSTR="obproxy_sys_password=81cfb7555c750488a15e86024b8960d6faf41943,observer_sys_password=f8d6a7e700ad3dc9b332b1a8ec3bab24c7386df1,enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=1G,client_max_connections=16384,enable_compression_protocol=false" -e OPTSTR="cpu_count=8,system_memory=3G,memory_limit=17G,__min_full_resource_pool_memory=1073741824,_ob_enable_prepared_statement=false,memory_limit_percentage=90" --cpu-period 100000 --cpu-quota 800000 --cpuset-cpus 0-7 --memory 18G -v home/admin/oceanbase:/home/admin/oceanbase -v data/log1:/data/log1 -v data/1:/data/1 --restart on-failure:5 reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429]
                                            81977f3efa3b77d14efc82b1eb8a963c93331e07029afca2c1b28ed086a4b6fe
                                            [2023-04-06 10:54:42.479637] INFO [installing OB docker and starting OB server on 10.0.0.63, pid: 31833, log: root/t-oceanbase-antman/logs/install_OB_docker.log and home/admin/logs/ob-server/ inside docker]
                                            [2023-04-06 10:54:42.926752] INFO [install_OB_docker.sh finished and reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429 started on 10.0.0.63]
                                            [2023-04-06 10:54:42.930371] INFO [waiting on observer ready on 10.0.0.63]
                                            [2023-04-06 10:57:42.940764] INFO [waiting on observer ready on 10.0.0.63 for 3 Minitues]
                                            [2023-04-06 10:58:42.951559] INFO [waiting on observer ready on 10.0.0.63 for 4 Minitues]
                                            [2023-04-06 10:59:42.962091] INFO [waiting on observer ready on 10.0.0.63 for 5 Minitues]
                                            [2023-04-06 10:59:43.381981] INFO [observer on 10.0.0.63 is ready]
                                            [2023-04-06 10:59:43.391518] INFO [observer installation on all hosts done]
                                            [2023-04-06 10:59:43.398477] INFO [Now, start bootstrap on 10.0.0.63: alter system bootstrap REGION "OCP_META_REGION" ZONE "META_OB_ZONE_1" SERVER "10.0.0.63:2882"]
                                            [2023-04-06 11:01:10.036774] INFO [bootstrap done, observer now ready]
                                            [2023-04-06 11:01:10.061021] INFO [major_freeze start]
                                            [2023-04-06 11:02:10.240394] INFO [major_freeze done]
                                            [2023-04-06 11:02:10.244661] INFO [create proxyro using random password]
                                            [2023-04-06 11:02:10.412847] INFO [step3: installation of ob cluster done]


                                            安装成功了,检验如下。

                                              [root@OB03 t-oceanbase-antman]# docker ps
                                              CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
                                              81977f3efa3b reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429 "/usr/bin/supervisor…" 13 minutes ago Up 13 minutes META_OB_ZONE_1


                                              这里给出修改文件的变化。
                                              [root@OB03 t-oceanbase-antman]# diff install.sh install.sh.bak
                                              1561c1561
                                              < [ $avail_tenant_memory_num -lt 10 ] && { antman_log "docker ob avail tenant memory is (${OB_DOCKER_MEMORY%G} - ${OB_SYSTEM_MEMORY%G})G, docker memory limit(${OB_DOCKER_MEMORY}) too small." "ERROR"; exit 1; }
                                              ---
                                              > [ $avail_tenant_memory_num -lt 31 ] && { antman_log "docker ob avail tenant memory is (${OB_DOCKER_MEMORY%G} - ${OB_SYSTEM_MEMORY%G})G, docker memory limit(${OB_DOCKER_MEMORY}) too small." "ERROR"; exit 1; }




                                              [root@OB03 t-oceanbase-antman]# diff install_OB_docker.sh install_OB_docker.sh.bak
                                              72c72
                                              < observer_memory_limit=`expr ${OB_DOCKER_MEMORY%G} - 1`G #保留6G给内置proxy及其余进程
                                              ---
                                              > observer_memory_limit=`expr ${OB_DOCKER_MEMORY%G} - 6`G #保留6G给内置proxy及其余进程
                                              79c79
                                              < proxy_optstr="obproxy_sys_password=$proxysys_pass_sha1,observer_sys_password=$proxyro_pass_sha1,enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=1G,client_max_connections=16384,enable_compression_protocol=false"
                                              ---
                                              > proxy_optstr="obproxy_sys_password=$proxysys_pass_sha1,observer_sys_password=$proxyro_pass_sha1,enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=4G,client_max_connections=16384,enable_compression_protocol=false"
                                              81c81
                                              < proxy_optstr="enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=1G,client_max_connections=16384,enable_compression_protocol=false"
                                              ---
                                              > proxy_optstr="enable_strict_kernel_release=false,enable_metadb_used=false,enable_proxy_scramble=true,log_dir_size_threshold=10G,automatic_match_work_thread=false,work_thread_num=16,proxy_mem_limited=4G,client_max_connections=16384,enable_compression_protocol=false"
                                              85c85
                                              < observer_memory_limit=`expr ${OB_DOCKER_MEMORY%G} - 1`G # 保留2G给其他进程
                                              ---
                                              > observer_memory_limit=`expr ${OB_DOCKER_MEMORY%G} - 2`G # 保留2G给其他进程



                                              OB 2.2 很早就可以在 8G 规格下启动,详细原理步骤介绍可以参考:OceanBase 独立部署高级玩法二 :2C8G版 (qq.com)

                                              如果没有 OB 镜像文件,就把这一步换成 OB 社区版的部署,社区版 4.1 相比 2.2 ,在单机性能上有很大提升。社区版的部署跟企业版并无差别,可以用上面独立部署方法,也可以用容器部署。详细原理步骤可以参考:5 分钟玩转 OceanBase 社区版 Docker 部署 (qq.com)

                                               

                                              3.初始化 OCP 元数据库

                                              这一步是初始化 OCP 元数据库。主要是创建相关租户和用户。

                                               

                                                [root@OB03 t-oceanbase-antman]# ./install.sh -i 4
                                                run install.sh with DEBUG=FALSE, INSTALL_STEPS=4 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                                [2023-04-06 11:10:27.708721] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                                [2023-04-06 11:10:27.712884] INFO [conf file is upper case format.]
                                                [2023-04-06 11:10:29.779872] INFO [start antman API service]
                                                [2023-04-06 11:10:29.878791] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                                LB_MODE=none
                                                [2023-04-06 11:10:30.288983] INFO [step4: initializing ocp metadb, logfile: root/t-oceanbase-antman/logs/init_metadb.log]
                                                ERROR 4624 (HY000) at line 1: machine resource is not enough to hold a new unit
                                                ERROR 4650 (HY000) at line 1: resource pool 'ocp_resource_pool' not exist
                                                ERROR 5157 (HY000) at line 1: Unknown tenant 'ocp_meta'
                                                ERROR 4624 (HY000) at line 1: machine resource is not enough to hold a new unit
                                                ERROR 4650 (HY000) at line 1: resource pool 'ocp_monitor_pool' not exist
                                                ERROR 5157 (HY000) at line 1: Unknown tenant 'ocp_monitor'
                                                ERROR 1045 (42000): Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: NO)
                                                执行后会报错,提示创建租户的资源不足。应该是脚本里默认租户资源分配的很大,这里调小一些。
                                                 
                                                • 查看元数据库 OB 集群可分配资源
                                                登录到 OCP 元数据库,看看资源。首先需要获取元数据库相关密码。方法是:
                                                  [root@OB03 t-oceanbase-antman]# sh tools/getpass.sh
                                                  然后登录元数据库,用户名:root@sys ,端口 :2881
                                                    [root@OB03 t-oceanbase-antman]# mysql -h127.1 -uroot@sys -P2881 -p -c -A oceanbase
                                                    Enter password:

                                                    查询 OB 集群剩余资源。

                                                      select
                                                      svr_ip,
                                                      zone,
                                                      cpu_total, cpu_assigned, cpu_assigned_percent,
                                                      round(mem_total/1024/1024/1024) mem_total_gb, round(mem_assigned/1024/1024/1024) mem_assigned_gb, mem_assigned_percent,
                                                      round(disk_total/1024/1024/1024) disk_total_gb, round(disk_assigned/1024/1024/1024) disk_assigned_gb, disk_assigned_percent,
                                                      unit_num, migrating_unit_num, merged_version, leader_count,
                                                      heartbeat_status, with_rootserver, clock_sync_status
                                                      from
                                                      __all_virtual_server_stat \G
                                                      *************************** 1. row ***************************
                                                      svr_ip: 10.0.0.63
                                                      zone: META_OB_ZONE_1
                                                      cpu_total: 6
                                                      cpu_assigned: 2.5
                                                      cpu_assigned_percent: 41
                                                      mem_total_gb: 14
                                                      mem_assigned_gb: 4
                                                      mem_assigned_percent: 25
                                                      disk_total_gb: 59
                                                      disk_assigned_gb: 59
                                                      disk_assigned_percent: 100
                                                      unit_num: 1
                                                      migrating_unit_num: 0
                                                      merged_version: 2
                                                      leader_count: 1236
                                                      heartbeat_status: alive
                                                      with_rootserver: 1
                                                      clock_sync_status: SYNC
                                                      1 row in set (0.00 sec)

                                                      初步看,是剩余 CPU 和内存 资源比较少。首先调整初始化元数据库脚本,减少创建租户的资源。其次,调大 OB 集群的 CPU 数量(参数 cpu_count
                                                      )。

                                                        MySQL [oceanbase]> alter system set cpu_count=16;
                                                        Query OK, 0 rows affected (0.05 sec)




                                                        MySQL [oceanbase]> show parameters like '%cpu_count%';
                                                        +----------------+----------+-----------+----------+-----------+-----------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+
                                                        | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level |
                                                        +----------------+----------+-----------+----------+-----------+-----------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+
                                                        | META_OB_ZONE_1 | observer | 10.0.0.63 | 2882 | cpu_count | NULL | 16 | the number of CPU\'s in the system. If this parameter is set to zero, the number will be set according to sysconf; otherwise, this parameter is used. Range: [0,+∞) in integer | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
                                                        +----------------+----------+-----------+----------+-----------+-----------+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------+---------+---------+-------------------+
                                                        1 row in set (0.00 sec)
                                                         

                                                        需要重启 OB 数据库。方法是登录 OB 容器,进入 admin 用户下,杀掉 OB 进程再启动 OB 。或者前面不用进入 OB 集群,直接启动 observer 时带上参数。

                                                         
                                                          docker exec -it META_OB_ZONE_1 bash
                                                          su - admin
                                                          cd oceanbase
                                                          kill -9 `pidof observer`
                                                          bin/observer -o "cpu_count=16"
                                                          输出
                                                            [admin@OB03 oceanbase]$ bin/observer -o "cpu_count=16"
                                                            bin/observer -o cpu_count=16
                                                            optstr: cpu_count=16
                                                            [2023-04-06 11:30:03.554149] ERROR [LIB] start_daemon (utility.cpp:1230) [4924][0][Y0-0000000000000000] [lt=0] pid already exists BACKTRACE:0xd4f99da 0xd422fae 0x350f978 0xd4fc193 0xd4fe853 0x351f803 0x7f41fd1f2445 0x350d7f5
                                                             
                                                            • 修改初始化 OCP 元数据的脚本,降低租户资源要求。

                                                            这里直接给出脚本修改的变化部分。

                                                              [root@OB03 t-oceanbase-antman]# diff create_ocp_db.sh create_ocp_db.sh.bak
                                                              37c37
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set memory_chunk_cache_size = '128M';"
                                                              ---
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set memory_chunk_cache_size = '8G';"
                                                              42,45c42,45
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set cpu_quota_concurrency = 2;"
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set data_copy_concurrency = 10;"
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set server_data_copy_out_concurrency = 5;"
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set server_data_copy_in_concurrency = 5;"
                                                              ---
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set cpu_quota_concurrency = 4;"
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set data_copy_concurrency = 100;"
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set server_data_copy_out_concurrency = 10;"
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set server_data_copy_in_concurrency = 10;"
                                                              47c47
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set freeze_trigger_percentage = 50;"
                                                              ---
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "alter system set freeze_trigger_percentage = 60;"
                                                              53c53
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "CREATE RESOURCE UNIT IF NOT EXISTS ocp_unit max_cpu 2, max_memory '2G', max_iops 128,max_disk_size '1G', max_session_num 10000, MIN_CPU=2, MIN_MEMORY= '2G', MIN_IOPS=128;"
                                                              ---
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "CREATE RESOURCE UNIT IF NOT EXISTS ocp_unit max_cpu 2, max_memory '5G', max_iops 128,max_disk_size '1G', max_session_num 10000, MIN_CPU=2, MIN_MEMORY= '5G', MIN_IOPS=128;"
                                                              59c59
                                                              < mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "CREATE RESOURCE UNIT IF NOT EXISTS ocp_monitor_unit max_cpu 4, max_memory '5G', max_iops 128,max_disk_size '1G', max_session_num 10000, MIN_CPU=4, MIN_MEMORY= '5G', MIN_IOPS=128;"
                                                              ---
                                                              > mysql -uroot -P$MYSQL_PORT -h${ZONE1_RS_IP} -Doceanbase -p${CLUSTER_SYS_PASS} -e "CREATE RESOURCE UNIT IF NOT EXISTS ocp_monitor_unit max_cpu 4, max_memory '16G', max_iops 128,max_disk_size '1G', max_session_num 10000, MIN_CPU=4, MIN_MEMORY= '16G', MIN_IOPS=128;" 

                                                              重新运行第 4 步安装。


                                                                [root@OB03 t-oceanbase-antman]# ./install.sh -c 4
                                                                run install.sh with DEBUG=FALSE, INSTALL_STEPS= CLEAR_STEPS=4 CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                                                [2023-04-06 11:45:34.087004] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                                                [2023-04-06 11:45:34.091613] INFO [conf file is upper case format.]
                                                                [2023-04-06 11:45:36.151593] INFO [start antman API service]
                                                                [2023-04-06 11:45:36.211226] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                                                LB_MODE=none
                                                                [2023-04-06 11:45:36.562012] INFO [clear_step4: drop ocp meta db/tenant/user/resource, logfile: root/t-oceanbase-antman/logs/uninit_metadb.log]
                                                                [2023-04-06 11:45:36.940951] INFO [clear_step4: uninit of metadb done]
                                                                  [root@OB03 t-oceanbase-antman]# ./install.sh -i 4
                                                                  run install.sh with DEBUG=FALSE, INSTALL_STEPS=4 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                                                  [2023-04-06 11:46:52.925373] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                                                  [2023-04-06 11:46:52.929297] INFO [conf file is upper case format.]
                                                                  [2023-04-06 11:46:54.986010] INFO [start antman API service]
                                                                  [2023-04-06 11:46:55.043361] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                                                  LB_MODE=none
                                                                  [2023-04-06 11:46:55.372811] INFO [step4: initializing ocp metadb, logfile: root/t-oceanbase-antman/logs/init_metadb.log]
                                                                  [2023-04-06 11:47:01.369866] INFO [step4: initialization of ocp metadb done]

                                                                  至此,元数据库初始化成功。元数据库对 OCP 非常重要,感兴趣的可以深入阅读:自动化运维产品的命门——元数据库 (qq.com)

                                                                   

                                                                  4.安装 TMP OCP

                                                                  接下来部署 OCP。由于 OCP 连接 OB 需要通过 OBProxy,但是启动 OBProxy 又需要配置 OB 的连接方式,这个连接方式是通过 OCP API 获取的。这里就有个“先有鸡还是先有蛋”问题。所以需要先通过一个 简化版的 TMP OCP 过渡一下。

                                                                    [root@OB03 t-oceanbase-antman]# ./install.sh -i 5
                                                                    run install.sh with DEBUG=FALSE, INSTALL_STEPS=5 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                                                    [2023-04-06 13:41:23.640439] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                                                    [2023-04-06 13:41:23.644910] INFO [conf file is upper case format.]
                                                                    [2023-04-06 13:41:25.703547] INFO [start antman API service]
                                                                    [2023-04-06 13:41:25.775681] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                                                    LB_MODE=none
                                                                    [2023-04-06 13:41:27.110622] INFO [using inner Proxy with OB!]

                                                                    这里提到使用的是内部 OBProxy,指的是 OB 容器中的,这样就不用单独一个 OBProxy 容器,节省了一些资源。

                                                                      [root@OB03 t-oceanbase-antman]# docker exec -it META_OB_ZONE_1 bash -c "netstat -ntlp |grep 288"
                                                                      tcp 0 0 0.0.0.0:2881 0.0.0.0:* LISTEN -
                                                                      tcp 0 0 0.0.0.0:2882 0.0.0.0:* LISTEN -
                                                                      tcp 0 0 0.0.0.0:2883 0.0.0.0:* LISTEN -
                                                                      tcp 0 0 0.0.0.0:2884 0.0.0.0:* LISTEN -


                                                                      从监听端口看,到这一步元数据库 OB 和 OBProxy 都部署好了。
                                                                       

                                                                      5.安装正式 OCP

                                                                      接下来部署正式的 OCP 。
                                                                        [root@OB03 t-oceanbase-antman]# ./install.sh -i 7
                                                                        run install.sh with DEBUG=FALSE, INSTALL_STEPS=7 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                                                        [2023-04-06 13:46:19.019939] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                                                        [2023-04-06 13:46:19.024277] INFO [conf file is upper case format.]
                                                                        [2023-04-06 13:46:21.082560] INFO [start antman API service]
                                                                        [2023-04-06 13:46:21.148509] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                                                        LB_MODE=none
                                                                        [2023-04-06 13:46:21.471557] INFO [step7: installing ocp, logfile: root/t-oceanbase-antman/logs/install_ocp.log]
                                                                        [2023-04-06 13:46:21.475197] INFO [using inner Proxy with OB!]
                                                                        [2023-04-06 13:46:21.480793] INFO [start ocp1 and init it...]
                                                                        [2023-04-06 13:46:33.300826] INFO [obproxy is ready]
                                                                        [2023-04-06 13:46:33.426576] INFO [load docker image: docker load -i root/t-oceanbase-antman/ocp334.tar.gz]
                                                                        Loaded image: reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:3.3.4-20221202162515
                                                                        [2023-04-06 13:46:53.525940] INFO [init metadb: docker run --net host --workdir=/home/admin/ocp-init/src/ocp-init --entrypoint=python reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:3.3.4-20221202162515 create_metadb.py 10.0.0.63 2883 root@ocp_meta#obcluster xOd1^P%FPx ocp root@ocp_monitor XE^450Rh{H ocp_monitor]
                                                                        <.....>
                                                                        [2023-04-06 14:02:39.508630] INFO [start container: docker run -d -it --name ocp --net=host --cpu-period 100000 --cpu-quota 400000 --memory=4G --env-file=/root/t-oceanbase-antman/config/env_ocp.yaml -v home/admin/logs:/home/admin/logs --restart on-failure:5 reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:3.3.4-20221202162515]
                                                                        216f8f078fdd01a766a64e18c6c3513fb0378fb14a9800ac627497eef468be2d
                                                                        [2023-04-06 14:02:39.969122] INFO [check ocp api]
                                                                        [2023-04-06 14:03:09.979394] INFO [waiting ocp api to be ready on host 10.0.0.63 for 1 Minites]
                                                                        [2023-04-06 14:03:09.983194] INFO [check ocp api]
                                                                        [2023-04-06 14:03:40.015036] INFO [waiting ocp api to be ready on host 10.0.0.63 for 1 Minites]
                                                                        [2023-04-06 14:03:40.025514] INFO [check ocp api]
                                                                        [2023-04-06 14:04:10.038253] INFO [waiting ocp api to be ready on host 10.0.0.63 for 2 Minites]
                                                                        [2023-04-06 14:04:10.041349] INFO [check ocp api]
                                                                        [2023-04-06 14:04:40.054816] INFO [waiting ocp api to be ready on host 10.0.0.63 for 2 Minites]
                                                                        [2023-04-06 14:04:40.059154] INFO [check ocp api]
                                                                        [2023-04-06 14:04:40.303255] INFO [ALTER SYSTEM ALTER ZONE META_OB_ZONE_1 set idc='am171';]
                                                                        [2023-04-06 14:04:43.719868] INFO [start takeOverPreCheck, already wait 0s]
                                                                        {}
                                                                        [2023-04-06 14:05:14.221508] INFO [start takeOverPreCheck, already wait 30s]
                                                                        {}
                                                                        [2023-04-06 14:05:44.482049] INFO [start takeOverPreCheck, already wait 60s]
                                                                        {u'valid': False, u'messages': [u'OBServer\u68c0\u67e5\u4e0d\u901a\u8fc7']}
                                                                        [2023-04-06 14:06:15.923110] INFO [start takeOverPreCheck, already wait 90s]
                                                                        {u'valid': True, u'messages': []}
                                                                        [2023-04-06 14:06:16.260680] INFO [takeOverPreCheck success]
                                                                        [2023-04-06 14:06:16.989242] INFO [takeover cluster through rs 10.0.0.63: {"rootSysPassword":"DWJmrC3w%m","saveToCredential":true,"address":"10.0.0.63","port":2881}]
                                                                        [2023-04-06 14:06:27.046867] WARN [obcluster is still importing, wait 30s to check]
                                                                        [2023-04-06 14:06:57.065821] INFO [import obcluster and hosts SUCCESS]
                                                                        [2023-04-06 14:06:57.092349] INFO [ocp api is ready on host 10.0.0.63]
                                                                        [2023-04-06 14:06:57.442354] INFO [OCP multi cluster disabled, pass.]

                                                                          ocp
                                                                          [2023-04-06 14:07:08.564766] INFO [make sure ocp service ready...]
                                                                          [2023-04-06 14:08:58.776883] INFO [ocp on 10.0.0.63:8080 service ready]
                                                                          [2023-04-06 14:08:58.781773] INFO [ocp installation on all hosts done]
                                                                          [2023-04-06 14:08:58.815438] INFO [OCP multi AZ disabled, pass.]
                                                                          [2023-04-06 14:08:58.821969] INFO [step7: installation of ocp done]

                                                                          当看到监听端口  :8080
                                                                          时,就表示 OCP 部署启动成功。

                                                                           

                                                                          6.安装后的检查

                                                                          主要是检查跟 OCP 有关的各个组件的状态。

                                                                            [root@OB03 t-oceanbase-antman]# sh install.sh -i 8
                                                                            run install.sh with DEBUG=FALSE, INSTALL_STEPS=8 CLEAR_STEPS= CONFIG_FILE=/root/t-oceanbase-antman/obcluster.conf
                                                                            [2023-04-06 14:11:15.882629] INFO [check conf file root/t-oceanbase-antman/obcluster.conf format ...]
                                                                            [2023-04-06 14:11:15.888134] INFO [conf file is upper case format.]
                                                                            [2023-04-06 14:11:17.949731] INFO [start antman API service]
                                                                            [2023-04-06 14:11:18.030614] INFO [SSH_AUTH=password SSH_USER=root SSH_PORT=22 SSH_PASSWORD=12*** SSH_KEY_FILE=/root/.ssh/id_rsa]
                                                                            LB_MODE=none
                                                                            [2023-04-06 14:11:18.417359] INFO [step8: post-checking service, logfile: root/t-oceanbase-antman/logs/post_check_service.log]
                                                                            [2023-04-06 14:11:18.474099] INFO [10.0.0.63: post_check_connection start]
                                                                            [2023-04-06 14:11:18.479336] INFO [Ping 10.0.0.63 -> 10.0.0.63]
                                                                            [2023-04-06 14:11:20.680894] INFO [10.0.0.63: post_check_connection done]
                                                                            [2023-04-06 14:11:20.686982] INFO [10.0.0.63: post_check_port start]
                                                                            [2023-04-06 14:11:20.692445] INFO [Connect 10.0.0.63 -> 10.0.0.63:8080]
                                                                            [2023-04-06 14:11:20.902949] INFO [Connect 10.0.0.63 -> 10.0.0.63:2883]
                                                                            [2023-04-06 14:11:21.102328] INFO [10.0.0.63: post_check_port done]
                                                                            [2023-04-06 14:11:21.105732] INFO [10.0.0.63: post_check_ob start]
                                                                            [2023-04-06 14:11:21.109142] INFO [check __all_server status 10.0.0.63 -> 10.0.0.63:2883]
                                                                            [2023-04-06 14:11:21.312185] INFO [10.0.0.63: post_check_ob done]
                                                                            [2023-04-06 14:11:21.315144] INFO [10.0.0.63: post_check_ocp_service start]
                                                                            [2023-04-06 14:11:21.318118] INFO [Curl 10.0.0.63 -> http://10.0.0.63:8080/services?Action=GetObProxyConfig&User_ID=admin&UID=alibaba]
                                                                            [2023-04-06 14:11:21.524950] INFO [10.0.0.63: post_check_ocp_service done]
                                                                            [2023-04-06 14:11:21.536864] INFO [step8: post check done]
                                                                             

                                                                            检查一下虚拟机服务器剩余资源。还有 3G 可用内存。如果精打细算的话,12G 的虚拟机应该也能将 OCP 部署起来。OB 给 8G ,OCP 给 2G 差不多了。当然,不排除后面 OCP 使用起来会有点慢。所以,更建议将元数据库 OB 换成社区版最新版。

                                                                              [root@OB03 t-oceanbase-antman]# free -g
                                                                              total used free shared buff/cache available
                                                                              Mem: 23 12 3 0 7 4
                                                                              Swap: 0 0 0
                                                                              [root@OB03 t-oceanbase-antman]# docker ps
                                                                              CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
                                                                              216f8f078fdd reg.docker.alibaba-inc.com/oceanbase/ocp-all-in-one:3.3.4-20221202162515 "/usr/bin/supervisor…" 9 minutes ago Up 4 minutes ocp
                                                                              81977f3efa3b   reg.docker.alibaba-inc.com/antman/ob-docker:OB2277_OBP320_x86_20220429     "/usr/bin/supervisor…"   3 hours ago     Up 3 hours               META_OB_ZONE_1

                                                                              运行一下 数据库监控脚本  dooba.py


                                                                                python dooba.py -h127.1 -uroot@sys -P2881 -p'DWJmrC3w%m'
                                                                                 

                                                                                打开 OCP 页面,表示安装成功http://10.0.0.63:8080/cluster



                                                                                 


                                                                                OCP 使用

                                                                                初次登录 OCP 需要修改密码。

                                                                                详细使用方法可以参考官网文档:文档概览-OceanBase 云平台 -OceanBase文档中心-分布式数据库使用文档 。

                                                                                 

                                                                                通过 OCP 部署 OB 主要步骤有:添加 OB 服务器、部署 OB 集群、部署 OBProxy 集群、创建租户。

                                                                                 

                                                                                OB 服务器准备

                                                                                服务器配置

                                                                                这里也是虚拟机,跟前面配置一样 10C24G。当然实际 10G 内存就足够。
                                                                                 

                                                                                内核参数

                                                                                  ####################################################
                                                                                  # for oceanbase
                                                                                  net.core.somaxconn = 2048
                                                                                  net.core.netdev_max_backlog = 10000
                                                                                  net.core.rmem_default = 16777216
                                                                                  net.core.wmem_default = 16777216
                                                                                  net.core.rmem_max = 16777216
                                                                                  net.core.wmem_max = 16777216




                                                                                  net.ipv4.ip_local_port_range = 3500 65535
                                                                                  net.ipv4.ip_forward = 0
                                                                                  net.ipv4.conf.default.rp_filter = 1
                                                                                  net.ipv4.conf.default.accept_source_route = 0
                                                                                  net.ipv4.tcp_syncookies = 0
                                                                                  net.ipv4.tcp_rmem = 4096 87380 16777216
                                                                                  net.ipv4.tcp_wmem = 4096 65536 16777216
                                                                                  net.ipv4.tcp_max_syn_backlog = 16384
                                                                                  net.ipv4.tcp_fin_timeout = 15
                                                                                  net.ipv4.tcp_max_syn_backlog = 16384
                                                                                  net.ipv4.tcp_tw_reuse = 1
                                                                                  net.ipv4.tcp_slow_start_after_idle=0
                                                                                  net.ipv4.ip_local_reserved_ports = 62881-63881




                                                                                  vm.swappiness = 0
                                                                                  kernel.core_pattern = data/1/core-%e-%p-%t
                                                                                  vm.min_free_kbytes = 2097152
                                                                                  vm.overcommit_memory = 0




                                                                                  fs.aio-max-nr=1048576
                                                                                  vm.max_map_count=655360
                                                                                  vm.nr_hugepages = 5150
                                                                                   

                                                                                  这里在 OB 服务器里开了大页,设置为 10G+ 内存。所以后面 OB 节点启动的时候也限制最大只使用 10G 内存。有关 OB 使用大页内存是一个探索。这里同时还要关闭透明大页(THP)以及关闭 NUMA,详细原理步骤请参考:OceanBase 使用内存大页技术探索 (qq.com) 。这一步需要重启 OB 服务器。

                                                                                   

                                                                                  内存设置

                                                                                  • 关闭 THP ,开启 HugePage
                                                                                  这是开启大页关闭 THP 后的结果。
                                                                                    [root@OB02 ~]# grep HugePage proc/meminfo
                                                                                    AnonHugePages: 0 kB
                                                                                    HugePages_Total: 5120
                                                                                    HugePages_Free: 5120
                                                                                    HugePages_Rsvd: 0
                                                                                    HugePages_Surp: 0
                                                                                    • 关闭 NUMA
                                                                                    这是关闭 NUMA 后的结果
                                                                                      [root@OB02 ~]# numastat -n




                                                                                      Per-node numastat info (in MBs):
                                                                                      Node 0 Total
                                                                                      --------------- ---------------
                                                                                      Numa_Hit 1086.02 1086.02
                                                                                      Numa_Miss 0.00 0.00
                                                                                      Numa_Foreign 0.00 0.00
                                                                                      Interleave_Hit 108.52 108.52
                                                                                      Local_Node 1086.02 1086.02
                                                                                      Other_Node 0.00 0.00
                                                                                       

                                                                                      OCP 部署 OB集群

                                                                                      部署规划

                                                                                      OB 4.1 推出了单机分布式一体化的功能,其功能之一指的是 OB 即可以单机部署也可以集群部署。实际上从 OB 1.0 开始后的版本就具备这个能力。这里通过 OCP 部署一个单节点的 OB。虽然是单节点,我依然习惯称它为集群,就像单节点的 ORACLE RAC 一样。

                                                                                       

                                                                                      新增主机

                                                                                      首先要在 OCP 里新增主机。

                                                                                       

                                                                                      OCP 运维任务也是以任务流方式处理,被分解为很多独立的步骤。每一步都有相应的日志。出问题的时候可以看日志排查问题,修复后重跑任务或者跳过任务等等。

                                                                                       

                                                                                      主机的基本信息如下,需要等个几分钟主机上监控agent才采集上报。后面存储和文件系统规划就略过。

                                                                                       
                                                                                       

                                                                                      上传 OB 软件

                                                                                      OCP 要自动化部署 OB 和 OBProxy集群,就需要将 OB 和 OBProxy 的 RPM 包上传到 OCP 上保存。

                                                                                      在上传页面勾选官网下载的 RPM 包。

                                                                                      • oceanbase-3.2.4.1-101000052023010822.el7.x86_64.rpm

                                                                                      • obproxy-3.2.9.0-20230116143405.el7.x86_64.rpm

                                                                                       
                                                                                       

                                                                                      上传失败问题分析

                                                                                      这期间由于网络问题,ob 软件包很大,可能上传过程中失败。但是第二次上传的时候可能会报错。如:cannot post /api/v2/software-packages 500
                                                                                      。这个版本的 OCP 页面上没有办法解决。只好到 ocp 容器和元数据库里找方法。

                                                                                       
                                                                                      1. 删除目录  /home/admin/data/files/sys-package
                                                                                        里相应的软件包。

                                                                                      2. 删除租户  ocp_meta
                                                                                        的库  ocp
                                                                                        下这些表里的相关记录:compute_software_package_meta
                                                                                        storage_object_meta
                                                                                        (有file_id 信息),  storage_object_block
                                                                                        (根据 file_id 删除)。

                                                                                       

                                                                                      OCP 上传软件包会先将文件写到文件系统,然后再解析文件写入到元数据库表 storage_object_block
                                                                                      里。这期间写入量还是比较大。如下监控图里可以看出内存的变化增量和磁盘读写 IO 吞吐(OB 2.2.7版本的转储带来的写IO在SYS租户的统计指标里)。同样,删除这个表记录的时候记得加上  limit 100
                                                                                      ,并提交。一批一批的删除提交,可以避免报租户内存不足错误(前面配置的租户可用内存很少)。

                                                                                       
                                                                                       

                                                                                      在没有 OCP 监控之前,使用脚本  dooba.py
                                                                                      监控 OB 是最好的。详细使用方法请参考:OB 社区版性能监控利器 DOOBA (qq.com)

                                                                                       

                                                                                      创建 OB 集群

                                                                                      1. 输入 集群相关信息

                                                                                      主要是指定集群的 OB 版本、集群名称、服务器信息、相关参数。由于服务器资源很低,所以需要调整多个 OB 参数。

                                                                                       
                                                                                       

                                                                                      2.查看集群创建任务

                                                                                      提交集群创建后,一定会报错。到 OCP 的任务管理模块中定位失败的原因。

                                                                                       
                                                                                      任务在  bootstrap 这里失败了,这是 OB 集群搭建的一个难关。这里是因为有个隐含参数没有调整,之前的  OCP 页面在配置参数的时候不支持调整下划线开头的隐含参数。
                                                                                       

                                                                                        2023-04-06 17:56:04.562 ERROR 46 --- [pool-manual-subtask-executor8,d3fbab939eef4d00,7ef887fbd662] c.a.o.s.task.util.AgentAsyncTaskHelper : failed to execute async task, task token :6fc08a7c-7797-4e88-91f3-8dc4d411d91d, err: OcpAgentError: code = 1500, message = Execute shell command failed: failed to execute command: Command{user=admin, program=sh, outputType=combined, cmd=mysql -h127.1 -P2881 -uroot -e "set ob_query_timeout=1200000000; ALTER SYSTEM BOOTSTRAP REGION 'OCP_META_REGION' ZONE 'zone1' SERVER '10.0.0.62:2882';", timeout=20m0s}, exitCode: 1, output: ERROR 1235 (0A000) at line 1: unit min memory less than __min_full_resource_pool_memory not supported
                                                                                         

                                                                                        接下来开始手动修复这个失败任务。这个修复过程跟重建单节点过程比较类似。如果看过早期我分享的手动部署 OB 1.4/2.2 版本的过程,这里的过程就会很熟悉。

                                                                                         

                                                                                        3. 手动执行 OB 集群初始化。

                                                                                        进入 OB 服务器主机,切换到 admin 用户下。
                                                                                         
                                                                                          [admin@OB02 ~]$ ps -ef|grep observer
                                                                                          admin 12963 1 99 17:55 ? 00:02:49 /home/admin/oceanbase/bin/observer -i ens192 -p 2881 -P 2882 -n obdemo -z zone1 -d /home/admin/oceanbase/store/obdemo -l info -oobconfig_url=http://10.0.0.63:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=obdemo,rootservice_list=10.0.0.62:2882:2881,config_additional_dir=/data/log1/obdemo/etc2,/data/1/obdemo/etc3,cluster_id=1680747946,use_large_pages=true,cpu_count=16,max_syslog_file_count=3,merge_thread_count=1,write_throttling_trigger_percentage=70,datafile_size=5G,system_memory=3G,memory_limit=10G,memory_chunk_cache_size=256M,minor_freeze_times=500
                                                                                          admin 13926 13753 0 17:57 pts/1 00:00:00 grep --color=auto observer
                                                                                          [admin@OB02 ~]$
                                                                                          [admin@OB02 ~]$ cd oceanbase/

                                                                                          复制上面的 observer 启动参数。然后杀掉 observer 进程。
                                                                                          删除 store 下 OB 相关的数据文件目录下的内容,目录需要保留。
                                                                                           
                                                                                            [admin@OB02 oceanbase]$ kill -9 `pidof observer`
                                                                                            [admin@OB02 oceanbase]$ sleep 5
                                                                                            [admin@OB02 oceanbase]$ tree -L 2 store/
                                                                                            store/
                                                                                            └── obdemo
                                                                                            ├── clog -> /data/log1/obdemo/clog
                                                                                            ├── ilog -> /data/log1/obdemo/ilog
                                                                                            ├── oob_clog -> /data/log1/obdemo/oob_clog
                                                                                            ├── slog -> /data/log1/obdemo/slog
                                                                                            ├── sort_dir -> /data/1/obdemo/sort_dir
                                                                                            └── sstable -> /data/1/obdemo/sstable


                                                                                            [admin@OB02 oceanbase]$ /bin/rm store/obdemo/*/*

                                                                                            手动启动 observer 进程,加上隐含参数  __min_full_resource_pool_memory=536870912
                                                                                             。

                                                                                              [admin@OB02 oceanbase]$ cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -i ens192 -p 2881 -P 2882 -n obdemo -z zone1 -d /home/admin/oceanbase/store/obdemo -l info -o "obconfig_url='http://10.0.0.63:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=obdemo',rootservice_list=10.0.0.62:2882:2881,config_additional_dir=/data/log1/obdemo/etc2,/data/1/obdemo/etc3,cluster_id=1680747946,use_large_pages=true,cpu_count=16,max_syslog_file_count=3,merge_thread_count=1,write_throttling_trigger_percentage=70,datafile_size=5G,system_memory=3G,memory_limit=10G,memory_chunk_cache_size=256M,minor_freeze_times=500,__min_full_resource_pool_memory=536870912"



                                                                                              等几秒,查看进程 observer 是否还在。如果不在,就是出错了。

                                                                                               
                                                                                                [admin@OB02 oceanbase]$ ps -ef|grep observer |grep -v grep
                                                                                                admin 14899 1 99 18:13 ? 00:00:42 /home/admin/oceanbase/bin/observer -i ens192 -p 2881 -P 2882 -n obdemo -z zone1 -d /home/admin/oceanbase/store/obdemo -l info -o obconfig_url='http://10.0.0.63:8080/services?Action=ObRootServiceInfo&User_ID=alibaba&UID=ocpmaster&ObRegion=obdemo',rootservice_list=10.0.0.62:2882:2881,config_additional_dir=/data/log1/obdemo/etc2,/data/1/obdemo/etc3,cluster_id=1680747946,use_large_pages=true,cpu_count=16,max_syslog_file_count=3,merge_thread_count=1,write_throttling_trigger_percentage=70,datafile_size=5G,system_memory=3G,memory_limit=10G,memory_chunk_cache_size=256M,minor_freeze_times=500,__min_full_resource_pool_memory=536870912



                                                                                                接下来登录 OB 节点,密码是空密码,初始化集群。

                                                                                                  [admin@OB02 oceanbase]$ mysql -h127.1 -uroot -P2881 -p                                                                                                                                      Enter password:                                                                                                                                                                             Welcome to the MariaDB monitor.  Commands end with ; or \g.                                                                                                                                 Your MySQL connection id is 3221225472
                                                                                                  Enter password:


                                                                                                  MySQL [(none)]> set ob_query_timeout=1200000000; ALTER SYSTEM BOOTSTRAP REGION 'OCP_META_REGION' ZONE 'zone1' SERVER '10.0.0.62:2882';
                                                                                                  Query OK, 0 rows affected (0.00 sec)


                                                                                                  Query OK, 0 rows affected (30.79 sec)

                                                                                                  退出重登陆,验证 OB 集群初始化成功。

                                                                                                    [admin@OB02 oceanbase]$ mysql -h127.1 -uroot@sys -P2881 -p
                                                                                                    Enter password:


                                                                                                    MySQL [(none)]> show databases;
                                                                                                    +--------------------+
                                                                                                    | Database |
                                                                                                    +--------------------+
                                                                                                    | oceanbase |
                                                                                                    | information_schema |
                                                                                                    | mysql |
                                                                                                    | SYS |
                                                                                                    | LBACSYS |
                                                                                                    | ORAAUDITOR |
                                                                                                    | test |
                                                                                                    +--------------------+
                                                                                                    7 rows in set (0.00 sec)




                                                                                                    MySQL [(none)]>
                                                                                                     

                                                                                                    4. 继续 OCP 任务

                                                                                                    当手动将 OB 集群启动后,就可以在 OCP 里将当前失败的 OCP 任务设置为成功。这是 OCP 失败任务处理常用的一个技巧。

                                                                                                     
                                                                                                     

                                                                                                    然后 OCP 任务就会继续运行。最终集群创建成功。

                                                                                                     
                                                                                                     

                                                                                                    5. 查看 OB 集群资源

                                                                                                    接下来随便浏览一下 OCP 的 OB 集群管理功能。首先看看 OB 集群资源。

                                                                                                     

                                                                                                    观看资源管理界面,可以加深对 OB 的租户原理的理解。

                                                                                                    从图中可见这个 OB 服务器内存剩余最大可分配是 5.25 G ,最大可用 CPU 是 11.5。

                                                                                                    或者通过下面 SQL 也可以查看。

                                                                                                      select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, (cpu_total-cpu_assigned) cpu_free
                                                                                                      , round(mem_total/1024/1024/1024) mem_total_gb, round((mem_total-mem_assigned)/1024/1024/1024,2) mem_free_gb
                                                                                                      , round(disk_total/1024/1024/1024) disk_total_gb, round((disk_total-disk_assigned)/1024/1024/1024) disk_free_gb
                                                                                                      from __all_virtual_server_stat a join __all_server b on (a.svr_ip=b.svr_ip and a.svr_port=b.svr_port)
                                                                                                      order by a.zone, a.svr_ip
                                                                                                      ;




                                                                                                      +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                      | zone | observer | cpu_total | cpu_free | mem_total_gb | mem_free_gb | disk_total_gb | disk_free_gb |
                                                                                                      +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                      | zone1 | 10.0.0.62:2882 | 14 | 11.5 | 8 | 5.25 | 5 | 0 |
                                                                                                      +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                      1 row in set (0.00 sec)



                                                                                                      虽然二者结果最大可用 CPU 都是 11.5 ,这个结果却是错的。查看已有租户资源分布。

                                                                                                        select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu
                                                                                                        , round(t2.max_memory/1024/1024/1024) max_mem_gb, round(t2.min_memory/1024/1024/1024) min_mem_gb
                                                                                                        , round(t2.max_disk_size/1024/1024/1024) max_disk_size , t4.tenant_name
                                                                                                        from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
                                                                                                        join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)
                                                                                                        left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
                                                                                                        order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id
                                                                                                        ;




                                                                                                        +--------------------+------------------+---------+---------+------------+------------+---------------+-------------+
                                                                                                        | resource_pool_name | unit_config_name | max_cpu | min_cpu | max_mem_gb | min_mem_gb | max_disk_size | tenant_name |
                                                                                                        +--------------------+------------------+---------+---------+------------+------------+---------------+-------------+
                                                                                                        | sys_pool | sys_unit_config | 5 | 2.5 | 2 | 2 | 5 | sys |
                                                                                                        +--------------------+------------------+---------+---------+------------+------------+---------------+-------------+
                                                                                                        1 row in set (0.01 sec)

                                                                                                        系统租户的资源规格最小 CPU 跟 最大 CPU 相差 2.5,实际剩余可分配的 CPU 是   11.5-2.5=9
                                                                                                        。将系统租户规格最小 CPU 和最大 CPU 拉平后再次查看剩余资源就对 了。这个原理会导致大家估计 OB 集群可分配的 CPU 资源时会有 2.5 的偏差。

                                                                                                          alter resource unit sys_unit_config min_cpu=5 ;


                                                                                                          <SQL>


                                                                                                          +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                          | zone | observer | cpu_total | cpu_free | mem_total_gb | mem_free_gb | disk_total_gb | disk_free_gb |
                                                                                                          +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                          | zone1 | 10.0.0.62:2882 | 14 | 9 | 8 | 6.25 | 5 | 0 |
                                                                                                          +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                          1 row in set (0.00 sec)

                                                                                                           

                                                                                                          OCP 部署 OBProxy 集群

                                                                                                          前面部署 OCP 的时候已经启动了一个 OBProxy,那个是给 OCP 自己用的。业务建议还是单独部署 OBProxy 集群。一般选择在 OB 服务器上部署 OBProxy。

                                                                                                           

                                                                                                          创建 OBProxy 集群

                                                                                                          创建 OBProxy 集群 很简单,输入关联的 OB 集群,选择 OB 所在的服务器或者其他服务器都可。

                                                                                                          OBProxy 集群指多个 OBProxy 部署在多个服务器上, 主要是管理方便。OBProxy 软件自身并不含有集群的概念,没有高可用功能。OBProxy 的高可用需要借助负载均衡技术,如 F5,LVS,NGINX,HAPROXY 等软硬件产品。

                                                                                                           
                                                                                                           

                                                                                                          部署后在服务器上可以看到 2 个相关的进程,其中一个  obproxyd
                                                                                                          是 OBProxy 的守护进程。


                                                                                                            [root@OB02 ~]# ps -ef|grep obproxy |grep -v grep
                                                                                                            admin 18734 1 4 18:33 ? 00:04:14 ./bin/obproxy -p 2883 -n OBPROXY -o prometheus_sync_interval=1s,rootservice_cluster_name=obdemo,obproxy_config_server_url=,prometheus_listen_port=2884,enable_metadb_used=false,skip_proxy_sys_private_check=true,log_dir_size_threshold=10G,rootservice_list=10.0.0.62:2881,proxy_mem_limited=2G,enable_full_username=true,enable_proxy_scramble=true,enable_strict_kernel_release=false
                                                                                                            admin 18902 1 0 18:33 ? 00:00:10 /bin/bash ./bin/obproxyd.sh -c checkalive -p 2883 -n OBPROXY


                                                                                                            测试 OBProxy

                                                                                                            OBProxy 的连接端口是 2883 ,用户名通常要包含集群和租户信息。

                                                                                                              [root@OB02 ~]# mysql -h10.0.0.62 -uroot@sys#obdemo -P2883 -p'aaAA11__' -c -A oceanbase -e "select version()"
                                                                                                              +---------------------------+
                                                                                                              | version() |
                                                                                                              +---------------------------+
                                                                                                              | 5.7.25-OceanBase-v3.2.4.1 |
                                                                                                              +---------------------------+
                                                                                                               

                                                                                                              OCP 部署 ORACLE 租户

                                                                                                              接下来是企业特有的 ORACLE 租户的创建。 
                                                                                                              在创建租户页面,会提示选择资源单元(Unit)规格。
                                                                                                              默认租户资源规格最小的内存也要 6G 。而前面看了这个 OB 服务器可分配的内存资源最大也只有 5.25 G 。所以这些资源规格都不能用。

                                                                                                              新增租户资源规格

                                                                                                              新增一个租户资源规格 2C4G 。这个页面的功能可能有点问题,导致这一步非常折腾。
                                                                                                               
                                                                                                              第一次自定义资源单元规格 S2C4G,保存后看列表里没有。即使刷新页面从来也看不到。再次输入就报已经存在。
                                                                                                              在资源单元规格页面可以看到保存成功了。
                                                                                                               
                                                                                                              也就是说无论定义什么规格在这个租户创建页面都看不到。
                                                                                                              接下来又要想办法绕过去。
                                                                                                               

                                                                                                              修改 OCP 的资源单元模板

                                                                                                              这一步不是必须。只是为了演示一下 OCP 的访问以及通过修改 OCP 元数据库解决问题的方法路径。
                                                                                                               
                                                                                                              进入 OCP 元数据库。

                                                                                                                MySQL [ocp]> show tables like '%unit%';
                                                                                                                +------------------------+
                                                                                                                | Tables_in_ocp (%unit%) |
                                                                                                                +------------------------+
                                                                                                                | ob_unit_spec |
                                                                                                                +------------------------+
                                                                                                                1 row in set (0.00 sec)




                                                                                                                MySQL [ocp]> select * from ob_unit_spec ;
                                                                                                                +----+---------------------+---------------------+---------+---------------+---------+---------+-------------+-------------+----------+----------+---------------+-----------------+----------+--------+
                                                                                                                | id | create_time | update_time | creator | name | max_cpu | min_cpu | max_memory | min_memory | max_iops | min_iops | max_disk_size | max_session_num | group | type |
                                                                                                                +----+---------------------+---------------------+---------+---------------+---------+---------+-------------+-------------+----------+----------+---------------+-----------------+----------+--------+
                                                                                                                | 1 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | B | 0.25 | 0.25 | 1073741824 | 1073741824 | 250 | 250 | 128849018880 | 75 | basic | SYSTEM |
                                                                                                                | 2 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | LogOnlyNormal | 1.00 | 1.00 | 2147483648 | 2147483648 | 1000 | 1000 | 536870912000 | 300 | logonly | SYSTEM |
                                                                                                                | 3 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | LogOnlySystem | 5.00 | 5.00 | 37580963840 | 37580963840 | 5000 | 5000 | 536870912000 | 1500 | logonly | SYSTEM |
                                                                                                                | 4 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | S0 | 0.50 | 0.50 | 2147483648 | 2147483648 | 500 | 500 | 536870912000 | 150 | standard | SYSTEM |
                                                                                                                | 5 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | S1 | 1.50 | 1.50 | 6442450944 | 6442450944 | 1250 | 1250 | 536870912000 | 375 | standard | SYSTEM |
                                                                                                                | 6 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | S2 | 3.00 | 3.00 | 12884901888 | 12884901888 | 2500 | 2500 | 536870912000 | 750 | standard | SYSTEM |
                                                                                                                | 7 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | S3 | 6.00 | 6.00 | 21474836480 | 21474836480 | 5000 | 5000 | 536870912000 | 1500 | standard | SYSTEM |
                                                                                                                | 8 | 2023-04-06 13:56:47 | 2023-04-06 13:56:47 | NULL | S4 | 12.00 | 12.00 | 42949672960 | 42949672960 | 5000 | 5000 | 536870912000 | 3000 | standard | SYSTEM |
                                                                                                                | 16 | 2023-04-06 20:17:38 | 2023-04-06 20:17:38 | admin | S2C4G | 2.00 | 2.00 | 4294967296 | 4294967296 | 5000 | 128 | 536870912000 | 75 | default | CUSTOM |
                                                                                                                +----+---------------------+---------------------+---------+---------------+---------+---------+-------------+-------------+----------+----------+---------------+-----------------+----------+--------+
                                                                                                                9 rows in set (0.00 sec)


                                                                                                                怀疑是  type 不对导致看不到新建规格,于是直接将刚添加的规格设置为 SYSTEM 规格。
                                                                                                                 
                                                                                                                  update ob_unit_spec set type='CUSTOM' where id=16;
                                                                                                                  commit;

                                                                                                                  刷新页面,还是看不到。估计是页面缓存。重启 OCP 看看。

                                                                                                                    [root@OB03 t-oceanbase-antman]# docker restart ocp
                                                                                                                    容器资源不高,重启大概需要 1 分钟后,OCP 服务启动成功。
                                                                                                                    资源规格里还是看不到自定义的规格。
                                                                                                                     
                                                                                                                    既然这个推测不对,那就更改原有的资源规格吧。
                                                                                                                      update ob_unit_spec set max_memory=4294967296, min_memory=4294967296, max_cpu=2, min_cpu=2 where name='S1';
                                                                                                                      commit;

                                                                                                                      最终发现页面上显示的还是老的资源规格或者当改了一个规格后 OCP 上就看不到了。原因不明。

                                                                                                                      看来是绕不过去了。只好继续创建租户。

                                                                                                                       

                                                                                                                      创建租户

                                                                                                                      选用最小的 S1 规格创建租户,OCP 报错,提示

                                                                                                                      操作OB失败,错误信息: (conn=524289) machine resource 'zone1' is not enough to hold a new unit

                                                                                                                      报错时符合预期的,可分配的内存不足。

                                                                                                                      还有个办法,调小 OB 集群的系统保留内存,释放更多的可用内存,等租户创建成功后,再把租户内存规格调小。


                                                                                                                        mysql -h10.0.0.62 -uroot@sys#obdemo -P2883 -p'aaAA11__' -c -A oceanbase -e "alter system set system_memory='2G';"

                                                                                                                        此时剩余内存有 6.25 G 。这回应该够了。

                                                                                                                          +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                                          | zone | observer | cpu_total | cpu_free | mem_total_gb | mem_free_gb | disk_total_gb | disk_free_gb |
                                                                                                                          +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                                          | zone1 | 10.0.0.62:2882 | 14 | 9 | 8 | 6.25 | 5 | 0 |
                                                                                                                          +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                                          1 row in set (0.00 sec)

                                                                                                                          再次在 OCP 页面里创建租户。
                                                                                                                          结果还是报错, zone 里可用内存资源不足。
                                                                                                                          怀疑是 OCP 页面问题,再次登录 OB 集群里查看事件日志。
                                                                                                                            MySQL [oceanbase]> select gmt_create , module , event, name1 , value1 , name2, value2  from `__all_rootservice_event_history` areh  order by gmt_create  desc limit 5;
                                                                                                                            +----------------------------+--------------+----------------------+-------+------------------------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                                                                                                                            | gmt_create | module | event | name1 | value1 | name2 | value2 |
                                                                                                                            +----------------------------+--------------+----------------------+-------+------------------------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                                                                                                                            | 2023-04-06 21:11:09.257661 | root_service | drop_resource_unit | ret | 0 | arg | unit_name:"config_oboracle_zone1_S1_upf", if_exist:true |
                                                                                                                            | 2023-04-06 21:11:09.257581 | unit | drop_resource_unit | name | config_oboracle_zone1_S1_upf | | |
                                                                                                                            | 2023-04-06 21:11:09.250401 | root_service | create_resource_pool | ret | -4624 | arg | pool_name:"pool_oboracle_zone1_upf", unit:"config_oboracle_zone1_S1_upf", unit_num:1, zone_list:["zone1"], replica_type:0, if_not_exist:false, is_tenant_sys_pool:false |
                                                                                                                            | 2023-04-06 21:11:09.193022 | unit | create_resource_unit | name | config_oboracle_zone1_S1_upf | | |
                                                                                                                            | 2023-04-06 21:07:58.633907 | root_service | admin_set_config | ret | 0 | arg | {items:[{name:"system_memory", value:"2G", comment:"", zone:"", server:"0.0.0.0", tenant_name:"", exec_tenant_id:1, tenant_ids:[]}], is_inner:false} |
                                                                                                                            +----------------------------+--------------+----------------------+-------+------------------------------+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
                                                                                                                            5 rows in set (0.01 sec)

                                                                                                                            从 OB 的事件日志表看是 OB 创建资源池报错了,错误号   -4624
                                                                                                                            , OCP 再报错后就回滚了这个操作。

                                                                                                                             

                                                                                                                            再从 OCP 里查看 OBSERVER 日志定位到报错日志,看看具体是哪个资源不足。(OCP 这个功能让运维可以不用登录 OB 服务器就能排查问题)。

                                                                                                                             
                                                                                                                             

                                                                                                                            observer 日志里也没有解释是什么资源不足。明明内存资源足够,为什么还不行。原因不明。

                                                                                                                            最后调低 OB 集群的系统内存规格再释放 1G 内存出来。

                                                                                                                              alter system set system_memory='1G';
                                                                                                                              +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                                              | zone | observer | cpu_total | cpu_free | mem_total_gb | mem_free_gb | disk_total_gb | disk_free_gb |
                                                                                                                              +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                                              | zone1 | 10.0.0.62:2882 | 14 | 9 | 9 | 7.25 | 5 | 0 |
                                                                                                                              +-------+----------------+-----------+----------+--------------+-------------+---------------+--------------+
                                                                                                                              1 row in set (0.01 sec)
                                                                                                                               

                                                                                                                              后面由于 OCP 创建租户的页面里资源规格还是有异常,于是彻底放弃 OCP 页面创建租户,等产品后续版本修复。

                                                                                                                               

                                                                                                                              这里采用命令行下建租户方式绕过。在业务 OB 集群里执行。


                                                                                                                                CREATE resource unit my_unit_config max_cpu=4, min_cpu=4, max_memory='2G', min_memory='2G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size='1024G'; 
                                                                                                                                CREATE resource pool oboracle_pool unit = 'my_unit_config', unit_num = 1;
                                                                                                                                CREATE tenant oboracle_pool resource_pool_list=('oboracle_pool'), primary_zone='RANDOM',comment 'oracle tenant/instance', charset='utf8' set ob_tcp_invited_nodes='%', ob_compatibility_mode='oracle';

                                                                                                                                手动创建的租户,等个几分钟后,会被 OCP 采集到,自动加入 OCP 管理。这个功能不错。


                                                                                                                                OCP 使用租户

                                                                                                                                接下来在 OCP 里查看租户,有了手动创建的租户。

                                                                                                                                 

                                                                                                                                在后面浏览这个新租户的用户的时候自动弹框提示需要填入 ORACLE 租户的 SYS 密码。手动创建的ORACLE 租户初期 SYS 密码是空。

                                                                                                                                 
                                                                                                                                 


                                                                                                                                结束语

                                                                                                                                到此就完成了企业版 OCP 、OB 集群在小内存服务器上的部署,租户的创建和使用。虽然这期间有很多曲折,但结果还不错。相比前面几个版本,OCP 在 OB 集群和租户的运维、性能诊断方面功能的确加强了很多。以后再给大家分享。
                                                                                                                                总结一下这次的经验,就下面几条:
                                                                                                                                • OCP 和 OB 的启动内存资源都是可以调整的,OCP 元数据库的租户资源也可以调整。
                                                                                                                                • OCP 里任务失败可以修复后将任务跳过。
                                                                                                                                • 定位任务失败原因可以查看 OCP 任务日志,也可以在 OCP 里查看 OB 运行日志。
                                                                                                                                • 手动创建的 OB 租户或 OB 集群、OBProxy 集群,都可以通过 OCP 接管。



                                                                                                                                 

                                                                                                                                更多阅读


                                                                                                                                文章转载自数据库技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                                                                评论