SSDB 服务器进程的 main 函数在 ssdb-server.cpp 文件里, 启动过程用伪代码表示如下:
welcome(); parse_args(argc, argv); conf = Config::load(); data_db = SSDB::open(conf); meta_db = SSDB::open(conf); net = NetworkServer::init(*conf); // 初始化业务处理 SSDBServer *ss = new SSDBServer(data_db, meta_db, *conf, net); // 处理网络请求 net.serve();
这个主体的启动过程其实很简单. SSDB 库(libssdb)是封装好的, 直接打开数据库文件即可. 而 NetworkServer 也是封装好的网络模块(libnet), 之前有介绍过(SSDB 源码分析 – 网络框架概述).
SSDBServer 是比较复杂的地方, 因为它将 libssdb 和 libnet 整合起来, 同时还整合主从同步功能, 所以需要详细介绍.
在 serv.cpp 的 SSDBServer 构造函数里:
reg_procs(net); backend_sync = new BackendSync(ssdb); expiration = new ExpirationHandler(ssdb); start_slaves();
首先, 给网络处理器注册命令处理函数, libnet 是业务无关的, 当 SSDB 服务器增加了一个新命令, 就要注册这个命令的处理函数, 这样当从客户端收到一个请求报文时, 服务器才知道如何处理.
接着会启动主从同步的处理器 BackendSync. 当网络服务器收到一个新的 slave 节点连接进来时, 请求会被转给 BackendSync 处理, BackendSync 将 binlog 发给 slave 处理.
关于 key 过期的处理是独立于 libssdb 的, 在 ExpirationHandler 类里处理.
由于每一个 SSDB 服务器节点既能作为 master, 同时也能作为 slave, 所以, 还需要根据配置文件决定是否启动 slave 处理器.