CnosDB有主复制演进历程

分布式存储系统的复杂性涉及数据容灾备份、一致性、高并发请求和大容量存储等问题。本文结合CnosDB在分布式环境下的演化历程,分享如何将分布式理论应用于实际生产,以及不同实现方式的优缺点和应用场景。

分布式系统架构模式

分布式存储系统下按照数据复制方式的不同,常分为两种模式:主从模式、无主节点模式。

主从模式

主从模式以Raft分布式算法为代表,Raft 算法是 Diego Ongaro 和 John Ousterhout 于 2013 年发表的《In Search of an Understandable Consensus Algorithm》中提出;从工程案例etcd实现之后,Raft算法开始大放异彩。

Raft分布式算法流程

无主模式

无主模式以亚马逊的Dynamo模型为代表,其理论来源于亚马逊在2007年发表的《Dynamo: Amazon’s Highly Available Key-value Store》,在该论文中论述了一种无主节点的数据库设计方案,像Cassandra、Riak等都是基于此理论实现。

Cassandra数据写入流程

CnosDB整体架构

CnosDB 架构中主要包括了两类进程: cnosdb、cnosdb-meta。cnosdb负责数据的写入、查询、以及存储;cnosdb-meta负责元数据存储,像用户、租户、Database、Table、以及数据分布等相关信息。

Meta服务

CnosDB的Meta服务是有主节点的分布式系统,通过 Raft 一致性协议实现的供CnosDB使用的一套分布式配置中心。作为配置中心要求具有较高的数据一致性,在有主模式下较容易实现这一点,这是我们采用有主模式实现Meta服务的主要原因。

CnosDB对访问频繁的Meta数据在本地有一份Cache,正常情况下直接访问本地Cache,降低用户的请求时延以及对Meta服务的访问压力;通过订阅Meta服务的数据变更日志来更新本地缓存数据。

上面提到Meta数据的本地缓存是通过订阅变更的方式进行同步,这必然会带来本地缓存与Meta服务数据不一致性的问题。对于这个问题我们根据对数据的不同使用场景做了不同处理;在可以容忍这种不一致性的地方直接读取本地缓存,像绝大多数的正常的读写流程都不需要访问Meta服务,这极大降低了用户访问时延;如果需要高度一致性的场景直接访问Meta服务获取最新的数据,像创建数据库、表结构的变更等。

CnosDB服务

CnosDB服务负责数据的写入、读取和存储,是一套类Dynamo的无主节点存储系统。

CnosDB按照两个维度对数据进行分片存储:时间分片与Hash分片。

时间分片:由于时序数据库本身的特征,按照时间维度进行分片有其天然的优势。CnosDB每隔一段时间创建一个Bucket,每个Bucket都有起始、结束时间用于存储对应时间段内的数据。每当系统容量不足时,添加新的存储节点;在创建新的Bucket时也将优先使用空闲容量最多的新节点,已有数据也不需要移动,这完美地解决了集群扩容与数据存储容量的问题。

Hash分片:时间分片完美地解决了存储容量的问题;在一个分布式集群环境下,会有多台机器提供服务,如若每个Bucket只分布在一台机器节点上,则整个系统的写入性能受限于单台机器。时序数据库还有另外一个概念是SeriesKey,按SeriesKey进行Hash分片可以分割成不同的ReplicaSet(复制组),每个ReplicaSet内的一个副本称其为Vnode,每个Vnode分散在不同的存储节点上,一个ReplicaSet内的多个Vnode按照类Dynamo方式进行副本间数据同步;Vnode是CnosDB进行数据分片管理的基本单元,采用Hash分片的方式解决了系统吞吐量的问题。

如下图所示,在时间维度上每隔一段时间创建一个Bucket,每个Bucket有两个复制组(用不同颜色来区分),每个复制组有两个副本(一个Bucket内相同颜色的Vnode有两个)分别落在不同的存储节点上。

当前面临问题

