在本系列的第一篇中,简述了SequoiaDB的安装,以及一个(伪)集群的部署

第二篇和第三篇对SequoiaDB的集群,做了简单地操作。

在本篇中,将对SequoiaDB的架构进行简单的分析。

因为自身能力有限,对于架构这么高大上的主题,不敢轻言。因此本文会摘抄SequoiaDB官方的描述,加上自己的理解,达到共同学习的目的。

在解析之前,先简单叙述一下分布式系统的CAP理论:

C:代表一致性,即在某时刻,分布式系统中节点数据应该是相同的;

A:代表可用性,即有求必应,在分布式系统中某节点后,统一集群内的其它节点依然能处理远程的请求;

P:代表分区容忍性,即系统中某节点无法连接(故障)后,同属集群内的其它节点能继续提供服务。

由于某些原因,例如网络环境恶劣,灾备处理缺乏等,没有任何一个分布式产品全部实现了CAP。故目前的分布式系统,都是在C和A中做出选择。

如果考虑C,就必须对节点做多个备份,在写数据时,同步写其它备份节点,都完成才返回。大并发情况下,无法及时响应,导致不可用。

如果考虑A,就无法保证数据(真的)写入多个备份节点,而访问备节点的请求获取到的数据可能是过期的数据。

SequoiaDB中,在大规模分布式环境中提供了数据最终一致性的保障。并且提供方式,切合用户业务场景,使数据库系统既具备一定的安全性,又具备一定的可用性。

  • 写操作只在某几个节点上执行后即返回,其它备节点后台定时向主节点同步,在此模式下,高可用性;
  • 写操作在所有节点上执行后再返回,在此模式下,数据更安全,满足一致性。

用户可以权衡自己的应用场景,在创建Collection(集合)的时候,合理设置ReplSize的数值。

SequoiaDB的整体架构图如下:

数据库系统提供一组协调节点,供客户程序访问。可以理解成为数据库的代理。

既然是代理,因此协调节点仅保持客户端的连接,作为请求分发节点将用户请求分发至相应的数据节点,并不保存任何用户数据,。

在协调节点之后,有数据节点组和编目节点组。

编目节点保存系统的元数据信息,像该数据库有几个用户,有几个数据组,数据组中有哪些cs,又有哪些cl,以及创建cl时候的一些选项值等。协调节点通过与编目节点通讯从而了解数据在数据节点中的实际分布。一个或多个编目节点可组成复制组集群。

用户的数据保存在数据节点中。一个或多个数据节点可以构成一个数据节点组(官方称之为分区组,复制组)。数据节点组中每个数据节点都存储该复制组的一份完整数据,又称为复制组实例(或分区组实例);复制组中的数据节点之间采用最终一致性同步数据,不同的复制组中保存的数据无重复。

一个数据节点组,必须有一个主节点,来处理用户的写请求。在考虑更高可用性的场景下,用户的写操作,会先写在主节点上,然后通过同步机制,备节点可以从主节点获取到用户的操作和数据,对节点的数据进行更新和存储。而对于用户的读操作,可以从数据节点上的任何一个节点上得到处理。

其实在集群环境中,所有的读、写等请求,都是从协调(coord)节点分发下来的(当然,直连数据节点组中的节点的情况除外)。上图所描述的,是把协调节点省略掉了(不信?可以看看源码中的pmd模块和rtn模块)。

当集群中,主节点故障了,在集群节点中的通信机制发现之后,会发起选举,从备节点中选择新的主节点,继续接受和处理客户端的请求。关于选举部分,可以通过“二次选举”关键字搜索,维基百科上描述得比较详细 :)

选举是有条件的,在SequoiaDB中,选举的发起,必须是除故障节点外所有节点的数目,大于集群内所有节点数据的一半。可能我描述得不太准确,用公式说明吧。

假设一个集群内,所有节点数是 T(total),故障的节点数是D(Dump),选举的发起条件则是: true == (T-D) > T/2。当然,在正常情况下,集群中的主节点也会自发的在各个节点中进行切换,选择最佳的节点作为集群主节点。

当发现节点故障了,dba对故障进行了处理,并恢复了故障节点。这个时候,恢复的节点会在启动之后,充当从节点,从主节点中拉取数据,做到数据的备份。

图示如下:

SequoiaDB整体架构基于上述机制,但是如何做到,就得慢慢分析其源码。更多简介,请去SequoiaDB官网信息中心获取。

唉,花了好久时间,感觉讲的还是不太清楚,而且只是业务上的架构,并没有涉及技术层面的架构。

在写完上一篇的高级功能之后,才发现居然没有把SequoiaDB的事务处理招牌写上去。

真是败笔啊。

我再找时间,去尝试一下SequoiaDB的事务功能是如何使用的。据说,MongoDB在目前的版本中,也没有提供事务的功能。看样子,其实国产软件,不一定输国外软件。

拙陋之处,敬请海涵。有讲述错误之处,请指出。感谢您能耐心看到这里。

下一篇,可能新写一篇关于SequoiaDB的事务功能的使用介绍,也可能是接着主题,开始分析SequoiaDB的源码部分。敬请关注。

