当前位置: 首页 > 编程日记 > 正文

CynosDB技术详解——存储集群管理

本文由腾讯云数据库发表

前言

CynosDB是架构在CynosFS之上的分布式关系数据库系统,为最大化利用存储资源,平衡资源之间的竞争,检查资源使用情况,需要一套高效稳定的分布式集群管理系统(SCM: Storage Cluster Manager),SCM使用Etcd作为存储,利用Etcd Raft算法完成SCM Leader的选举,对外提供HTTP API 查询CynosFS 状态,负责CynosFS调度,其包含两类调度:

lPool调度:对SCM 中所有Pool进行调度,每个Pool的调度将根据其状态,产生相关调度操作,包括Pool的初始化,Pool自动扩缩容,以及Pool的销毁等。

lSegment Group调度: 每个Pool内有一个SG调度器,负责该Pool内所有SG的调度,根据每个SG的状态,产生相关的调度操作,包括增减副本,Leader切换,副本迁移,副本离线等。

img

相关组件和名词解释如下:

lDBEngine:数据库引擎,支持一主多从。

lDB Cluster Manager(DCM):数据库集群管理,其负责一主多从DB集群的HA管理。

lStorage ServiceStorage Node(SN):Storage Service是个逻辑概念,泛指实际提供服务的Storage Node。SN则是1个具体的服务进程,负责日志的处理、BLOCK数据的异步回放、读请求的多版本支持等,同时还负责将WALLOG备份到Cold Backup Storage。

lSegment(Seg):Storage Service管理数据块BLOCK和日志的最小单元(大小为10GB),也是数据复制的实体。通过一致性协议(Raft)进行同步,形成Segment Group(SG)

lPool:多个SG从逻辑上构成一个连续的存储数据BLOCK的块设备,供上层的Distributed File System分配使用。Pool和Seg Group是一对多的关系。

lStorage Cluster Manager(SCM):负责管理Storage Service,维护Pool和SG的对应关系,以及Segment Group内部成员的调度。

数据模型

SCM数据模型包含4类信息:API信息,系统信息,调度信息,存储服务信息

lAPI信息(API Info):SCM对外提供服务的接口,包括SCM自身运行情况,Pool信息,以及Storage Service信息等,提供RESTFul风格的接口(管理类接口)和GRPC接口(数据交互类)。

l系统信息(System Info):SCM自身运行的全局配置信息,以及多个SCM主从Member信息,此外还包括外部系统访问的地址ClientUrls和Member之间的访问地址PeerUrls等信息。

l调度信息(Schedule Info):SCM内部调度的作业信息和状态信息,包括Pool和SG的调度信息,以及相关调度产生的任务,这些任务将会通过心跳下发给Storage Service。

l存储服务(Store Info):SCM保存的Storage Service信息、调度的状态信息、Storage Service上报的统计信息以及内部作业定期计算产生的统计信息等,主要包括Pool信息,Storage Service元数据及Storage Service运行时统计信息,以及SG相关信息。

img

I/O模型

SCM Master主要与如下模块进行交互:

lStorage Service:进行资源调度,接收心跳,下发命令等交互

lDistributed File System:为其提供对应Pool和pool下所属SG的信息,以帮助其完成读写请求的正确路由

lDCM:为其提供包括创建Pool,查看Pool信息,以及SG调度情况等接口。

lSCM Slave:通过Etcd同步SCM的数据,包括调度信息和资源信息等,维护高可用性的心跳信息。

img

对上图的详细说明:

1.SN注册到SCM,SN的物理布局信息通过标签组labels(每个标签label采用key-value键值对表示)进行定义,标签名依次是Region->Zone->Rack->Host,标签值是具体部署的物理信息,如北京->北京一区->rack_01->host_01。一个SN负责处理一个SSD设备上的数据读写。

2.DCM开始创建Pool,SCM接收到创建操作后,保存该Pool的元数据信息到Etcd上,然后把该Pool加入到内部调度队列。

3.Pool调度器:定期从调度队列上获取各个Pool来调度,调度包括Pool的初始化(分配第一个SG),根据Pool状态及使用情况进行扩缩容,以及Pool的销毁。

