SequoiaDB 巨杉数据库是一款金融级分布式关系型数据库,坚持从零开始打造分布式开源数据库引擎。“内核笔记系列”旨在分享交流 SequoiaDB 巨杉数据库引擎的设计思路和代码解析,帮助社区用户深入理解 SequoiaDB 的实现原理,共建开源开放的数据库技术生态。
01 基本概念

会话与连接是两个容易混淆的概念。会话(Session) 指是通信双方从开始通信到通信结束期间的一个上下文(Context)。这个上下文是一段位于服务器端的内存,记录了本次连接的客户端机器,通过哪个应用程序和哪个用户登录等信息。而连接是指从客户端到数据库实例的一条物理路径。连接可以在网络上建立,也可以在本机通过IPC机制建立。通常会在客户端进程与一个专用服务器或一个调度器之间建立连接。
02 SequoiaDB 中的会话设计

分布式数据库 SequoiaDB 的集群通常由数据节点、协调节点和编目节点组成,集群内的不同节点间存在多种类型的连接。因此 SequoiaDB 中存在多种会话,且不同的会话对应不同的服务。会话的主要任务是处理通信的对端发来的请求。

集群中典型的会话结构如下图。

协调节点监听客户端发起的连接请求,连接建立后创建一个 coord session,即协调节点会话,之后便由这个会话处理对应的客户端发起的所有请求。coord session 在接收到客户端发来的处理请求后,会结合编目信息进行分析,确认需要下发到哪些节点去执行,可能会发送给编目节点、一个或多个数据节点。数据节点在接收到协调节点发来的消息时,会创建一个 shard session 来处理请求,执行指定的操作,并返回数据。
03 通信平面

SequoiaDB 集群内的节点间存在多个通信通道,不同类型的节点提供不同的服务。为了保证这些服务各自能够正常工作,SequoiaDB 的节点提供了多个通信平面。简单来说,一个通信平面对应一个服务端口,不同的端口提供不同类型的服务,这也是为什么在安装 SequoiaDB 时,要求预留一定范围内的端口号的原因。

SequoiaDB 中当前提供了如下几个通信平面:

local 平面(local service): 使用节点配置文件中指定的基础服务端口号 svcname

repl 平面(repl service): 使用端口号svcname+1

shard 平面(shard service): 使用端口号svcname+2

cat 平面(cat service): 使用端口号svcname+3

rest 平面(rest service): 使用端口号svcname+4

om 平面(om service): 使用端口号svcname+5

04 本地会话

本地会话在直连节点(即配置 svcname)时创建。直连的含义相对宽泛,指的是连接任意节点的本地服务端口。客户端连接到协调节点时,会在协调节点上创建本地会话。当本地端口上的监听接收到新的连接请求时,会创建一个新的会话(内存结构)及一个服务线程(执行单元),并将它们绑定(attach)起来。后续客户端将会直接与这个新的服务线程进行交互。
代码导读

SequoiaDB 中各类型的会话继承关系如下图所示。

从图中可以看到,本地会话、增量/全量同步会话、复制会话等,都是继承自同一个基类 _ISession。下面将会结合组网对其中几个关键的会话进行介绍,主要是会话建立/销毁的时机、会话的结构、操作等。

本地会话对应数据结构是类 _pmdLocalSession,线程的主函数是  _pmdLocalSession::run(),会话线程启动后,就在这个函数里循环,接收及处理消息,直到会话需要结束时退出该循环。

本地会话能绑定不同的 processor 以执行不同的处理流程。对于协调节点,绑定的是 _pmdCoordProcessor。对于编目节点和数据节点,绑定的是 _pmdDataProcessor。对于协调节点,会先调用  _pmdCoordProcessor 的接口进行消息处理,在无法识别请求类型时,则会再次调用 _pmdDataProcessor 的接口进行处理。

05 同步(或复制)会话 Repl Session

分区组内的节点之间,通过同步动作来保证数据的一致性。同步分为两种,一种是正常运行状态下的增量同步,一种是异常情况下的全量同步。同步是通过对应的同步会话与同步线程来处理的,它涉及到两个节点,在数据生产方称为源端,在数据消费方称为目标端。由于只有数据节点和编目节点上会进行数据复制,所以只有在这两种类型的节点上,才存在同步会话。
1)增量同步会话

