仅用一个月,游卡完成从MySQL到上线OceanBase的实践

编者按:自2023年9月起,游卡——国内最早卡牌游戏研发者之一,开始测试OceanBase,并在短短两个月内成功将三个核心业务应用迁移至OceanBase上。究竟是何因素促使游卡放弃游戏行业普遍采用的MySQL方案,转而大胆选择OceanBase?游卡的运维负责人俞振佳详细分享了这次数据库升级历程及实践经验。

作者:俞振佳,杭州游卡网络技术有限公司公共支持中心运维部负责人

游戏业务架构特点及痛点

作为国内最早涉足卡牌游戏研发的公司之一,游卡不仅拥有以桌游为代表的线下社交场景,还积极拓展以线上游戏为引领的数字文化场景。其核心业务主要围绕“三国杀”这一知名IP展开,推出了一系列深受玩家喜爱的游戏和产品。同时,游卡近年来也在不断探索并打造超越“三国”光环的爆款游戏,其中《自在西游》这款作品在上线仅一个月的时间内,便实现了突破2亿的流水佳绩。

在游戏行业,最常见也最流行的数据库产品是MySQL,但它对于分布式和扩展性的缺失为游戏业务发展带来了限制。以游卡的数据库集群架构(见图1)来说,该业务架构有三个特点。

1701411042

图1  游卡数据库集群架构

特点1:三地两中心,符合三级等保要求。从图1可见,这是一个非常典型的传统数据库主备架构。我们在杭州配备了主备机房,在上海机房做容灾,在江苏还有一个离线备份机房。

特点2:混合云部署,数据在本地。我们将业务部署在云上,但所有数据都存储在IDC中,通过企业专线将IDC和阿里云打通。这是目前企业业务上云普遍采用的方式,普遍认为数据比较隐私,抓在自己手里才放心。

特点3:项目多且每个项目至少对应一个数据库集群。我们的游戏项目非常多,不论项目大小,都需要使用至少一套MySQL集群,因此架构繁复。

在上述架构特性下,衍生了四个使用痛点。:

痛点1:高可用(MHA)配置复杂,业务实现自动切换困难。举个例子,在一次事故中,我们的主库宕机了,但主从之间因为存在1~2秒的延时,从库无法切换到线上,即使切换也会丢失数据。这是因为游戏角色的属性是实时写入数据库中的,每秒钟的并发量都非常高,所以这时无论我们切不切库都无关紧要,已经对线上业务造成灾难了。

痛点2:扩容困难、维护成本高。图2是移动端《三国杀》从2015年日志系统上线至今,平均每月日志空间的增长趋势,已经显现出几何倍数的增长态势。我们使用MySQL只能依靠迁移或分库分表来实现扩容,增加了大量的维护成本。尤其在业务侧投放商业推广时,迎来数据高峰,若占用大量人力维护分库分表,直接影响我们的投放效益。

1701411092

图2 移动端《三国杀》数据

痛点3:资源利用率参差不齐。我们知道不可能每一款游戏都是爆款,大部分游戏产品都是非常平淡地走完一生。因此,平淡运行的游戏产品占用的机器CPU和内存非常富余,而爆款游戏占用的机器CPU和内存严重不足。

痛点4:迁移困难。由于游戏业务特性,我们经常会有一些迁移工作,但MySQL提供的mysqldump工具的性能和可视化较差,无法显示迁移进度或速度,因此我们不得不选择其他产品。

上述痛点已经困扰我们多年,如今已成为亟待解决的问题,在多番考察后,我们上线了新的数据库方案——原生分布式数据库OceanBase。下文介绍使用OceanBase带来的架构转变和业务收益。

OceanBase带来的架构转变

部署:内存与磁盘配置。

目前,我们在部分业务中上线了OceanBase,搭建了一套规格为3台48C/256G/80TB的生产集群。由于从测试到上线只用了不到一个月的时间,对OceanBase操作经验欠缺,因此在部署时遇到了两个小问题。

问题1:数据库内存上限配置。

