当前位置: 代码迷 >> 综合 >> 一文带你掌握 OceanBase 社区版部署细节及原理
  详细解决方案

一文带你掌握 OceanBase 社区版部署细节及原理

热度:29   发布时间:2024-01-17 11:35:02.0

作者:庆涛。 DBA,熟悉 Oracle / MySQL / SQLServer / OceanBase , 现主要从事 OceanBase 产品和解决方案推广工作。

 

个人公众号:OceanBase技术闲谈

OceanBase在2021年6月1日发布了社区版后(官网:OceanBase 社区版),立即有很多网友开始下载使用。部分朋友反馈在安装部署上不是很顺利,本文主要是提供一种简易的社区版安装方法,帮助大家快速了解有关原理以及具体操作步骤。

在社区版发布之前,在OceanBase 1.0版本发布之后,OceanBase软件从来只有一个版本(一个rpm包)。不管此前你从哪个渠道获取,不管是什么形态(可执行文件、rpm包、docker镜像),它跟蚂蚁内部所使用的OceanBase都是一个代码分支(功能一样)。区别只是具体的软件版本不一样(如1.4.7,2.2.3,2.2.5,2.2.7等)。在社区版发布之后,才有了社区版和企业版区分,二者功能上的确有区别,功能对比具体可以看官网 :OceanBase 社区版。

但是OceanBase最核心的基本能力都一样,包括:多副本Paxos协议强同步、SQL引擎(兼容MySQL)、分布式事务、水平扩展。所以就部署方法而言,社区版和企业版的部署方法都是一样的。以前总结的OceanBase部署经验同样适用于社区版。

参考:(OceanBase 2.2 安装部署问题解答)

OceanBase部署的方法比Oracle RAC简单许多,新手觉得难的主要原因在于还不太了解OB的步骤原理。当机器资源和环境都初始化正确后,命令行环境里运行5分钟即可重新部署一个OceanBase集群。很多人喜欢自动化脚本部署,觉得省事。但弊端也很明显。如果部署成功了,不知道为什么成功;部署报错了,也不知道为什么报错。除非你研究自动化部署脚本的程序 。

下面我们将提供一个方法帮助初学者把社区版快速运行起来,会省略一些OS内核参数、数据库内核参数的配置过程。因此这个方法装好的OB不适合立即展开性能测试。

首先是下载社区版。

这里不考虑源码编译安装了。按官网方法下载。

yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo# 创建一个目录用于下载
mkdir rpm
cat > rpm_list <<EOF
oceanbase-ce-3.1.0-1.el7.x86_64.rpm
oceanbase-ce-libs-3.1.0-1.el7.x86_64.rpm
obproxy-3.1.0-1.el7.x86_64.rpm
EOF
wget -B https://mirrors.aliyun.com/oceanbase/community/stable/el/7/x86_64/ -i rpm_list -P rpm

先不要安装rpm包。

第二机器配置。

OceanBase机器里关键资源是内存。就目前而言,4C8G的环境将OB跑起来是没问题的。如果条件允许,尽可能用更大资源的机器。比如说我用的16C64G的阿里云ECS。机器资源多一点,我可以多起几个OB进程,在单机上模拟搭建一个集群。

机器磁盘也单独说一下。这关系到OB的数据文件、日志文件的存储。这个路径比较多确实有点难记。初学时简单点,机器搞一块独立的裸盘即可(/dev/sdb)。磁盘的空间稍微大于内存的4倍吧。

第三是操作系统配置。

为缩减篇幅,不说OS内核参数设置了,那些是关乎性能的。这里目标降低为跑起来。

将物理盘格式化为文件系统 /data

[root@obpilot ~]# fdisk /dev/vdb
[root@obpilot ~]# mkfs -t ext4 /dev/vdb1
[root@obpilot ~]# mkdir -p /data
[root@obpilot ~]# mount -t ext4 /dev/vdb1 /data

官网OBD安装的OB会运行在root用户下。这个习惯很不好。生产的OB默认运行在admin用户下,这里也这么做。要换成其他用户也可以,先按admin用户安装好熟悉一下特点再考虑换其他用户。

