命令行部署分布式 OceanBase 集群

部署分布式 OceanBase 集群

本文档使用命令行 来进行 1-1-1 架构的分布式 OceanBase 集群部署,有 3 台 服务器,每 1 台 服务器就是一个 Zone。

192.168.48.142

192.168.55.209

192.168.55.210

前提条件

  • 准备三台服务器,并且这三台机器之间可以互相访问。同时,需要确保本地机器能够通过 SSH 登录到这三台服务器,以便进行操作和配置。
  • 准备好 OceanBase 数据库的 RPM 包、OBClient 的 RPM 包 和 OBProxy RPM 包

部署前配置

创建 admin 用户(所有节点)

使用 root 用户分别登录3台服务器

ssh root@192.168.48.142
ssh root@192.168.55.209
ssh root@192.168.55.210
创建 admin 用户
--创建用户组 admin 以及创建用户 admin
useradd -U admin -d /home/admin -s /bin/bash

--设置用户admin密码
echo 'admin'|passwd --stdin admin

--赋予用户目录权限
chown -R admin:admin /home/admin

--为账户 admin 设置 sudo 权限
sudo visudo  等价于 vi /etc/sudoers
在打开的界面找到以下内容
Same thing without a password
# %wheel        ALL=(ALL)       NOPASSWD: ALL
条目下增加
admin       ALL=(ALL)       NOPASSWD: ALL
按 ESC 键,输入 :wq,保存退出。

--云服务器需要,修改 root 用户权限并将 admin 用户添加至 wheel 组   
vim /etc/pam.d/su
在打开的界面找到以下内容
#auth           sufficient      pam_wheel.so trust use_uid
删除前面的注释符号#  保存   

然后将 admin 用户添加至 wheel 组
usermod -aG wheel admin

目录规划(所有节点)

--创建 data 目录
mkdir -p /data/{1,log1}

--赋予权限
chown -R admin:admin /data

依次往 3 台主机上传 rpm 安装包

官方下载地址:https://www.oceanbase.com/softwarecenter

根据部署环境选择对应的安装介质

说明:OBproxy 可以和 OBServer 共用一台主机 ,这里只需要将安装包上传到一台主机即可。

下载并上传到/home/admin目录下

[root@iZbp1330hxx8l77slgu7ghZ ~]# ls -l /home/admin/
total 341204
-rw-r--r-- 1 root root  12010316 Jun 11  2024 obclient-2.2.6-32024052710.el7.x86_64.rpm
-rw-r--r-- 1 root root  75214004 Apr 17 20:41 ob-deploy-3.2.0-2.el7.x86_64.rpm
-rw-r--r-- 1 root root  30409776 Jun 11  2024 obproxy-4.2.3.0-20231226165754.el7.x86_64.rpm
-rw-r--r-- 1 root root 231747600 Jun 18  2024 oceanbase-4.3.1.0-100010022024052916.el7.x86_64.rpm

部署操作

安装软件(所有节点)

  1. 登录到 服务器。
  2. 切换到 admin 目录下。
cd /home/admin
  1. 安装 OceanBase 数据库 RPM 包。
rpm -ivh oceanbase-4.3.1.0-100010022024052916.el7.x86_64.rpm

说明:OceanBase 软件将会被安装在目录 /home/admin/oceanbase 下。如果需要指定其他目录,可以通过设置 --prefix 参数来指定。命令参考如下: rpm -ivh --prefix=<自定义安装目录>

  1. 安装 obclient 客户端 RPM 包。
rpm -ivh obclient-2.2.6-32024052710.el7.x86_64.rpm
  1. 重复步骤 1 ~ 步骤 4,完成所有机器上 OceanBase 数据库 RPM 包和 obclient RPM 包的安装。
  2. 安装 OBproxy RPM 包。只在192.168.48.142上安装

说明:OBproxy RPM 包安装到其中一台机器即可。