按照时间、Hash两个维度进行分片解决分布式存储下容量与性能问题;但由于每个复制组内的数据复制方式是类Dynamo的无主节点模式,这带来一些新问题:

数据一致性:在无主节点的分布式存储系统中解决数据不一致性问题方式也有很多,像Cassandra中采用以最后写入者为准,Riak中的向量时钟等;再配合读修复、反熵、提示移交(Hinted Handoff)等一整套机制达到数据的最终一致性。这一整套机制实现起来是较为复杂的,也会极大拖累系统的整体性能,CnosDB当前也只是实现了部分机制。

数据订阅与同步:在无主节点的分布式存储系统中由于数据写入无顺序性,这导致做数据订阅也是一个难以解决的问题。在无主节点的模式中数据写入的统一的入口就是计算节点的接口层,但是在计算存储分离的强大背景下,通常计算层都是无状态的,在这一层做数据订阅难以保证订阅服务不丢失数据。

当Raft遇上CnosDB

为解决上述问题,我们转投有主模式寻求解决方案。

半同步方案:最开始我们参考Kafka设计了一个半同步方案。在Kafka中通过下面几个参数来控制服务在不同模式下运行,给用户灵活自由的选择。(不熟悉的读者,具体参数含义可以查阅网络信息)

  1. acks
  2. 复制因子(副本数)
  3. min.insync.replicas

此方案最大优点就是灵活,用户需要什么样的一致性、可靠性等级系统都可以通过参数进行配置;我们考虑到实现的难度、时间关系以及之后的稳定性,暂停了此方案。

其他方案:我们还讨论了主备节点的方案;由于CnosDB系统是多租户的,每个租户甚至每个Database要求的副本数都不一致,导致有些副本节点比较空闲、而像主节点则会压力比较大,造成机器间负载不均衡,资源的浪费等。

最终,我们选择了成熟的Raft方案,确切说是Multi-raft的方式,CnosDB中每个ReplicaSet都是一个Raft复制组。

为什么选择Raft

自采用Raft共识算法实现的etcd发布以后,Raft算法被公认为易于理解、相对易于实现的一套分布式共识算法,在数据的一致性、稳定性、可靠性等方面都得到众多产品的验证。

Raft是有主模式,会很好满足对数据一致性的要求;同时做数据订阅也极其容易(一种方式是作为集群的Learner节点存在,再一种方式是直接读取 Raft Logs)。

再就是CnosDB的Meta服务已经采用Raft。CnosDB主程序再也没有理由不去拥抱Raft。

关于Raft开源社区也有众多开源实现,几乎成为当前分布式系统下的标准算法,我们也并没有必要从头开始造轮子,而是选择了openraft方案。

Raft在CnosDB中应用

在CnosDB 中一个ReplicaSet就是一个Raft复制组,一个ReplicaSet由分布在不同机器上的多个Vnode副本组成,这些Vnode便构成了该Raft复制组的成员节点。

Raft在CnosDB中使用

数据写入过程:在CnosDB中每次写入都对应Raft复制组中的一次提交。服务接收到请求后判断本节点是否是此次写入对应Raft复制组的主节点,不是则进行请求转发;如果是则通过Raft协议进行写入,按照Raft协议在每个Vnode节点下产生一条Raft Log Entry,CnosDB会以WAL的形式记录到此Vnode目录下。

有超过半数Vnode节点记录WAL成功后,由Raft协议驱动进入下一个阶段——Apply阶段;在CnosDB中Apply阶段较为简单,只是写Memcache,主节点Apply成功后就响应客户端成功。

服务重启后Memcache中的数据通过WAL进行恢复。Memcache是由上层的Raft协议驱动刷盘,每次Memcache的刷盘都是作为一个Snapshot而存在。

更详细的过程可以参考Raft协议相关文档。

数据读取过程:根据查询条件,数据读取最终会落到每个Vnode上。在CnosDB的计划中是优先读取主节点的Vnode,这会带来较高的数据一致性;由于CnosDB是一个Multi-raft实现方式,主节点是分散在各个节点并不会造成主从节点负载不均匀的问题。

