[分享]MySQL Cluster写入效率测试_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1727 | 回复: 0   主题: [分享]MySQL Cluster写入效率测试        下一篇 
flying
注册用户
等级:下士
经验:153
发帖:75
精华:0
注册:2011-8-25
状态:离线
发送短消息息给flying 加好友    发送短消息息给flying 发消息
发表于: IP:您无权察看 2014-12-30 16:46:02 | [全部帖] [楼主帖] 楼主

MySQL Cluster使用到目前为止遇到渴望得到答案的问题,也是直接影响使用的问题就是MySQL Cluster的写入效率问题和Cluster是否适合大数据存储、如何配置存储的问题。
在之前的测试中MySQL Cluster的写入效率一直不佳,这也是直接影响能否使用MySQL Cluster的关键。现在我们来仔细测试一下。使用的环境略有变化。
Data节点的内存扩展为4G。
集群配置如下:

[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2 # Number of replicas
DataMemory=2000M # How much memory to allocate for data storage
IndexMemory=300M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
MaxNoOfConcurrentOperations=1200000
MaxNoOfLocalOperations=1320000


测试代码如下:

* 向数据库中插入数据

 * @param conn
* @param totalRowCount
* @param perRowCount
* @param tableName
* @author lihzh(OneCoder)
* @throws SQLException
* @date 2013 -1 -17 下午1:57:10
private void insertDataToTable(Connection conn, String tableName,
long totalRowCount, long perRowCount, long startIndex)
throws SQLException {
conn.setAutoCommit( false);
String sql = "insert into " + tableName + " VALUES(?,?,?)";
System. out.println( "Begin to prepare statement.");
PreparedStatement statement = conn.prepareStatement(sql);
long sum = 0L;
for ( int j = 0; j < TOTAL_ROW_COUNT / BATCH_ROW_COUNT; j++) {
long batchStart = System. currentTimeMillis();
for ( int i = 0; i < BATCH_ROW_COUNT; i++) {
long id = j * BATCH_ROW_COUNT + i + startIndex;
String name_pre = String. valueOf(id);
statement.setLong(1, id);
statement.setString(2, name_pre);
statement.setString(3, name_pre);
statement.addBatch();
System. out.println( "It's up to batch count: " + BATCH_ROW_COUNT);
statement.executeBatch();
conn.commit();
long batchEnd = System. currentTimeMillis();
long cost = batchEnd - batchStart;
System. out.println( "Batch data commit finished. Time cost: "
+ cost);
sum += cost;
System. out.println( "All data insert finished. Total time cost: "
+ sum);
System. out.println( "Avg cost: "
+ sum/5);


} 分下列情景进行写入测试。
数据加载、写入在内存中时,在独立的新库、新表中一次写入100,1000,10000,50000条记录,分别记录其耗时情况。(5次平均)

100:260ms
1000:1940ms
10000:17683ms(12000-17000)
50000: 93308、94730、90162、94849、162848


与普通单点MySQL写入效率进行对比(2G内存)

100:182ms
1000:1624ms
10000:14946ms
50000:84438ms


    双线程并发写入测试
由于只有两个SQL节点,所以这里只采用双线程写入的方法进行测试。代码上采用了简单的硬编码

* 多线程并行写入测试

 * @author lihzh(OneCoder)
* @blog http://coderli
* @date 2013 -2 -27 下午3:39:56
private void parallelInsert() {
      final long start = System. currentTimeMillis();
      Thread t1 = new Thread( new Runnable() {
            @Override
            public void run() {
                  try {
                        Connection conn = getConnection(DB_IPADDRESS, DB_PORT,
                        DB_NAME, DB_USER, DB_PASSOWRD);
                        MySQLClusterDataMachine dataMachine = new MySQLClusterDataMachine();
                        dataMachine.insertDataToTable(conn, TABLE_NAME_DATAHOUSE,
                        500, 100, 0);
                        long end1 = System.currentTimeMillis();
                        System. out.println( "Thread 1 cost: " + (end1 - start));
                  } catch (SQLException e) {
                        e.printStackTrace();
                  });
                  Thread t2 = new Thread( new Runnable() {
                        @Override
                        public void run() {
                              try {
                                    Connection conn = getConnection(DB_IPADDRESS_TWO, DB_PORT,
                                    DB_NAME, DB_USER, DB_PASSOWRD);
                                    MySQLClusterDataMachine dataMachine = new MySQLClusterDataMachine();
                                    dataMachine.insertDataToTable(conn, TABLE_NAME_DATAHOUSE,
                                    500, 100, 500);
                                    long end2 = System.currentTimeMillis();
                                    System. out.println( "Thread 2 cost: " + (end2 - start));
                              } catch (SQLException e) {
                                    e.printStackTrace();
                              });
                              t1.start();
                              t2.start();


} 测试结果:

从结果可以看出,在10000条以下批量写入的情况下,SQL节点的处理能力是集群的瓶颈,双线程双SQL写入相较单线程单节点效率可提升一倍。但是当批量写入数据达到一定数量级,这种效率的提升就不那么明显了,应该是集群中的其他位置也产生了瓶颈。www.it165.net
注:由于各自测试环境的差异,测试数据仅可做内部比较,不可外部横向对比。仅供参考。
写入测试,要做的还很多,不过暂时告一段落。大数据存储和查询测试,随后进行。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论