购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2 网络子系统

ObServer类的init_network方法负责进行OBServer进程的网络子系统初始化。OBServer的网络处理总体由ObSrvNetworkFrame这个类实现,它提供了init方法来初始化网络框架,其过程如图3.2所示。

图3.2 网络框架初始化过程

1)获得各种网络设置,将它们集合在一个ObNetOptions实例opts中,用于后续的初始化工作。opts中的设置大部分来自配置文件中相应配置项的值,例如tcp_user_timeout_和high_prio_rpc_io_cnt_分别来自配置项dead_socket_detection_timeout和high_priority_net_thread_count,表示TCP的用户超时时间和高优先级网络线程的数量。另外,opts中还有一些像high_prio_rpc_io_cnt_这样的用于设置网络相关线程数量的选项(rpc_io_cnt_、mysql_io_cnt_、batch_rpc_io_cnt_),它们的值来自配置项net_thread_count,并且在该项未被设置的情况下,会根据节点上的CPU核心数计算出来,且不低于6。

2)调用libeasy网络层初始化RPC端口,在请求投送器deliver_中设置当前节点的IP地址。

3)调用request_qhandler_的init方法初始化Handler,request_qhandler_属性在ObSrvNetworkFrame类(见图3.3)实例化时自动被实例化,其translater_属性中放入的是一个ObSrvXlator对象,而request_qhandler_的init方法调用的是这个ObSrvXlator对象的init方法。事实上,目前ObSrvXlator的init方法几乎是一个空函数,在其中会直接返回成功标志。

4)调用deliver_的init方法初始化请求投送器,它的工作是几个建立集中式的请求队列,当有请求(MySQL或者RPC请求)到来时,deliver_会将请求放入这些队列中的某一个(见3.5.3节)。init方法会创建四个队列:

图3.3 ObSrvNetworkFrame及相关类的主要结构示意

①租约队列lease_queue_:接收租约相关的请求。

②DDL队列ddl_queue_:接收DDL请求。

③MySQL队列mysql_queue_:接收除DDL之外的MySQL请求。

④诊断队列diagnose_queue_:接收诊断相关的请求。

这些队列的作用是接收“Auth request”(还没有建立租户但先收到了请求),它们都有一个队列守护线程,线程名分别为:LeaseQueueTh、DDLQueueTh、MysqlQueueTh和DiagnoseQueueTh。队列守护线程的工作循环里会不断地弹出队列中的请求,然后用与队列绑定的请求Handler来处理请求,事实上这些队列绑定的请求Handler就是前述ObSrvNet-workFrame实例request_qhandler_属性中保存的Handler(ObReqQHandler实例)。处理请求时,Handler将调用其handlePacketQueue方法,该方法采用与3.5.4节中类似的方式,利用翻译器获得实际的请求处理器来处理请求。

5)初始化rpc_handler_,其init方法与request_qhandler_的情况类似,即返回成功标志。

6)初始化libeasy,即网络框架实例的net_属性。libeasy初始化过程的核心是创建网络层所需要的网络I/O线程(数量由opts_中的rpc_io_cnt_等属性决定),在libeasy的模型中这些网络I/O线程负责从所监听的端口取出网络请求,然后逐步将它们交由请求投送器放入请求队列,最终由工作线程负责处理。

7)最后,网络框架的初始化过程会建立MySQL端口和RPC端口监听。对于MySQL协议,除了在TCP网络上监听MySQL端口之外,还会监听本地UNIX套接字。在建立监听时,同时会注册各个监听端口上的Handler,这些Handler可以看成是符合libeasy规范的回调函数集合,如果这些监听的端口上有请求到达,注册的Handler中的回调函数会被调用,最后进入3.5节中所述的请求处理过程。 SedSHT5DIkZEh7icnJhtsB9n8jznL3MU3s1VFoHKtKfXARdZZwOee13fwPhmKaO/

点击中间区域
呼出菜单
上一章
目录
下一章
×