第1页
Codis 2.0:从 Cache 到 DB
黄东旭
第2页
关于我
● 黄东旭 ● @Dongxu_Huang ● Gopher,脑残谷粉,分布式系统信徒,开
源运动实践者
第3页
Codis
● 分布式 Redis ● Stateless Proxy-based ● 完全兼容 Twemproxy ● 目前已经有很多知名和不知命的公司用于
生产环境
o 猎豹移动,科大讯飞,豌豆荚,汽车之家...
● 开源, github star 2200+
第4页
传统单点缓存
Redis, Memcached 1. 单机内存有限 2. 带宽压力 3. 单点问题 4. 不能动态扩容 5. 磁盘损坏时数据抢救
第5页
分布式缓存
1. Twemproxy 2. Redis Cluster (official) 3. Tair, Coachbase, Aerospike 4. Codis
第6页
Twemproxy
1. 最早/使用最广泛的解决方案 2. Proxy based 3. 静态的拓扑 4. 运维基本靠手 5. 最大痛点:无法平滑的扩/缩容
o 甚至修改个配置都需要重启服务 Orz
第7页
Redis Cluster
1. 官方出品 2. 去中心化设计 3. 客户端需要修改 4. 目前还缺乏 Best Practice,还没有人写一个
Redis Cluster 若干条注意事项 5. 整个系统高度耦合,升级比较困难
第8页
Tair, Couchbase, Aerospike…
1. 技术选型 2. 数据结构支持 3. 社区
第9页
Codis 1.x
第10页
Codis 1.x
• 业务不停机,平滑扩/缩容 • 无状态 Proxy,负载均衡,无单点 • 充分利用多核 • 运维工具齐全
– dashboard – redis-port – codis-ha
第11页
Codis 1.x
缺点(maybe :P ) : • 强依赖 zookeeper • 修改了官方 redis • 性能 • MULTI / EXEC 等指令不支持
第12页
Codis 整体设计
● Pre-sharding
o Slot => [0, 1023]
● Zookeeper ● Proxy 无状态 ● 平滑扩容/缩容 ● 扩容对用户透明
第13页
设计考量
● 分布式系统是复杂的 ● 开发人员不足 ● 尽量拆分,简化每个模块,同时易于升级 ● 每个组件只负责自己的事情 ● Redis 只作为存储引擎 ● Proxy 状态
第14页
设计考量
● Redis 是否挂掉的判定放到外部,因为分布 式系统存活的判定是复杂的
● 提供 API 让外部调用,当 Redis master 挂掉 的时候,提升 slave 为 master
● 我们不喜欢读写分离
第15页
设计考量
● graph everything
o slot status o proxy status o group status o lock o action
第16页
设计考量
proxy vs smart client proxy:
更好的监控,控制 后端信息不暴露,易于升级 smart client: 更好的性能 更低的延迟,升级比较麻烦
第17页
无状态 Proxy
1. 路由表统一存储在 Coordinator 中 2. 连接任意一个 proxy 发起请求的效果是一
样的
3. 负载均衡变得非常简单,proxy 可以平滑的 水平扩展
第18页
路由信息一致性保证
• 在 cluster-admin 发起集群状态变更时,所 有的 proxy 必须达到信息的一致后,才能重 新对外提供服务
• cluster-admin 和 proxy 之间通过二阶段提交 保证一致性
第19页
Read/Write Flow (Normal)
第20页
Read/Write Flow (Migrating)
第21页
如何保证安全迁移
1. 将 slot_X 状态标记为 ‘pre_migrate’ 2. 等待所有的 proxy 确认 3. 将 slot_X 状态标记为‘migrating’ 4. admin 不断发送 SLOTSMGRT 命令给 source
redis instance 直到 slot_X 所有的 key 迁移完 成 5. 将 slot_X 状态标记为 ‘online’
第22页
Result
1. 平滑水平扩展 2. 可插拔的存储引擎( 各个模块之间的纽带
是 Redis Protocol ) 3. 由于不同组件之间解耦, 都可以独立升级
a. proxy b. cluster admin c. storage engine
第23页
RebornDB
第24页
RebornDB (Codis 2.0)
1. Support both zookeeper and etcd 2. Plugglable storage engine 3. Backend pipeline 4. Simple HA tools 5. New Dashboard 6. Sync Replication 7. Distributed Redis Protocol Framework
第25页
性能
Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz redis-benchmark -p 22121 -c 500 -n 5000000 -P 100 -r 10000 -t get,set
第26页
性能
1. Pipeline 带来的性能提升 2. Golang 利用多核的能力 3. 除此之外,多节点和可以平行扩展的 proxy
让整个集群的性能也同样可以 scale
第27页
抽象 Coordinator
接口化 ● 使用 zookeeper 和 etcd 的最小子集实现现
有功能
● https://github.com/ngaut/zkhelper
第28页
无状态的存储引擎
1. 存储引擎不负责具体的路由信息,只关心 数据的存储,及点对点的迁移
2. Redis 协议
第29页
持久化存储
RocksDB <3 Redis Protocol ● 完全兼容 Redis 协议,包括 SYNC 相关协议 ● 实现了 Codis 的 SLOT 相关指令
第30页
持久化存储
典型业务 ● 作为 NoSQL 使用 ● 数据量大 118G 无热备(备份靠手,周期
bgsave) ● 重做数据困难 ● 读写速度小 (QPS 500~2000, max=5000)
第31页
持久化存储
● as redis-server
○ 读写 QPS set=3w, get=4w 链接 ○ 指令集:
■ 大部分数据相关指令 链接
● 不包括 set 有关的多key 指令 ● 不包括 zset.{rank,range} 操作 ● 目前业务不需要
○ 支持 slaveof, sync, bgsave 等
● bgsave 相对较慢
第32页
持久化存储
● as redis-{master, slave}
codis
machine A
redis
machine B
rpdb
redis
第33页
Codis-HA
● 读取集群 server groups 信息,对 master 探 活,调用 RESTful API 提升 slave
第34页
Memcached Twemproxy Redis
Codis RebornDB
MySQL PostgreSQL SQLServer
MongoDB Cassandra HBase
MegaStore
Spanner ?
第35页
RebornDB http://github.com/reborndb/re borndb/reborn