OB 产品终于兑现了当初的承诺,在 8G 内存的笔记本电脑上可以将 OB 集群跑起来,当然 8G 内存的机器只能跑个单节点的OB。尽管名字是叫试用版,就软件本身而言跟 OB 的内部和外部客户用的 OB 软件是同一个代码。
- 官网下载地址:OceanBase 试用版软件下载 https://www.oceanbase.com/download 。
- 安装文档:OceanBase 数据库试用版部署文档 https://www.oceanbase.com/docs/oceanbase-trial/V2.2.50/ii133b 。
OB 自6 月份独立公司运营后,一切都变得正规起来,有专门的文档、运营团队。官网的内容也变得非常丰富。有文档,有培训视频,有认证。感兴趣的朋友可以看看官网。就上面这份安装文档而言,已经针对用户不同的操作系统给出详细的安装步骤,并且还有视频。所以我这里就不重复说明了。本文要演示的是,使用官方下载文件搭建一个 6节点的 OB 集群(三副本,2-2-2 部署),每个节点是 2C8G 内存。当然,2C8G 的节点,不能指望做复杂的测试(比如说灌输数据,跑性能等等),主要就是学习玩玩。 每个节点 8G 内存,6 个节点总共也就 48G内存,只要主机内存有 64G ,就可以在一个机器上模拟 6 个 OB 节点。
由于此前很多文章反复介绍安装部署的步骤和原理,本文就不再重复了。直接上脚本。下面所有脚本都运行多次,正确性绝对没问题。
清理上一次目录
第一次运行不用。
su - admin
kill -9 `pidof observer` ; \
/bin/rm -rf ~/{node1,node2,node3,node4,node5,node6} /data/{1,log1}/{node1,node2,node3,node4,node5,node6}
准备安装目录
由于是 1 个机器上模拟 6 个节点,所以要规划 6 个 OB 节点的目录。
- 软件 目录 : /home/admin/node{1-6}
- data 目录 : /data/1/node{1-6}
- clog 目录 : /data/log1/node{1-6}
软件、data 和 clog 分开是最佳实践经验,传统数据库也是如此。
for i in {node1,node2,node3,node4,node5,node6}; do \
echo $i; \
mkdir -p ~/$i/{admin,bin,etc}; cp ~/mini-ob-deploy/bin/observer ~/$i/bin/; cd ~; \
mkdir -p /data/1/$i/obdemo/{etc3,sort_dir,sstable} /data/log1/$i/obdemo/{clog,etc2,ilog,slog,oob_clog} ;\
mkdir -p ~/$i/store/obdemo; \
for t in {etc3,sort_dir,sstable};do ln -s /data/1/$i/obdemo/$t /home/admin/$i/store/obdemo/$t; done; \
for t in {clog,etc2,ilog,slog,oob_clog};do ln -s /data/log1/$i/obdemo/$t /home/admin/$i/store/obdemo/$t; done; \
done
tree ~/node*
tree /data/{1,log1}/
启动 observer 进程
分别启动每个节点。6 个节点,3 个 zone。每个节点的端口号、zone 都要一一对应。注意启动参数 -o
后面的内容,可以自己探索。如果你主机的内存资源是 64 的倍数,你可以尝试调整里面内存有关的参数(memory_limit
)。
port=2880; \
for i in {3,4,5,6,7,8}; do \
echo $i; node="node"$[$i-2]; \
cd /home/admin/$node/ && /home/admin/$node/bin/observer -i bond0 -p $[$port+1] -P $[$port+2] -z "zone"$[$i%3+1] -d /home/admin/$node/store/obdemo -r '11.166.87.5:2882:2881;11.166.87.5:3882:3881;11.166.87.5:4882:4881' -c 20201010 -n obdemo -o "memory_limit=8G,cache_wash_threshold=1G,row_purge_thread_count=1,net_thread_count=1,enable_syslog_recycle=True,enable_merge_by_turn=FALSE,cpu_count=16,location_refresh_thread_count=2,max_syslog_file_count=3,major_freeze_duty_time=Disable,__easy_memory_limit=1G,schema_history_expire_time=1d,merge_thread_count=1,writing_throttling_trigger_percentage=70,_max_trx_size=2M,workers_per_cpu_quota=2,enable_separate_sys_clog=0,datafile_disk_percentage=50,__min_full_resource_pool_memory=536870912,system_memory=5G,memory_chunk_cache_size=128M,trace_log_slow_query_watermark=10s,writing_throttling_maximum_duration=1m,switchover_process_thread_count=1,datafile_size=10G,minor_freeze_times=500,stack_size=1536K,disk_io_thread_coun=1,config_additional_dir=/data/1/$node/obdemo/etc3;/data/log1/$node/obdemo/etc2" ; \
sleep 3; \
port=$[$port+1000]; \
echo ;cd ~; \
done;
ps -ef|grep observer
netstat -ntlp |grep observer
进程列表
监听端口列表
集群自举(初始化)
不管是哪种 OB 的安装部署方法,关键的一步始终是集群的 bootstrap 。如果这一步不成功,不用看日志了,也不用问了。请看此前的安装部署总结。一定是某个环节没有按文章要求来。
mysql -h127.1 -uroot -P2881 -p -c -A
set session ob_query_timeout=1000000000; alter system bootstrap ZONE 'zone1' SERVER '11.166.87.5:2882', ZONE 'zone2' SERVER '11.166.87.5:3882', ZONE 'zone3' SERVER '11.166.87.5:4882' ;
alter user root identified by '123456';
注意,集群自举的时候,只需要指定 3 个节点(分别是 3 个 zone 的节点),它们组成 1-1-1 的集群,也就是内部租户 sys 所在。其他 3 个节点要后期扩容进来。
集群扩容
后面 3 个节点的 observer 进程在前面一并启动了,并且所有节点使用相同的 rootservice list 地址。所以集群扩容的时候才可以跟其他 3 个新节点进行通信。
mysql -h127.1 -uroot@sys -P2881 -p123456 -c -A oceanbase
show databases;
-- 查看集群资源
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
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 名称必须跟前面节点启动参数一一对应。
alter system add server '11.166.87.5:5882' zone 'zone1';
alter system add server '11.166.87.5:6882' zone 'zone2';
alter system add server '11.166.87.5:7882' zone 'zone3' ;
逐个的扩容节点,注意节点的端口号和 zone 名称必须跟前面节点启动参数一一对应。
模拟 OCP API (可选)
前面 observer 启动时指定的 rootservice list 地址是具体的节点 IP,这样并不灵活。后期节点可能下线或宕机之类。所以,生产环境的 OB 集群会使用 OCP 提供的一个 API 保存自己的rootservice 地址信息。官网没有提供 OCP ,或者不想安装 OCP,可以使用脚本configurl_server.py
来模拟这个 API。这不是必需的。
nohup python configurl_server.py `hostname -i` 8088 2>&1 1>/tmp/configurl_server.log &
mysql -h127.1 -uroot@sys -P2881 -p123456 -c -A oceanbase
alter system set obconfig_url='http://11.166.87.5:8088/services?Action=ObRootServiceInfo&ObRegion=obdemo';
参数修改后过几秒钟就可以查看。
模拟脚本会把 rootservice list 地址保存到一个文件里。
新建 ORACLE 租户
OB 集群支持多租户,不过 8G 内存节点可能也就支持 1 到 2 个租户。这里以 ORACLE 租户为例。
mysql -h127.1 -uroot@sys -P2881 -p123456 -c -A oceanbase
CREATE resource unit my_unit_config max_cpu=8, min_cpu=4, max_memory='1G', min_memory='1G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size='1024G';
CREATE resource pool oracle_pool unit = 'my_unit_config', unit_num = 1;
CREATE tenant obbmsql resource_pool_list=('oracle_pool'), primary_zone='RANDOM',comment 'oracle tenant/instance', charset='utf8' set ob_tcp_invited_nodes='%', ob_compatibility_mode='oracle';
可以查看集群资源概览和分配明细。
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
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
;
select t1.name resource_pool_name, t2.`name` unit_config_name, t2.max_cpu, t2.min_cpu, round(t2.max_memory/1024/1024/1024) max_mem_gb, round(t2.min_memory/1024/1024/1024) min_mem_gb, t3.unit_id, t3.zone, concat(t3.svr_ip,':',t3.`svr_port`) observer,t4.tenant_id, t4.tenant_name
from __all_resource_pool t1 join __all_unit_config t2 on (t1.unit_config_id=t2.unit_config_id)
join __all_unit t3 on (t1.`resource_pool_id` = t3.`resource_pool_id`)
left join __all_tenant t4 on (t1.tenant_id=t4.tenant_id)
order by t1.`resource_pool_id`, t2.`unit_config_id`, t3.unit_id
;
租户扩容
OB 的扩容除了集群扩容外还有租户扩容。租户扩容有两种方式:
- 扩资源规格。
- 扩资源单元数量。
下面都分别做一次。先将租户内存从 1G 扩容到 2G. 然后数量从 3 节点扩容到 6 节点。
mysql -h127.1 -uroot@sys -P2881 -p123456 -c -A oceanbase
alter resource unit my_unit_config max_memory='2G';
alter resource pool oracle_pool unit_num=2;
OB 的租户扩容几乎是瞬间完成的。当然生产环境有数据,扩容可能会引起数据负载均衡。命令是立即返回,数据迁移是后台异步做的,非常平滑。这是 OB 独特之处。
连接问题
- 路由问题
上面连接 OB 集群的时候,都是直连某个节点。OB 的正式用法是还会有个 反向代理 进程 obproxy。OBProxy 解决的是路由问题,包括故障切换时的客户端路由切换问题(数据库切换了,应用不用改 IP和重连。这是一个复杂的话题,可以看以前高可用文章)。OB 节点进程 observer 自身也有路由作用。官网没有提供 OBProxy 下载,大家就还是直连某个 OB 节点,后面不要杀这个节点就行。
- oracle 租户访问问题
如果你创建的是 mysql 租户,用 mysql 命令行(版本:5.5/5.6/5.7)就可以直连;如果是 oracle 租户,需要使用 OB 的 oracle 租户客户端(obclient)。不过官网没提供下载。大家可以使用官方的图形化客户端ODD 连接 oracle 租户。
- ODC下载地址:
https://help.aliyun.com/document_detail/142073.html
或者推荐用 dbeaver 连接。方法参考后面附录文章。注意,连接用户名是 tpcc@obbmsql,端口是某个节点对应的端口(2881/3881/4881/5881/6881/7881 都行)。
集群重启
OB 集群的重启方式就是直接杀所有节点进程,然后重新启动节点进程 observer。
这里要注意:
- 启动 observer 进程必须在 admin 用户下,且必须在软件目录 /home/admin/oceanbase/ 下运行启动命令。注意本文每个节点软件目录都不一样。
- 第二次启动 observer 不需要带前面的参数。除非你想定制化修改某个参数。
重启之前先做一个合并,减少启动后集群整体恢复时间。这里是所有节点同时杀进程,属于测试玩法。生产环境一定要严格的挨个节点重启。
- 合并
alter system major freeze;
SELECT DATE_FORMAT(gmt_create, '%b%d %H:%i:%s') gmt_create_ , module, event, name1, value1, name2, value2, rs_svr_ip
FROM __all_rootservice_event_history
WHERE 1 = 1
ORDER BY gmt_create DESC
LIMIT 10;
看到 global_merged 记录就表示全部合并完毕了。
- 杀进程
kill -9 `pidof observer`
sleep 10
ps -ef|grep observer
- 启动节点
for i in {1,2,3,4,5,6}; do \
echo $i; node="node"$[$i]; \
cd /home/admin/$node && bin/observer ; \
sleep 1; \
done
ps -ef|grep observer
确认一下集群状态
HAVE FUN! ????
其他参考
OceanBase 独立部署高级玩法一
OceanBase 2.2 安装部署问题解答
揭秘OceanBase的弹性伸缩和负载均衡原理
OceanBase 2.x体验:推荐用DBeaver工具连接数据库
OB 开发测试建议 (中)