PS:说到国产软件,不禁就会想起给自己和朋友配电脑时候,CPU,硬盘,内存,核心配件,居然都是国外的。龙芯火过一阵之后,也慢慢销匿。在软件产品方面,游戏引擎、数据库等软件,也大都出自国外。在NoSQL慢慢升温的情况下,杀出一个能和MongoDB这个行业老大竞争的SequoiaDB数据库,作为软件从业者,其实心里还是感到很自豪的。由衷希望国内会出现更多的牛逼软件产品,为我国人争光。

=====>THE END<=====

SequoiaDB 系列之四 :架构简析的更多相关文章

  1. Spring系列.@EnableRedisHttpSession原理简析

    在集群系统中,经常会需要将Session进行共享.不然会出现这样一个问题:用户在系统A上登陆以后,假如后续的一些操作被负载均衡到系统B上面,系统B发现本机上没有这个用户的Session,会强制让用户重 ...

  2. REST架构简析(原论文整理)

    0 引言        目前,互联网在社会中扮演的角色越来越重要.通过互联网为广大群众提供服务,也是互联网成功的关键.互联网服务架构目前大多数都是基于REST架构来完成的.REST从它诞生至今,可以说 ...

  3. muduo库整体架构简析

    muduo是一个高质量的Reactor网络库,采用one loop per thread + thread loop架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范. muduo的代码分为两部 ...

  4. Nginx服务器架构简析

    一.Nginx的模块化 模块化结构的思想是一个很久的概念,但也正是成熟的思想造就了Nginx的巨大优越性. 我们知道Nginx从总体上来讲是有许多个模块构成的.习惯将Nginx分为5大模块分别为:核心 ...

  5. 构建 CDN 分发网络架构简析

    构建 CDN 分发网络架构 CDN的基本目的:1.通过本地缓存实现网站的访问速度的提升 CDN的关键点:CNAME在域名解析:split智能分发,引流到最近缓存节点

  6. EasyPlayer RTSP安卓Android播放器架构简析

    本文转自EasyDarwin开源团队成员John的博客:http://blog.csdn.net/jyt0551/article/details/73310641 EasyPlayer 是一款小而美的 ...

  7. Spring系列.AOP原理简析

    Spring AOP使用简介 Spring的两大核心功能是IOC和AOP.当我们使用Spring的AOP功能时是很方便的.只需要进行下面的配置即可. @Component @Aspect public ...

  8. SequoiaDB 系列之六 :源码分析之coord节点

    好久不见. 在上一篇SequoiaDB 系列之五   :源码分析之main函数,有讲述进程开始运行时,会根据自身的角色,来初始化不同的CB(控制块,control block). 在之前的一篇Sequ ...

  9. NETGEAR 系列路由器命令执行漏洞简析

    NETGEAR 系列路由器命令执行漏洞简析 2016年12月7日,国外网站exploit-db上爆出一个关于NETGEAR R7000路由器的命令注入漏洞.一时间,各路人马开始忙碌起来.厂商忙于声明和 ...

随机推荐

  1. Docker 基础命令 简要入门

    本文出自:http://www.cnblogs.com/scoter2008,本文将持续更新所有docker都可以通过man查看帮助:man docker [ps|top|run|...]1.列出正在 ...

  2. c++ initialize_list

    看到这么一个东西,可以实现花括号( "{" "}" )初始化容器类. 使用时需包含头文件 #include <initialize_list> 我们 ...

  3. zookeeper适用场景:zookeeper解决了哪些问题

    问题导读:1.master挂机,传统做法备份必然是以前数据,该如何保证挂机数据与备份数据一致?2.分布式系统如何实现对同一资源的访问,保证数据的强一致性?3.集群中的worker挂了,传统做法是什么? ...

  4. FDTD Python API

    源代码 #!/usr/bin/env python from math import exp from gnuplot_leon import * imp0 = 377.0 class fdtd_le ...

  5. java日期和字符串的相互转换

    日期->字符串,字符串->日期:日期->毫秒,毫秒>日期- private static void getDate() { // TODO Auto-generated met ...

  6. cnblog code syntaxhighlighter view

    wlw代码插件 测试多款 wlw插入代码插件 在博客园的代码高亮效果 1.Code Snippet 1: public override void Update() 2: { 3: base.Upda ...

  7. linux命令学习-su

    su 切换用户:su -root与su root的区别你直接su root 你可以认真看下,只是用户变成root.你当前的操作环境还是在aaa的用户下 如果加个su - root,就等于你的操作环境跟 ...

  8. [转]比较Jmeter、Grinder和JAVA多线程本身压力测试所带来的性能开销

    1. 测试环境 jmeter版本 :jmeter 2.4 grinder的版本 : Grinder 3 JAVA的版本:JDK 1.6 2. 测试代码 Jmeter测试代码 public class  ...

  9. TestLink学习五:TestLink1.9.13和JIRA6.3.6的集成

    testlink和jira的集成,一般步骤: 第1步:System-Issue Tracker Management添加JIRA的db模式.第2步:测试项目管理,“Issue Tracker Inte ...

  10. Android Studio下载与安装

    Android Studio下载与安装 1 2 3 4 5 分步阅读 百度经验:jingyan.baidu.com 自从Google宣布Android Studio将取代Eclipse,正式成为官方集 ...