新的问题

Raft共识算法在如下场景下并没有说明如何处理:

  1. 读写Raft log发生错误
  2. Apply时发生错误

上述两项错误通常为IO错误,发生上述错误时系统将陷入一种未知的状态,当前CnosDB的做法是尽量提前预检查规避错误的发生,也参考了etcd的处理方式如果遇到不可处理的未知场景,将由人工介入处理。

启用Raft算法

在配置文件中只需要把配置项using_raft_replication设置为true即可。

using_raft_replication = true

总结

CnosDB在2.4版本中引入Raft共识算法,在保住了CnosDB高性能、高可用性、易维护性的提前下,将会使得CnosDB 查询具有更高的数据一致性,同时为后面待实现的数据订阅、同步、数据异构处理做足了前期准备。

随着CnosDB各项功能的完善,未来将会在更广泛的使用场景中发挥更大的作用。后期我们会推出更多的测试报告、以及使用场景供大家参考,欢迎各位关注我们,我们共同成长。

CnosDB简介

CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。

欢迎关注我们的社区网站:https://cn.cnosdb.com

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

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

相关文章

java消息中间件简介

一、为什么要使用消息中间件 消息中间件就是可以省去繁琐的步骤,直达目的,怎么讲呢,就是比如你想很多人,知道你的动态,而知道的人可能手机没电,可能手机信号不好,可能手机不在服务区&#xff0c…

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于狮群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.狮群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Maven的安装与配置本地仓库,镜像源,环境变量详细步骤

参考视频: 黑马程序员2023新版JavaWeb开发教程,实现javaweb企业开发全流程 【小飞非系列】最新Maven实战教程-项目实战构建利器 文章目录 一.下载Maven安装包二.配置Maven的本地仓库(本机仓库)三.配置镜像源(加速jar包的下载)四.配置Maven的环…

Zookeeper 安装与部署

Zookeeper官网 目录 1 配置文件参数解读2 Zookeeper 单点安装3 Zookeeper 分布式安装 1 配置文件参数解读 Zookeeper 中的配置文件 zoo.cfg 中参数含义解读如下: (1)tickTime 2000:通信心跳数,Zookeeper 服务器与客户…

IdleStateHandler 心跳机制源码详解

优质博文:IT-BLOG-CN 一、心跳机制 Netty支持心跳机制,可以检测远程服务端是否存活或者活跃。心跳是在TCP长连接中,客户端和服务端定时向对方发送数据包通知对方自己还在线,保证连接的有效性的一种机制。在服务器和客户端之间一…

bean依赖属性配置

bean依赖属性配置 文章目录 bean依赖属性配置 Data ConfigurationProperties(prefix "cartoon") public class CartoonProperties {private Cat cat;private Mouse mouse; }cartoon:cat:name: whatage: 5mouse:name: howage: 6这样的话,业务bean无需在读…

FPC和PCB有哪些区别?

现在电子技术越来越先进,CPU可以做到5nm工艺,电路板可以做到几十层,可折叠屏应用多款手机中。 什么是FPC? FPC:Flexible Printed Circuit,柔性电路板,又被称为“软板” FPC 以聚酰亚胺或聚酯薄…

Active Stereo Without Pattern Projector论文精读

1.背景补充 主动立体相机和被动立体相机的主要区别在于它们获取立体视觉信息的方式 主动立体相机12: 主动立体视觉是指寻找最佳的视角去重建目标或者场景1。主动视觉的实现方式通常有:改变环境中的光照条件、改变相机的视角、移动相机自身位置等&…

利用 LD_PRELOAD劫持动态链接库,绕过 disable_function

目录 LD_PRELOAD 简介 程序的链接 动态链接库的搜索路径搜索的先后顺序: 利用LD_PRELOAD 简单的劫持 执行id命令 反弹shell 引申至 PHP 绕过disable_function 方法1:使用蚁剑的扩展工具绕过disable_function 方法2:利用 mail 函数…

