手游业务MySQL服务特点
-
目前手游业务大多是采用Redis和MySQL相结合的方案;
-
Redis则用于游戏业务中当前状态数据的存储,而MySQL一般用于数据持久化存储以及事务控制、数据一致性保证;
-
手游业务中的MySQL数据库一般负载不高。
正因为MySQL负载不高,才需要想办法提高资源利用率,这里可以有两个思路:
-
单机多实例;
-
虚拟化技术。
这两种方法各有优缺点,我们接下来各自分析对比下。
1、单机多实例
在同一个OS下启动多个mysqld进程,监听多个端口。
优点:
-
计算资源利用率相对较高,因为没有虚拟化层的损耗;
-
适合中小企业,因为无需额外维护KVM等虚拟化组件。
缺点:
-
隔离性相对较差,不同业务的MySQL实例间可能会因为业务瞬间突增而相互影响;
-
定制化相对麻烦,不同实例要使用不同的MySQL版本,操作配置比较麻烦;
-
不同实例无法都使用默认的3306端口,除非事先绑定多个IP,相对较复杂。
2、虚拟化技术
在每个虚拟机只运行一个数据库实例。
优点:
-
方便推动数据库部署标准化、模版化,为后续推进快速部署打好基础;
-
通过虚拟化技术,实现数据库服务快速批量部署,公有云RDS一般也是这么做的;
-
具备良好的隔离性,一个实例中的OS或数据库故障不影响其他实例下的服务。
缺点:
-
多了虚拟化层,增加一部分计算资源消耗;
-
每个虚拟化实例使用单独的IP,网络管理上更复杂;
-
手游业务数据库虚拟化方案可以考虑KVM结合Docker的方案。
数据库使用KVM虚拟化方案需要关注下面的几个要点:
-
服务稳定性,业务的稳定是一切基础,再好的方案也不能影响业务的稳定,否则都是耍流氓;
-
避免性能瓶颈,数据库服务主要的瓶颈在于磁盘I/O,好在手游业务的压力一般不太大。不过上线前也要做足测试,对潜在的性能需求要有预估。遇到高负载时可直接使用SSD或者PCIe SSD设备,在KVM虚拟化中也可将SSD直接以裸盘方式挂载到KVM实例上。
-
服务可靠性,可从下面两个方面提升服务可靠性:1)数据库层面,可采用主从复制、定期物理&逻辑备份(全备+差异备份)、备份恢复等机制;
2)虚拟化层面,可采用共享存储、虚拟机快照等。共享存储优先选择企业级存储设备,要注意虚拟机快照并不能保证数据库的完整性。
数据库使用Docker技术
数据库服务基于Docker技术,有效平衡了单机多实例以及KVM虚拟化两种方案,其资源损耗小,又具备虚拟化灵活部署和隔离性等优点。
数据库服务基于Docker技术,有效平衡了单机多实例以及KVM虚拟化两种方案,其资源损耗小,又具备虚拟化灵活部署和隔离性等优点。
但当前Docker技术仍有诸多限制:
-
其使用AUFS文件系统,更容易造成磁盘I/O性能瓶颈(可配置SSD盘缓解I/O压力);
-
Docker的实例不支持热迁移(可和KVM结合,利用KVM实现热迁移);
-
Docker的网络模块上也有瓶颈。
上述这些因素决定了目前在Docker里跑MySQL还有待进一步完善,我们也相信随着Docker技术的不断改进,这些限制或者瓶颈会越来越少,更适大规模运行MySQL等服务。