0%

部署OceanBase并使用TPCH进行测试

环境信息

作用 主机名 IP OS CPU 内存 系统盘 数据盘
observer, obproxy ecs-ob-0001 192.168.0.128 CentOS 7.6 64bit 8C 16G 50G 200G
observer ecs-ob-0002 192.168.0.185 CentOS 7.6 64bit 8C 16G 50G 200G
observer ecs-ob-0003 192.168.0.12 CentOS 7.6 64bit 8C 16G 50G 200G

准备

本次部署采用三副本部署模式,基本参照官方文档的部署步骤,不同的是ODP没有使用单独的机器部署。

没有特别说明,准备部分的步骤对每台机器都执行。

资源准备

根据官方文档,对于CentOS系统,运行以下命令手动关闭透明大页:

1
echo never > /sys/kernel/mm/transparent_hugepage/enabled

配置免密登录

为每台机器配置ssh免密登录,中控机器上如果没有密钥,则创建并将公钥发送给每台目标机器:

1
2
3
ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub root@192.168.0.185:~/.ssh
scp ~/.ssh/id_rsa.pub root@192.168.0.12:~/.ssh

目标机器将公钥加入authorized_keys

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

完成后就可以免密登录目标机器了:

1
ssh root@192.168.0.185

如果嫌敲ip麻烦,可以在中控机器的/etc/hosts里面加上主机信息,然后ssh的时候用主机名。

1
2
3
192.168.0.128 ecs-ob-0001
192.168.0.185 ecs-ob-0002
192.168.0.12 ecs-ob-0003

配置时钟源

配置时钟同步,给每台机器安装ntp服务:

1
yum install ntp ntpd -y

使用ob-0001作为内网时钟源服务端,在/etc/ntp.conf中将外网时钟源注释掉,并加上

1
2
server 127.127.1.0
fudge 127.127.1.0 stratum 10

保存后重启ntp服务

1
systemctl restart ntpd

然后查看时钟源是否同步,带”*”表示已经同步。

1
ntpq -p

剩下两台目标机器的/etc/ntp.conf也进行类似修改,将时钟源换成ob-0001

1
server 192.168.0.128 iburst

然后重启ntp服务即可。查看时钟源是否同步:

1
2
3
4
[root@ecs-ob-0002 ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*192.168.0.128 LOCAL(0) 11 u 40 64 377 0.196 7.476 8.616

使用ntpstattimedatectl命令验证目标机器上的时钟是否同步:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@ecs-ob-0002 ~]# ntpstat
synchronised to NTP server (192.168.0.128) at stratum 12
time correct to within 26 ms
polling server every 64 s
[root@ecs-ob-0002 ~]# timedatectl
Local time: Sat 2022-06-04 14:38:31 CST
Universal time: Sat 2022-06-04 06:38:31 UTC
RTC time: Sat 2022-06-04 06:38:31
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a

规划磁盘

正常情况下,OceanBase数据库需要分别挂载三块盘:数据盘data_dir、事务日志盘redo_dir和OB数据库安装盘home_path

由于仅做测试+条件限制,这里我将所有数据都挂载在/ob-data盘上。数据盘、事务日志盘和数据库安装盘配置的具体要求参考官方文档

设置limits.conf

OceanBase 数据库的进程涉及的限制包括线程最大栈空间大小(Stack)、最大文件句柄数(Open Files)和 core 文件大小 (Core File Size)。

/etc/security/limits.conf中修改以下内容:

1
2
3
4
5
6
7
8
9
10
root soft nofile 655350
root hard nofile 655350
* soft nofile 655350
* hard nofile 655350
* soft stack 20480
* hard stack 20480
* soft nproc 655360
* hard nproc 655360
* soft core unlimited
* hard core unlimited

完成后重新登陆,通过ulimit -a查看是否生效。

如果用vscode重新登陆,有可能出现不会生效的情况,重启一下就好了。

设置sysctl.conf

为了保证OB的正常运行,需要对sysctl.conf进行修改配置,提高Linux系统的性能。

/etc/sysctl.conf中修改以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# for oceanbase
## 修改内核异步 I/O 限制
fs.aio-max-nr=1048576

## 网络优化
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_tw_recycle = 1
net.ipv4.tcp_slow_start_after_idle=0

vm.swappiness = 0
vm.min_free_kbytes = 2097152

# 此处为 OceanBase 数据库的 data 目录
# kernel.core_pattern = /data/core-%e-%p-%t

基本按照官网部署教程修改,由于仅做测试,最后一行注释掉了。修改完成后执行sysctl -p使配置生效。

关闭防火墙和SELinux

使用如下命令关闭防火墙:

1
2
3
systemctl disable firewalld 
systemctl stop firewalld
systemctl status firewalld

/etc/selinux/config中修改如下内容:

1
SELINUX=disabled