rpm -ivh obproxy-4.2.3.0-20231226165754.el7.x86_64.rpm

初始化目录(所有节点)

说明:

OceanBase 的数据目录通常建在独立的磁盘上 ,然后通过软链接方式链接到软件 Home 目录 下面。

此处 dxjoceanbase 是以集群名称 创建的目录,可根据需要自行定义。该名称在启动 observer 进程时会用到

切换 admin 用户

su - admin

创建各目录盘

su - admin

--创建OceanBase 数据盘目录
mkdir -p /data/1/dxjoceanbase/{etc3,sstable,slog}

--创建 OceanBase 日志盘目录
mkdir -p /data/log1/dxjoceanbase/{clog,etc2}

--创建 OceanBase 数据文件目录
mkdir -p /home/admin/oceanbase/store/dxjoceanbase

--创建 OBproxy 日志文件目录
mkdir -p /home/admin/logs/obproxy/log

建立软连接

建立数据文件目录下 sstableslog 文件到数据盘目录的软连接。

su - admin
for t in {sstable,slog};do ln -s /data/1/dxjoceanbase/$t /home/admin/oceanbase/store/dxjoceanbase/$t; done

建立数据文件目录下 clogetc2 到数据盘目录的软连接。

su - admin
for t in {clog,etc2};do ln -s /data/log1/dxjoceanbase/$t /home/admin/oceanbase/store/dxjoceanbase/$t; done

建立到 obproxy 的软链接(该操作在安装了 OBProxy 的主机上执行)

obproxy 安装目录在 /opt/taobao/install 下。obproxy 进程 home 目录是 /opt/taobao/install/obproxy ,这是一个软链接,实际指向相应的 obproxy 版本软件目录。

--建立软链接
su - admin
cd /opt/taobao/install
sudo ln -s obproxy-4.2.3.0 obproxy

--修改 obproxy 的所有者和所属组为 admin
su - root
chown -R admin:admin /opt/taobao/install/obproxy

初始化 OceanBase 集群

注意

  • 启动 observer 进程,必须使用 admin 用户
  • 在部署时应根据机器真实 IP 填写(ECS 机器的私有 IP 地址)。

启动 observer 进程

语法
su - admin
--语法
cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer {-I $ip | -i $devname} -P $rpc_port -p $sql_port -z $zone_name -d /home/admin/oceanbase/store/$cluster_name -r '$ip:2882:2881' -c $cluster_id -n $cluster_name -o "system_memory=30G,datafile_size=500G,config_additional_dir=/data/1/$cluster_name/etc3;/data/log1/$cluster_name/etc2"
参数解释
参数 说明
-I

-i|* -I :指定待启动的节点 IP 。在多机部署场景下,不能指定 127.0.0.1 作为目标 IP。建议使用指定 IP(例如:-I 10.10.10.1 )来启动节点。

  • -i :指定网卡名 ,可通过 ifconfig 命令查看。