OceanBase 需要根据一些配置项进行数据库内存上限的配置,如 memory_limit_percentage 和 memory_limit。第一次部署 OceanBase 集群的用户往往不会去手动修改这些配置,例如,我们最初使用的 4.2.0 版本就默认只使用机器内存的 80% 当做 OBServer 可以使用的内存上限(因为 memory_limit_percentage 默认值是 80%),这样物理机器就会有 20% 的内存无法被利用。

除此以外,还要给一个虚拟的 500 号租户预留一笔内存,由 system_memory 这个配置项来控制,如果不去手动配置,默认会由系统自动根据当前系统的内存情况来调整 500 号租户的内存使用策略。500 租户是个特殊的虚拟租户,共享性的、非实体租户消耗的内存都被 OceanBase 数据库划归 500 租户里。我们第一次部署环境时,当 256GB 内存的机器上线后,在 OCP 里看到的可以为普通用户租户分配的内存资源只剩180GB(约等于 256 * 80%(memory_limit_percentage) - 30(system_memory))。后来我们了解到 OceanBase 存在和内存分配相关的一批配置项,通过调整 memory_limit_percentage 和 system_memory 解决了这个问题。

问题2:磁盘空间配置。

当事务日志(Clog)和数据共用同一个磁盘时,OceanBase 默认保留 40% 的磁盘空间给 Clog,数据文件只能占用其所在磁盘总空间的 60%。其实,这个比例可以通过 datafile_disk_percentage 等相关的配置项来控制。后面我们通过把数据盘、事务日志盘分别挂载到两个不同的磁盘上解决了该问题。

上述两个问题在不够了解产品时,很容易被忽略。对此,我们的经验是:目前主流的 OceanBase 数据库服务器内存为 384GB 或 512GB,384GB 内存建议配置为使用机器内存的 80%,512GB 内存建议配置为使用机器内存的 90%,这也是 OceanBase 官网显示的最佳配置。并且建议企业用户把数据盘、事务日志盘分别挂载到两个不同的磁盘上,当数据盘独占磁盘时,数据文件默认占用其所在磁盘总空间的百分比为 90%(磁盘空间规划的内容详见该文档。)。

上线OceanBase后,游卡的业务架构和改造前的MySQL架构相似(见图3)。相当于将MySQL的主备容灾节点换成了3个OBServer节点,在每个机房部署了OBProxy。但受限于社区版,我们没有使用OBProxy集群的方案,而是采用了一个比较取巧的方法。我们使用阿里云的NLB服务来负载2个OBProxy,这样一来,当我们机房的任何一个节点出现问题时,还可以保证业务在生产环境的可用性。

1701411231

图3 游卡上线OceanBase后的数据库集群架构

此外,我们也使用了较多的OceanBase生态配套,包括OCP(OceanBase云平台)、OMS (OceanBase迁移服务)、OBAgent(OceanBase监控工具)、ODC(OceanBase开发者中心)、OBProxy (OceanBase专用反向代理)。这些工具和组件提供了简单而高效的操作减轻了运维人员的工作负担,同时降低了运维成本。

OCP:简化运维工作,降低运维成本。

首先,任何一个新产品的上线都存在学习成本,OceanBase提供的OCP工具可以将黑屏转变为白屏,极大地降低了运维学习成本,使传统的集中式数据库DBA几乎无门槛转型到了分布式数据库DBA,也使DBA的门槛进一步降低,更容易上手数据库管理。其次,由于我们的游戏产品众多,每个游戏产品至少配备一个数据库集群,因此一个DBA手上动辄十多个集群需要运维。使用OCP平台后,DBA的管理规模只剩一个后台,管理规模大幅缩减。同时,原本需要在操作系统、平台、客户端等地方进行的账号管理、慢日志分析、监控、备份管理、资源管理、容灾管理,全都集中到一个后台进行,管理工作集中、便捷。

OMS:简单、高效、直观的数据迁移。

我们曾在测试阶段对比了OMS和mysqldump的迁移性能。mysqldump的迁移过程涉及导出、压缩、传输、恢复等,操作多且耗时长,且无法可视化,MySQL生态也没有提供数据校验工具。相较而言,OMS的迁移过程非常简单,分进程迁移数据后进行校验。从图4的迁移性能对比可见,OMS的迁移效率比mysqldump高出很多,从OMS后台清晰可见迁移进度和速度。当前,我们已经迁移超过20TB数据,OMS是现阶段最依赖的工具之一。