然后使更改生效

1
setenforce 0

查看更改是否生效

1
sestatus

由于使用的ECS默认关闭了防火墙和SELinux,这一步直接跳过。

创建用户

如果担心使用root误操作,可以创建一个新的用户(例如admin),并用新用户来进行操作。

OceanBase部署

完成上面的准备工作后,就可以开始部署OceanBase了。

以下的安装均为中控机器上执行,其他的目标机器只需安装OBLibs即可。注意在目标机器上安装时也需要在yum-config-manager中添加Oceanbase的repo(如下安装OBD步骤中所示)。

安装OBD

1
2
3
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
yum install -y ob-deploy

安装OBLibs

1
yum install -y oceanbase-ce-libs

安装OBClient

1
2
yum install -y libobclient
yum install -y obclient

下载并修改配置文件

可以从OceanBase的GitHub上下载对应的yaml配置文件,然后根据自己机器的实际情况进行修改,下面是去除注释之后的部分,这里并没有把数据盘、事务日志盘和OB数据库安装盘的目录做区分,全部放在一起,实际生产环境的时候要分开设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
user:
username: root # your own username
password: ******* # your own password
oceanbase-ce:
servers:
- name: ecs-ob-0001
ip: 192.168.0.128
- name: ecs-ob-0002
ip: 192.168.0.185
- name: ecs-ob-0003
ip: 192.168.0.12
global:
home_path: /ob-data/oceanbase
devname: eth0
memory_limit: 8G
system_memory: 3G
datafile_size: 50G
appname: ob_tpch
ecs-ob-0001:
mysql_port: 2881
rpc_port: 2882
zone: zone1
ecs-ob-0002:
mysql_port: 2881
rpc_port: 2882
zone: zone2
ecs-ob-0003:
mysql_port: 2881
rpc_port: 2882
zone: zone3
obproxy-ce:
depends:
- oceanbase-ce
servers:
- 192.168.0.128
global:
home_path: /root/obproxy
skip_proxy_sys_private_check: true
enable_strict_kernel_release: false

完成后保存为distributed-with-obproxy-example.yaml

部署OceanBase集群

1
2
obd cluster deploy ob_tpch -c distributed-with-obproxy-example.yaml
obd cluster start ob_tpch

部署完成后,可以如下查看当前的OceanBase集群列表

1
obd cluster list
1
2
3
4
5
6
7
8
[root@ecs-ob-0001 ~]# obd cluster list
+------------------------------------------------------------+
| Cluster List |
+-----------+------------------------------+-----------------+
| Name | Configuration Path | Status (Cached) |
+-----------+------------------------------+-----------------+
| ob_tpch | /root/.obd/cluster/ob_tpch | running |
+-----------+------------------------------+-----------------+

查看某一个cluster

1
obd cluster display ob_tpch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@ecs-ob-0001 ~]# obd cluster display ob_tpch
Get local repositories and plugins ok
Open ssh connection ok
Cluster status check ok
Connect to observer ok
Wait for observer init ok
+-------------------------------------------------+
| observer |
+---------------+---------+------+-------+--------+
| ip | version | port | zone | status |
+---------------+---------+------+-------+--------+
| 192.168.0.12 | 3.1.3 | 2881 | zone1 | active |
| 192.168.0.128 | 3.1.3 | 2881 | zone1 | active |
| 192.168.0.185 | 3.1.3 | 2881 | zone1 | active |
+---------------+---------+------+-------+--------+

Connect to obproxy ok
+-------------------------------------------------+
| obproxy |
+---------------+------+-----------------+--------+
| ip | port | prometheus_port | status |
+---------------+------+-----------------+--------+
| 192.168.0.128 | 2883 | 2884 | active |
+---------------+------+-----------------+--------+

验证

完成部署后就可以通过如下命令进行部署,-h代表OceanBase所在实例的地址,-P代表mysql所使用的端口号,默认为2881

1
obclient -h192.168.0.128 -P2881 -uroot

此时应当能够看到OceanBase的shell,测试一下:

1
2
use oceanbase;
select * from __all_server;

TPCH的使用

创建租户

为了使用TPCH,首先需要创建一个新的租户用于测试:

1
obd cluster tenant create ${cluster_name} -n ${tenant_name}

这种方法其实容易报资源不足的错(一开始在这里卡了半天),因为你并没有划分新的资源单元和资源池,所以最好用root用户连接到sys租户,在mysql shell下创建新的租户。

1
obclient -h192.168.0.128 -P2881 -uroot

OceanBase下一开始只有一个sys租户,有已经分配的资源单元sys_unit_config和资源池sys_pool,创建的新租户无法直接使用,所以我们要创建新的资源单元和资源池。

首先查看当前的剩余资源