说明:支持通过同时指定 IP 和网卡名 (例如:-I 10.10.10.1 -i eth0 )来启动节点,但不建议这么用 。|
|-p|指定服务端口号,一般指定为 2881|
|-P|指定 RPC 端口号,一般指定为 2882|
|-n|指定集群名称。可自定义,不同集群名称不要重复即可。|
|-z|指定启动的 observer 进程所属的 Zone。|
|-d|指定集群主目录,初始化目录时创建的目录。除集群名字 $cluster_name 外,其他不要变动 。|
|-c|指定集群 ID。为一组数字,可以自定义,不同集群不要重复即可。|
|-l|指定日志级别。|
|-r|指定 RS 列表,格式是 $ip:2882:2881 ,分号分割,表示 Root Service 信息。|
|-o|指定集群启动参数(配置项)列表,为可选项。可以为多个配置项指定值,多个配置项的值之间使用英文逗号进行分隔。请根据实际需要,选择适当的启动参数并为每个参数指定合适的值,以优化集群的性能和资源利用率。以下是一些常用的集群启动配置项:

  • cpu_count:用于设置系统 CPU 总数。
  • system_memory:用于设置系统预留给租户 ID 为 500 的租户的内存容量,即指定 OceanBase 数据库内部保留内存。在机器内存较少的情况下可以考虑将该值调小,需要注意的是,在性能测试时可能会出现内存不足的问题。
  • :用于设置可用的总内存大小。
  • datafile_size:用于设置数据文件占用磁盘可用空间的大小。即指定 OceanBase 数据库数据文件 sstable 的大小(一次性初始化),根据 /data/1/ 可用空间评估,建议不少于 100G
  • datafile_disk_percentage:磁盘数据文件占用磁盘总空间的百分比。
  • datafile_next:用于设置磁盘数据文件自动扩容的步长。
  • datafile_maxsize:用于设置磁盘数据文件自动扩容的最大空间。
  • config_additional_dir:用于设置本地存储配置文件的多个目录,为了冗余存储多份配置文件。
  • log_disk_size:用于设置 Redo 日志磁盘的大小。
  • log_disk_percentage:用于设置 Redo 日志占用其所在磁盘总空间的百分比。
  • syslog_level:用于设置系统日志级别。
  • syslog_io_bandwidth_limit:用于设置系统日志所能占用的磁盘 IO 带宽上限,超过带宽上限容量的系统日志将被丢弃。
  • max_syslog_file_count:用于设置在回收日志文件之前可以容纳的日志文件数量。
  • enable_syslog_recycle:用于设置是否开启回收系统日志的功能。|
依次启动三台机器的 observer 进程
启动第一台机器的 observer 进程
--zone1:在 admin 用户下,启动第一台机器的 observer 进程
su - admin
cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -I 192.168.48.142 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/dxjoceanbase -r '192.168.48.142:2882:2881;192.168.55.209:2882:2881;192.168.55.210:2882:2881' -c 10001 -n dxjoceanbase -o "memory_limit=6G,system_memory=1G,datafile_size=10G,log_disk_size=5G,__min_full_resource_pool_memory=1073741824,resource_hard_limit=150,config_additional_dir=/data/1/dxjoceanbase/etc3;/data/log1/dxjoceanbase/etc2"

--验证 observer 进程启动成功
ps -ef|grep observer   输出如下:
admin     2230     1  8 15:10 ?        00:00:01 /home/admin/oceanbase/bin/observer -I 192.168.48.142 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/dxjoceanbase -r 192.168.48.142:2882:2881;192.168.55.209:2882:2881;192.168.55.210:2882:2881 -c 10001 -n dxjoceanbase -o memory_limit=6G,system_memory=1G,datafile_size=10G,log_disk_size=5G,__min_full_resource_pool_memory=1073741824,resource_hard_limit=150,config_additional_dir=/data/1/dxjoceanbase/etc3;/data/log1/dxjoceanbase/etc2
启动第二台机器的 observer 进程
--zone2:在 admin 用户下,启动第二台机器的 observer 进程
su - admin
cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -I 192.168.55.209 -P 2882 -p 2881 -z zone2 -d /home/admin/oceanbase/store/dxjoceanbase -r '192.168.55.209:2882:2881;192.168.55.209:2882:2881;192.168.55.210:2882:2881' -c 10001 -n dxjoceanbase -o "memory_limit=6G,system_memory=1G,datafile_size=10G,log_disk_size=5G,__min_full_resource_pool_memory=1073741824,resource_hard_limit=150,config_additional_dir=/data/1/dxjoceanbase/etc3;/data/log1/dxjoceanbase/etc2"

