主程的晋升攻略(8):数据层的演进(上)

我们用一个做手游的故事来聊聊数据层不断优化提升的演进过程。

10:简单设计

有一天,老板突然说做个山寨版的糖果传奇手游,你接到任务后,分析出游戏的交互频率不大,都是点查询,用mysql能简单搞定。对游戏来说,你非常少有机会用orcale这样的上流货。mysql是物美价廉的选择。建个表,设好主键和索引。你轻松搞定数据库设计,满意的泡了杯茶边喝边写程序。

这里说的“点查询”,是指基于指定主键的查询,比如查询指定用户的信息,由于是基于指定主键。查询结果有限且较少。点查询的效率很高。

还有一种叫“面查询”。是基于主键或索引的范围查询,比如查询昨天全部的订单,这样的查询尽管有主键或索引。但结果数量不确定。有时处理不好时会出现严重性能问题。

游戏删档内測上线了,用户数不多。请求的响应也非常及时,老板拍了拍你的肩膀。

100:数据库调优

游戏上线反响不错,精美的画面给了玩家不少惊喜,很多其它玩家蜂拥而入,你从监控系统上发现mysql的压力有点大。当初仅仅是对数据库表结构做了设计,如今你開始review数据库优化了:创建表时默认的MyISAM存储引擎换成InnoDB存储引擎,改动mysql參数加大InnoDB的cache。不使用事务提交。

做了这些优化后,db性能提升明显,整个系统跑得非常欢。你又满意的去泡茶了。

1000:分库分表

你们游戏山寨得比較牛叉。用户持续添加,作为有风险意识的你,肯定不会等到系统告警了才去优化,于是你在想更大訪问量时怎么办?

单台db的性能有极限,必须有扩展到多台db的能力。于是你又一次改动了数据库表结构和后台代码,把主键按规则做了分库分表,眼下用户增长迅猛。假定单台db存放500万用户,终于可能有上亿用户。那么可能有20台DB,于是你分了32个库,每一个库里有32张表,共1024张表。

初始时这1024张表都在一台db上。当用户数添加时。分裂成2台、4台、8台、16台。涉及好分库分表策略后,db压力能通过扩容来解决,你放心了。

关于读写分离

有不少介绍mysql读写分离已提升mysql并发性能的文章。在游戏项目中用得比較少,主要是读写比例的原因。

像站点那种读多写少的应用场景能够採用读写分离,而游戏的读和写差点儿相同多,读写分离的用处不大。并且用户可能是海量的,分多台db是常事,假设分库后再搞读写分离,整个db就过于复杂了。

mysql读写分离是基于mysql主从复制功能的,游戏项目假设对数据安全有要求,通常会用mysql主从复制功能做热备。假设项目有GM或经分系统须要直接查询mysql,往往也是在slave上查询,不直接操作master。避免低效查询减少master性能影响业务。这样的做法也是OLDP(On-Line Transaction Processing。联机事务处理)和OLAP(On-Line Analytical Processing。联机分析处理)分离的常见做法。

10000:缓存

有了分库分表来平滑扩容,项目安稳了较长一段时间,直到某一天。运维说db机器增长比較快,4个月就添加到了64台(master+slave),希望后台能提升单台db的性能。以应对兴许的业务增长。

OK。你祭出你留的后手——memcached,麻利的操起机械键盘,咔哒咔哒的改起后台的代码,增加缓存逻辑:读的时候从memcached读,假设没有就从mysql查询并写入memcached。

写的时候同一时候写入mysql和memcached。

好吧。你最终使用了NoSQL。NoSQL泛指非关系型数据库。是Not Only SQL(有多少人和我一样搞错的~~!)。

搞定这个问题后,成本下降了,项目收入可观,拿奖金好happy。

未完待续~

时间: 2024-12-24 11:08:29

主程的晋升攻略(8):数据层的演进(上)的相关文章

主程的晋升攻略(7):服务器模型谈

在上一篇<主程的晋升攻略(6):CGI和FastCGI>中,讲到Web服务器和CGI/FastCGI能动态输出内容,从而提供更强大的业务处理能力.Web服务器这种架构,我称之为Web模式,与之相对的是Svr模式.Web模式和Svr模式是互联网项目的后台最常见的两种模式.先介绍几个概念. 同步通讯 vs 异步通讯 同步通讯是指在一个连接中,一个请求的应答没回来前,不能发送下一个请求,整个通讯过程是请求1-应答1-请求2-应答2--这种.异步通讯与同步通讯相反,在一个连接中,可以随意发送请求,而且

主程的晋升攻略(9):数据层的演进(下)

