OceanBase架构设计

本文主要参考《大规模分布式存储系统》

基本结构

客户端:发起请求。

RootServer:管理集群中的所有服务器,子表数据分布及副本管理,一般为一主一备,数据强同步。

UpdateServer:存储增量变更数据,一般为一主一备,客户端的写入数据只更UpdateServer。

MergeServer:接收并解析SQL请求,进行词法分析和查询优化之后把请求转发给ChunkServer查询,并合并查询后的结果。客户端直接访问MergeServer。

ChunkServer:存储基线数据,一般存储两到三份。

上述组件可以构成一个OB集群,另外还可以在此基础上部署多个集群,集群之间的数据同步通过主集群的UpdateServer向备集群同步来实现。

组件实现

RootServer

RootServer负责管理集群中所有的MergeServer,ChunkServer和UpdateServer,功能主要包括以下三点:

集群管理

RootServer通过心跳与其他组件连接。

保证一个集群内同一时刻只有一个UpdateServer提供服务,通过租约机制选择唯一的主UpdateServer。

数据分布
中心表RootTable

使用主键对表格数据排序,按顺序分布(和Hbase一样)。把所有数据划分为大致相等的数据范围(Tablet),每个子表默认256MB。采用根表一级索引结构,即只有根表和子表两层。

由于中心表RootTable的修改很少,直接使用有序数组实现,增加子表时通过CopyOnWrite的方式创建一个新的数据,对新的数据写入和重新排序,然后吧指针指向新的RootTable。

子表分裂和合并

分裂:每台ChunkServer采用同样的分裂规则,根据子表的数据行数和子表大小设定分裂规则。

合并:先选择若干连续范围的子表,把它们迁移到相同的ChunkServer机器上,然后执行合并。只要有一个副本合并成功,就认为合并成功。

副本管理

每个子表一般包含3个副本,RootServer定期执行负载均衡,转移子表到负载低的节点。

RootServer的主备之间数据强一致同步。

UpdateServer

集群中只有UpdateServer接收写操作,更新时首先写入内存,当内存表的数据量超过阈值时转储到磁盘。和Hbase一样,为了保证可靠性,写入数据前先写入操作日志并同步到备UpdateServer。

由于只有一台UpdateServer提供写服务,很容易实现跨行跨表事务。

UpdateServer中的增量数据结构为一颗内存中的B+树(Hbase为跳跃表),每个叶子结点对应一行数据,key为行主键,value为行操作链表的指针,每行按照时间顺序构成一个行操作链表(更新、删除)。

UpdateServer的主备节点各保存增量数据的一个副本,以此保证高可用。同步机制跟MySQL的主备同步一致基本一样,主UpdateServer往备机推送操作日志,备UpdateServer接受线程接收日志并写入全局日志缓冲区。

ChunkServer

ChunkServer是集群中实际存储数据的节点,数据结构为B+树。每个表格按主键组成一颗B+树,每个叶子结点包含表格中某个主键范围内的数据。每个叶子结点称为一个子表(Tablet),包含一个或多个SSTable,每个SSTable由多个块组成,支持布隆过滤器过滤。叶子结点是负载平衡和任务调度的基本单元。

ChunkServer中保存基线数据的2-3个副本,以此保证高可用

ChunkServer的功能主要包括以下:

存储多个子表

每个子表由1个SSTable组成,每个SSTable由多个块组成,每个块大小为4KB-64KB之间(和HBase一样)。

支持两种缓存:块缓存和行缓存。

SSTable分为两种格式:稀疏格式和稠密格式。稀疏格式的每一行只存储包含实际值的列(列存储),稠密格式每一行需要存储所有列,但不需要存储列名(行存储)。

列存储的好处有两个:

  1. 在SQL语句只读取部分列时,避免把完整行加载到内存中。
  2. 同一列数据在物理上存放到一起,提高压缩率。
提供读取服务

MergeServer把请求发到子表所在的ChunkServer读取基线数据,然后请求UpdateServer获取增量数据并融合。

定期合并

把UpdateServer转储来的增量表和本地的基线数据执行多路合并,生成新的SSTable。

数据分发

冻结UpdateServer当前活跃的内存表,生成冻结内存表并缓存到ChunkServer中。

MergeServer

负责解析用户的SQL请求、转发到ChunkServer执行、合并结果并返回。

MergeServer中缓存子表信息以减少对RootServer的读取。MergeServer本身是无状态的,理论上在宕机后不会对使用者产生影响。

SQL执行

读取

select c1, sum(c2)
from t1
where c3=10
group by c1
having sum(c2) >= 10
order by c1
limit 0, 20

执行顺序依次为:

TableScan(table = t1, col = {c1, c2, c3}, filter = {c3 = 10}):读取数据。

HashGroupBy(groupby = {c1}, aggr = {sum)(c2)}):分组并计算每个分组内c2的总和。

Filter(cond = {sum(c2) >= 10}):过滤。

Sort(col={c1}):排序。