[root@obpilot ~]# useradd admin
[root@obpilot ~]# rpm -ivh rpm/*
准备中...                          ################################# [100%]
正在升级/安装...1:oceanbase-ce-libs-3.1.0-1.el7    ################################# [ 33%]2:oceanbase-ce-3.1.0-1.el7         ################################# [ 67%]3:obproxy-3.1.0-1.el7              ################################# [100%]

查看一下具体安装目录。

[root@obpilot ~]# rpm -ql oceanbase-ce-3.1.0-1.el7.x86_64
/home/admin/oceanbase
/home/admin/oceanbase/bin
/home/admin/oceanbase/bin/import_time_zone_info.py
/home/admin/oceanbase/bin/observer
/home/admin/oceanbase/etc
/home/admin/oceanbase/etc/timezone_V1.log
[root@obpilot ~]# rpm -ql obproxy-3.1.0-1.el7
/home/admin/obproxy-3.1.0/bin
/home/admin/obproxy-3.1.0/bin/obproxy
/home/admin/obproxy-3.1.0/bin/obproxyd.sh
[root@obpilot ~]#

第四启动OB进程。

在 admin用户下启动,在oceanbase主目录启动,严格按照下面步骤执行命令。


[admin@obpilot oceanbase]$ su - admin
[admin@obpilot oceanbase]$ mkdir -p /data/observer01/store/{sort_dir,sstable,clog,ilog,slog}
[admin@obpilot oceanbase]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/admin/oceanbase/lib/
[admin@obpilot oceanbase]$ cd /data/observer01 && /home/admin/oceanbase/bin/observer -r 172.20.249.39:2882:2881 -o __min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,sys_bkgd_migration_retry_num=3,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_size=50G,enable_syslog_recycle=True,max_syslog_file_count=10 -z zone1 -p 2881 -P 2882 -c 1 -d /data/observer01/store -i eth0 -l INFO


上面黄色底色的都是要根据实际环境修改的

1. -d 是指定存放 OB节点的数据文件和日志文件的目录。这个目录下必须存在几个子目录。如果你重装了,把 -d 的目录清空重新创建。

2. -r 是指定OB节点的信息。上面是单节点。后面再看三节点的示例。

3. -o 是指定OB进程启动参数,如果你熟悉OB参数,可以在这里调整。这里的 memory_limit=8G,表示启动一个8G的OB进程。如果你机器实际内存比这个大,可以改大它。内存越大的话,你甚至可以去掉这些内存相关的参数。data_size是数据文件大小,确保可以分配出来并且分配后剩余空间比例不低于10%以及是内存 2 倍以上。

4. -i 是网卡名,跟 -r 后面的IP要对应上。

5. 启动目录改到 /data/observer01下,这样相关的运行日志会在这个目录下。后面还要启动多个节点,每个节点的observer进程运行日志是分开存放的。

启动后能看到observer进程,监听端口(2881和2882),那这一步就成功了。

