本文转载自:OceanBase 社区

作者简介:黄友鹏,现就职于深圳某游戏公司,是一名Java开发,主要负责公司的业务调优和故障处理,熟悉MySQL,近年来研究分布式数据库。

导语:一家运营海外休闲游戏的公司随着其业务的发展,表的数据量大幅增加,原始的单实例MySQL在性能方面已经无法满足业务需求,因此需要寻求新的解决方案。本文主要介绍了选用OceanBase的考量因素、测试情况,分享一些实践经验,给大家提供一些参考。

业务痛点及选型背景

在游戏业务发展阶段早期,我们考虑到迭代迅速、运维简单、架构轻量,使后端数据库均采用了AWS上的MySQL单实例,承担游戏运行、运营分析等各项业务。

运营分析业务主要面向公司内部员工,用于观察生产业务运营情况、追踪异常用户数据,针对游戏日志进行分析计算,处理生成BI报表。该业务几乎24小时都有数据写入,大部分数据量集中在几张日志表、流水表中,且21:00-24:00点的数据量会是其他时段的1-2倍。随着业务的发展,我们发现,运营分析业务使用MySQL数据库的弊端越来越凸显。

弊端1:性能瓶颈。随着多张表一天产生的数据量由百万级增长到亿级,原来的MySQL实例在读场景的性能出现明显下滑,例如,针对单天的统计计算从原来的10s延迟至300+s才能出结果;在写场景下,由于80%以上的数据集中在几张日志表、流水表中,且24小时不间断写,造成写热点、数据入库慢等问题。

弊端2:分析瓶颈。写热点场景下,数据入库慢,叠加读性能下滑的影响,导致运营分析的数据一直有延迟,仅能获取准实时报表。

弊端3:扩展瓶颈。数据量突增的情况下,出现上述性能、分析瓶颈后,暂时只能升级MySQL配置,但随着业务的进一步扩展,升无可升。同时,由于MySQL的局限性,难以采用线性扩展方案,即使想用分库分表,前期的应用适配改造及后期的运维工作量也很大,无法短时间解决问题。

基于上述三个弊端,我们在制定解决方案时想到了关注已久的原生分布式数据库OceanBase。早在OceanBase开源(2021年6月)前与CloudCanal的合作直播中,让我们了解到这款数据库产品。当我们再度想起OceanBase时,它已经开源并计划发布OceanBase 4.0版本。在我们从OceanBase官网及社区深入了解相关信息时,观察到OceanBase的文档比较完善,其写性能、AP能力、扩展性、迁移成本都符合我们对新方案的预期。当即展开小规模调研。即搭建低配测试环境观察基本的语法兼容和业务适配。

测试与部署

在小规模测试过程中,用户数据突增,数据从原来的日增百万级别,直接跳跃到日增1.2亿左右,公司内部报表业务接近瘫痪,更新替换迫在眉睫。我们迅速搭建了测试环境,测试公司基本的业务流程、兼容情况,为正式部署做准备。测试过程中主要考量以下几个因素。

1、高性能

抽取MySQL中多张日志、流水表的部分数据至OceanBase 4.0单节点中,测试各类分析SQL的查询性能,如分组求和、总数统计等。

对比示例:模拟单表2600w的数据量,OceanBase中全表count(1)毫秒级响应,而在MySQL中执行是分钟级。

2、低成本

数据存储方面,原来千万级别的数据在MySQL中大概占用超400 GB的存储量,迁移到OceanBase中亿级别的数据仅需260 GB。

MySQL 5.7迁移至OceanBase4.0时,使用了MySQL dump导出MySQL 5.7数据,再使用OBLOADER 4.0导入OceanBase 4.0,方便快捷。

迁移至OceanBase4.0以后,少部分存储过程存在不兼容的情况,在代码层面做了修改,相较于分库分表的改造、运维方案,这块的人力投入比较可控。

3、易用性

采用OBD方式部署单节点实例简单快捷,另外自带的ODC开发者工具和以前习惯使用的Navicat都能方便的测试OceanBase。

基于上述测试数据,我们决定部署OceanBase 4.0,生产环境部署信息如下。

版本 OceanBase:4.0.0_CE_BP1OBD:1.6.2
拓扑 OceanBase:单节点OBServer+OBProxy
配置 16C/64G/3*1T租户资源:12C/48G

而在实际的测试到生产过程中,线上业务飞速发展,单表日增数据量到上亿级别,导致在生产环境实际跑业务分析SQL时,效率不佳。因此,我们针对几张核心表的查询也做了一定的优化措施。下面以SQL为例展开说明,以供参考。

