腾讯游戏互动娱乐事业群(IEG)DBA梁飞龙——游戏云存储架构变迁之路
2020-02-27 514浏览
- 1.游戏云存储的架构变迁之路
- 2.个人简介 • 腾讯游戏互动娱乐事业群(IEG) DBA • 梁飞龙(英文ID:felixliang) • 毕业8.8年, 5.8年腾讯DBA经验: DB运维及开发
- 3.目录 • 单实例时代 • 游戏DB分布介绍 • 自动化提供海量DB服务 • 多实例时代 • 高可用/灵活调度 • MySQL源码定制 • 分布式时代 • TSpider动态调度 (在线扩容及缩容)
- 4.单实例时代,游戏DB分布及架构 • 典型游戏DB分布介绍 • 大型多人在线游戏(MMOG): 三国/地下城与勇士 • 高级休闲游戏(ACG): QQ飞车/英雄联盟 • 平台休闲游戏(PLAT):玫瑰小镇/QQ游戏大厅 • 游戏DB架构简化 • 核心数据 热备 • 日志数据 单实例
- 5.MMOG游戏DB分布 • 部署策略:就近接入 • 切分策略:SET化 • 承载策略:Scale Up world cluster world zone server zone server dir server zone server log server dir server dir server cs server zone server zone server zone server log server
- 6.ACG游戏DB分布 • 部署策略:就近接入 • 切分策略:水平 + 垂直 • 承载策略:Scale Out Name服务器& DB服务器 国家服务器 DB服务器 DB服务器 Proxy服务器 日志服务器 日志服务器 LogProxy 边境服务器 休闲服务器 商店服务器 新手游戏服务器组 初级游戏服务器组 LogProxy 目录服务器 公用网络 新手游戏服务器组初级游戏服务器组 分IDC 客户端 客户端 客户端
- 7.PLAT游戏DB分布 • 部署策略:集中部署,跨IDC容灾 • 切分策略:水平 • 承载策略:Scale Out
- 8.游戏DB架构简化 • 核心数据 增加热备 • 日志数据 单实例
- 9.单实例时代,自动化提供海量DB服务 • 效率为王,工具平台解放DBA双手 250+款游戏(端游+手游)、10000+台服务器、20000+个实例 690次SQL变更/月,人均每天支撑3个业务SQL变更,人均管理着500台机器、1000个实例 • DB服务举例
- 10.单实例DB管理的痛点 • 硬件故障影响用户时间长 • DB无法实现调度,DB Scale耗费停机时间长 • DB加字段耗时长,无透明DB压缩方案
- 11.多实例时代,高可用/灵活调度 • 游戏云存储架构1.0
- 12.Auto Switch组件 • MySQL-‐Proxy扩展(基于0.8.2) • 去掉lua扩展,提升性能 • 扩展ADMIN接口 • refresh_backends\refresh_users\refresh_connlog • show processlist\show balances • 监控 • 多点监控,IDC内/IDC外 • 进程探测、SSH探测及Touch文件 • Double Check • 切换前检查 • 数据一致性检查 • Slave状态检查 • Time Delay
- 13.故障切换数据⼀一致性保证 • 数据自动校验pt-‐table-‐checksum例行化 • 数据块切分不均在可重复度隔离级别下的“锁数据”问题 • 源码改造两个核心函数的代码片段 – _chunk_char_exact,引入辅助变量@i qq# select `$args{chunk_col}` from $args{db}.$args{tbl} where (\@i :=\@i +1) > 0 and (\@i % $chunk_rows) = 1 order by `$args{chunk_col}` asc # – recursive_dynamic_calculate_chunks,二分递归切分 "EXPLAIN SELECT * FROM $db_tbl where $col >= " . $q->quote_val($from_pos) . " AND $col < " . $q>quote_val($end_pos) 按数据分块的原理,5000M的表,chunk-‐size=10M时,只有两个区间包含 – 数增加据参:数:第-‐-‐c1hu个nk-区‐size间-‐ex包cat=含yes5 n行o 数据(id>=0 and id < 20),第500个区间包含1行数 据(id=10000000)。
- 14.故障切换数据⼀一致性保证 • 数据自动修复pt-‐table-‐sync • replicate模式下,修复SQL改为直接在Slave上执行 • replicate模式下,普通索引使用delete+insert方式修补数据 • replicate模式下,结合-‐-‐where参数做”差异”数据块修复
- 15.高可用故障切换效果 • 机器故障切换,几乎不影响游戏在线
- 16.基于Proxy灵活调度 • 业务高峰期调整Proxy的后端backends的效果
- 17.多实例时代,MySQL源码定制 • 在线加字段 • 大字段列压缩 • binlog压缩及binlog限速
- 18.MySQL源码定制之路 • 在线加字段的原理 • GCS存储格式 • TMySQL为在线加字段功能新增行格式GCS • 原理:扩展原Compact及Dynamic行格式,增加1~2字节控制信息 Barracuda File Format Antelope File Format Dynamic Compact Redundant GCS Compressed GCS
- 19.MySQL源码定制之路 • 在线加字段的原理 select:判断GCS行标记,对比fieldcount大小,实际列数大于Row Field count即为null或者 默认值 insert:根据当前表的字段数构造记录中field count和置GCS行标记位 delete:保持不变 update:原地更新不变;非原地更新走delete+insert,会更新为新的field count
- 20.MySQL源码定制之路 • 大字段列压缩的背景 • 游戏内大量使用blob或text来简化数据访问 • 多实例管理模式下磁盘和内存是瓶颈 • 无有效的数据压缩方案 • 依赖于开发进行数据压缩,周期长且太被动 • MySQL页压缩的空间预留问题及uncompress page问题
- 21.MySQL源码定制之路 • 大字段列压缩的实现 • 适配GCS行格式,支持blob/text类字段 • 字段内容变为 • 是否压缩:首字节最高bit,若为1表示已压缩;若为0表示不压缩,同时 解压后长度为空。 • 多种压缩算法:首字节5~6 bit用于可表示4种不同压缩算法,目前只支持 zlib(0) • 其他特性扩充预留 • 支持行外存储
- 22.MySQL源码定制之路 • 大字段列压缩的用法 • 建表 create table t1 ( C1 int primary key, C2 blob compressed, C3 text character set gbk compressed, C4 blob ) engine = innodb row_format=GCS • 修改表 alter table t1 change c4 c4 blob compressed
- 23.MySQL源码定制之路 • 大字段列压缩的收益 原始数据51G 服务器配置:24core/64Gmem/fusionIO,buffer_pool=32G 数据量 非压缩 原始数据 51G Innodb页压缩 key_block_size=8 24G 列压缩 (blob/text大字段压缩) 7.1G QPS (100个并发update) IO util CPU util 1174 100% 15% 1524 100% 45% 3994 30% 50%
- 24.MySQL源码定制之路 • binlog压缩 • 单实例最多生成360G/天,本地及异地存储困难(网络传输) • 支持语句级/行级binlog压缩,可节省42%~69%的空间 • binlog限速 • 多实例管理模式下,重做slave造成网络阻塞 • 令牌限速算法,限制binlog传输速率,譬如控制在100Mb/s以下
- 25.多实例DB管理的痛点 • MySQL实例彼此孤立,无法实现资源共享和负载均衡 • MySQL存在单机性能瓶颈,无有效的动态扩容与缩容机制 DB 4W在线 负载80% DB 5k在线 负载10% DB 1W在线 负载20% DB 5k在线 负载10% DB 号段1 DB 号段2 DB 号段3
- 26.分布式时代 , TSpider动态调度 • TSpider分布式数据库 • 故障恢复(无需重连) • 动态扩容/缩容 • 水平扩展 • 均衡CPU/MEM/IO能力 按号段划分 DB SPIDER DB SPIDER DB SPIDER DB DR DB DR DB DR
- 27.TSpider分布式数据库 • 游戏云储存的转变 • 实例管理 -> 集群管理 • 自动分表,应用透明
- 28.TSpider分布式数据库 • Spider存储引擎 • Kentoku SHIBA 开发的基于分区表的分布式存储引擎 •http://spiderformysql.com• TSpider就是spider 3.1基础上开发而成,进一步提高了性能、稳定性和兼 容性,并结合互娱业务特性整合而成的分布式数据库解决方案
- 29.TSpider分布式数据库 • TSpider核心特性 • 高效全局自增ID • 自定义分区策略 • 线性扩展(在线扩容缩容) • 兼容MySQL协议及性能优化 • SQL并行化
- 30.TSpider分布式数据库 • 高效全局自增ID • 初始编号不同,自增的步长=集群TSpider最大节点数(16) • TSpider重启后,需select max获得最大值 ID=1 ID=2 ID=16 TSpider TSpider 。。。 TSpider DB DB DB 。。。 • 可保证全局自增且唯一,但不保证+1 • ID生成效率高但存在空洞 DB
- 31.TSpider分布式数据库 • 自定义分区策略 • 一对多的ER关系,按照”一”进行切分,减少跨分区SQL操作 CreateTable:CREATE TABLE `mail` ( `id` int(20) unsigned NOT NULL, `accoungd` int(11) unsigned NOT NULL, …… PRIMARY KEY (`id`), KEY `idx_accoungd` (`accoungd`), /*! shard_key "accoun>d" */ KEY `idx_egme` (`egme`) ) ENGINE=SPIDER DEFAULT CHARSET=uk8 用户访问邮件表的SQL # SELECT count(1) FROM mail WHERE accountid = 102393935; # SELECT id, accountid, state, sender, sendername, type, title, content, etime, ctime, hasitems, mailitem FROM mail WHERE accountid = 102393935 ; # DELETE FROM mail where accountid=102393935 and id = 142028645;
- 32.TSpider分布式数据库 • 线性扩展(在线扩容缩容) • 例:一个集群8个shard,存储层两个物理机器 • 扩容一倍 • 具体步骤 • 1. 确认热备已经完成,无落后且数据校验一致 • 2. lock all TSpider read only • 3. 更新集群路由信息 • 4. unlock tspider • 5. 断开slave关系 MySQL 热备
- 33.TSpider分布式数据库 • 线性扩展(性能) • 集群整体QPS随分片数增加而线性提升
- 34.TSpider分布式数据库 • 兼容MySQL协议 • 支持99.99%SQL语句(join/sum/group by/order by/in/not in/limit/case when) • 支持所有mysql连接协议,如:CLIENT_FOUND_ROWS • 性能优化 • 减少网络流量 • 增加direct SQL • 智能下推 -> select limit m, n -> delete/update limit n -> select c1, count(*) from t1 where group by c1 • 执行计划相关 • 定期统计远程表信息 show table status • 禁用index merge,减少SQL分发数量 select * from t1 where key1 = 1 or key2 = 2
- 35.TSpider分布式数据库 • SQL并行化 • 某实例2%的SQL超过10ms • 绝大多数是跨分区SQL导致 • TSpider到RemoteDB的延迟,16节点至少可节省2ms
- 36.TSpider分布式数据库 • SQL并行化 • 程序伪代码
- 37.TSpider分布式数据库 • 游戏云存储新架构2.0
- 38.FAQ # 团队技术博客 # tencentdba.com # 欢迎加入我们 # felixliang@tencent.com
- 39.