腾讯互娱高级DBA康中良《Redis集群在腾讯游戏的应用及演变》
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
按key分片
❖ 访问透明,协议兼容
关于Twemproxy:
❖
A fast, light-weight proxy for memcached and Redis —
https://github.com/twitter/twemproxy
腾讯定制twemproxy,主要改造:
❖ 1.定制hash分片算法(42w) ❖ 2.故障切换支持 ❖ 3.ping/auth命令的支持
❖
自动化部署
❖ ❖
自动化部署实例,支持大量实例批量安装 平台化
❖
监控
❖ ❖
统一监控内容 Redis性能数据集中上报
❖
备份
❖
统一备份策略,本地备份+异地备份
Redis-标准化管理
❖ Redis服务化
❖ 上架工作一步完成
Redis-可用性
❖
主备部署
❖
master访问,slave aof落地+备份
❖ 域名接入,自动故障切换
❖ 单集群容量900G
不足
集群容量的扩展问题
阶段三:容量可扩展服务
重点关注:
❖ Redis集群数据在线迁移(扩缩容)
在线迁移-设计
❖ 迁移以key为单位 ❖ Redis哈希取模分片 ❖ Twemproxy支持消息重定向及重试 ❖ Redis
分片/key增加迁移状态
❖ 分片、key迁移状态在Redis中落地
Redis集群在线迁移-收益
❖ 提供7*24不间断Redis集群服务
❖ 在线扩容&缩容&迁移
❖ 集群资源快速调度,节约成本,缩容不停机
展望:冷热数据分离
TODO:
❖ 增量同步 ❖ Redis+SSD落地,冷热分离
目标:
❖ Redis集群建设为高效、稳定的存储解决方案。
Q&A zhongliangkang@qq.com
❖ Redis故障程序配置不需要修改 ❖ 故障自动切换 ❖ 方案透明,应用无需改造
❖ Why
not zookeeper/LVS?
Redis故障自动切换
DNS管理 GameSvr
域名切换
GCS 系统
GameSvr
DNS
Redis (M)
故障检测
…..
Redis (S)
故障Redis切换时间: 1分钟
get mykey
….
Twemproxy
5 6
4
mykey
try 10 times …….
7
Redis(new)
迁移中的key,如果在old Redis请求失败,请求重定向到new Redis. 如果new Redis 中key未迁移完成,Twemproxy最多重试10次。
❖ Twemproxy ❖ 支持请求重定向 ❖ 支持添加、修改Redis节点 ❖ 支持配置文件落地,支持Redis节点状态
twemproxy
Redis(new)
mykey status:1 status:0
迁移过程: a. Transfer向proxy发送增加迁移svr的指令 add SP Redis_new APP 0-419999 b. 向Redis old/new 每个bucket发送迁移开始指 令,并获取bucket内所有key
Redis 特点
❖ 速度快
❖ 单线程 ❖ K-V存储 ❖ 纯内存+持久化 ❖ 支持多种数据结构 ❖ 协议简单
QPS 10w+
一个线程干活:收包、发包、解析 所有数据按“key”访问 数据全内存,高性能,RDB/AOF落地 strings,hashes,lists,sets,sorted sets 各种语言的api支持
定制改造
❖ Redis ❖ 分片功能支持,共42w个分片(buckets),可以按分片提取分片内所有key ❖ 增加管理指令,用于支持迁移 ❖ 对key增加迁移状态,对分片增加迁移状态 ❖ 分片迁移状态落地到rdb/aof文件,并主从同步 ❖ 迁移工具(transfer,新开发) ❖ 支持按分片迁移集群内Redis数据 ❖ 支持失败重迁移
Redis集群在腾讯游戏的应用及演进
康中良 DBA @TencentGame
Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets, sorted sets, bitmaps and hyperloglogs. — http://redis.io
Transfer Center
c. 在old/new上锁定一个key,开始搬迁
d. 搬迁key( dump/pttl/restore) e. 释放new上的key锁定,删除old key f. Bucket迁移完成 g. 迁移完成,发送adddone命令到proxy
迁移中请求处理
key未搬迁,且未锁定:
❖ 3.
Redis集群-收益
❖ 程序访问配置一个域名,扩缩容无需修改,运维方便
❖ twemproxy层可以在线扩容、缩容,调度灵活
❖ 提供高并发,海量请求处理能力
Redis集群-数据
某手游Redis集群现网运行数据:
❖ 单集群60个Redis节点 ❖
30台twemproxy(90个实例)
❖ 单集群查询峰值达100w/s
标准化管理 可用性
海量数据支撑 简化运维管理
在线容量迁移
AOF增量落地 数据SSD落地 冷热数据分离
2013.7
2014.3
2014.8
TODO
阶段一:直接使用Redis
直接使用Redis,重点关注:
❖
标准化管理 可用性
❖
Redis-标准化管理
❖
标准安装,集中管理
❖ ❖
统一配置+个性配置 标准安装目录及命名规范
Redis1 0-200000 Redis2 20001-419999
Redis2
Redis集群方案
DNS管理 GCS 系统
hash取模
Redis (M)
Redis (S)
GameSvr
DN S
定制twemproxy Redis (M) Redis (S)
GameSvr
定制twemproxy Redis (M) Redis (S)
…..
……
…… ……
集群高可用
❖ 1.
Redis集群通过DNS+port访问.
❖ 2.
当twemproxy故障时,GCS系统会将twemproxy从DNS中 剔除掉故障IP,业务访问重试即可恢复.(需重连) 当Redis实例故障时,GCS系统会将所有访问该Redis节 点的twemproxy全部指向Redis的slave. 整个操作预计 1分钟左右完成.
例如某业务模块:
❖ 需500G空间,访问峰值100w/s,需要30+Redis节点 ❖ 程序需自己实现hash算法,扩容还需要修改算法。。
阶段二:定制-提供集群服 务 大量Redis运营,重点关注:
❖ 海量数据支撑 ❖ 运维管理简化
引入中间件
❖ Redis集群引入twemproxy作为代理: ❖
❖ 生产者/消费者消息队列 高性能,异步处理请求队列
❖ 过期时间
到期数据自动删除
Redis@腾讯游戏
❖ 主要代理手游使用(2013~至今) ❖ 实例数:
1900+ ❖ 数据量: 2.5T+ ❖ 访问量: 900亿+/天
Redis@游戏场景
❖
string :openid映射等
❖
❖ ❖ ❖ ❖
hash: 角色信息、装备道具等
Redis-容量管理
单实例如果数据量太大,带来的困难:
✤ 备份 ✤ replication ✤ 性能
解决:
❖ 单机多实例 ❖ 单实例容量管理: ❖ 单实例<16G(最好<8G) ❖ 请求量<5w/s ❖ 内存超过配置80%告警
单线程 既是优点,也是缺点!
直接使用Redis的不足
❖ 单实例容量有限 ❖ 大量实例管理复杂 ❖ 运维操作复杂
list : set : DB数据缓写、排队等 用户单属性记录:好友等 定期活动礼包发放等
sorted set:全局排行等 过期时间:
Redis@游戏场景
*周排行
❖ ❖
腾讯手游特点 用户多
增长快
❖
❖
节奏快
业务多
❖
周期短
上线
推广
Redis集群在腾讯游戏的应用及演进
阶段1: 直接使用Redis 阶段2: 定制+集群服务 阶段3: 在线迁移扩缩容 展望: 冷热数据分离
Twemproxy定制
❖ 关于twemproxy性能:(与直连Redis对比)
Redis集群分片管理
❖ 单集群固定分片: ❖ key
42W
=> hash(key)%420000 =>key存储Redis
❖ 扩容、缩容操作
Redis1
get mykey
hash(“mykey”) = 9642
定制twemproxy
Redis(old)
2 1 3
mykey
get mykeyBiblioteka Baidu
4
Twemproxy
Redis(new)
迁移中请求处理
key搬迁完成,未锁定:
Redis(old)
2 1 3
get mykey
6
Twemproxy
5
4
Redis(new)
mykey
迁移中请求处理
key搬迁中,锁定:
Redis(old)
2 1 3
Redis集群在线迁移流程
Redis(old)
GameSvr ① ④
Redis_new 0-419999 1 Redis_old 0-419999 1 Redis_old 0-419999 1 Redis_new 0-419999 2
mykey status:0 status:1
dump/pttl/restore