码迷,mamicode.com
首页 > 数据库 > 详细

数据库选型之MySQL(三)

时间:2015-09-20 19:10:08      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

刘勇    Email: lyssym@sina.com

       本博客记录作者在工作与研究中所经历的点滴,一方面给自己的工作与生活留下印记,另一方面若是能对大家有所帮助,则幸甚至哉矣!

简介

        鉴于高频中心库task部分占用机器较多,为节省成本,调研数据库或缓存。在数据库选型之MySQL(二)中,在固态硬盘本地访问MySQL可以满足其10000次/s操作的需求,由于实际环境中存在多个品种(多进程、多线程访问数据库)的业务需求,因此,本文采用多线程在固态硬盘本地访问MySQL展开测试,以期对高频中心库后期架构调整提供实践参考。需要指出,本文作者对该种节省成本的解决方案是不赞成的。

测试环境

        硬件环境

        10.1.120.34:Intel Core I5-4590, 主频:3.30G,  内存:16G, 有固态硬盘

        软件环境:

        10.1.120.34: Cent OS 6.5,  MySQL 5.6.26 (社区版)

性能测试

        针对高频生产的应用需求,本文构造高频中心库系统的数据结构,采用多线程模拟业务需求对本地节点MySQL进行写入操作,分别存储数据总量为60K、100K、600K条数据,对其速率进行测试。需要指出,由于常见I/O访问的瓶颈主要受限于写入测试,本文只针对写入操作进行测试,暂不考虑读取操作或者混合读写方式,若写入操作不满足要求,其它操作无需测试。

        因为10.1.120.34上采用固态硬盘作为存储介质,其安装有MySQL,根据应用场景,分别从10、20、30个线程并发访问MySQL 展开测试。

        测试整个结果见图-1:

技术分享

图-1 完整测试结果

        10个线程

        从10个线程执行事务处理,需要指出,事务处理数据量固定为1000,以下多线程情况与之类同,不再赘述,10个线程的平均速率见表-1。

表-1  10个线程下每个线程平均访问MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)
本地节点 10.1.120.34 60 4085
本地节点 10.1.120.34 100 4607
本地节点 10.1.120.34 600 3021

         20个线程

         从20个线程执行事务处理,20个线程的平均速率见表-2。

表-2  20个线程下每个线程平均访问MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)
本地节点 10.1.120.34 60 1945
本地节点 10.1.120.34 100 2149
本地节点 10.1.120.34 600 1525

        30个线程

        从30个线程执行事务处理,30个线程的平均速率见表-3。

表-3  30个线程下每个线程平均访问MySQL测试结果

节点

数据库IP

数据量(K)

平均写入速率(条/s)
本地节点 10.1.120.34 60 1266
本地节点 10.1.120.34 100 1461
本地节点 10.1.120.34 600 879

小结

        从表1-3可知:1)随着线程数目增加,线程平均写入速率会减小,而且还很明显;2)随着访问的数据量的增加,以10万条至60万条为例,每个线程平均访问其速率下降也很明显。

        本文测试结果对高频中心库后续架构调整提供有一些实践参考,若以平均速率乘以线程个数来衡量,则该高频生产情形是满足需求的,但是若出现不平衡状况,则为节省成本采用将数据在固态硬盘本地入库落地来生产,然后辅以redis作为缓存来缓解访问系统访问压力的解决方案,本文作者是不赞成这种该方案的,希望对有类似业务需求的朋友有所帮助。

 

附录:

测试部分程序源代码:

 

技术分享
 1 public static void main(String[] args) {
 2         
 3         Transaction [] ts = new Transaction[ThreadTest.MAX];
 4         Test []test = new Test[ThreadTest.MAX];
 5         int symbol = 100000;
 6         for (int i = 0; i < ts.length; i++) {
 7             ts[i] = new Transaction(null,
 8                     "",
 9                     "",
10                     "010000",
11                     new BigDecimal(15.857).setScale(3, RoundingMode.HALF_UP),
12                     new BigDecimal(18.550).setScale(3, RoundingMode.HALF_UP),
13                     new BigDecimal(13.147).setScale(3, RoundingMode.HALF_UP),
14                     new BigDecimal(16.383).setScale(3, RoundingMode.HALF_UP),
15                     new BigDecimal(0.151).setScale(3, RoundingMode.HALF_UP),
16                     new BigDecimal(1.550).setScale(3, RoundingMode.HALF_UP),
17                     new BigDecimal(5000000).setScale(3, RoundingMode.HALF_UP),
18                     new BigDecimal(500000000).setScale(3, RoundingMode.HALF_UP),
19                     System.currentTimeMillis(),
20                     "SSE");
21             test[i] = new Test();
22             
23         }
24 
25         
26         RunThread[] thread = new RunThread[ThreadTest.MAX]; 
27         for (int i = 0; i < thread.length; i++) {
28             test[i].initMySQL();
29             thread[i] = new RunThread(ts[i], symbol, test[i]);
30             symbol += ThreadTest.NUM*1000;
31         }
32         
33         for (int i = 0; i < thread.length; i++)
34             thread[i].start();
35         
36         while (true) {
37             try {
38                 Thread.sleep(1000);
39             } catch (InterruptedException e) {
40                 e.printStackTrace();
41                 test[0].down();
42             }
43         }
44         
45     }
View Code

 

数据库选型之MySQL(三)

标签:

原文地址:http://www.cnblogs.com/lyssym/p/4821788.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!