MySQL分布式集群之MyCAT调优初探(四)

来源:互联网 发布:淘宝生意经在哪里 编辑:程序博客网 时间:2024/05/08 07:27
这是有生之年系列的填坑_(:з」∠)_
前作第一篇:http://blog.itpub.net/29510932/viewspace-1664499/
前作第二篇:http://blog.itpub.net/29510932/viewspace-1667814/
前作第三篇:http://blog.itpub.net/29510932/viewspace-1678591/
MyCAT基准测试:http://blog.itpub.net/29510932/viewspace-1726924/和http://blog.itpub.net/29510932/viewspace-1717783/
------------------------------------------------------------------------------------------------------正文------------------------------------------------------------------------------------------------------------

背景:接本应接在基准测试之后就整理,不过有别的事情耽搁了

环境:与基准测试时保持一致,4核32G,MyCAT-1.4-RC,6月17号发布的版本,目前最新发布的版本应该是在7.29,七月底的样子。

相关配置文件:server.xml与cacheservice.properties

文件简介:
server.xml:保存了有关MyCAT的配置信息,包括MyCAT对外暴露的schema(包含这个schema对应的账户名和密码),MyCAT server的连接池等参数配置
cacheservice.properties:缓存区的配置

server.xml示例:

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- - - Licensed under the Apache License, Version 2.(the "License"); 
  3.         - you may not use this file except in compliance with the License. - You 
  4.         may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.
  5.         - - Unless required by applicable law or agreed to in writing, software - 
  6.         distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
  7.         WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
  8.         License for the specific language governing permissions and - limitations 
  9.         under the License. -->
  10. <!DOCTYPE mycat:server SYSTEM "server.dtd">
  11. <mycat:server xmlns:mycat="http://org.opencloudb/">
  12.         <system> 
  13.         <property name="processors">32</property> 
  14.         <property name="processorExecutor">256</property> 
  15.         <property name="processorBufferPool">204800000</property>
  16.         <property name="processorBufferChunk">40960</property>
  17.                 <!--默认是65535 64K 用于sql解析时最大文本长度 -->
  18.         <property name="maxStringLiteralLength">65535</property>
  19.                 <!--<property name="sequnceHandlerType">0</property>-->
  20.                 <!--<property name="backSocketNoDelay">1</property>-->
  21.                 <!--<property name="frontSocketNoDelay">1</property>-->
  22.                 <!--<property name="processorExecutor">16</property>-->
  23.                 <!-- 
  24.                         <property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
  25.                         <property name="mutiNodePatchSize">100</property> 亿级数量排序批量
  26.                         <property name="processors">32</property> <property name="processorExecutor">32</property> 
  27.                         <property name="serverPort">8066</property> <property name="managerPort">9066</property> 
  28.                         <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property> 
  29.                         <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
  30.         <property name="defaultSqlParser">druidparser</property>
  31.         </system>
  32.         <!--
  33.         <user name="root">
  34.                 <property name="password">root</property>
  35.                 <property name="schemas">test</property>
  36.         </user>

  37.         <user name="root_read">
  38.                 <property name="password">root_read</property>
  39.                 <property name="schemas">test</property>
  40.                 <property name="readOnly">true</property>
  41.         </user>
  42.         -->
  43.         <user name="test">
  44.                 <property name="password">test</property>
  45.                 <property name="schemas">test</property>
  46.         </user>

  47.         <!-- <cluster> <node name="cobar1"> <property name="host">127.0.0.1</property> 
  48.                 <property name="weight">1</property> </node> </cluster> -->
  49.         <!-- <quarantine> <host name="1.2.3.4"> <property name="user">test</property> 
  50.                 </host> </quarantine> -->

  51. </mycat:server>
PS:MyCAT对外暴露的schema,是可以使用readonly模式的,如上面配置文件中的加红部分;

