pika整体架构

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完全一致的偏移量来追加Binlog
  • SlavePing:slave用来向master发送心跳线程
  • HeartBeat:master用来接收所有slave发送来的心跳并恢复进行存活检测线程
  • Bgsave:后台dump线程
  • Keyscan:后台扫描keyspace线程
  • Purgelog:后台删除Binlog线程

3.存储引擎nemo

  • nemo存储引擎是在rocksdb引擎基础上,增加了对redis的5种数结构kv,hash,list,set,zset的支持
  • rocksdbcheckpoint做了修改,能够更好的支持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线程实现

results matching ""

    No results matching ""