电磁兼容EMC理论基础汇总

目录 0. 序言 1. EMC的基础介绍 1.1 EMC电磁兼容的定义 1.2 EMC的重要性 1.3 EMC的三要素 2. 库仑定律 3. 趋肤效应与趋肤深度 4. 电阻抗公式 4.1 电阻 4.2 容抗 4.3 感抗 4.4 电路元件的非理想性 5. 麦克斯韦方程组 5.1 高斯磁定律 5.2 高斯定律 5.3 法拉…

Appwidget开发基本介绍

本篇主要对appwidget开发进行简单介绍,为后续漏洞挖掘相关做前置铺垫 appwidget简介 官方解释如下: 应用微件是可以嵌入其他应用(如主屏幕)并接收定期更新的微型应用视图。这些视图称为界面中的微件,您可以使用应用微…

软件工程精品课程教学网站的设计与实现

系统功能需求分析 本系统要求采用Browser/Server模式设计开发,可以作为一般高等院校的网络学堂;可以为教师的辅助教学或者网络教学提供一个完善的教学网站;学生可以利用本教学网站来完成一些课程的学习任务。 2.2.1 功能划分 《软件工程》教学…

Sakila数据库和World数据库

Sakila数据库和World数据库 安装MySQL8.2的时候多出两个样例数据库 Sakila数据库和World数据库 Sakila数据库是一个关于DVD租赁的样例数据库,用于展示MySQL的各种功能和特性。Sakila数据库中包含了多个表,包括电影、演员、客户、租赁记录等,可…

Oracle(2-6) Backup and Recovery Overview

文章目录 一、基础知识1、Categories of Failures 故障类别2、Causes of Statement Failures 语句失败的原因故障情况Resolutions 决议 3、User Process Failures 用户进程失败故障情况Resolutions 决议 4、Possible User Errors 用户错误类型故障情况Resolutions 决议 5、Inst…

实验6 二叉树操作

0x01 实验目的 掌握二叉树的基本概念,二叉树的存储结构使用链表。 0x02 实验内容 输入一个完全二叉树的层次遍历字符串,创建这个二叉树,输出这个二叉树的前序遍历字符串、中序遍历字符串、后序遍历字符串、结点数目、二叉树高度(上述每一个…

计算UDP报文CRC校验的总结

概述 因公司项目需求,遇到需要发送带UDP/IP头数据包的功能,经过多次尝试顺利完成,博文记录以备忘。 环境信息 操作系统 ARM64平台的中标麒麟Kylin V10 工具 tcpdump、wireshark、vscode 原理 请查看大佬的博文 UDP伪包头定义&#x…

MQ - 消息系统

消息系统 1、消息系统的演变 在大型系统中,会需要和很多子系统做交互,也需要消息传递,在诸如此类系统中,你会找到源系统(消息发送方)和 目的系统(消息接收方)。为了在这样的消息系…

数据结构和算法-哈夫曼树以相关代码实现

文章目录 总览带权路径长度哈夫曼树的定义哈夫曼树的构造法1法2 哈夫曼编码英文字母频次总结实验内容: 哈夫曼树一、上机实验的问题和要求(需求分析):二、程序设计的基本思想,原理和算法描述:三、调试和运行…

Matter学习笔记(3)——交互模型

一、简介 1.1 交互方式 交互模型层定义了客户端和服务器设备之间可以执行哪些交互。发起交互的节点称为发起者(通常为客户端设备),作为交互的接收者的节点称为目标(通常为服务器设备)。 节点通过以下方式进行交互&a…

Spring Initial 脚手架国内镜像地址

官方的脚手架下载太慢了,并且现在没有了Java8的选项,所以找到国内的脚手架镜像地址,推荐给大家。 首先说官方的脚手架 官方的脚手架地址为: https://start.spring.io/ 但是可以看到,并没有了Java8的选项。 所以推荐…