缓存为什么能提高性能? 为什么memcached的性能比mysql高? 首要因素是memcached的数据都是位于内存中,mysql的数据可能是位于磁盘里.从IO速度来说,内存IO比磁盘IO会快几个数量级,memcached也就比mysql性能更高.架构和性能优化做到后面,会发现最终限制性能的是硬件瓶颈.例如nginx做静态webserver时,出口流量往往能达到网卡的最大值或出口带宽的最大值.mysql是个性能还不错的db,但它的数据持久化在磁盘上,自然就受限于磁盘IO速度. mysql也是有

直播攻略:网易视频云送上OBS直播完整版教程

OBS是什么? OBS是一款直播串流软件,中文无广告,完全免费,含32位与64位版本,通吃各种电脑,支持MAC的OS X系统. 各大平台都有自己的直播软件了还需要用OBS么? 因为,当前平台直播软件存在以下两个方面问题: 1功能缺失,对采集卡,摄像头,屏幕截取,码率设置,输出分辨率以及更多高级设置都 不能很好的支持,基本上是傻瓜设置,不能做到相对更精准更有质量的调教. 2严重占用系统资源,很多主播在游戏时候会进行同步录制视频,如果用平台直播软件直播的话,很可能在高画质的设定下同步录制会导致游戏各

Axure RP使用攻略--带遮罩层的弹出框(9)

实现目标: 1.   点击按钮弹出带遮罩层的对话框: 2.   页面上下左右滚动时,弹出的对话框水平和垂直始终居中. 实现步骤如下: 1. 拖入编辑区2个矩形,并点右键-转换-转换为动态面板: 2. 双击其中一个动态面板设置标签为"遮罩层"(看个人喜好随便命名),并双击状态1进入编辑: 3. 点击状态1里面的矩形,设置大小与网站页面大小相同,以便完全遮盖:然后,设置矩形边框为"无":最后设置填充色的透明度为50%(看个人喜好),并选择填充色为灰色(看个人喜好): 4

Windows Socket五种I/O模型——代码全攻略(转)

Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模式.可以通过多线程技术进行处理. 非阻塞模式:执行I/O操作时,Winsock函数会返回并交出控制权.这种模式使用 起来比较复杂,因为函数在没有运行完成就进行返回,会不断地返回 WSAEWOULDBLOCK错误.但功能强大.为了解决这个问题,提出了进行I/O操作的一些I/O模型,下面介绍最常见的三种: Windows Socket五种I/O模型——代码全攻

图像识别DM8127开发攻略——KERNEL的移植说明

图像识别DM8127开发攻略--KERNEL的移植说明 接上一篇<图像识别DM8127开发攻略--UBOOT的移植说明>的步伐,DM8127开发攻略最后一篇文章是有关Kernel的裁剪移植.基于APPRO RDK3.8.0的基础上,我们对/ti_tools/ipnc_psp_arago/kernel进行裁剪和移植,这个kernel是linux-2.6.37版本:一.第一步还是做裁剪工作,删除多余的文件夹和文件,方便程序在每个阶段备份保存.1.先在kernel/fs/hostf/Makefile

深度学习在携程攻略社区的应用

编者:本文来自携程攻略社区开发总监李健在携程技术中心主办的深度学习Meetup中的主题演讲,介绍了深度学习在攻略社区领域的主要应用.关注携程技术微信公号ctriptech,可获知更多技术分享信息. 携程攻略社区是携程旗下的旅游攻略类社区,致力于为旅行者提供出行指南和资讯服务.依托携程2.5亿用户总量,社区日活跃用户超过500万,并汇集3000万条真实用户的旅行和酒店点评,并有40万篇旅行游记,2000位知名旅行达人.面对数据库中浩如烟海的信息,我们如何能去其糟粕,留其精华? 攻略社区的主要需求

【携程攻略】千岛湖骑行-其他

[携程攻略]千岛湖骑行-其他 ? 千岛湖绿道骑行,千岛湖沿湖建有骑行车道,可以边骑行边欣赏千岛湖美景.骑行俱乐部20元一小时.千岛湖镇上就近安排车辆.咨询电话13777367764.微信号:yujian20060222

R语言教程:写给高级入门者的数据打理攻略

http://developer.51cto.com/art/201312/423612_all.htm 原文地址 如果大家还未完全熟悉R语言.甚至不能轻松利用它实现最基本的处理任务,我建议各位先查阅其它指导文章.帮助自己积累对R语言的认识.但如果大家已经拥有一定的背景知识,希望能够进一步提升自己的开发技能——或者单纯只是想看看R语言如何完成文章中罗列的四项任务——那么请跟着我继续阅读. 学习如何添加column.计算总和.对结果排序以及数据改造. 强大的能力在带来责任之外,也给我们增添了恼人的