4.SG调度器:每个Pool下对应一个SG调度器,负责该Pool内所有SG的调度,包括SG的初始化,增减副本,SG内leader切换,迁移等,通过装箱算法选择最佳Storage Node作为该SG的成员以及整个存储资源的调度。

5.Distributed File System会定期同步SG的使用情况,Pool信息到SCM,并从SCM获取该Pool的所有SG信息以及SG的变更情况(如SG内leader切换)。

调度原理

通过SCM发送心跳信息来驱动的,包括Store Node(SN)心跳和Segment Group(SG)心跳,心跳消息采用Protobuf V3定义,GRPC进行交互,由SN发起,SCM负责接收,接收到心跳信息后,将根据SN运行情况产生相关的调度命令,并通过心跳响应信息下发给SN,SN接收命令,并执行命令,然后更新相应的状态信息,通过下一次心跳发送给SCM。

Pool调度

Pool调度将对SCM所有Pool进行调度,每隔5秒轮询一次所有的Pool,检查是否有新的Pool加入,检测每个Pool的状态,根据Pool状态进行调度,如初始化,扩缩容和销毁等。

img

Pool状态包括:UNINITIALIZE,NORMAL,DISABLE,DELETE,其调度状态包括:INITIATING,EXPANDING,EXPANDED,IDLE。Pool调度状态变更如下:

img

扩容过程如下:

1.当前Pool存在SG0,新增SG1并对SG1进行初始化。

2.当Pool调度器检查到Pool需扩容时,更新其状态为EXPANDING,并持久化该Pool信息,然后添加一个SG的元数据到Pool的SG内部调度队列中,并持久化到Etcd中,SG的ID从0开始编号,依次递增,保持连续性,避免产生空洞,采用一次扩展一个SG的方式,完成后更新其状态为EXPANDED。

3.该Pool的SG调度器进行调度,检测到有新SG,对该SG进行初始化,补充副本。

4.当Pool调度器检查到该Pool的状态为EXPANDED,判断该新的SG是否创建完成(补充完所有副本),如创建完成则更新Pool的调度状态为IDLE,否则忽略本次调度。

img

调度状态需进行持久化,当SCM发生主从切换时,能恢复到崩溃时的调度状态。

Pool缩容是扩容的逆过程,从id最大的SG开始往0方向收缩,以免产生空洞,具体的操作由SG调度器执行每个SG回收。

Pool释放是对该Pool的所有SG进行释放,回收将从从id最大的SG开始回收,回收过程将通过心跳信息下发指令给SN,具体的操作由SG调度器执行每个SG的回收。

SG调度

CynosDB每个Pool都对应一个SG调度器,每个调度器按1秒轮询一次该Pool内的所有SG,每个Segment Group之间是相互隔离的,其调度不受影响,调度主要通过SN的心跳和SG心跳完成的,调度包括segment的添加,删除,切主等。

img

SG状态包括:UNINITIALIZE,NORMAL,DISABLE。

Segment调度状态包括:UNINITIALIZE,INITIATING,ALLOCATING,ALLOCATED,BOOTSTRAPPING,ADDING,ADDED,REMOVING,RELEASING,调度状态如下:

img

SN心跳:SCM接收store的统计信息,然后下发Segment操作(分配和销毁Segment)和SG操作(启动和销毁Segment Group)给Store,然后Store执行操作,而Store操作的结果通过GRPC API汇报给元数据。如分配一个Segment给某个Pool的SG过程:

1.保存Segment的元数据信息到KV系统中。

2.接收到Store的心跳信息。

3.下发分配Segment信息。

4.接收到分配Segment信息,进行本地操作,操作完成后直接通过grpc汇报分配结果给元数据。

img

SG心跳:SCM获取SG的心跳信息,更新SG的元数据信息,然后根据SG的状态,产生相应操作(如添加,删除副本)或空操作,通过心跳的响应信息反馈给SN,如有下发操作,SCM通过下一次心跳信息来检查本次操作是否成功,如往某个SG中添加一个副本的过程:

1.SCM接收到SG上报的心跳信息,更新该SG的信息到KV系统。

2.SCM通过响应下发添加Segment请求给SG。

3.SG接收到请求后,向该SG加入新的Segment,添加后,更新SG信息,下一次心跳周期发送更新后的SG信息.

4.SCM接收到SG的心跳信息,检查添加Segment操作是否成功。

img