Project(col = {c1, sum(c2}):返回指定列。

Limit(offset = 0, count = 20):返回限定行数。

select t1.c1, sum(t2.c3)
from t1, t2
where t1.c2 = t2.c2and t1.c3=10
group by t1.c1
having sum(t2.c3) >= 10
order by t1.c1
limit 0, 20

执行顺序依次为:

TableScan(table = t1, col = {c1, c2, c3}, filter = {c3 = 10}) 和 TableScan(table = t2, col = {c1, c2, c3}, filter = {c3 = 10}) 分别读取数据。

Sort(col={t1.c2) 和 Sort(col={t2.c2) 分别排序。

MergeJoin(cond = {t1.c2 = t2.c2}) 合并两张表的结果。

… 后面和单表一样。

写入

REPLACE:直接写入UpdateServer。

INSERT:读取ChunkServer中的基线数据并发送到UpdateServer,如果行已存在则返回错误,不存在则执行插入操作。

UPDATE:如果行已存在则执行更新,否则什么也不做。

DELETE:如果行已存在则执行删除,否则什么也不做。

多版本并发控制

写操作的两个步骤:

预提交:锁住待更新行,把操作追加到该行的未提交行操作链表中,然后往提交任务队列加入一个提交任务。

提交:线程从提交任务队列中获取提交任务,然后把任务的操作日志写入到日志缓冲区中(缓冲区满时写入磁盘)。操作日志写成功后,把未提交行操作链表追加到已提交行操作链表,释放锁。

默认情况的隔离级别为读已提交。

单行只写事务预提交时对单行加写锁;多行只写事务预提交时对所有行加写锁;读写事务中的读操作是读取某个版本的快照。

允许用户显式锁住某一行(select xxx for update),发生死锁时超过指定时间自动回滚。

一些设计

  1. 惊群效应:N个线程同时读取一行已失效的缓存,第一个线程在读取时往缓存中加入fake标记,其他线程发现fake标记时先等待。
  2. LightyQueue:使用多个队列分散读写请求。
  3. 双缓存机制:分配当前和预读两个缓冲区,使用当前缓冲区读取完成并返回上层计算之后,预读缓冲区切换成当前缓冲区并异步读取数据,原来的当前缓存区计算完之后清空内存并切换成预读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/92958.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/92958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Element-plus]动态设置组件的语言

nuxt element-plus国际化vue element-plus国际化<template><div class"container"> <!-- <LangSwitcher />--><button click"toggle(zh-cn)">中文</button><button click"toggle(en)">English<…

【VS Code - Qt】如何基于Docker Linux配置Windows10下的VS Code,开发调试ARM 版的Qt应用程序?

如何在Windows 10上配置VS Code以开发和调试ARM版Qt应用程序。这需要设置一个基于Docker的Linux环境。首先&#xff0c;让我们了解一下你的具体需求和环境&#xff1a;你有一个Qt项目&#xff08;看起来是医学设备相关的设置程序&#xff09;目标平台是ARM架构你希望在Windows …

linux常见故障系列文章 1-linux进程挂掉原因总结和排查思路

问题一 &#xff1a;运行时常见的进程崩溃原因 内存不足&#xff09; **0. 内存不足 内存不足&#xff08;OOM Killer&#xff09; 排查 OOM&#xff1a;free -h → dmesg → ps aux --sort-%mem 预防 OOM&#xff1a;限制关键进程内存、调整 OOM Killer 策略、增加 swap 长期优…

Spring Cloud Gateway 路由与过滤器实战:转发请求并添加自定义请求头(最新版本)

前言 网关是什么?如果把你的系统比作一栋高端写字楼,网关就是那位神通广大的前台小姐姐,笑容可掬地拦住不速之客,把贵宾引到豪华会议室,还会在你胸口贴上一枚醒目的“贵宾”标签。它既懂礼数,又有原则,能过滤无效请求、转发正确目标,还能在途中动点“小手脚”,比如加…

达梦数据库慢SQL日志收集和分析

达梦数据库慢SQL日志收集和分析 开启SQL日志记录 使用DMLOG工具分析SQLLOG DMLOG安装配置 DMLOG分析日志 系统视图V$LONG_EXEC_SQLS记录了最近1000条执行时间超1s的sql。如果sql语句超长可能会被截断,只能从sqllog里找完整的sql文本。 SELECT * FROM V$LONG_EXEC_SQLS ORDER …

一篇文章,带你玩转SparkCore

Spark Core 概念 前言 批处理&#xff08;有界数据&#xff09; ​ 对静态的、有限的数据集进行一次性处理&#xff0c;数据通常按固定周期&#xff08;如每小时、每天&#xff09;收集后统一计算。 特点&#xff1a; 高吞吐量&#xff0c;适合大规模数据。高延迟&#xff08;数…

VRRP技术

VRRP的概念及应用场景 VRRP&#xff08;虚拟路由冗余协议&#xff09;概念 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff0c;虚拟路由冗余协议&#xff09;是一种路由容错协议&#xff0c;用于在多个路由器之间提供网关冗余&#xff0c;确保当主路由器故障时&a…

表驱动法-灵活编程范式

表驱动法&#xff1a;从理论到实践的灵活编程范式 一、为什么需要表驱动法&#xff1f; 在处理多分支逻辑&#xff08;如消息解析、命令分发&#xff09;时&#xff0c;传统的 if-else 或 switch-case 存在明显局限&#xff1a; 当分支数量庞大&#xff08;如成百上千条命令&am…

零基础-动手学深度学习-10.2. 注意力汇聚:Nadaraya-Watson 核回归

上节介绍了框架下的注意力机制的主要成分 图10.1.3&#xff1a; 查询&#xff08;自主提示&#xff09;和键&#xff08;非自主提示&#xff09;之间的交互形成了注意力汇聚&#xff1b; 注意力汇聚有选择地聚合了值&#xff08;感官输入&#xff09;以生成最终的输出。 本节将…

nginx高新能web服务器

一、Nginx 概述和安装 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器。 Nginx 功能介绍 静态的web资源服务器html&#xff0c;图片&#xff0c;js&#xff0c;css&#xff0c;txt等静态资源 http/https协议的反向代理 结合F…

Unity大型场景性能优化全攻略:PC与安卓端深度实践 - 场景管理、渲染优化、资源调度 C#

本文将深入探讨Unity在大型场景中的性能优化策略&#xff0c;涵盖场景管理、渲染优化、资源调度等核心内容&#xff0c;并提供针对PC和安卓平台的优化方案及实战案例。 提示&#xff1a;内容纯个人编写&#xff0c;欢迎评论点赞。 文章目录1. 大型场景性能挑战1.1 性能瓶颈定位…

Java集合框架、Collection体系的单列集合

Java集合框架、Collection1. 认识Java集合框架及结构1.1 集合框架整体结构1.2 集合框架的核心作用2. Collection的两大常用集合体系及各个系列集合的特点2.1 List系列集合&#xff08;有序、可重复&#xff09;2.2 Set系列集合&#xff08;无序、不可重复&#xff09;3. Collec…

HTML <picture> 元素:让图片根据设备 “智能切换” 的响应式方案

在响应式设计中&#xff0c;图片适配是一个绕不开的难题&#xff1a;同一张高清图片在大屏设备上清晰美观&#xff0c;但在小屏手机上可能加载缓慢&#xff1b;而适合手机的小图在桌面端又会模糊失真。传统的解决方案往往需要用JavaScript判断设备尺寸并动态替换图片源&#xf…

Spring Boot 监控与日志管理实战

在 Spring Boot 应用开发中&#xff0c;指标监控和日志管理是保障应用稳定运行的核心环节。指标监控能实时掌握应用健康状态、性能瓶颈&#xff0c;日志管理则用于问题排查和安全审计。本文基于 Spring Boot 提供的 Actuator 监控工具、Spring Boot Admin 可视化平台&#xff0…

【排序算法】②希尔排序

系列文章目录 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希尔排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接选择排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

Linux Shell为文件添加BOM并自动转换为unix格式

1.添加并查看BOM添加bomvim -c "set bomb|set fileencodingutf-8|wq" ./gradlew查看bomhead -c 3 ./gradlew | hexdump -C2.安装dos2unix并转换为unix格式安装sudo apt install dos2unix转换dos2unix ./gradlew

华清远见25072班C语言学习day5

重点内容&#xff1a;数组&#xff1a;为什么有数组&#xff1f;为了便于存储多个数据特点&#xff1a;连续存储多个同种数据类型元素(连续指内存地址连续)数组名&#xff1a;数组中首元素的地址&#xff0c;是一个地址常量。一维整形数组&#xff1a;定义&#xff1a;数据类型…

安全守护,温情陪伴 — 智慧养老产品上新

- 养老智慧看护终端接入萤石开放平台 - 在2025 ECDC萤石云开发者大会&#xff0c;萤石产品经理已经介绍了基于萤石云服务AI能力适老化设备的养老智能能力开放。 而今天&#xff0c;养老智慧看护终端再升级&#xff0c;集成跌倒检测、物理隐私遮蔽、火柴人遮蔽、AI语音智能体…

鸿蒙flutter项目接入极光推送

推送的自分类权益 需要审核15个工作日&#xff0c;实际约3个工作日 项目使用极光推送flutter代码&#xff0c;代码端已经配置的东西&#xff08;需要配置flutter端和对应各自平台原生端&#xff09;&#xff0c;我的工程是多target&#xff0c;所以和单target有一点不同。 一、…

2025牛客多校第八场 根号-2进制 个人题解

J.根号-2进制 #数学 #FFT 思路 赛后发现身边的同学都是通过借位来解决进位问题的&#xff0c;在此提供一种全程不出现减法的顺推做法 首先A,BA,BA,B可以理解为两个多项式&#xff1a;A0A1−2A2(−2)2…A_{0}A_{1}\sqrt{ -2 }A_{2}(\sqrt{ -2 })^2\dotsA0​A1​−2​A2​(−…