1
2
3
4
5
use oceanbase;
select a.zone,concat(a.svr_ip,':',a.svr_port) observer, cpu_total, cpu_assigned, (cpu_total-cpu_assigned) cpu_free, mem_total/1024/1024/1024 mem_total_gb, mem_assigned/1024/1024/1024 mem_assign_gb, (mem_total-mem_assigned)/1024/1024/1024 mem_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
;

能够得到如下结果,含有free的就是当前还能使用的资源数

1
2
3
4
5
6
7
+-------+--------------------+-----------+--------------+----------+----------------+----------------+----------------+
| zone | observer | cpu_total | cpu_assigned | cpu_free | mem_total_gb | mem_assign_gb | mem_free_gb |
+-------+--------------------+-----------+--------------+----------+----------------+----------------+----------------+
| zone1 | 192.168.0.128:2882 | 6 | 2.5 | 3.5 | 5.000000000000 | 1.250000000000 | 3.750000000000 |
| zone2 | 192.168.0.185:2882 | 6 | 2.5 | 3.5 | 5.000000000000 | 1.250000000000 | 3.750000000000 |
| zone3 | 192.168.0.12:2882 | 6 | 2.5 | 3.5 | 5.000000000000 | 1.250000000000 | 3.750000000000 |
+-------+--------------------+-----------+--------------+----------+----------------+----------------+----------------+

新建资源池时使用的资源单元不能超过当前剩余的资源,比如理论上,现在的cpu_free的值为3.5,那么创建资源池时的最大cpu核心数就不能超过这个值。

然而这种方法还是不准确,如果创建资源池时的最大cpu核心数设成3,仍然会报错,此时需要看一下所有资源单元的配置情况:

1
SELECT * FROM oceanbase.__all_unit_config;

将返回如下结果,这里去掉了前后的一些不相关的列:

1
2
3
4
5
6
----------------+-----------------+---------+---------+------------+------------+
unit_config_id | name | max_cpu | min_cpu | max_memory | min_memory
----------------+-----------------+---------+---------+------------+------------+
1 | sys_unit_config | 5 | 2.5 | 1610612736 | 1342177280 |
----------------+-----------------+---------+---------+------------+------------+
1 row in set (0.001 sec)

这里的max_cpu=5,意味着新建资源池时的max_cpu是不能超过1的(因为cpu_total=6)!上述仍然报错的原因,就是在sys_unit_config中max和min并不一致,上面的assigned是按min计算的。

为了测试效果的最佳化,我们可以把sys_unit_config这边尽量调小,把测试要用的资源单元尽量调大就行。

1
alter resource unit sys_unit_config max_cpu 0.5,min_cpu 0.5,max_memory '0.5G', min_memory '0.5G';

接着依次执行如下操作,分别对应新建资源单元、新建资源池、创建租户。创建租户中的primary_zone在TPCH测试中通常设为RANDOM

1
2
3
create resource unit tpch_unit max_cpu 5.5, max_memory '4G', max_iops 128, max_disk_size '20G', max_session_num 64, MIN_CPU=5.5, MIN_MEMORY '4G', MIN_IOPS=128;
create resource pool tpch_pool unit = 'tpch_unit', unit_num = 1, zone_list=('zone1','zone2','zone3');
create tenant tpch_mysql resource_pool_list=('tpch_pool'), charset=utf8mb4, replica_num=3, zone_list('zone1', 'zone2', 'zone3'), primary_zone=RANDOM, locality='F@zone1,F@zone2,F@zone3' set variables ob_compatibility_mode='mysql', ob_tcp_invited_nodes='%';

这样,测试用的租户tpch_mysql就创建成功了。

OBD一键测试

OBDeployer可以进行一键测试,首先安装相应依赖:

1
2
3
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/oceanbase/OceanBase.repo
sudo yum install obtpch

接着创建如下软链接:

1
sudo ln -s /usr/tpc-h-tools/tpc-h-tools/ /usr/local/

然后就可以一键测试:

1
obd test tpch ob_tpch --tenant=tpch_mysql -s 10 --remote-tbl-dir=/tmp/tpch_test

-s后的参数表示生成数据库的大小,单位为GB,进行测试的过程不需要其他操作。

10G结果如下:

Query Time/s
1 9.1
2 0.4
3 7.9
4 28.1
5 8.4
6 5.6
7 8.1
8 28.8
9 11.0
10 27.7
11 1.1
12 11.7
13 3.1
14 18.3
15 47.7
16 1.6
17 6.4
18 5.5
19 6.4
20 6.8
21 22.3
22 2.1
total 268.1

参考

https://open.oceanbase.com/docs/observer-cn/V3.1.3

https://blog.51cto.com/hbxztc/4742364

https://blog.csdn.net/u010674953/article/details/117701938

https://blog.csdn.net/xiefp/article/details/41442523

https://ask.oceanbase.com/t/topic/35600048

https://www.modb.pro/db/397718