初试单机搭建OB4.0三节点集群

初试单机搭建OB4.0三节点集群

OB4.0 Beta版已于11月2日发布。小伙伴们,让我们赶紧把学习环境搞起来~~

测试目的:

本测试旨在一台虚拟机上,手动启动一个三节点集群(1-1-1),通过sysbench增加集群负载,使用dooba工具实时监测集群性能。该环境可用于集群扩容、缩容、高可用,合并转储等实验,相较于多虚拟机的集群环境来说,启动和加载更为快速,减少了虚拟机的数量和占用的资源。

测试环境:

  • 物理机最低32G内存,虚拟机24G内存即可。
  • /data需要150G以上空间。

参考视频:

这里推荐两位原厂的UP主:美少女Amber宝宝obpilot,建议关注UP主并一键三连——鼠标长按点赞图标即可。

不到两分钟体验OceanBase 数据库 4.0 版

使用 sysbench 对 OceanBase 数据库进行 OLTP 性能测试(包含翻车记录)_哔哩哔哩_bilibili

OceanBase 独立部署高级玩法二 :2C8G版

OB 性能监控分享── dooba_哔哩哔哩_bilibili

1 OB4.0安装及集群初始化

1.1介质下载及安装

安装请阅读官方文档:快速体验OceanBase-OceanBase数据库-OceanBase文档中心-分布式数据库使用文档

安装完成后,执行obd demo启动。待启动完成后,可以观察observer -o参数的变化,其中对于内存及磁盘空间是有最低要求的。

[admin@bogon bin]$ ps -ef|grep observer
admin    12545     1 69 09:23 ?        00:00:58 /home/admin/oceanbase-ce/bin/observer -r 127.0.0.1:2882:2881 -p 2881 -P 2882 -z zone1 -n obcluster -c 1 -d /home/admin/oceanbase-ce/store -i lo -l INFO -o __min_full_resource_pool_memory=2147483648,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=6G,datafile_size=20G,log_disk_size=24G,system_memory=1G,cpu_count=16

其中,memory_limit是6G,那么操作系统至少要有6G空闲内存供observer进程使用;system_memory为1G,说明OB租户可用的总内存是6-1=5G。此外,由于demo环境下数据文件和事务日志文件往往共用一个磁盘,为了避免目录空间不够的情况发生,数据文件和事务日志文件都被指定了大小,数据文件大小为20G,日志文件大小为24G。OB4.0 demo要求的最低 54G 空间,显然是在此基础上额外预留了10G用于存放安装介质和log日志等。

1.2搭建集群

# 把以下环境变量加入到~/.bash_profile中
export LD_LIBRARY_PATH=/home/admin/oceanbase-ce/lib

# 创建3节点observer使用的相关目录
for i in {node1,node2,node3};    do \
echo $i; \
mkdir -p ~/$i/{admin,bin,etc}; cp ~/oceanbase-ce/bin/observer ~/$i/bin/; cd ~; \
mkdir -p /data/1/$i/obdemo/store/{clog,slog,sstable}  ;\
mkdir -p /data/1/$i/obdemo/{etc2,etc3}  ;\
done

# 启动observer进程,注意修改主机IP地址
port=2880; \
for i in {3,4,5};    do \
echo $i; node="node"$[$i-2]; \
cd /home/admin/$node/ && /home/admin/$node/bin/observer -i eth0 -p $[$port+1] -P $[$port+2] -z "zone"$[$i%3+1]  -d /data/1/$node/obdemo/store -r '192.168.3.170:2882:2881;192.168.3.170:3882:3881;192.168.3.170:4882:4881' -c 20221103 -n demo01 -o "__min_full_resource_pool_memory=2147483648,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=6G,datafile_size=20G,log_disk_size=24G,system_memory=1G,cpu_count=16,config_additional_dir=/data/1/$node/obdemo/etc3;/data/1/$node/obdemo/etc2" ;  \
sleep 3; \
port=$[$port+1000]; \
echo ;cd ~; \
done;
# observer进程启动完成后可检查进程及端口状态
ps -ef|grep observer
netstat -ntlp |grep observer
# 若初始化失败,请检查日志,一般是目录权限问题或资源不足。
# 注意,如果初次bootstrap失败,建议清除所有目录、调整参数后重试。
# 清除安装目录使用admin用户执行如下命令:
# /bin/rm -rf ~/{node1,node2,node3} /data/1/{node1,node2,node3} 

