环境信息
作用 | 主机名 | 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 | ssh-keygen -t rsa |
目标机器将公钥加入authorized_keys
:
1 | cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys |
完成后就可以免密登录目标机器了:
1 | ssh root@192.168.0.185 |
如果嫌敲ip麻烦,可以在中控机器的/etc/hosts
里面加上主机信息,然后ssh的时候用主机名。
1 | 192.168.0.128 ecs-ob-0001 |
配置时钟源
配置时钟同步,给每台机器安装ntp服务:
1 | yum install ntp ntpd -y |
使用ob-0001作为内网时钟源服务端,在/etc/ntp.conf
中将外网时钟源注释掉,并加上
1 | server 127.127.1.0 |
保存后重启ntp服务
1 | systemctl restart ntpd |
然后查看时钟源是否同步,带”*”表示已经同步。
1 | ntpq -p |
剩下两台目标机器的/etc/ntp.conf
也进行类似修改,将时钟源换成ob-0001
1 | server 192.168.0.128 iburst |
然后重启ntp服务即可。查看时钟源是否同步:
1 | [root@ecs-ob-0002 ~]# ntpq -p |
使用ntpstat
和timedatectl
命令验证目标机器上的时钟是否同步:
1 | [root@ecs-ob-0002 ~]# ntpstat |
规划磁盘
正常情况下,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 | root soft nofile 655350 |
完成后重新登陆,通过ulimit -a
查看是否生效。
如果用vscode重新登陆,有可能出现不会生效的情况,重启一下就好了。
设置sysctl.conf
为了保证OB的正常运行,需要对sysctl.conf
进行修改配置,提高Linux系统的性能。
在/etc/sysctl.conf
中修改以下内容:
1 | # for oceanbase |
基本按照官网部署教程修改,由于仅做测试,最后一行注释掉了。修改完成后执行sysctl -p
使配置生效。
关闭防火墙和SELinux
使用如下命令关闭防火墙:
1 | systemctl disable 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 | yum install -y yum-utils |
安装OBLibs
1 | yum install -y oceanbase-ce-libs |
安装OBClient
1 | yum install -y libobclient |
下载并修改配置文件
可以从OceanBase的GitHub上下载对应的yaml配置文件,然后根据自己机器的实际情况进行修改,下面是去除注释之后的部分,这里并没有把数据盘、事务日志盘和OB数据库安装盘的目录做区分,全部放在一起,实际生产环境的时候要分开设置。
1 | user: |
完成后保存为distributed-with-obproxy-example.yaml
。
部署OceanBase集群
1 | obd cluster deploy ob_tpch -c distributed-with-obproxy-example.yaml |
部署完成后,可以如下查看当前的OceanBase集群列表
1 | obd cluster list |
1 | [root@ecs-ob-0001 ~]# obd cluster list |
查看某一个cluster
1 | obd cluster display ob_tpch |
1 | [root@ecs-ob-0001 ~]# obd cluster display ob_tpch |
验证
完成部署后就可以通过如下命令进行部署,-h
代表OceanBase所在实例的地址,-P
代表mysql所使用的端口号,默认为2881
1 | obclient -h192.168.0.128 -P2881 -uroot |
此时应当能够看到OceanBase的shell,测试一下:
1 | use oceanbase; |
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 | use oceanbase; |
能够得到如下结果,含有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 | ----------------+-----------------+---------+---------+------------+------------+ |
这里的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
3create 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 | sudo yum install -y yum-utils |
接着创建如下软链接:
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