FAQ
1 编译安装
Q1: 支持的系统?
A1: 目前支持 Linux 和 MacOS 系统,不支持 Windows
Q2: 怎么编译安装?
A2: 参考编译安装 wiki
Q3: Ubuntu 编译偶尔报错 isnan isinf was not declared?
A3: 一些旧版本的 pika 对 Ubuntu 环境兼容不好,某些情况下会出现;可以先修改代码,用 std::isnan 和 std::isinf 替代 isnan,isinf, 并包含头文件 #include <cmath>
。 我们会在新版兼容这个。
2 设计与实现
Q1: 为什么要开那么多线程?比如 purge,搞个定时任务不就好了。难道编程框架不支持定时器?
A1: pika 有一些比较耗时的任务,如删 binlog,扫描 key,备份,同步数据文件等等,为了不影响正常的用户请求,这些任务都是放到后台执 行的,并且将能并行的都放到不同线程里来最大程度上提升后台任务的执行速度;你说的变成框架是 pink 吗?pink 是支持定时器的,每一个 workerthread 只要用户定义了 cronhandle 和频率,就会定时执行要执行的内容,不过这时候 worker 是被独占的,响应不了用户请求,所以占时的任务最好还是单独开线程去做,redis 的 bio 也是这个原因
Q2: heartbeat 让 sender 做不就好了?或者说 sender 有必要那么多线程吗?
A2: 这主要有两个原因,第一为了提高同步速度,sender 只发不收,receiver 只收不发,心跳是又单独的线程去做,如果心跳又 sender 来做,那么为了一秒仅有一次的心跳还要去复杂化 sender 和 receiver 的逻辑;第二其实前期尝试过合并在一起来进行连接级别的存活检测,当写入压力过大的时候会心跳包的收发会延后,导致存活检测被影响,slave 误判 master 超时而进行不必要的重连