增量同步会话分为增量同步源端会话和目标端会话,且存在于复制组正常运行期间。在数据节点和编目节点的启动过程中,主节点或从节点都会开启增量同步的监听。同时,它也会主动启动一个增量复制目标端会话,并向它选定的源端发送同步请求。源端节点上会被动创建一个增量同步源端会话,这两个会话后续会开始进行交互,以完成数据同步。

2)全量同步会话

全量同步会话存在于全量同步期间,在集群正常运行期间及全量同步完成后不存在。与增量同步会话一样,全量同步会话也分为源端和目标端。

需要全量同步的场景有三种:

备节点的重放速度跟不上主节点,主节点上复制日志绕接,导致备节点还未获取到的复制日志被覆盖,备节点无法继续增量同步

节点异常重启,启动后节点根据读取到的异常启动状态决定全量同步

节点正常停止后正常重启,但停止时间较长,期间其它节点上的日志已经发生了绕接

而无论是上述哪种情况,都会先发生增量复制会话。当这些原因导致增量同步无法继续进行的时候,目标节点上会主动创建一个全量同步会话(以及对应的线程),并退出当前的增量复制线程。当全量同步会话启动时,会向源端发送一个全量同步开始的消息。此时源端上会被动创建一个全量同步源端会话。至此,全量同步的会话创建完成,后续这两个会话之间会开始进行交互,完成数据同步。
代码导读

四种会话对应的类为: _clsReplSrcSession,  _clsReplDstSession,  _clsFSSrcSession,  _clsFSDstSession。

同步相关的会话都是异步会话,上述四种会话使用同一个会话管理器:_clsReplSessionMgr 来进行管理。

异步会话响应的消息类型及对应的处理函数,一般在对应的类中通过 OBJ_MSG_MAP 等宏进行定义,请参考代码。

06 会话的查看

用户可通过 db.snapshot ( SDB_SNAP_SESSIONS ) 命令列出当前数据库节点中的所有会话,或通过 db.snapshot ( SDB_SNAP_SESSIONS_CURRENT ) 命令列出当前数据库节点中的当前会话。
代码导读

session 的导出动作在类 _monSessionFetcher 类中实现,并在 init() 函数中准备数据。用户可选择查看当前会话 (使用当前线程的 eduCB 接口导出) 或所有会话 (使用  _pmdEDUMgr的接口导出)。 在准备好数据后,由上层统一的 context 框架调用该类的 fetch 接口获取数据。

