分割字符串是比较常用的功能,自己基于 stl 实现了一个,也可以参考一下 QT 原生的字符串分割实现逻辑。
sentinel 监控管理 redis 节点,那么我们如何感知 sentinel 的动作?sentinel 为我们提供了很多途径:
详细请参考官方文档 《Redis Sentinel Documentation》
sentinel notification-script <master-name> <script-path>
。SENTINEL get-master-addr-by-name <master name>
redis 是否使用了 raft 一致性算法呢?使用了,但不是严格意义上的 raft,然而 raft 算法的核心要点:领导者选举,日志复制,安全性,你都可以在 redis 中找到相似的实现。
下面将探索一下 redis 关于 raft 算法的有关实现。
前面几章已经讲了:redis 集群各个角色之间的通信,主客观下线,投票选举;在选举中胜出的哨兵 leader,由它来完成 redis 集群的故障转移:redis 实例的角色转换。
哨兵故障转移主体流程:
master 主观下线 -> master 客观下线 -> 选举 -> leader 筛选原 master 的最优 slave -> 晋升最优 slave 为新 master -> 通知原 master 的其它 slave 链接新 master -> 结束故障转移 -> 更新新 master 的存储结构关系 -> 旧 master 重新上线被降级为 slave。
投票原理:”先到先得”,每个 sentinel 机会是对等的,都有投票权利。
当前 sentienl 节点,确认某个 master 客观下线后,它会主动开启故障转移的选举环节,进行拉票(选自己)和投票(选别人)。
经过票数统计,在最新一轮的选举过程中,超过法定数量(一般过半数)的 sentinel 投票给某个 sentinel 节点时,那么它就当选 leader,选举结束后,由它去执行其它剩余的故障转移步骤。
科技给予了我们很多高效解决生产问题方法:互联网,物联网,大数据。
kimserver 网络库基于 libev
,redis 异步链接池主要封装了 hiredis
,它足够高效:
redis - ip:port
对应一个链接基本可以满足正常的读写。trello 是一个管理应用,支持多个平台,用过的都知道它的好。自己断断续续使用了好几年,它最实用的功能就是“看板”,看板最大的好处是操作简单,将零散的思维片段化零为整。——它最大的问题是对国内网络支持不是很友好。
mysql
非阻塞异步 client 比较小众,能搜索出来的资料不多。
只要做单线程的异步服务,就绕不开 mysql 数据库操作。很幸运,mariadb
提供了异步接口,在 github 上找到一个项目(mysql_async)是结合 libev 实现的异步项目,正合我意!接下来对其进行改造。
cryptopp
是 c++ 加解密库,包含了大部分主流的加解密实现功能。详细可以查看官方文档。本章主要是写 demo,测试 cryptopp
的使用。
hiredis 是 redis 的一个 c - client,异步通信非常高效。
单链接异步压测,轻松并发 10w+,具体请参考《hiredis + libev 异步测试》。
本章主要剖析 hiredis 异步回调机制原理,围绕三个问题,展开描述。
获取本地时间是比较常用的操作,可通过 gettimeofday
函数获取本地时间,然后根据需要转化成对应的时间单位:毫秒,微秒,秒。
jemalloc
是一个优秀的内存分配器,通过与系统默认的内存分配器进行比较:jemalloc 内存分配性能比系统默认的分配器快 50%。
火焰图是 svg 格式的矢量图,基于 perf
软件性能分析工具。通过对软件在系统上的工作行为记录进行采样。并将数据进行图形化,从而获得比较直观的可视化数据矢量图。
我们要考虑一个高性能解决方案,首先要考虑:方案是否能解决问题,其次是否足够简单,研发人员能少写代码,运维方便维护部署。而 golang 比较符合预期。
我使用 golang
时间不多,没有深入研究,算是入门级别,也总结一下使用的心得吧,下面简单说说 golang 的几个主要优点。