1701411268

图4 OMS和mysqldump迁移性能对比

其他工具:OBProxy、OBAgent、ODC。

除了OCP和OMS外,OceanBase生态的其他组件也相较于MySQL更有优势。

  • OBProxy相对MySQL Proxy来讲,它本身已经集成到了OCP的后台,搭配云上的LB产品,简单、高效地实现HA配置。
  • OBAgent替代MySQL Exporter,搭配Promethues 和 Grafana能够平滑接入游卡监控中台,将监控数据集中展示。
  • ODC不仅是开发和运维工具,更是协同工具,工单和审核功能让我们非常惊喜,替代了我们原本使用的Navicat。

除收益外,我们在使用生态工具时,也发现了一些希望OceanBase优化的方向。首先是生态工具间的联通,比如目前OCP、OMS、ODC的相关操作分布在各自的后台中,我们希望工具间互相打通,只用一个账密和一套后台即可解决运维管理的所有问题。其次,我们希望ODC增加编辑表结构、编辑存储过程、数据归档等功能,打破工单结果无法通知的壁垒。

OceanBase带来的降本增效

对于企业而言,相比新技术为运维管理带来的好处,更关心新技术带来的降本和增效。OceanBase很大程度上提升了游卡的资源利用率,降低了存储成本和硬件成本,

1、存储资源利用率提升。

最初打动我们使用OceanBase的因素是其数据高压缩能力,经过测试,游卡的数据可以压缩到原有数据到19%~37%不等(见图5),且并不会造成性能下降和CPU开销的增加。 

1701411370

图5 MySQL迁移到OceanBase后空间对比

而对于硬件成本的节省,经过计算,当前企业采用的固态存储约450元/TB,RAID10后约900元/TB,今年预计迁移20TB数据,迁移后预计空间7TB以内,可以节省成本(20-7)T*900元/T*3=35100元。上文提到的业务集群,其数据可用空间大约为50GB。按照80%的文件存储容量计算,我们可以迁移125TB左右的数据。那么,一个集群可以为我们节省20万元。

2、计算资源(CPU、内存)利用率提升。

至于CPU和内存利用率的提升,我们可以结合游戏行业的数据库性能指标特点来讲。

游戏行业的从库、容灾库资源利用率低,即使是主库,在大多数时间(90%)内其CPU利用率不到10%。只有游戏每日任务开启时(如凌晨2点、上午10点时),利用率会达到高峰。不同游戏的高峰期不同,比如A游戏集中在0点,B游戏集中在10点,而运维人员做数据分析集中在凌晨3-4点。

基于游戏业务特点,我们在OceanBase中对租户做了一些优化。通过不同租户的ZONE优先级调整,不同业务的组合,适当超限配置,提高资源利用率。也就是说,我们CPU的配置已经超过了数据库拥有的48核。用这种方式来提高资源利用率。举个例子,比如A项目和B项目的高峰都在0点,将两个租户的ZONE优先级分别设置为ZONE1和ZONE2,如果A、C项目的高峰分别在0和4点,则将两个租户的ZONE优先级全部设置为ZONE1。

通过这样的方式,我们的资源利用率都处于10%以上,从图6可见比原来高出很多。

1701411395

1701411402

图6 资源利用率对比

通过图7的柱状对比也可以看到,我们使用OceanBase后,主机的一些CPU利用率得到了显著提升。

1701411413

图7 MySQL和OceanBase主机CPU利用率对比

3、服务器成本节约。

我们下架了一套MySQL集群和一个阿里云的云数据库。图8显示了我们采购MySQL集群主机和阿里云服务器的配置及成本。也是目前使用OceanBase后节省的成本。

1701411526

图8 使用OceanBase节省的成本

目前我们从测试到应用OceanBase至今不到三个月,虽然比较激进,但效果显著。未来会在更多场景中探索OceanBase的价值。

OceanBase在更多场景下的价值探索

场景一:亿级大表性能优化。

