DCS是Data Connectivity Service即数据连接服务的简称,是Trafodion非常重要的组成部分,它接收连接请求,并合理分配连接请求,借助Zookeeper完成HA的功能。
简介
最近越来越多的人在Trafodion社区问到关于DCS的一些问题,我在这里给大家统一介绍一下这个Trafodion的重要组成部分。DCS是Data Connectivity Service即数据连接服务的简称。Trafodion数据连接服务层提供了数据连接的分配和管理,主要涉及DCSMaster、DCSServer、 MXOSRVR、以及Zookeeper四大部分。本文将从对这几个组件的基本工作流程原理进行简单介绍。
如下图所示,数据连接服务层是连接数据库驱动和SQ引擎层的桥梁,是数据库引擎对外提供服务的唯一方式。从图中我们看到数据连接服务层支持了三种驱动的连接,JDBC、ODBC、及ADO,本文不涉及驱动相关介绍。
DCS概览
如下图所示,四大组件之间的关系如下,
- DCSMaster主要有三个任务:
- 启动时在Zookeeper中注册
- 分配连接
- 守护DCSServer,即当DCSServer出现异常后,DCSMaster会尝试重新启动DCSServer
- DCSServer只负责守护多个MXOSRVR
- MXOSRVR可以看做是任务执行者,所有SQL语句都通过这里执行
- Zookeeper是用于元数据的存储,以及DCSMaster HA开启时选举下一个DCSMaster重要组件
本文主要介绍DCSMaster的启动流程和工作原理,对于DCSServer,工作内容比较简单主要用于防止MXOSRVR意外退出后重启,对于MXOSRVR,本文也不详细讲解,主要工作是执行具体任务(DDL、DML、CQD等)。如有需要,我们在后续的文章中给大家介绍。
Zookeeper
打乱一下顺序,我们先从Zookeeper讲起,先来粗略看看有哪些关于DCS的元数据:
/trafodion/dcs/master
/trafodion/dcs/leader
/trafodion/dcs/servers/running
/trafodion/dcs/servers/registered
可以看到主要的元数据分为四部分,master和backup master的信息存放于/trafodion/dcs/master的子节点中;DCSMaster主节点的信息存放于/trafodion/dcs/leader的子节点中;DCSServer的状态和信息存放于/trafodion/dcs/servers/running;MXOSRVR进程状态及连接状态存放于/trafodion/dcs/servers/registered的子节点中,由于经常会连接建立-释放的更替,所以这个Zookeeper node下的节点会被频繁更新。
DCSMaster
了解了元数据的主要结构,接下来我们分两部分介绍DCSMaster,启动过程和工作原理。
DCSMaster启动过程
我们首先来看看DCSMaster的启动过程,如下图所示,图中表述比较清晰,这里不再赘述,我们主要看后面的工作原理。
在上图中,DCSMaster启动过程分为几个步骤:
- 将元数据写入Zookeeper。
- 启动两个重要的工作线程,ListenerService/ListenerWorker。
- 启动DCSServer。
DCSMaster基本工作原理
DCSMaster启动完成正常运转后,ListenerService线程和ListenerWorker线程会接管后续的主要工作。从ListenerService开始,ListenerService一旦接收到连接请求,则根据请求的类型进行相应的处理,比如Accept时会完成一些初始化操作,Read会从Socket中读取相应的数据,Write会将处理后的数据写回Socket,紧接着数据读取成功后,会将数据发送至Queue1缓存,ListenerWorker观测到Queue1中有数据变化,会将数据从Queue1中取回并逐条处理,将处理结果放入Queue2中,ListenerService观察到Queue2的数据变化后,将数据从Queue2中将数据取出并将数据逐条写回Socket。
总结
本文简述了DCS的工作流程和原理,并讲解了DCSMaster的基本工作原理,希望有助于读者了解数据连接服务的基本功能。DCS是Trafodion非常重要的组成部分,它接收连接请求,并合理分配连接请求,借助Zookeeper完成HA的功能,在本文中未涉及HA的相关工作,更多细节关于DCS安装配置等内容请参考官方文档:http://trafodion.apache.org/documentation.html。
本文中重点介绍了DCSMaster,这是DCS中最核心的部分,它通过两个线程ListenerService和ListenerWorker完成了请求接收和处理,它们分工不同ListenerService主要负责Socket读写操作,ListenerWorker主要负责请求内容的具体处理工作,两个线程缺一不可。这里提到的是Apache Trafodion的DCS功能,对于EsgynDB企业版中的DCS,它具有更强更完善的功能,这些功能将逐渐推向开源版本,敬请期待。
作者:徐恺华