网易首页 > 网易号 > 正文 申请入驻

OceanBase 源码解读(十一):Location Cache 模块浅析

0
分享至

此前,OceanBase 源码解读第十篇《一号表及其服务寻址》,为大家介绍了“系统租户的「一号表」”的前世今生,并对一号表相关的服务寻址过程进行了说明。本期“源码解读”继续由 OceanBase 内核研发工程师镇楠为大家带来文中提及的 Location Cache 模块浅析。

Location cache 是 observer 上的一个基础模块,为 SQL、事务、CLOG 等多个其他模块提供获取及缓存某个副本位置信息的能力。Location cache 依赖各级 meta 表以及底层 partition_service、log_service 的服务获取副本的位置信息,通过各模块的调用被动刷新及缓存 cache。同一个 observer 各模块共享同一个 Location cache。

一、location cache 的缓存内容

在 OceanBase 集群中,各个副本的位置信息记录在 meta table 中。如果每次访问副本,都要发 SQL 去 meta table 里面找一遍位置,未免效率太低。因此我们在每个 ObServer 中都会缓存实体表的位置信息,由 location cache 模块负责管理,在 ObPartitionLocationCache 中实现。其主要缓存内容如下:

1、核心 location cache

sys_cache_ 缓存系统表 location 信息,user_cache_ 缓存用户表 location 信息。

之所以采用不同数据结构分开存储,是为了避免用户表数量过大,将系统表的 location cache 挤掉。

2、leader cache

  • sys_leader_cache_:用来缓存本集群系统租户系统表的 leader 信息。

该 cache 的提出是为了在有限场景上支持不依赖内部表获取系统租户系统表 leader 的功能。一方面是为了解决分布式事务推进获取不到系统表 leader 死锁的问题,另一方面可稍微优化获取系统租户系统表 leader 的速度。

  • leader_cahce_ 用来缓存用户表的 leader 信息。

引入它是考虑到从 KVCache 的结构中获取 location 有一定消耗,又增加一层 leader_cache_ 来缓存 leader 位置信息,从而优化 nonblock_get_leader() 方法的 location 获取路径。

二、location cache 模块对外提供的能力

location cache 模块缓存以各个 observer 为主体,将访问过的实体表的位置信息缓存在本地。location cache 采用被动刷新机制,当其他内部模块发现cache失效时,需调用刷新接口刷新 cache。

对应缓存内容,location cache 模块对外提供获取具体 pkey(pgkey) 对应的 partition 和 leader 位置信息的能力。主要应用于 SQL、Proxy、storage、transaction、clog(后两者重点关注 leader 信息)等模块,接口如下所示:

//同步接口:
int ObPartitionLocationCache::get(const uint64_t table_id,
const int64_t partition_id,
ObPartitionLocation &location,
const int64_t expire_renew_time, //该参数为INT64_MAX时,表示强制刷新。bool &is_cache_hit,const bool auto_update /*= true*/) //get函数带有刷新功能
int ObPartitionLocationCache::get_strong_leader(const common::ObPartitionKey &partition,
common::ObAddr &leader,
const bool force_renew) //本质上通过get函数获取leader,也带刷新功能
//异步接口:
int ObPartitionLocationCache::nonblock_get(const uint64_t table_id,
const int64_t partition_id,
ObPartitionLocation &location,
const int64_t cluster_id) //以nonblock方式从location cache中查询
int ObPartitionLocationCache::nonblock_get_strong_leader(const ObPartitionKey &partition, ObAddr &leader) //优先从leader cache中查,没有则走nonblock_get
int ObPartitionLocationCache::nonblock_renew(const ObPartitionKey &partition,
const int64_t expire_renew_time,
const int64_t specific_cluster_id) //配合上面两个函数,访问失败则刷新location cache。通过ObLocationAsyncUpdateTask实现

其中 nonblock_renew() 通过任务队列的方式实现。

其中通过多个队列划分优先级,加快异常场景恢复速度:

  1. pall_root_update_queue_; // __all_core_table、__all_root_table、__all_tenant_gts、__all_gts
  2. prs_restart_queue_; // rs restart related sys table
  3. psys_update_queue_; // other sys table in sys tenant
  4. puser_ha_update_queue_; // __all_dummy、__all_tenant_meta_table
  5. ptenant_space_update_queue_; // sys table in tenant space
  6. puser_update_queue_; // user table

三、location cache 的刷新机制

主要刷新流程:

1、SQL 刷新——最初的刷新方式

SQL 刷新顾名思义,就是通过 SQL 语句去 meta table 中查询 location 信息来刷新本地 cache。该刷新过程与汇报过程如出一辙。

SQL 刷新依赖与 meta table 可读以及汇报流程运行正常。SQL 刷新存在一定延时,例如,在 leader 变更,汇报正在进行的时候进行 SQL 刷新,返回的是仍是旧的 leader。该问题通过再次刷新即可解决。

2、RPC 刷新——不依赖 meta table 的刷新方式

为什么提出 RPC 刷新?

因为 SQL 刷新依赖 meta 表、SQL 模块、底层汇报,在网络异常的情况下,会导致location cache一直无法刷新。比如下图中,meta 表所在的 server A 与 DEF 网络断连,D 发出刷新请求,此时无法 SQL 刷新,但可以通过 EF 上同一 partition 的副本 location 信息确定 D 的 location。一定程度上减少对于 meta table 的依赖,减少 SQL 查询消耗,加速 cache 刷新。

RPC 刷新的实现

中心思想:通过旧 cache 拿到本 region 的 partition 的所有副本位置信息,RPC 到对应的 server 上通过 partition service 获取 member_info(含leader、member_list、lower_list等),通过对比 member_info 和旧的 location 信息,感知 leader 和 replica type 的变化(F->L)。

成功刷新的条件:member_list 未改变,non_paxos 成员未改变。

RPC 刷新的优缺点:

优点:消耗很小,能更快速地感知到 leader 和成员列表中副本变更,针对无主选举、leader 改选等场景有较好的效果。所以我们会优先使用 RPC 刷新。

缺点:RPC 刷新实现为了尽可能高效,仅保证该副本的 leader、paxos 成员列表、直接级联在本 region paxos 成员下只读副本的 location 信息是准确的,无法感知到二级及以上级联的只读副本的变更,也无法感知级联在其他 region 下的只读副本变更。

3、其他机制

强制 SQL 刷新

  1. 目的:RPC 刷新无法感知到异地只读副本变化、二级及以上的级联只读副本变化;
  2. 方法:

定时 SQL 刷新,FORCE_REFRESH_LOCATION_CACHE_INTERVAL

限制每秒SQL刷新次数,FORCE_REFRESH_LOCATION_CACHE_THRESHOLD

批量刷新

  1. 目的:优化 RTO 场景 location cache 刷新速度,对日常 SQL 执行也有优化效果;
  2. 方法:

按 partition table 类型分类任务

按 Sys partitions 和 user partitions分类

按租户分类

__all_core_table/__all_root_table 的 location_cache 单独刷新

四、虚表的 location cache

虚表没有存储实体,在查询的时候才会按照特定规则生成。为了统一 SQL 层的查询逻辑,Location cache 模块为虚表的查询提供了特殊的“位置信息”。

1、虚表的分类

从分布情况的角度,虚表可以分为以下三类:

  1. LOC_DIST_MODE_ONLY_LOCAL:只在本地执行的虚表
  2. LOC_DIST_MODE_DISTRIBUTED:分布式执行的虚表(包括集群级和租户级)
  3. LOC_DIST_MODE_ONLY_RS:需要 RS 上才能执行的虚表

2、虚表获取 location

//关键函数:
int ObSqlPartitionLocationCache::virtual_get(const uint64_t table_id,const int64_t partition_id,share::ObPartitionLocation &location,const int64_t expire_renew_time,bool &is_cache_hit)
//LOC_DIST_MODE_ONLY_LOCAL://只需要自身的地址
int ObSqlPartitionLocationCache::build_local_location(uint64_t table_id,ObPartitionLocation &location)
|-replica_location.server_ = self_addr_;
//LOC_DIST_MODE_DISTRIBUTED://本质上就是集群的server_list
int ObSqlPartitionLocationCache::build_distribute_location(uint64_t table_id, const int64_t partition_id,ObPartitionLocation &location)
|-int ObTaskExecutorCtx::get_addr_by_virtual_partition_id(int64_t partition_id, ObAddr &addr)
//LOC_DIST_MODE_ONLY_RS://本质上就是RS的位置
int ObSqlPartitionLocationCache::get(const uint64_t table_id,ObIArray

&locations,const int64_t expire_renew_time,bool &is_cache_hit,const bool auto_update /*=true*/)|-int ObPartitionLocationCache::get(const uint64_t table_id,ObIArray

&locations,const int64_t expire_renew_time,bool &is_cache_hit,const bool auto_update /*=true*/)| |-int ObPartitionLocationCache::vtable_get(const uint64_t table_id,ObIArray

&locations,const int64_t expire_renew_time,bool &is_cache_hit)| | |- int renew_vtable_location(const uint64_t table_id,common::ObSArray

&locations);

言而总之,我们将虚表的 location cache 概括成三句话:

  1. 对于本地执行的虚表,Location cache 模块返回本地 server 的地址;
  2. 对于分布式执行的虚表,Location cache 模块返回集群的 server_list;
  3. 对于 RS 执行的虚表,Location cache 模块返回 RS 所在 server 的地址。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
福建一公司郊外团建,女子穿着引发同事群嘲:一眼就看出小心思了

福建一公司郊外团建,女子穿着引发同事群嘲:一眼就看出小心思了

大脸猫做局
2024-04-26 16:08:01
袁家军:航天界的天才,后来从政宁夏、浙江,如今是重庆市委书记

袁家军:航天界的天才,后来从政宁夏、浙江,如今是重庆市委书记

初心刘师傅
2024-04-29 09:15:33
五一小长假,央媒:别让形式主义值班给“绑架”了!禁止随便加班

五一小长假,央媒:别让形式主义值班给“绑架”了!禁止随便加班

鹏飞深文
2024-04-30 12:31:35
“云浩止耕”后续:央媒发声怒批,官方再一次发通报,果然有情况

“云浩止耕”后续:央媒发声怒批,官方再一次发通报,果然有情况

历史有些冷
2024-04-28 18:30:07
赖清德向大陆提“和平三条件”,民进党打错算盘

赖清德向大陆提“和平三条件”,民进党打错算盘

郭茂辰海峡传真
2024-04-30 08:29:05
瓜迪奥拉:如果我们平一场,就无法赢得英超冠军了

瓜迪奥拉:如果我们平一场,就无法赢得英超冠军了

直播吧
2024-04-29 18:14:33
车企回应“问界M7追尾起火致3人身亡”:安全气囊正常打开 交警称事故还在调查中

车企回应“问界M7追尾起火致3人身亡”:安全气囊正常打开 交警称事故还在调查中

红星新闻
2024-04-28 13:49:52
浓眉首轮总结:三场30+10一场双20 G5受伤后下半场仅1分梦游

浓眉首轮总结:三场30+10一场双20 G5受伤后下半场仅1分梦游

醉卧浮生
2024-04-30 12:34:52
李尚福被免去国防部长,虎父无犬子,父亲竟和美国交过手

李尚福被免去国防部长,虎父无犬子,父亲竟和美国交过手

磊子讲史
2024-03-25 14:45:46
实体经济不死,天理难容,男子开面馆日均100份,每月房租2.3万

实体经济不死,天理难容,男子开面馆日均100份,每月房租2.3万

坠入二次元的海洋
2024-04-24 20:58:08
大批“爱国者”导弹正在到来!英国防部称已击落100多架俄军战机

大批“爱国者”导弹正在到来!英国防部称已击落100多架俄军战机

鹰眼Defence
2024-04-27 17:42:20
马斯克抵达钓鱼台国宾馆,看到美景不停拍照,他和母亲全是中国迷

马斯克抵达钓鱼台国宾馆,看到美景不停拍照,他和母亲全是中国迷

郑丁嘉话
2024-04-30 10:39:35
沈阳、大连、长治市频发恶性案件!你了解民众戾气为何如此重吗?

沈阳、大连、长治市频发恶性案件!你了解民众戾气为何如此重吗?

小毅讲历史
2024-04-29 11:17:34
港媒:中国在人形机器人领域走在前列

港媒:中国在人形机器人领域走在前列

参考消息
2024-04-30 14:47:11
普京的秘密情人卡巴耶娃:未婚却连生4子,二人绯闻是真的吗?

普京的秘密情人卡巴耶娃:未婚却连生4子,二人绯闻是真的吗?

悦悦侃历史
2024-04-29 13:16:44
福建省民政厅党组书记陆菁,新兼任这一职位

福建省民政厅党组书记陆菁,新兼任这一职位

新京报
2024-04-30 16:12:18
北上广深,大反转了!

北上广深,大反转了!

城市财经
2024-04-30 12:04:45
大S和具俊晔外出吃饭被偶遇!大S节俭持家主动打包,不避嫌!

大S和具俊晔外出吃饭被偶遇!大S节俭持家主动打包,不避嫌!

娱圈小愚
2024-04-29 14:39:32
生肖兔明日运势来了!5月1日(农历三月廿三)星期三

生肖兔明日运势来了!5月1日(农历三月廿三)星期三

牛锅巴小钒
2024-04-30 11:51:14
一个很变态,但让你瘦到极致的办法

一个很变态,但让你瘦到极致的办法

健身狂人
2024-04-30 07:20:15
2024-04-30 18:20:49
OceanBase数据库
OceanBase数据库
企业级原生分布式数据库
43文章数 0关注度
往期回顾 全部

科技要闻

特斯拉和百度独家深度定制车道级高辅地图

头条要闻

出狱后病逝的李四强被判无罪:8名同案犯均不认识他

头条要闻

出狱后病逝的李四强被判无罪:8名同案犯均不认识他

体育要闻

唏嘘!詹库杜19年首次无人进分区半决赛

娱乐要闻

黄子韬被曝求婚徐艺洋 大量亲密照曝光

财经要闻

查道炯:中国经济的外部挑战与应对思考

汽车要闻

越野老炮最爱 哈弗新H9新增2.4T柴油机

态度原创

旅游
艺术
本地
公开课
军事航空

旅游要闻

五一大雨,浇灭了多少旅游城市的心气?

艺术要闻

用耳朵看展览?西岸美术馆最新特展关注声音艺术

本地新闻

食味印象 | 潍坊:碳水脑袋的人间乐园

公开课

父亲年龄越大孩子越不聪明?

军事要闻

以官员:以总理求助拜登阻止逮捕令

无障碍浏览 进入关怀版