--验证 observer 进程启动成功
ps -ef|grep observer   输出如下:
admin     2230     1  6 15:10 ?        00:00:15 /home/admin/oceanbase/bin/observer -I 192.168.48.142 -P 2882 -p 2881 -z zone1 -d /home/admin/oceanbase/store/dxjoceanbase -r 192.168.48.142:2882:2881;192.168.55.209:2882:2881;192.168.55.210:2882:2881 -c 10001 -n dxjoceanbase -o memory_limit=6G,system_memory=1G,datafile_size=10G,log_disk_size=5G,__min_full_resource_pool_memory=1073741824,resource_hard_limit=150,config_additional_dir=/data/1/dxjoceanbase/etc3;/data/log1/dxjoceanbase/etc2
启动第三台机器的 observer 进程
--zone3:在 admin 用户下,启动第三台机器的 observer 进程
cd /home/admin/oceanbase && /home/admin/oceanbase/bin/observer -I 192.168.55.210 -P 2882 -p 2881 -z zone3 -d /home/admin/oceanbase/store/dxjoceanbase -r '192.168.48.142:2882:2881;192.168.55.209:2882:2881;192.168.55.210:2882:2881' -c 10001 -n dxjoceanbase -o "memory_limit=6G,system_memory=1G,datafile_size=10G,log_disk_size=5G,__min_full_resource_pool_memory=1073741824,resource_hard_limit=150,config_additional_dir=/data/1/dxjoceanbase/etc3;/data/log1/dxjoceanbase/etc2"

--验证 observer 进程启动成功
ps -ef|grep observer   输出如下:
admin     2282     1 14 15:16 ?        00:00:01 /home/admin/oceanbase/bin/observer -I 192.168.55.210 -P 2882 -p 2881 -z zone3 -d /home/admin/oceanbase/store/dxjoceanbase -r 192.168.48.142:2882:2881;192.168.55.209:2882:2881;192.168.55.210:2882:2881 -c 10001 -n dxjoceanbase -o memory_limit=6G,system_memory=1G,datafile_size=10G,log_disk_size=5G,__min_full_resource_pool_memory=1073741824,resource_hard_limit=150,config_additional_dir=/data/1/dxjoceanbase/etc3;/data/log1/dxjoceanbase/etc2

注意:如果启动失败,可以看下日志中的报错信息,根据报错信息进行错误处理。

[admin@xxx ~]cat /home/admin/oceanbase/log/observer.log |grep "ERROR"

集群 BootStrap 操作

注意: 同一个集群,只需要进行一次集群初始化,即仅执行一次 bootstrap 命令即可。

使用 obclient 命令登录集群

登录任意一台服务器,使用 obclient 命令登录集群

obclient -h127.0.0.1 -uroot -P2881 -p
修改集群的查询时间
set session ob_query_timeout=1000000000;
执行 bootstrap 命令

注意: 启动 observer 进程时设置的不同 Zone 与机器 IP 要一一对应。执行时间约1m多点

--语法
ALTER SYSTEM BOOTSTRAP ZONE 'zone1' SERVER 'xxx.xxx.xxx.xx1:2882',ZONE 'zone2' SERVER 'xxx.xxx.xxx.xx2:2882',ZONE 'zone3' SERVER 'xxx.xxx.xxx.xx3:2882';

--示例
ALTER SYSTEM BOOTSTRAP ZONE 'zone1' SERVER '192.168.48.142:2882',ZONE 'zone2' SERVER '192.168.55.209:2882',ZONE 'zone3' SERVER '192.168.55.210:2882';

如果这一步报错了,一般原因集中在如下几点:

  • observer 进程启动参数不对。
  • observer 相关目录权限不对。
  • 日志目录空间不足一定比例(跟数据目录合用了大目录,空间被数据目录占用了)
  • 节点时间不同步。
  • 节点内存资源不足等等。

请排查这些问题后,清理目录后重新部署,详情请参见 清理 OceanBase 旧集群

简单验证集群初始化成功

通过查看集群中 database ,来简单验证集群初始化成功。

show databases;

输出如下:

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

