Redis 集群在腾讯游戏的应用及演进

alonlong

贡献于2015-03-02

字数:0 关键词: NoSQL数据库

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

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 1 人已下载

下载文档

相关文档