巨杉内核笔记 | 会话(Session)的更多相关文章

  1. 巨杉内核笔记(一)| SequoiaDB 会话(session)简介

    SequoiaDB 会话(session)简介 会话(Session)的基本概念 容易弄混淆的两个概念是会话与连接. 通俗来讲,会话(Session) 是通信双方从开始通信到通信结束期间的一个上下文( ...

  2. MZY项目笔记:session歧路

    from my typora MZY项目笔记:session歧路 文章目录 MZY项目笔记:session歧路 那该怎么办? 1. 手动加上cookie的header. 2.自己模拟一个Session ...

  3. Linux内核笔记--内存管理之用户态进程内存分配

    内核版本:linux-2.6.11 Linux在加载一个可执行程序的时候做了种种复杂的工作,内存分配是其中非常重要的一环,作为一个linux程序员必然会想要知道这个过程到底是怎么样的,内核源码会告诉你 ...

  4. 简单PHP会话(session)说明

    现在程序员愈发的不容易了,想要精通,必然要寻本溯源,这其实与目前泛滥的愈发高级的语言以及众多的框架刚好相反,因为它们在尽可能的掩盖本源使其简单,个人称之为程序员学习悖论. 注:作者接触web开发和ph ...

  5. webpy使用笔记(二) session/sessionid的使用

    webpy使用笔记(二) session的使用 webpy使用系列之session的使用,虽然工作中使用的是django,但是自己并不喜欢那种大而全的东西~什么都给你准备好了,自己好像一个机器人一样赶 ...

  6. 【转载】linux内核笔记之进程地址空间

    原文:linux内核笔记之进程地址空间 进程的地址空间由允许进程使用的全部线性地址组成,在32位系统中为0~3GB,每个进程看到的线性地址集合是不同的. 内核通过线性区的资源(数据结构)来表示线性地址 ...

  7. 【转载】linux内核笔记之高端内存映射

    原文:linux内核笔记之高端内存映射 在32位的系统上,内核使用第3GB~第4GB的线性地址空间,共1GB大小.内核将其中的前896MB与物理内存的0~896MB进行直接映射,即线性映射,将剩余的1 ...

  8. http 会话(session)详解

    会话(session)是一种持久网络协议,在用户(或用户代理)端和服务器端之间创建关联,从而起到交换数据包的作用机制 一.查看session id 可利用相关工具,比如firebug,httpwatc ...

  9. 对<< ubuntu 12.04编译安装linux-3.6.10内核笔记>>的修正

    前题: 在前几个月的时候,写了一篇笔记,说的是kernel compile的事情,当时经验不足,虽说编译过了,但有些地方写的有错误--因为当时的理解是有错误的.今天一一更正,记录如下: 前文笔记链接: ...

随机推荐

  1. PERC H310 配置详细步骤【阵列RAID创建】【阵列恢复】【阵列池创建】

    机器配置: HP PRO6300 二手淘的201912,HP的主板芯片Intel Q75芯片组,集成显卡(集成显卡与H310阵列卡冲突),CPU Intel I5 3450 [raid5阵列创建] 1 ...

  2. 如何知道一个路由器的 BSSID ?

    使用 Mac 连接上这个路由器,然后使用 option 按 wifi 按钮,可以在详情页里找到. 有些路由中继的设置需要使用 BSSID ,比如 pandorabox openwrt

  3. JavaScript语法规则+JavaScript数据类型

    JavaScript: ECMAScript + BOM +DOM javascript 标识符命名规则: 1.只能是字母.数字.下划线.$ 2.不能以数字开头 3.不能使用关键字和保留字 省略var ...

  4. Android实战项目——家庭记账本设计思路

    经过三周左右的Android学习,实感只有上手开发才能有所提高.在此打算做一个家庭记账APP,同时巩固一下学到的东西并且弥补漏洞. 概述 记账是自古以来人类必不可少的一件事,从古代的算盘,到手写账本, ...

  5. Ubuntu18--使用vi编辑器方向键以及Backspace乱码问题

    解决方法一: 可以进入vi /etc/vim/vimrc.tiny目录对vim配置文件进行修改 修改内容: 修改完成就可以正常使用了.(换行的时候Esc退出编译状态,回车换行,输入第二句话,在按Esc ...

  6. .net 父类值赋给子类

    1.最简单的方式,反射+泛型 优点:字段修改时,无需更改代码,只需要更新实体即可 缺点:因为用到反射,可能效率会稍微弱那么一点点,没有实际用太多字段测试 public static cClass Pa ...

  7. API接口幂等性设计

    目录 幂等性场景 解决方案 幂等性场景 网络延迟导致多次重复提交. 表单重复提交. 解决方案 每次提交都使用一个Token,Token保证临时且唯一即可 token生成规则(单机应用):token+U ...

  8. 在Docker中部署Confluence和jira-software

    -------谢谢您的参考,如有疑问,欢迎交流 version: centos==7.2 jdk==1.8 confluence==6.15.4 jira-software==8.2.1 docker ...

  9. XMind快捷键汇总

    在 XMind: ZEN 中,快捷键是可以大大提高绘图效率的存在.掌握常用的快捷键组合,就可以在键盘上运指如飞,快速地进行思维导图的绘制.还在等什么?感兴趣的朋友,下面就和小编一起来看看吧! XMin ...

  10. 巨杉数据库SequoiaDB】巨杉Tech | SequoiaDB 分布式事务实现原理简介

    1 分布式事务背景 随着分布式数据库技术的发展越来越成熟,业内对于分布式数据库的要求也由曾经只用满足解决海量数据的存储和读取这类边缘业务向核心交易业务转变.分布式数据库如果要满足核心账务类交易需求,则 ...