装箱算法

假设SCM中存在Region1,该Region1存在Zone1,Zone2两个区域,Zone1有三个机架Rack1,Rack2,Rack3,存在三个主机Host1,Host2,Host3,每个主机有4个SN,每个SN保存已分配的Segment,选择一个Store作为SG 副本分四个步骤:筛选,过滤,打分,比较。

img

1.筛选:根据Pool注册的标签信息(为一组Key-Value数组),如[{REGION:Region1},{ZONE:Zone1}],选择出可用的PoolStores1集合,如{S1,S2,S3,S4,S5...,S12}。

img

2.过滤:从PoolStores1集合中过滤不符合规则的store信息,如根据其状态(在线,离线),工作负载(空闲,忙碌),使用率(CPU,内存,磁盘,网络等),以及该Store已在该SG中等进行过滤,得到PoolStores2集合{S1,S2,S4,S7,S8,S9,S10,S12}。

img

3.打分:假设SG0的segment所在的store的集合为{S5,S3},其中S5为leader所在的store,对PoolStores2中的store进行打分,遍历PoolStores,针对每个pStore,遍历SGStores,比较pStore和sgStore的位置,计算pStore的分值pScore,遍历完SGStores后,得到该pStore在该SG上的分值pScore的总分值,即{100,100,100,100,100,200,200,200}。

img

4.比较:如选择的Stores的分数相同,则按Store上Segment数量进一步比较,数量少的为选择的Store,如选择出Store10作为为SG0{S5,S3}的另一个副本。

img

此文已由作者授权腾讯云+社区发布

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

转载于:https://www.cnblogs.com/qcloud1001/p/10045360.html

相关文章:

linux进程间通信:system V消息队列

文章目录基本介绍编程接口代码实例消息队列的发送和接收消息队列中的消息对象的属性控制基本介绍 支持不同进程之间以消息(messages)的形式进行数据交换,消息能够拥有自己的标识,且内核使用链表方式进行消息管理。进程之间的通信…

将一个一维数组转化为二进制表示矩阵。例如_算法之矩阵最大区域问题

例如&#xff1a;给定一个m*m(0<n)的矩阵&#xff0c;请找到此矩阵的一个子矩阵&#xff0c;并且此子矩阵的各个元素的和最大&#xff0c;输出这个最大的值。或者给出一个柱形矩阵求最大子矩阵的最大值。首先我们需要了解一下最大字段和问题。最大子段和问题给定一个长度为n…

伪元素first-letter

用于设置一个块级元素首位字符的样式&#xff0c;而且仅对该字符设置样式 p&#xff1a;first-letter{ font-size&#xff1a;200%}是让P中的第一个字符是其他字符大小的两倍转载于:https://www.cnblogs.com/damade/p/3518583.html

fedora17 的 rc.local

Fedora17上已经找不到/etc/rc.local了&#xff0c;如果我们想开机执行某个脚本&#xff0c;就需要手动创建这个文件&#xff0c;目录也发生了小小变化&#xff1a; 1. 新建文件/etc/rc.d/rc.local&#xff0c;第一行须指明执行shell&#xff1a; [root www.linuxidc.com rc.d]#…

使用TortoiseGit,设置ssh方式连接git仓库。

开始设置之前的准备&#xff1a;建立项目文件夹&#xff0c;初始化git仓库(右键 git init)&#xff0c;右键打开 git bash &#xff0c;git pull “仓库地址”, 把网站上的仓库代码拉取下来。 TortoiseGit使用扩展名为ppk的密钥&#xff0c;而不是ssh-keygen生成的rsa密钥。 也…

linux进程间通信:消息队列实现双端通信

双端通信描述 利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递&#xff0c;而不需要server端进行消息转发。 同时消息队列的读阻塞和写阻塞特性&#xff08;消息队列中已经写入数据&#xff0c;如果再不读出来&#xff0c;则无法再次写入&#xff09;让…

windows 软件安装事件_苹果安装windows,报windows支持软件未能存储到所选驱动器

今天去给一个IT外包客户维修电脑&#xff0c;前台的一台苹果电脑需要安装双系统&#xff0c;苹果电脑安装双系统对我们专业安装系统工程师来说&#xff0c;这不是很简单的嘛&#xff01;客户问需要多长时间&#xff0c;信心满的说一到两个小时&#xff01;客户说那你开始弄吧。…

