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/cc
slave用的接收master发送binlog线程
pika_binlog_sender_thread.h/cc
master用来给slave发送binlog线程
pika_binlog_bgwork.h/cc
slave从master接收过来的Binlog,后台写入
pika_client_conn.h/cc
Redis Client连接
pika_command.h/cc
命令映射表实现
pika_kv.h/cc
kv数据结构实现
pika_list.h/cc
list数据结构实现
pika_hash.h/cc
hash数据结构实现
pika_set.h/cc
set数据结构实现
pika_zset.h/cc
zset数据结构实现
pika_bit.h/cc
bitmap相关实现
pika_server.h/cc
定义server
pika_dispatch_thread.h/cc
分配已连接client给worker线程的分发线程
pika_heartbeat_thread.h/cc
master用来接收slave心跳包线程
pika_slaveping_thread.h/cc
slave用来给master发送心跳包线程
pika_trysync_thread.h/cc
slave和master建立主从同步线程
pika_worker_thread.h/cc
处理client请求的worker线程
pika_heartbeat_conn.h/cc
心跳连接模板实现类
pika_master_conn.h/cc
slave监听端口,接收master发送过来的Binlog
pika_monitor_thread.h/cc
Monitor线程实现