开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
@[toc]
第三章:OceanBase集群技术架构
1. Paxos协议与负载均衡
1.6 查看表和分区的分布情况
查看表和分区的分布情况
表及分区的相关信息储存在这两个系统表中。 系统表:__all_virtual_meta_table,关键信息 • tenant_id • table_id • partition_id • svr_ip • role:1 – leader, 2 - follower 系统表:__all_virtual_table,关键信息 • table_id • table_name
1.7 查看租户的分区分布情况
• 该租户一共有21个分区(21个主副本,42个从副本),分布在Zone1/2/3的6台服务器内
• 每个Zone都有7个主副本,实现了3个Zone的负载均衡
• 该表格有3个分区,每个分区有3个副本,分布在3个zone内的一台OB Server
• 每个Zone均有一个分区的主副本,实现负载均衡
1.8 OB Proxy为应用提供智能路由服务,应用透明访问
1.8.1 高效路由转发
• 对SQL做基本解析,确定对应Leader所在机器 • 反向代理,将请求路由至对应Leader;Leader位置无法确定时随机选择OB Server • 轻量SQL解析 + 快速转发,保证高性能,单OB Proxy每秒转发百万次请求
1.8.2 “非”计算节点,无状态
• 每个OB Proxy是一个“无状态”的服务进程,不做数据持久化,对部署位置无要求 • OB Proxy不参与数据库引擎的计算任务,不参与事务(单机 or 分布式)处理 • 多个OB Proxy之间无联系,可通过F5/SLB组成负载均衡集群 • 不需要独立服务器,可以与OB Server共用一台服务器,如果应用对实时性要求高,也可以将OB Proxy部署到应用服务器中
1.9 通过设置Primary Zone,将业务汇聚到特定Zone
通过为不同的租户配置不同的Primary Zone,可以将业务流量集中到若干Zone中,减少跨Zone及跨服务器的操作。Zone List,逗号两侧优先级相同,分号左侧优先级高于右侧
1.9.1 配置:(z1,z2,z3) 意义:ZONE_1 =ZONE_2 = ZONE_3
• 主副本(Leader)均匀分布到各机器
• 适合批处理场景,希望尽快跑完,不关注某一个sql的执行时间,期望让整体任务尽快完成
1.9.2 配置2:(z1;z2;z3) 意义:ZONE_1 >ZONE_2 > ZONE_3
• 主副本(Leader)只在Zone1存在,Zone2和Zone3均是从副本
• 适合对时延敏感的在线处理业务,业务量不大,不超过一台机器的处理能力,可以尽量避免跨服务器访问,从而降低时延
1.9.3 配置3:(z1,z2;z3) 意义:(ZONE_1 = ZONE_2) > ZONE_3
• 主副本(Leader)均匀分布到Zone1和Zone2,Zone3均是从副本
• 适合三地五中心方案,将业务汇聚到距离较近的城市,距离较远的城市只承担从副本的角色
1.10 Primary Zone有租户、数据库和表不同的级别
• 如无特殊指定,自动继承上级对象的primary_zone:database继承租户的primary_zone设置,table继承database的primary_zone设置 • database和table可以指定各自的primary_zone,不必和上一级对象的设置保持一致;提供更加灵活的负载均衡策略
1.10.1 租户
(z1, z2 , z3) • 主副本均匀分布到3个Zone中 • 满足大部分表的应用场景
1.10.2 数据库
(z1 ; z2 ; z3) (如没有特殊指定)该数据库下的所有表的主副本将集中到 Zone1内机器中(可能是多台)
1.10.3 表
(z1,z2;z3)主副本将集中到 Zone1和Zone2内机器中
1.11 Primary Zone示例
1.12 Table Group,将多个表的相同分区ID的主副本聚集在一个OB Server中,减少分布式事务引入的开销
• 如果多个表的分区方式完全相同(分区类型、分区键个数、分区数量等) ,可以在逻辑上将这些表归属到同一个Table Group中,以影响动态负载均衡的策略 • 同一个Table Group中的所有表,分区ID(partition_id)相同的所有分区,它们的leader在同一observer上;在不影响全局负载均衡的前提下,可有效减少分布式事务引入的跨机访问开销 • 如果负载均衡被打破(服务器故障后、扩容缩容等),Table Group中的所有表会作为一个整体来调整分区分布和leader分布 • 动态创建和删除,并且对上层应用完全透明 • 如果租户的unit_num=1且primary_zone只有一个zone,不需要tablegroup
1.13 Table Group举例
• 假设一个集群有3个Zone,租户的Unit Num是2,表1和表2的PrimaryZone是负载均衡的 • 对于某一个员工(emp_id)来说,他/她的员工信息数据和薪水数据,一定在同一个observer上提供服务,比如employees(p1)和salaries(p1) • employees表和salaries表组成一个Table Group • Table Group中相同分区ID的主副本均在一台OB Server上 • 整体负载均衡没有被打破,每台OB Server均有主副本和从副本 • 如果Zone1-OB Server1故障,那么T1(P1)+T2(P1)将会整体迁移
create tablegroup emp_id_group partition by hash partitions 6; create table employees (emp_id integer, emp_name varchar(64)) tablegroup = 'emp_id_group' partition by hash (emp_id) partitions 6; create table salaries (emp_id integer, emp_salary number(10,2)) tablegroup= 'emp_id_group' partition by hash (emp_id) partitions 6;