暂无图片
暂无图片
6
暂无图片
暂无图片
暂无图片

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

2312
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 - adminkill -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; \donetree ~/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 observernetstat -ntlp |grep observer

进程列表

监听端口列表

集群自举(初始化)
不管是哪种 OB 的安装部署方法,关键的一步始终是集群的 bootstrap 。如果这一步不成功,不用看日志了,也不用问了。请看此前的安装部署总结。一定是某个环节没有按文章要求来。
mysql -h127.1 -uroot -P2881 -p -c -Aset 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 oceanbaseshow 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.statusfrom __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 oceanbasealter 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 oceanbaseCREATE 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.statusfrom __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_namefrom __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 oceanbasealter 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_ipFROM __all_rootservice_event_historyWHERE 1 = 1 ORDER BY gmt_create DESCLIMIT 10;

看到 global_merged 记录就表示全部合并完毕了。
  • 杀进程

kill -9 `pidof observer`sleep 10ps -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! 😆


其他参考



最后修改时间:2020-10-09 09:04:59
文章转载自OceanBase技术闲谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论