初始化 OBProxy

创建 OBProxy 账户

OBProxy 需要与后端 OBServer 节点保持通信 ,需要提前在 OceanBase 集群的 sys 租户下为 OBProxy 节点创建连接用户(proxyro)和密码 。该用户密码用于启动 OBProxy 进程时配置相关参数来建立通信

说明: proxyro 用户是 OBProxy 访问 OceanBase 集群的用户。一个 OceanBase 集群对应一个 proxyro 账号。

创建 proxyro 用户
CREATE USER proxyro IDENTIFIED BY '123456';
proxyro 用户授权
GRANT SELECT ON *.* TO proxyro;

执行 exit 命令退出集群。

启动 OBProxy 节点

  • 在安装了 OBProxy 的主机上执行。
  • 进入 admin 用户下的 OBProxy 软件的 home 目录启动 OBProxy 进程。

OBProxy 启动时通过参数 rootservice_list 指定 OceanBase 集群。

语法
cd /opt/taobao/install/obproxy && bin/obproxy -r "xxx.xxx.xxx.1:2881;xxx.xxx.xxx.2:2881;xxx.xxx.xxx.3:2881" -p 2883 -o "observer_sys_password=$sha1_value,enable_strict_kernel_release=false,enable_cluster_checkout=false,enable_metadb_used=false" -c cluster_name

说明

  • $sha1_value 应根据实际设置密码替换。例如:proxyro 用户设置的密码是 123456 ,则需要设置 observer_sys_password 的值是 7c4a8d09ca3762af61e59520943dc26494f8941b 。查询密码 sha1 后的值命令如下:
[admin@xxx ~] echo -n 123456|sha1sum
参数解释
参数 说明
-r 指定 OBServer 节点 IP 和端口。
-p 指定服务端口号,一般指定为 2883
-c 指定集群名称。
-o 指定硬件或者内核参数配置。
示例
--查询密码 sha1 后的值
echo -n 123456|sha1sum

--启动 OBProxy 节点
cd /opt/taobao/install/obproxy && bin/obproxy -r "192.168.48.142:2881;192.168.55.209:2881;192.168.55.210:2881" -p 2883 -o "observer_sys_password=7c4a8d09ca3762af61e59520943dc26494f8941b,enable_strict_kernel_release=false,enable_cluster_checkout=false,enable_metadb_used=false" -c dxjoceanbase

若执行此命令报错bin/obproxy: error while loading shared libraries: libidn.so.11: cannot open shared object file: No such file or directory ,请执行该命令 sudo yum install libidn

检查进程是否存在

ps -ef|grep obproxy

输出结果如下:

admin     2986     1  0 15:23 ?        00:00:00 bin/obproxy -r 192.168.48.142:2881;192.168.55.209:2881;192.168.55.210:2881 -p 2883 -o observer_sys_password=7c4a8d09ca3762af61e59520943dc26494f8941b,enable_strict_kernel_release=false,enable_cluster_checkout=false,enable_metadb_used=false -c dxjoceanbase

部署后验证

部署成功后,可以通过 OBProxy 连接集群。格式为: 用户名@租户名#集群名 或 集群名:租户名:用户名

使用 root 用户登录 dxjoceanbase 集群的 sys 租户。

obclient -h127.0.0.1 -P2883 -uroot@sys#dxjoceanbase -Doceanbase -A

连接成功后,输入如下:

[admin@iZbp1i4d7p6sjwjysy9j8cZ obproxy]$ obclient -h127.0.0.1 -P2883 -uroot@sys#dxjoceanbase -Doceanbase -A
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 1
Server version: OceanBase 4.3.1.0 (r100010022024052916-9a755dd27aaaf5e34e8ad6ad95942a0d89e7c80f) (Built May 29 2024 17:21:45)

Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

obclient [oceanbase]> 

部署完成后,可以根据需要查询集群的资源、创建租户、创建用户等操作。