比如这是一张游戏的流水表,拿到用户的流水记录以后,我们在内部会统计最近几天,不同游戏、不同渠道用户的各类消费情况,根据统计的各游戏的运营信息及时调整游戏的活动策略。

CREATE TABLE `games_play_flow` (`event_time` int(11) DEFAULT NULL COMMENT,`game_id` int(5) DEFAULT NULL COMMENT,`account_id` bigint(20) DEFAULT NULL,`uid` bigint(20) DEFAULT NULL,`channel_id` varchar(20) DEFAULT NULL,`play_id` varchar(100) DEFAULT NULL,`mfr_id` int(11) DEFAULT NULL,`money_type` tinyint(4) DEFAULT NULL,`output` bigint(20) DEFAULT NULL,`consume` bigint(20) DEFAULT NULL,KEY `idx_ix_event_time_63917445` (`event_time`) BLOCK_SIZE 16384 LOCAL,KEY `idx_ix_account_id_1050842020` (`account_id`) BLOCK_SIZE 16384 LOCAL
) DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0SELECT /*+ parallel(10)*/ "2022-12-09" date,
game_id,
channel_id,
sum(output) as pay_output,
sum(consume) as pay_consume
from games_play_flow
where money_type = 2
and event_time between 1670515200 and 1670601600
group by game_id ,channel_id

在测试此类业务SQL的过程中,也出现了一些意料之外的问题,在日增数据量突增的情况下,OceanBase4.0中单表分组统计SQL性能表现没有在测试环境的表现好。并且因为业务24小时均匀写入的特点,业务没有明显的高低峰期,导致当天最新数据入库时,统计信息未更新,统计最近三天运营数据时,SQL执行计划不走索引。

我们也和OceanBase社区的同学一起商量了解决方案,做了三方面的工作,最终保证了业务SQL的性能满足运营需求。第一,重新规划运营数据的保留周期,计划仅保留1-2个月数据,并且将多张核心的单表(几亿行数据)改造为分区表,按天分区;第二,根据CPU占用增加SQL执行的并行度,利用分区裁剪+event_time索引提升查询效率;第三,针对统计信息未及时更新的问题,定时任务触发手动收集统计信息。

实践总结

从整体来看,选用OceanBase 4.0对公司业务性能的提升还是很大的,也为公司节约了很多成本。

首先,解决了MySQL的性能瓶颈问题,依据生产环境实际运行情况,分区表的改造加上OceanBase准内存架构,解决了热点表写的问题,OceaanBase 4.0单机写性能是之前MySQL的5-6倍。其次,针对两条业务线(MySQL与OceeanBase)在游戏正式服的查询性能表现,对于分组聚合查询业务,我们按天进行数据分区,MySQL对单天的数据进行统计计算需要130s,而OceanBase 仅需18s,且OceanBase业务线日增数据是MySQL业务线的2倍左右。按这样的比例来算,同配置下,在我们的业务场景下OceanBase的分组查询性能是MySQL的12倍左右。性能得到了巨大的提升。

当然,在业务切换到OceanBase 4.0的过程中,我们也遇到了一些问题,比如上文提到的刚开始启用生产环境发现按天分区的分区表查询性能和测试环境相差较大,后来同OceanBase社区的同学一起快速定位到了问题。原来是当天的分区统计信息未收集到,导致查询语句走的全表扫描,通过手动触发收集分区信息后,查询性能就立马上来了,据了解,OceanBase 4.1版本将提供在线收集统计信息功能,解决这个问题。

除此以外,我们还反馈了一些关于兼容性、功能等问题,OceanBase社区的同学也一一做了解答,可参考如下:

cpu_count不实时生效:cpu_count 不实时生效 - OceanBase - 社区问答- OceanBase社区-分布式数据库

mySQL迁移到ob遇到兼容问题:mysql迁移到ob遇到兼容问题 - OceanBase - 社区问答- OceanBase社区-分布式数据库

未来畅想

总的来说,在本次业务解决方案替换过程中,我们重点关注于AP场景下的性能优化,期间遇到的一些问题都已解决,但还有些未来可能遇到的问题,我们也做了一些规划。

  1. 未来会将OceanBase4.0BP1升级至正式版本。
  2. 为支持业务发展,后续可能会继续扩展实例节点数,针对大表优化,可能进一步做二级分区。
  3. 在运维管理方面,试用OCP Express,简化集群管理的操作。

这次试用OceanBase 4.0,整体而言比较惊喜,短时间内的调研、测试、替换上线,既解决了我们的业务痛点,又不用担心扩展问题。未来,我也会积极参与OceanBase的社区,和大家共迎更好的OceanBase。