C# Attribute简介

一 、EventAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、DefaultEventAttribute PropertyAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、 DefaultPropertyAttribute、DefaultValueAttri…

P2P之UDP穿透NAT的原理

关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone原始作者: Hwycheng Leo(FlashBTHotmail.com)源码下载: http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar参考&#xff1a;http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt P2P之UDP穿透NAT的原理…

快速幂运算and 快速乘运算

ll qpow(ll a,ll b) {ll ans1;while(b){if(b&1) ans(ans*a)%mod;a(a*a)%mod;b>>1;}return ans; } 快速乘运算 ll mult(ll a,ll b,ll mod) {a%mod,b%mod;ll sa,sum0;while(b){if (b&1){sums;if (sum>mod)sum-mod;}b>>1;s<<1;if (s>mod)s-mod;}r…

linux进程间通信:system V 共享内存

文章目录思维导图如下通信原理优势运行流程编程接口编程实例思维导图如下 通信原理 多个进程共享物理内存的同一块区域&#xff08;通常称之为“段”:segment&#xff09;抛弃了内核态消息转存处理的过程&#xff0c;让两个进程直接通过一块内存进行通信 我们普通的像PIPE,FI…

python函数手册68_直接在python中检索68个内置函数?

Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name&#xff1a;>>> sorted(k for k, v in vars(__builtins__).items()if k.islower() and getattr(v, __module__, ) builtins)[__build_class__, __import__, abs, all, a…

《深入理解Java虚拟机》笔记3

垃圾收集算法 (1)标记清除 根据根搜索确定对象是否已死&#xff0c;已死对象标记&#xff0c;然后一起清除。 这个其实不算什么算法&#xff0c;最正常想法应该就是这样。但是&#xff0c;缺点 是效率不高&#xff0c;如果有很多不连续的小对象需要回收&#xff0c;会花好多时间…

Step-By-Step在AIX上安装Oracle RAC

最近遇到一个项目&#xff0c;是在AIX5.3上安装ORACLE 9i RAC&#xff0c;说实话&#xff0c;ORACLE俺压根就没有接触过&#xff0c;我也是临危受命。感觉如同当年实施AS400的XSM项目一般。无奈&#xff0c;下载了N多本REDBOOK开始研究&#xff0c;终于有了些眉目&#xff0c;找…

Python中输出字体的颜色设置

1.实现过程 终端的字符颜色是用转义序列控制的&#xff0c;是文本模式下的系统显示功能&#xff0c;和具体的语言无关。控制字符颜色的转义序列是以ESC开头,即用\033来完成 2.书写过程开头部分: \033[显示方式;前景色;背景色m结尾部分: \033[0m注意&#xff1a;开头部分的三个…

linux进程间通信:system V 信号量

文章目录概念描述通信原理编程接口使用流程编程案例概念描述 英文&#xff1a;semaphore 简称SEM&#xff0c;主要用来进行进程间同步本质&#xff1a;内核维护的一个正整数&#xff0c;可对其进行各种/-操作分类&#xff1a;systemV 信号量、POSIX 有名信号量、POSIX 无名信号…

设计模式总结1

1.代码不是没有错误就是最好的 &#xff08;1&#xff09;命名要规范-------取一个好的名字。 &#xff08;2&#xff09;代码少做无用功。 &#xff08;3&#xff09;注意逻辑错误。 &#xff08;4&#xff09;面向对象&#xff1a;可维护、可复用、可扩展、灵活性好。 2.简单…

mysql 单选字段_mysql字段类型

学习自 https://www.cnblogs.com/jennyyin/p/7895010.html&#xff0c;感谢原博主的奉献mysql支持多种类型&#xff0c;大致可以分为三类&#xff1a;数值、字符串、日期/时间。数值类型类型大小范围(有符号)范围(无符号)用途tinyint1字节(-128, 127)(0,255)小整数值smallint2字…

ios时间差,以时间格式显示

为什么80%的码农都做不了架构师&#xff1f;>>> NSDate *nowDate [[NSDate alloc]init]; double diffTime [nowDate timeIntervalSinceDate:preDate]; int diffHour diffTime / (60*60); int diffMin ( diffTime - diffHour*(60*60) ) / (60); int diffSec…

深入理解C++中public、protected及private用法

深入理解C中public、protected及private用法 这篇文章主要介绍了C中public、protected及private用法,对于C面向对象程序设计来说是非常重要的概念,需要的朋友可以参考下初学C的朋友经常在类中看到public&#xff0c;protected&#xff0c;private以及它们在继承中表示的一些访问…

v-vim 代码批量缩进,字符串精确查找及替换

vim中代码批量缩进 有如下两种办法&#xff0c;主要依靠>和<字符来进行 缩进的单位通过设置~/.vimrc,添加如下行 set tabstop4 "设定tab宽度为4个字符 set shiftwidth4 "设定自动缩进为4个字符 set expandtab "用space替代tab的输入 set noexpandtab &q…

Codeforces Round #228 (Div. 1)B

进制构造 这里用了十进制 有点像串并联 每一位代表的数分开表示出来再把每一位的数并起来 比如892 就是800902 800又可分为8*10*10。。。 1 #include <iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 #include<stdlib.h&g…

javaweb实现mysql备份功能_java web 实现mysql 数据库备份、恢复

如题&#xff0c;由于项目需要&#xff0c;研究并实现了java web的 mysql数据库的备份、下载、恢复功能&#xff0c;中间遇到一些问题&#xff0c;耗费了不少时间&#xff0c;下面让我一一道来&#xff1a;背景介绍&#xff1a;window 7系统mysql 5.7eclipsespring mvctomcat 7…

在windows8 上安装framework 3.5

在电脑上装了windows8 的双系统后&#xff0c;为了装上Windows Live Writer&#xff0c;需要安装framework3.5.在线安装等了很久都装不上&#xff0c;下载的安装包不能用&#xff0c;提示需要framework3.5的支持。死循环啊 。搜索找到离线更新的方法&#xff0c; 离线更新方法&…

C#第一章笔记

第一个C#程序 namespace 是C#中组织代码的方式&#xff0c;它的作用那个类似java中的包 using 在Java中作用如果导入其他包 应该是用import关键字而在C#中应使用using关键字来引用 class关键字 与java一样C#也是一门面向对象的得语言&#xff0c;使用class关键字来表示类 Main&…

linux进程间通信:system V 信号量和共享内存实现进程间同步

关于信号量和共享内存的相关描述已经在前几篇提到过&#xff1b; 信号量&#xff1a;即内核维护的一个正整数&#xff0c;可以使用内核提供的p/v接口进行该正整数的/-操作&#xff0c;它主要用来表示系统中可用资源的个数&#xff0c;协调各个进程有序访问资源&#xff0c;防止…

mysql三次握手_一文彻底搞懂 TCP三次握手、四次挥手过程及原理

原创文章首发于公众号&#xff1a;「码农富哥」&#xff0c;欢迎收藏和关注&#xff0c;如转载请注明出处&#xff01;TCP 协议简述TCP 提供面向有连接的通信传输&#xff0c;面向有连接是指在传送数据之前必须先建立连接&#xff0c;数据传送完成后要释放连接。无论哪一方向另…

【转】常见系统中文字体的英文名

http://www.aoao.org.cn/blog/2008/03/fonts-chinese/ http://www.yale.edu/chinesemac/pages/fonts.html Mac OS的一些&#xff1a; 华文细黑&#xff1a;STHeiti Light [STXihei]华文黑体&#xff1a;STHeiti华文楷体&#xff1a;STKaiti华文宋体&#xff1a;STSong华文仿宋&…

手动新增swap分区

1、建立1G的交换分区&#xff08;填充&#xff09; #dd if /dev/zore of /opt/swapfile bs1M count1024 2、设置交换分区文件 #mkswap /opt/swapfile 3、立即启用交换分区文件 #swapon /opt/swapfile 4、系统开机时自动挂载新分区 #vim /etc/fstab 末尾添加&#xff1a;/opt…

js捕获和冒泡

面向对象&#xff1a; 1.单例模式 2.工厂模式 3.构造函数 &#xff08;1&#xff0c;2&#xff0c;3的目的都是生成对象&#xff09; js天生自带的类 object&#xff08;基类&#xff09; 子类&#xff1a;function&#xff08;函数&#xff09; array&#xff08;数组&…