我们的一款手游项目一天的数据量是4-5亿条,在使用MySQL时,我们分了14张表,共164种数据类型,占用60~100GB的存储空间。在OceanBase中,我们尝试将所有分表的数据重新合并,并将原来的14张表按照数据类型转变为14个分区。我们进行了插入和读取测试,随机插入10万条数据,随机选取1万个账号,对随机数据类型进行查询,结果显示查询时间与MySQL单表查询耗时基本一致。随着数据量和数据类型的增长,OceanBase分区带来的管理便捷性愈发明显,因为我们不必担心未来某个表的数据量过大后,再次分表的开销。 

场景二:历史库存储降本。

我们想使用费用低廉的存储(大容量低转速机械硬盘)搭建历史库,满足历史低频日志数据查询需求。因为游戏行业有一个要求,即厂商对玩家的消费行为等数据能够追溯一年。而事实上,厂商对游戏玩家在3个月前的行为查询率较低,如果这部分数据存储在主力集群中,是对存储资源的浪费。因此,我们需要将查询率低的历史数据同步到历史数据集群中,以节省存储成本。而OceanBase的存储技术可以使历史库降本达到50%~95%,我们期待在历史库场景中验证OceanBase的价值。

上线进度及后续规划

当前我们迁移进度主要分三大部分:第一部分是3个已上线的生产业务,其中包含游卡核心项目——三国杀Online;第二部分是4个内部项目,包含监控、审计、CMDB等内部信息化数据库;第三部分是一些测试中的项目,包括游卡集团的IM项目。在此过程中,我们感谢项目组对运维的信任和对新技术的包容,也非常感谢Oceanbase开源社区对我们的支持。

目前已经完成迁移上线的项目,解决了使用MySQL时的高可用配置复杂和容灾、扩容等痛点,显著提升了服务器资源的使用率,并以此节省了计算资源的成本。后续,我们会将更多业务上线OceanBase,希望OceanBase能够蒸蒸日上。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/761944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内ip切换是否合规?

在网络使用中,IP地址切换是一种常见的行为,可以用于实现隐私保护、访问地域限制内容等目的。然而,对于国内用户来说,IP地址切换是否合规一直是一个备受关注的话题。在中国,网络管理严格,一些IP切换行为可能…

Java安全 反序列化(3) CC1链-TransformedMap版

Java安全 反序列化(3) CC1链-TransformedMap版 本文尝试从CC1的挖掘思路出发,理解CC1的实现原理 文章目录 Java安全 反序列化(3) CC1链-TransformedMap版配置jdk版本和源代码配置前记 为什么可以利用一.CC链中的命令执行我们可以尝试一下通过InvokerTransformer.tr…

ssm项目(tomcat项目),定时任务(每天运行一次)相同时间多次重复运行job 的bug

目录标题 一、原因 一、原因 debug本地调试没有出现定时任务多次运行的bug,上传到服务器就出现多次运行的bug。(war的方式部署到tomcat) 一开始我以为是代码原因,或者是linux和win环境不同运行定时任务的方式不一样。 但是自己…

专业135+总分400+重庆邮电大学801信号与系统考研经验重邮电子信息与通信工程,真题,大纲,参考书。