某游戏公司基于OceanBase 4.0的运营分析AP实践相关推荐

  1. 基于jQuery 2.0的源代码分析

    有段时间没有使用jQuery了,对他的认识还停留在1.2 - 1.4左右. 前几天看,哇,原来jQuery 2.0 beta都发布了-- 以后不敢说自己会jQuery了. 决定趁着年末不忙,干脆分析一 ...

  2. 生成式对抗网络GAN之实现手写字体的生成(基于keras Tensorflow2.0实现)详细分析训练过程和代码

  3. Vue3.0 组合式 API 分析与实践

    本文带大家深入理解组合式 API 的设计详情,同时加入我们的实践经验总结. 01 背景 Vue3.x 版本的出现带来了许多令人眼前一亮的新特性,其中组合式 API(Composition API),一 ...

  4. doris历程_基于 Apache Doris 的小米增长分析平台实践

    1.背景 随着小米互联网业务的发展,各个产品线利用用户行为数据对业务进行增长分析的需求越来越迫切.显然,让每个业务产品线都自己搭建一套增长分析系统,不仅成本高昂,也会导致效率低下.我们希望能有一款产品 ...

  5. 【clickhouse】基于ClickHouse的海量数据交互式OLAP分析场景实践

    1.概述 视频:https://www.bilibili.com/video/BV1gF41167Fd/ 社区:置顶 ClickHouse 2021 冬季线上Meetup视频回放 2.概括 3.技术架 ...

  6. 游戏公司的越冬样本:出海和精品化成为新的增长点?

    7月12日,今年以来第三批国产网络游戏版号下发,受利好刺激,Wind网络游戏指数周三大涨2.32%,可以说是给下半年的游戏行业又带来一股"春风". 但回顾2022年上半年,游戏行业 ...

  7. 基于stm32、0.96寸OLED实现的贪吃蛇小游戏(详细源码注释)

    简介:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的贪吃蛇小游戏.项目源码地址:点击下载. 硬件设计: 普通摇杆,0.96寸OLED 单色屏幕(SPI协议通讯), ...

  8. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)

    概述:本实验基于stm32最小系统.0.96寸OLED(68*128)和摇杆实现一个经典的俄罗斯方块小游戏.项目源码地址:点击下载. 硬件要求: 普通摇杆,两个电位器和一个开关组成,左右摇动控制一个电 ...

  9. 服务国内超过70%游戏公司,腾讯游戏云发布游戏行业最全解决方案

    9月10日,在2020腾讯全球数字生态大会游戏专场上,腾讯云发布了全新升级的游戏解决方案及游戏服务器引擎GSE.游戏原生数据库TcaplusDB等多款新产品,进一步提升游戏开发者的效率. 目前,腾讯云 ...

最新文章

  1. 这样建统一告警平台,运维的告警麻痹症有救了
  2. 2021个人北美秋招总结
  3. PHP中遍历stdclass object 及 json 总结[中国航天神舟十号以json形式向地面返回数据]...
  4. oracle时间格式转换问题 ORA-01810: format code appears twice--转
  5. [Leetcode][第93题][JAVA][复原IP地址][剪枝][回溯]
  6. java修改配置文件参数_在java类中获取在.properties配置文件中设置的参数
  7. Java中的自增操作符与中间缓存变量机制
  8. php pcntl signal,php – 后续的pcntl_signal信号没有启动处理程序
  9. 聚焦大数据与智能时代:2016中国大数据应用大会将于7月举行
  10. Linux下安装McAfee防病毒软件(企业版本)
  11. python底层源码_python源码剖析——系列一
  12. 系统重装BIOS设置
  13. puzzle(0722)逻辑电路、蜂巢迷阵
  14. CSDN博客插入图片
  15. 怪异的JavaScript系列(一)
  16. 移动通信与无线实验五:AP认证及WLAN配置流程
  17. runtime-compiler和runtime-only的区别
  18. potplayer 多个进程_Linux系统编程1.2:进程概念简介
  19. 银行业务部门名称中英对照
  20. vostro3470装win7_戴尔Latitude 3470笔记本win10怎么改win7系统

热门文章

  1. php转换音频采样率,音频采样率转换 如何转换音频采样率
  2. C盘不够用-删除D盘空间贡献给C盘的简单方法
  3. 特征筛选(2)——基于模型的特征筛选方法
  4. python递归绘制简单分形树
  5. 用python-turtle画分形树叶图
  6. JAVA连接Redis客户端多种方式实现
  7. 安卓端一键自动设置WiFi代理的APP,配合Fiddler、Burp、Charles等抓包工具使用,懒人必备!
  8. java实用工具 根据指定的类名查找jar包
  9. 图文并茂详细教程之——富斯I6遥控器电压回传模块的安装和使用(苍穹四轴)
  10. java让gif图停止,JS控制GIF图片的停止与显示