[admin@bogon ~]$ obclient -h127.1 -uroot -A -c -P2881
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 3221225473
Server version: OceanBase_CE 4.0.0.0 (r100000272022110114-6af7f9ae79cd0ecbafd4b1b88e2886ccdba0c3be) (Built Nov  1 2022 14:57:18)

Copyright (c) 2000, 2018, OB Corporation Ab and others.

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

obclient [(none)]> set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '192.168.3.170:2882', ZONE 'zone2' SERVER '192.168.3.170:3882', ZONE 'zone3' SERVER '192.168.3.170:4882' ;
Query OK, 0 rows affected (0.001 sec)

Query OK, 0 rows affected (52.149 sec)

2 创建租户和测试数据库

# 创建资源单元,注意参数与OB3.1.4相比有所变化,
create resource unit microunit max_cpu=4,min_cpu=4, MEMORY_SIZE='2G';
# 创建资源池
create resource pool pool01 unit='microunit', unit_num=1;
# 创建租户
create tenant mysql01 resource_pool_list=('pool01'), primary_zone='RANDOM', charset='utf8' set ob_tcp_invited_nodes='%', ob_compatibility_mode='mysql';
# 修改root@sys的密码
alter user root identified by '123456';
# 修改root@mysql01的密码
obclient -h127.1 -uroot@mysql01 -P2881 oceanbase -A
alter user root identified by '123456';
# 在mysql01租户上创建测试数据库及其用户
create database sbtest;
grant all privileges on sbtest.* to sbuser@'%' identified by 'sbtest';

3 手动带参数启动obproxy

# 此时集群中是没有proxyro用户的,需要手动创建
obclient -h127.1 -uroot -p123456 -P2881
create user proxyro identified by '123456';
grant select on *.* to proxyro;

# 带参数启动obproxy,注意首次启动需要添加-e参数
# 初次启动obproxy出现了多次的obproxy's memroy is out of limit错误。
# 分析日志,判断为proxy_mem_limited=200M 值过小,需要在启动参数中指定一个更大的数值,这里用了1G
/home/admin/obproxy-ce/bin/obproxy -p2883 -r'192.168.3.170:2881;192.168.3.170:3881;192.168.3.170:4881' -n demo01 -c demo01 -e -o 'syslog_level=INFO,proxy_mem_limited=1G'

# obproxy正常启动,日志无报错,但此时遇到了obclient登录obproxy的异常。已确认这是一个小BUG
obclient -h127.1 -uroot@proxysys -P2883
ERROR 2027 (HY000): received malformed packet

# 改用mysql客户端登录成功。
mysql -h127.1 -uroot@proxysys -P2883

# 登录root@proxysys,配置obproxy_sys_password和observer_sys_password的密码
[admin@bogon obproxy-ce]$ mysql -h127.1 -uroot@proxysys -P2883
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.25

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)]> alter proxyconfig set observer_sys_password='123456';
Query OK, 0 rows affected (0.02 sec)

MySQL [(none)]> alter proxyconfig set obproxy_sys_password='123456';
Query OK, 0 rows affected (0.01 sec)

4 性能测试及监控

Sysbench编译安装请查看B站UP主 Amber宝宝 相关视频,本文开头有介绍。具体命令见视频评论。

4.1准备测试数据

此时建议调大freeze_trigger_percentage(默认为20)和major_compact_trigger(默认为0)的值,否则容易出现内存不足。

内存不足时,sysbench会报错:

