pika整体架构

主要组件
1.网络模块pink
- 高性能非阻塞网络编程库,支持protobuf、redis等协议
- 用户实现一个高性能的server只需要实现对应的DealMessage函数即可
- 支持单线程模型、多线程worker模型。
2.线程模块
Pika基于pink对线程进行封装,使用多个工作线程来进行读写操作,由底层nemo引擎来保证线程安全,线程分为11种:
PikaServer:主线程DispatchThread:监听1个端口,接收用户连接请求Worker线程:存在多个(用户配置),每个线程里有若干个用户客户端的连接,负责接收处理用户命令并返回结果,每个线程执行写命令后,追加到Binlog中Trysync:在接收到slaveof命令时,尝试与master建立首次连接,并在以后出现故障后发起重连BinlogSender:存在多个(动态创建销毁,本master节点挂多少个slave节点就有多少个),每个线程根据slave节点发来的同步偏移量,从Binlog指定的偏移开始实时同步命令给slave节点BinlogReceiver:存在1个(动态创建销毁,一个slave节点同时只能有一个master),将用户指定或当前的偏移量发送给master节点并开始接收执行master实时发来的同步命令,在本地使用和master完全一致的偏移量来追加BinlogSlavePing:slave用来向master发送心跳线程HeartBeat:master用来接收所有slave发送来的心跳并恢复进行存活检测线程Bgsave:后台dump线程Keyscan:后台扫描keyspace线程Purgelog:后台删除Binlog线程
3.存储引擎nemo
nemo存储引擎是在rocksdb引擎基础上,增加了对redis的5种数结构kv,hash,list,set,zset的支持- 对
rocksdb的checkpoint做了修改,能够更好的支持checkpoint的需求
4.日志模块Binlog
- 日志模块由两部分组成,
meta文件和log文件组成 meta文件只有一个,用来标识当前正在写的log文件的版本号以及当前写入偏移log文件有多个,不同的log用版本号来区分。每个log文件都有log文件顺序写入,且最大100M,每写满一个log文件,需要重新新建一个,老的log文件不会再被修改了。每次新建一个log文件,版本号就会增加1
文件说明
pika_admin.h/cc管理类命令实现
pika_binlog.h/cc线程安全binlog实现
pika_binlog_receiver_thread.h/ccslave用的接收master发送binlog线程
pika_binlog_sender_thread.h/ccmaster用来给slave发送binlog线程
pika_binlog_bgwork.h/ccslave从master接收过来的Binlog,后台写入
pika_client_conn.h/ccRedis Client连接
pika_command.h/cc命令映射表实现
pika_kv.h/cc kv数据结构实现
pika_list.h/cclist数据结构实现
pika_hash.h/cchash数据结构实现
pika_set.h/ccset数据结构实现
pika_zset.h/cczset数据结构实现
pika_bit.h/ccbitmap相关实现
pika_server.h/cc定义server
pika_dispatch_thread.h/cc分配已连接client给worker线程的分发线程
pika_heartbeat_thread.h/ccmaster用来接收slave心跳包线程
pika_slaveping_thread.h/ccslave用来给master发送心跳包线程
pika_trysync_thread.h/ccslave和master建立主从同步线程
pika_worker_thread.h/cc处理client请求的worker线程
pika_heartbeat_conn.h/cc心跳连接模板实现类
pika_master_conn.h/ccslave监听端口,接收master发送过来的Binlog
pika_monitor_thread.h/ccMonitor线程实现