每个女孩都是天使,每个女孩都美丽芬芳。在这个特别的日子里,温馨的女人节骄傲的向我们走来,祝女神节日快乐!
有同事向我们反馈,数据库的服务器CPU利用率100%,怀疑主机的配置不够,今天我们来测试影响数据库性能的因素有哪些?用实际操作为大家揭开心中的困惑。
一、我们用Mysql作为测试对象
1、Mysql有三个版本:percona、mysql、mariadb。三个版本在sql语法、api接口均兼容,出现三个版本的原因还是商业原因。mysql被oracle收购后,有闭源收费的可能性。
2、CentOS中默认为mariadb。在开源项目中,建议首选percona,次选mariadb
二、我们安装Mysql官方版测试
为了测试数据更具有代表性,我们用Mysql官方版进行测试。测试环境为:CentOS 7.6。
1、因CentOS默认将mysql替换成了mariadb,如需要安装mysql官方版,需要替换数据源,网上的操作文档很多,不再详述。
2、数据库的测试软件用Mysql的自带软件MysqlSlap。
三、影响Mysql性能的因素,实测
1、服务器的cpu、内存配置
A、当前这台云主机的配置为1vCPUs | 2GB | CentOS 7.6 64位 | 40G SATA盘。
经过多次实测,测试数据如下:
执次5000次的自动sql查询,共用时2.88秒。
结论数据:在该配置下,每秒能处理5000/2.877=1737次简单sql查询。通俗一点讲,也是就最大每秒支持1737次的简单select语句并发操作。注:连接池的数量可以通过命令修改,默认的连接数为151,我为了测试修改为了1024。
B、接下来,我们将服务器的配置提升至16vCPUs | 64GB
经过多次实测,测试数据如下:
执次5000次的自动sql查询,共用时0.928秒。
结论数据:在该配置下,性能提升很明显,每秒能处理5000/0.928=5417次简单sql查询。
2、服务器的磁盘类型配置
我们将这台云主机的配置修改为1vCPUs | 2GB | CentOS 7.6 64位 | 40G SSD盘。
执次5000次的自动sql查询,共用时2.567秒。
结论数据:在该配置下,每秒能处理5000/2.567=1947次简单sql查询。
3、数据库的优化
我们创建了一个拥有104万条记录的数据表T1、T2表(T1表带索引,而T2表不带索引),进行测试。配置同样为,1vCPUs | 2GB | CentOS 7.6 64位 | 40G SSD盘。
首先在T2查询第5万条记录,用时0.478秒,相当于这0.478只执行了一条sql语句。
接着在T1查询第5万条记录,用时0.001秒。同样的数据内容,仅仅是因为T1有索引,因此快了478倍。非常惊人的提升。
4、数据库架构的合理性
随着数据库数据量的增加,单库难以满足横向扩展的要求。比较经典的数据库架构如下图,写数据走红线(左边部份),读数据走黄线(右边部份)。
其中左边,dbm157、dbm158为主备关系,采用keepalive+DRBD进行心跳+数据底层复制。而dbm157与159、160、161采用mysql replication进行日志级的复制。
其中右边lvs1、lvs2也为主备关系,前端应用服务器通过读lvs进行底层159、160、161的负载均衡。
在项目中可采用MyCAT中间件进行读写分离、读的负载均衡。