FATAL: `sysbench.cmdline.call_command' function failed: ./oltp_common.lua:237: db_bulk_insert_next() failed

调整完参数后,使用sysbench准备数据,这里需要修改oltp_read_write.lua文件的路径,其他参数视情况而定。

sysbench --mysql-host=192.168.3.170 --mysql-port=2883 --mysql-db=sbtest --mysql-user="sbuser@mysql01"  --mysql-password=sbtest --tables=8 --table_size=100000 --threads=8 --time=600  --db-driver=mysql --db-ps-mode=disable --skip-trx=on --mysql-ignore-errors=6002,6004,4012,2013,4016 --secondary=on /home/admin/oltp_read_write.lua prepare

4.2使用dooba监控集群

此时,由于我们没有还没有配置prometheus和grafana,可以尝试使用OB生态工具中的dooba监控集群的负载。

该工具类似oracle的oratop,实时监控的结果非常直观。本测试中使用dooba一切正常,未发现与4.0不兼容的情况。

由于新版本的发布,官方文档中dooba的链接已经失效,可前往https://gitee.com/oceanbase/oceanbase/blob/3.1/tools/scripts/dooba.py)获取。

# 启动dooba
# 启动后按C键切换监控目标租户,按数字键2、3切换监控内容
python dooba.py -h 127.0.0.1 -uroot@sys -P2883 -p123456

4.3运行sysbench

测试数据准备完成后,建议执行一次手动合并,可使用如下命令查询合并状态。

select status from DBA_OB_ZONE_MAJOR_COMPACTION;

当STATUS字段为IDEL时,可启动sysbench。

sysbench --mysql-host=192.168.3.170 --mysql-port=2883--mysql-db=sbtest --mysql-user="sbuser@mysql01"  --mysql-password=sbtest --tables=8 --table_size=100000 --threads=8 --time=600  --db-driver=mysql --db-ps-mode=disable --skip-trx=on --mysql-ignore-errors=6002,6004,4012,2013,4016 --secondary=on /home/admin/oltp_read_write.lua run

此时,可以切换到dooba工具上,观察实时负载情况。

1 个赞

捞一下贴子。

以下脚本可以迅速创建一套 observer 4.3 集群,用来做实验、学习原理还是足够的。优点是不需要安装 OAT/OCP,只需要安装 oceanbase RPM 包就可以了,省事省力。

其中,脚本中 observer 的内存参数配置,在一台 51.2G 的 HyperV 虚拟机上测试通过,也就是说 64G 的本本就可以装下一个三节点的 OB 集群,不管是企业版还是社区版。

第一步:初始化环境,安装 oceanbase RPM包。

以下均以 admin 用户执行

第二步:创建各节点目录

mkdir -p /data/1/{node1,node2,node3}

for i in {node1,node2,node3};
do
echo $i;
cp -R oceanbase ~/$i/;
mkdir -p /data/1/$i/obdemo/store/{clog,slog,sstable} ;
mkdir -p /data/1/$i/obdemo/{etc2,etc3} ;
done

第三步:启动observer

port=2880;
for i in {3,4,5};
do
echo $i; node=“node”$[$i-2];
cd /home/admin/$node/ && /home/admin/$node/bin/observer -i eth0 -p $[$port+1] -P $[$port+2] -z “zone”$[$i%3+1] -d /data/1/$node/obdemo/store -r ‘172.25.200.244:2882:2881;172.25.200.244:3882:3881;172.25.200.244:4882:4881’ -c 20250115 -n obdemo -o “__min_full_resource_pool_memory=2147483648,enable_syslog_recycle=True,enable_syslog_wf=True,max_syslog_file_count=4,memory_limit=6G,datafile_size=20G,log_disk_size=20G,system_memory=2G,cpu_count=16,config_additional_dir=/data/1/$node/obdemo/etc3;/data/1/$node/obdemo/etc2” ;
sleep 3;
port=$[$port+1000];
done;

ps -ef|grep observer
netstat -ntlp |grep observer

第四步:集群初始化

obclient -h127.1 -uroot -A -c -P2881
set session ob_query_timeout=1000000000; alter system bootstrap ZONE ‘zone1’ SERVER ‘172.25.200.244:2882’, ZONE ‘zone2’ SERVER ‘172.25.200.244:3882’, ZONE ‘zone3’ SERVER ‘172.25.200.244:4882’ ;

如果上述步骤有报错,请清除安装目录后重试

rm -rf ~/{node1,node2,node3} /data/1/{node1,node2,node3}/

obclient(root@(none))[oceanbase]> select * from __all_server;
±---------------------------±---------------------------±---------------±---------±-----±------±-----------±----------------±-------±----------------------±------------------------------------------------------------------------------------------±----------±-------------------±-------------±---------------±------------------+
| gmt_create | gmt_modified | svr_ip | svr_port | id | zone | inner_port | with_rootserver | status | block_migrate_in_time | build_version | stop_time | start_service_time | first_sessid | with_partition | last_offline_time |
±---------------------------±---------------------------±---------------±---------±-----±------±-----------±----------------±-------±----------------------±------------------------------------------------------------------------------------------±----------±-------------------±-------------±---------------±------------------+
| 2025-01-15 14:48:12.057903 | 2025-01-15 14:48:16.027806 | 172.25.200.244 | 2882 | 1 | zone1 | 2881 | 1 | ACTIVE |
0 | 4.3.3.1_101030022024120210-07f0ac36d201fedd69102a42d912ed8017ccca64(Dec 2 2024 10:21:05) | 0 | 1736923694993042 | 0 | 1 | 0 |
| 2025-01-15 14:48:12.078016 | 2025-01-15 14:48:14.011973 | 172.25.200.244 | 3882 | 2 | zone2 | 3881 | 0 | ACTIVE |
0 | 4.3.3.1_101030022024120210-07f0ac36d201fedd69102a42d912ed8017ccca64(Dec 2 2024 10:21:05) | 0 | 1736923693167330 | 0 | 1 | 0 |
| 2025-01-15 14:48:12.092254 | 2025-01-15 14:48:18.044370 | 172.25.200.244 | 4882 | 3 | zone3 | 4881 | 0 | ACTIVE |
0 | 4.3.3.1_101030022024120210-07f0ac36d201fedd69102a42d912ed8017ccca64(Dec 2 2024 10:21:05) | 0 | 1736923696213560 | 0 | 1 | 0 |
±---------------------------±---------------------------±---------------±---------±-----±------±-----------±----------------±-------±----------------------±------------------------------------------------------------------------------------------±----------±-------------------±-------------±---------------±------------------+

/home/admin目录结构如下:
-bash-4.2$ tree -d
.
├── node1
│ ├── admin
│ ├── audit
│ ├── bin
│ ├── etc
│ ├── log
│ │ └── alert
│ ├── run
│ └── wallet
├── node2
│ ├── admin
│ ├── audit
│ ├── bin
│ ├── etc
│ ├── log
│ │ └── alert
│ ├── run
│ └── wallet
├── node3
│ ├── admin
│ ├── audit
│ ├── bin
│ ├── etc
│ ├── log
│ │ └── alert
│ ├── run
│ └── wallet
└── oceanbase
├── admin
├── audit
├── bin
├── etc
├── log
│ └── alert
└── run

/data目录结构如下:
-bash-4.2$ tree -d
.
├── 1
│ ├── node1
│ │ └── obdemo
│ │ ├── etc2
│ │ ├── etc3
│ │ └── store
│ │ ├── clog
│ │ │ ├── log_pool
│ │ │ └── tenant_1
│ │ │ └── 1
│ │ │ ├── log
│ │ │ └── meta
│ │ ├── slog
│ │ │ ├── server
│ │ │ └── tenant_1
│ │ └── sstable
│ ├── node2
│ │ └── obdemo
│ │ ├── etc2
│ │ ├── etc3
│ │ └── store
│ │ ├── clog
│ │ │ ├── log_pool
│ │ │ └── tenant_1
│ │ │ └── 1
│ │ │ ├── log
│ │ │ └── meta
│ │ ├── slog
│ │ │ ├── server
│ │ │ └── tenant_1
│ │ └── sstable
│ └── node3
│ └── obdemo
│ ├── etc2
│ ├── etc3
│ └── store
│ ├── clog
│ │ ├── log_pool
│ │ └── tenant_1
│ │ └── 1
│ │ ├── log
│ │ └── meta
│ ├── slog
│ │ ├── server
│ │ └── tenant_1
│ └── sstable

2 个赞

如集群已成功 bootstrap,那么以后无需配置参数直接启动即可

for i in {3,4,5}; 
	do  
	echo $i; node="node"$[$i-2];  
	cd /home/admin/$node/ && /home/admin/$node/bin/observer ; 
	 sleep 3; 
done;

# 创建 1C2G 租户是没有问题的
CREATE RESOURCE UNIT unit1C2G MAX_CPU 1, MEMORY_SIZE = '2G';
CREATE RESOURCE POOL pool1C2G UNIT = 'unit1C2G', UNIT_NUM = 1, ZONE_LIST = ('zone1', 'zone2', 'zone3');


CREATE TENANT IF NOT EXISTS mysql_tenant
CHARSET = 'utf8mb4',
PRIMARY_ZONE = 'zone1;zone2,zone3',
RESOURCE_POOL_LIST = ('pool1C2G')
SET ob_tcp_invited_nodes = '%';

ALTER SYSTEM ALTER ZONE zone1 SET REGION='ZHENGZHOU', IDC='ZZ1';
ALTER SYSTEM ALTER ZONE zone2 SET REGION='ZHENGZHOU', IDC='ZZ2';
ALTER SYSTEM ALTER ZONE zone3 SET REGION='ZHENGZHOU', IDC='ZZ2';

谢谢分享

赞一个