processors:用于指定可用线程数,实际上由于现在的多核CPU和超线程技术,这个值可以酌情调高,这里调到了虚拟机核数的八倍,感觉稍稍有点高了,实际上四倍or五倍就差不多了

processorExecutor:类似于线程池大小的参数,酌情修改即可,在1.4之后,这个线程池是用来做异步处理逻辑的时候用的,对并发能力的影响相对较小了

processorBufferPool:BufferPool的大小,原则上来说,调高一些会比较好

processorBufferChunk:每一个Buffer块的大小,processorBufferPool/processorBufferChun可以得到buffer块的数量

server调整总结:
processors+processorExecutor会影响到MyCAT可用的线程数,虽然调高点会比较好,但是调的太高会导致频繁的上下文切换和软中断,在实际调整中,用top观察sys和si的百分比,如果服务器/虚拟机并没有什么不干净的后台程序和其他的服务在运行,sys在10%-15%之内,si在5%之内是比较理想的状态

processorBufferPool+processorBufferChunk影响的server缓存,保持processorBufferChunk大小合理的情况下,增加buffer块的数量才是关键


cacheservice.properties示例:

点击(此处)折叠或打开

  1. #used for mycat cache service conf
  2. factory.encache=org.opencloudb.cache.impl.EnchachePooFactory
  3. #key is pool name ,value is type,max size, expire seconds
  4. pool.SQLRouteCache=encache,1500000,60
  5. pool.ER_SQL2PARENTID=encache,2000,180
  6. layedpool.TableID2DataNodeCache=encache,3000,18000
  7. layedpool.TableID2DataNodeCache.TESTDB_ORDERS=10000,18000
cacheservice是SQL的缓存服务,

SQLRouteCache:sql路由缓存,通过缓存SQL语句的路由信息,下次查询,不用再路由了,直接从缓存中获取路由信息,然后发到各个节点执行;
TableID2DataNodeCache :表主键ID的路由缓存,为每一个表建一个缓存池,命名为TableID2DataNodeCache.TESTDB_表名,缓存的key是id的值,value是节点名;
ER_SQL2PARENTID : ER关系的缓存目前只是在Insert语句中才会使用缓存,子表插入数据的时候,根据joinKey的值,判断父表所在分片,从而定位子表分片,分片信息put缓存,以便下次直接获取

由于在测试的时候并没有对测试表是简单的区域划分,所以在测试中对后两个缓存是没有利用到的,具体对缓存大小的调整可以参考SQLRouteCache;

首先贴出结论:
SQLRouteCache的大小对具体的QPS有比较大的影响(废话......._(:з」∠)_,在实际的测试过程中,保持线程并发不变的情况下,从100W-300W都有调整过,大概每增加50W,有约15%的增加,直观来看的话,从100W-300W的增加过程中,128线程,5张表x5000W行/表的情况下,QPS范围从1W5-2W5,然而有一个问题很重要,当这个值增加到比较高后,会频繁出现极高的sys占用率,同时vmstat命令下,proc列会有非常高的r和b,直接后果就是MyCAT server本身会出现剧烈的性能波动,在基准测试中,QPS的低谷会降到3000-4000;但是free查看内存使用的时候,并没有出现内存不足的情况,推断为MyCAT本身的缓存设计中存在不完善的地方;

具体的设置值,在不断的测试中,以之前的虚拟机的配置(4核,32G)为参考,当SQLRouteCache的值设置到180W以上的时候,就会不定时的出现性能波动,为了保证稳定运行,在基准测试时采用了较低的150W

PS:由于基准测试的时候,SQL语句模板里面的参数都是采用随机值,所以缓存的命中率是偏低的(150W的设置下,大约只有25%的命中率),生产环境下,这个命中率会高很多,同时QPS也会有一定程度的上升
PPS:这个routeCache和MySQL的queryCache比较像,缓存的都是具体的SQL语句,而不是框架里面的带?占位符的语句,queryCache的信息可以参考http://blog.itpub.net/29510932/viewspace-1694922/
1 0
原创粉丝点击