zone 1 zone 2 zone 3 Ocean Base
资源的物理表示 zone 1 zone 2 zone 3
资源的逻辑表示 Ocean. Base Cluster 270 C 1800 G 36 T OBServer zone 1 ip 1 port 30 C 200 G 4 T OBServer zone 2 ip 2 port 30 C 200 G 4 T OBServer zone 3 ip 3 port 30 C 200 G 4 T OBServer zone 1 ip 4 port 30 C 200 G 4 T OBServer zone 2 ip 5 port 30 C 200 G 4 T OBServer zone 3 ip 6 port 30 C 200 G 4 T OBServer zone 1 ip 7 port 30 C 200 G 4 T OBServer zone 2 ip 8 port 30 C 200 G 4 T OBServer zone 3 ip 9 port 30 C 200 G 4 T
资源的分配流程(研发视角) Ocean. Base Cluster : 270 C 1800 G 36 T tenant : sys 15 C 60 G tenant : tnt_trade 60 C 120 G tenant : tnt_pay 120 C 600 G 集群初始化 总资源 270 C 1800 G sys租户 15 C 60 G 分配交易业务租户(实例) tnt_trade 60 C 120 G 分配支付业务租户(实例) tnt_pay 120 C 600 G
资源池的分配流程(运维视角) Ocean. Base Cluster : 270 C 1800 G 36 T zone 2 zone 1 1 30 C 200 G Unit 1: 5 C 20 G 30 C 200 G 7 30 C 200 G Unit 4: 20 C 40 G Unit 10: 20 C 100 G 2 5 8 Unit 2: 5 C 20 G Unit 5: 20 C 40 G Unit 7: 20 C 100 G Unit 11: 20 C 100 G Unit 8: 20 C 100 G 3 zone 3 4 Unit 3: 5 C 20 G Unit 9: 20 C 100 G 6 Unit 6: 20 C 40 G 9 Unit 12: 20 C 100 G ü 集群初始化成功(默认租户:sys) ü create unit config S 2 max_cpu=20, max_mem=40 G, … ü create unit config S 3 max_cpu=20, max_mem=100 G, … ü create resource pool p_trade unit=S 2, unit_num=1; ü create tenant tnt_trade resource pool=p_trade … ü create resource pool p_pay unit=S 3, unit_num=2; ü create tenant tnt_pay resource pool=p_pay; p 资源单元(Unit)是资源分配的最小单元 p 同一个Unit不能跨节点(OBServer)。 p Unit是数据的容器
数据(分区)的分配(运维视角) zone 1 Unit 2: 5 C 20 G zone 3 Unit 1: 5 C 20 G zone 2 Tenant: tnt_trade , Resource Pool : pool_trade; 15 C 60 G t 1(p 0) t 3(p 0) t 2(p 0) Unit 3: 5 C 20 G t 1(p 0) t 3(p 1) t 3(p 0) t 2(p 0) t 3(p 3) t 3(p 1) t 3(p 3) ü ü 资源池及租户初始化成功(tnt_trade) create table t 1(…); create table t 2(…) primary zone=zone 2; create table t 3(…) partition by hash partitions 3; p 每个分区有三个副本,默认leader副本提供 读写服务, follower副本不提供服务。 p 每个分区的三副本内容是一样的,其原理下 次直播分享。
数据(分区)的分配2(运维视角) zone 3 zone 2 zone 1 Tenant: tnt_trade , Resource Pool : pool_trade; 15 C 60 G Unit 7: 20 C 100 G t 1(p 0) Unit 10: 20 C 100 G t 3(p 1) t 3(p 0) t 3(p 2) t 4(p 1) t 4(p 0) t 4(p 2) Unit 8: 2 C 100 G t 1(p 0) Unit 11: 2 C 100 G t 3(p 1) t 3(p 0) t 3(p 2) t 4(p 1) t 4(p 0) t 4(p 2) Unit 9: 20 C 100 G t 1(p 0) Unit 12: 20 C 100 G t 3(p 1) t 3(p 0) t 3(p 2) t 4(p 1) t 4(p 0) t 4(p 2) ü 资源池及租户初始化成功(tnt_order) ü create tablegroup tgorder partition by hash partitions 3; ü create table t 1(…); ü create table t 3(…) partition by hash(…) partitions 3 tablegroup=tgorder; ü create table t 4(…) partition by hash(…) partitions 3 tablegroup=tgorder; p 每个分区有三个副本,默认leader副本提供 读写服务。 p 同一个分区不能跨Unit,同一个分区表不同 分区可以跨Unit p 同号分区组的分区稳定在同一个Unit内部。
集群扩容->Unit搬家 Ocean. Base Cluster : 270 C 1800 G 1200 G zone 2 zone 1 1 30 C 200 G Unit 1: 5 C 20 G Unit 4: 20 C 40 G Unit 7: 20 C 100 G Unit 10: 20 C 100 G 2 5 Unit 2: 5 C 20 G Unit 5: 20 C 40 G Unit 8: 20 C 100 G 3 zone 3 4 Unit 3: 5 C 20 G Unit 9: 20 C 100 G 7 Unit 6: 20 C 40 G Unit 12: 20 C 100 G 集群初始状态: 2 -2 -2 Unit:每个Zone 4个Unit 集群扩容: 2 -2 -2 -> 3 -3 -3 Unit迁移 8 Unit 11: 20 C 100 G 6 30 C 200 G ü ü 9 p Unit 是资源调度的最小单元 p 分区(名词)是数据迁移的最小单元 p 图中Unit移动是示意图,实际细节是目标端 先创建Unit,然后分区复制和切换。
Unit扩容->分区搬家 zone 1 Tenant: tnt_trade , Resource : pool_trade; 120 C 60 C 300 G 600 G Unit 7: 20 C 100 G t 3(p 0) t 1(p 0) t 3(p 2) t 4(p 0) zone 3 zone 2 t 4(p 2) Unit 10: 20 C 100 G t 3(p 1) t 3(p 2) t 4(p 0) t 4(p 2) Unit 11: 20 C 100 G t 3(p 1) t 4(p 1) Unit 9: 20 C 100 G t 3(p 0) t 1(p 0) t 3(p 2) t 4(p 2) 租户资源初始状态:unit_num=1 分区分布初始状态:t 1, t 3, t 4 租户资源扩容:unit_num->2 分区搬家,分区组聚合在一起,Leader打散 t 4(p 1) Unit 8: 20 C 100 G t 3(p 0) t 1(p 0) ü ü t 4(p 0) Unit 12: 20 C 100 G t 3(p 1) t 4(p 1) p 分区是数据迁移的最小单元,同一个分区不 能跨Unit,不同分区可以跨Unit p 同号分区组的分区稳定在同一个Unit内部。 p 图中分区移动只是示意图,实际分区迁移是 生成新的Follwer副本,然后Leader跟 follower角色互换。
极端无规则的多点写入(多活) zone 2 zone 1 zone 3 APPs OBProxy observer y 1(p 0) observer x 1(p 0) observer y 2(p 0) observer x? y 3(p 0) y? observer x 2(p 0) z? observer z 1(p 0) observer z 2(p 0) observer z 3(p 0) x?
按应用划分的异地多活/容灾 zone 2 zone 1 APP-x APP-y APP-z OBProxy observer x 1(p 0) observer x? observer x 3(p 0) y 1(p 0) ü Primary_zone ü 表级 ü 数据库级 ü 租户级 ü locality ü 租户级 ü obproxy路由策略 observer y? x 2(p 0) x? zone 3 observer y 2(p 1) observer y? observer z 2(p 0) y 3(p 0) observer z 3(p 0) z? z 1(p 0) z?
单元化下的异地多活 zone 1 zone 2 zone 3 APP (users: 0 -1) APP (users: 2 -3) APP (users: 4 -5) OBProxy observer db[0 -1]. t 1 observer db[0 -1]. t 2 observer db[2 -3]. t 1 observer db[2 -3]. t 2 observer db[4 -5]. t 1 db[4 -5]. t 2 ü Primary_zone ü 表级 ü 数据库级 ü 租户级 ü locality ü 租户级 ü obproxy路由策略
试验观察 具 dooba ü ü ü ü ü SSC:sql select count SSRT: sql select RT. SIC : sql insert count SIRT: sql insert RT. SUC: sql update count SURT: sql update RT. SDC: sql delete count SDRT: sql delete RT. TCC: trans. commit count TCRT: trans. commit RT. p QPS发生的节点就是 Leader副本所在。
sysbench试验模拟租户扩容 p 创建租户 create resource unit_demo max_cpu=25, min_cpu=20, max_memory='20 G', min_memory='10 G', max_iops=10000, min_iops=1000, max_session_num=1000000, max_disk_size='1024 G’; create resource pool_mysql unit = 'unit_demo', unit_num = 1; create tenant tnt_mysql resource_pool_list=('pool_mysql'), primary_zone='RANDOM', comment 'mysql tenant/instance' set ob_tcp_invited_nodes='%', ob_compatibility_mode='mysql'; p 建表,初始化数据 CREATE TABLE `sbtest 1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `k` int(11) NOT NULL DEFAULT '0', `c` char(120) NOT NULL DEFAULT '', `pad` char(60) NOT NULL DEFAULT '', PRIMARY KEY (`id`, `k`), KEY `k_1` (`k`) LOCAL ) partition by hash(k) partitions 5; p 读写压测 . /sysbench --test=. /oltp_read_write_ob. lua --mysql-host=11. ***. 84 --mysql-port=2883 --mysql-db=sysbenchtest --mysql-user="obdemo: tnt_mysql: demouser" --mysql-password=123456 --tables=1 --table_size=1000000 --threads=32 --time=600 --report-interval=10 --db-ps-mode=disable --skip-trx=on --mysql-ignoreerrors=6002, 6004, 4012, 2013, 4016 run p 租户扩容 alter resource pool_mysql unit_num=2;
- Slides: 24