今年分数出来还是比较满意,专业801信号与系统135,总分400,没想到自己也可以考出400以上的分数,一年的努力付出都是值得的,总结一下自己的复习心得,希望对大家复习有所帮助。专业课:(…

获取KEGG通路的基因列表 做单细胞GSEA、GSVA分析

使用KEGG通路的基因列表进行单细胞GSEA GSVA分析的过程,我们需要遵循以下步骤: 获取KEGG通路的基因列表:这通常涉及使用专门的R包,如KEGGREST或biomaRt,来查询KEGG数据库并检索特定通路的基因列表。 准备单细胞表达数…

申请Github Education获取免费Copilot权限(2024.3.18实测成功)

起因:旧帐户Copilot权限被封 我已经离开Github Copilot就无法独自耐着性子写代码了(懒惰AI成瘾性),这两天Github Copilot不知道为什么在大规模封号,我不幸也被封号了(禁用掉了Github Copilot权限&#xff…

Python:柱状-折线图

写论文,需要画数据分析图: 用柱状图描述算法执行时间用折线图描述性能改进 示例代码: import numpy as np import matplotlib.pyplot as plt from matplotlib.pyplot import MultipleLocatorSecurity ["128", "192",…

Linux第82步_“gpio子系统”下的使用KEY开关灯

使用新字符设备驱动的一般模板和“gpio子系统”,以及设备树,驱动KEY和LED。 1、在stm32mp157d-atk.dts文件中添加“gpio_led”和“key0”节点 打开虚拟机上“VSCode”,点击“文件”,点击“打开文件夹”,点击“zgq”&…

HTTPS 协议原理

目录 HTTPS VS HTTP HTTPS是什么 概念准备 常见的加密方式 对称加密 一个简单的对称加密例子 非对称加密 数据摘要&&数据指纹 数字签名 HTTPS 的工作过程探究 方案1-只使用对称加密 方案2-只使用非对称加密 方案3-双方都使用非对称加密 方案4-非对称加密…

Cell发表的单细胞整合方法:LIGER,很好用!

之前,我们已经介绍过其他的整合方法: harmony整合单细胞数据-去除批次效应 Seurat一键完成五种数据整合:harmony,CCA,RPCA,FastMNN,scVI,代码分享 今天来看看Cell发表的LIGER 介绍 LIGER(Li…

C++语言学习(二)—— C++语言的基本知识

目录 一、面向对象的三个核心概念 二、C语言中的I/O口 三、C语言中的数据类型​​​​​​​ 3.1 逻辑类型 3.2 引用类型 3.2.1 引用作为函数参数 3.2.2 引用作为函数返回值 3.2.3 引用作为类成员 3.3 类类型 四、 C语言中的内联函数 五、 函数重载 六、 带默认形参…

docker 容器挂掉,无法exec 进入bash 怎么修改容器里的文件

在使用tdengine 数据库时出现了 TDengine.Driver.TDengineError:“code:[0x334],error:Out of dnodes” 查找文档发现需要修改一个配置文件 。 /etc/taos/taos.cfg 中的 supportVnodes 参数 于是修改 保存。然后,运行出错。 03/21 06:56:27.986498 00000064 …

IDEA通过内网穿透实现固定公网地址远程SSH连接本地Linux服务器

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

[音视频学习笔记]六、自制音视频播放器Part1 -新版本ffmpeg,Qt +VS2022,都什么年代了还在写传统播放器?

前言 参考了雷神的自制播放器项目,100行代码实现最简单的基于FFMPEGSDL的视频播放器(SDL1.x) 不过老版本的代码参考意义不大了,我现在准备使用Qt VS2022 FFmpeg59重写这部分代码,具体的代码仓库如下: …

基于python+vue渔船出海及海货统计系统的设计与实现flask-django-php-nodejs

当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统渔船出海及海货统计采取了人工的管理方法&#…

抖音视频爬虫下载软件|可导出视频分享链接|视频批量采集工具

无水印视频关键词批量下载工具操作指南 我们自主开发了一款便捷的音视频批量下载工具,不仅支持单个视频链接提取,还可通过关键词搜索实现批量采集和选择性下载,让您轻松获取所需视频内容。 操作说明: 关键词批量采集视频 进入软件…

AI绘画可以稳定生成中文了:白嫖阿里云部署AnyText

长久以来,在AI绘画中书写文字一直是个难题。即使到了SDXL时代,我们也只能输出英文,而且还经常出现漏掉字母的情况。现在阿里达摩院搞出了一个解决方案,可以在Stable Diffusion生成的作品中稳定输出中、英、日、韩等多种文字&#…

python共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块:即管理员模块和用户模块,主要功能包括:用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等; 语言:Python 框架:django/flask 软件版本:python3.7.7 数据库…

【Unity】从0到1的横版2d制作笔记-DAY3

确定碰撞体积 选择rigidbody2d,创建player重力 创建player碰撞体积 创建瓦片地图碰撞体积 使平台变成一个整体 ​​​​​ 设置Body Type为Static(避免平台也因为重力影响下落) 回到Player,在Rigidbody2D中设置为冻结旋转 Player设…

python家政服务系统flask-django-php-nodejs

相比于以前的传统手工管理方式,智能化的管理方式可以大幅降低家政公司的运营人员成本,实现了家政服务的标准化、制度化、程序化的管理,有效地防止了家政服务的随意管理,提高了信息的处理速度和精确度,能够及时、准确地…