rs list: 172.20.249.39:2882:2881
optstr: __min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,sys_bkgd_migration_retry_num=3,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_size=50G,enable_syslog_recycle=True,max_syslog_file_count=10
zone: zone1
mysql port: 2881
rpc port: 2882
cluster id: 1
data_dir: /data/observer01/store
devname: eth0
log level: INFO
[2021-06-26 17:27:34.052449] ERROR [LIB] pidfile_test (utility.cpp:1153) [9005][0][Y0-0000000000000000] [lt=0] fid file doesn't exist(pidfile="run/observer.pid") BACKTRACE:0x90a107e 0x90008fb 0x24c152f 0x251bb2d 0x90a6215 0x24be1a8 0x7f1a0a400495 0x24bd4e9
[admin@obpilot oceanbase]$ ps -ef|grep observer
admin     9006     1 73 17:27 ?        00:00:04 bin/observer -r 172.20.249.39:2882:2881 -o __min_full_resource_pool_memory=268435456,memory_limit=8G,system_memory=4G,stack_size=512K,cpu_count=16,cache_wash_threshold=1G,workers_per_cpu_quota=10,schema_history_expire_time=1d,net_thread_count=4,sys_bkgd_migration_retry_num=3,minor_freeze_times=10,enable_separate_sys_clog=0,enable_merge_by_turn=False,datafile_size=50G,enable_syslog_recycle=True,max_syslog_file_count=10 -z zone1 -p 2881 -P 2882 -c 1 -d /data/observer01/store -i eth0 -l INFO
admin     9577  8043  0 17:27 pts/2    00:00:00 grep --color=auto observer
[admin@obpilot oceanbase]$ netstat -ntlp
(Not all processes could be identified, non-owned process infowill not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:2881            0.0.0.0:*               LISTEN      9006/bin/observer
tcp        0      0 0.0.0.0:2882            0.0.0.0:*               LISTEN      9006/bin/observer
[admin@obpilot oceanbase]$

说明:

如果你不是第一次启动,再次启动的时候会看到提示“ERROR [LIB] pidfile_test (utility.cpp:1153) [9005][0][Y0-0000000000000000] [lt=0] fid file doesn't exist(pidfile="run/observer.pid")”。这个报错没有实质性影响,这个信息日志级别应该用 WARN 而不是 ERROR 。希望社区版能有人把这个错误给修改了。

仅仅是进程启动了,并不代表OB部署成功了。

第五步,集群bootstrap。

不用奇怪我说集群。三副本是集群,单副本也是集群。单副本不一定是单节点。

进程第一次启动后,用mysql客户端登录(mysql版本5.5/5.6/5.7) ,root密码为空。用 obclient 也可以(需要安装 yum -y install obclient)。

[admin@obpilot oceanbase]$ mysql -h127.1 -uroot -P2881 -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3221225473
Server version: 5.7.25 OceanBase 3.1.0 (r-) (Built May 30 2021 11:21:29)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [(none)]>
MySQL [(none)]>set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '172.20.249.39:2882' ;
Query OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (15.67 sec)
MySQL [(none)]> alter user root identified by '123456';
Query OK, 0 rows affected (0.02 sec)MySQL [(none)]> Bye
[admin@obpilot oceanbase]$ mysql -h127.1 -uroot@sys -P2881 -p123456 -c -A oceanbase
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3221487636
Server version: 5.7.25 OceanBase 3.1.0 (r-) (Built May 30 2021 11:21:29)Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MySQL [oceanbase]> show databases;
+--------------------+
| Database           |
+--------------------+
| oceanbase          |
| information_schema |
| mysql              |
| SYS                |
| LBACSYS            |
| ORAAUDITOR         |
| test               |
+--------------------+
7 rows in set (0.00 sec)MySQL [oceanbase]>

bootstrap 是学OB的第一道门槛。迈不过去就永远部署不了OB。bootstrap 原理比较复杂,根据原理或日志去找原因不是个好主意。bootstrap失败的原因通常很简单。如内存资源不够、目录权限不对、磁盘空间不够等等、多节点时间不同步(超过5ms)、多节点网络延时很大(超过50ms)。这一块有单独的文章总结,可以参考《OceanBase 2.2安装部署问题解答》。

bootstrap 成功后,用用户名 root@sys 登录后,查看数据库,可以看到多出几个database:oceanbase 。

看到 oceanbase 这个数据库,那就是真正成功了。

第六步,建租户(实例)。

租户就是实例,是逻辑实例,没有单独的进程。OceanBase在企业自己机房部署后,可以给开发提供类似云数据库的服务。Database As A Service。实例按需分配,立即分配(1分钟不到),实例资源后期可以在线调整,多退少补。OceanBase改变的是传统数据库的运维形态,DBA更像是一个资源管家,更专注于服务业务。

这一步很简单,但是很多人也会在这里碰到资源不足问题。在分配租户之前,首先得知道集群有多少资源可用。

MySQL [oceanbase]> 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) mem_free_gb, usec_to_time(b.last_offline_time) last_offline_time, usec_to_time(b.start_service_time) start_service_time, b.status, b.build_version , usec_to_time(a.stop_time) stop_time
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 | last_offline_time          | start_service_time         | status | build_version                 | stop_time                  |
+-------+--------------------+-----------+----------+--------------+-------------+----------------------------+----------------------------+--------+-----------------------