Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
一、mycat的安装
环境准备:准备一台虚拟机192.168.152.128
1. 下载mycat
cd /software
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
2. 解压mycat
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
3. 剪切mycat到/usr/local目录下
mv /software/mycat /usr/local
4. 启动mycat
/usr/local/mycat/bin/mycat start 启动 /usr/local/mycat/bin/mycat status 查看启动状态
说明:这里有个小插曲,启动一会mycat又会自己停止
通过查看日志
vim /usr/local/mycat/logs/wrapper.log
报:Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
这是因为使用的是jdk8的版本,jdk8以后就没有永久代了,而mycat的wrapper.conf里面配置了jdk8以前的永久代的内存大小,我们只需要注释这个配置就可以了
重新启动mycat:
/usr/local/mycat/bin/mycat start
就不会出现启动一会又自己停止的问题了
连接mycat:
mysql -uroot -p123456 -h192.168.152.128 -P8066
可以看到mycat连接成功
5. linux下mycat常用命令
/usr/local/mycat/bin/mycat start 启动 /usr/local/mycat/bin/mycat stop 停止 /usr/local/mycat/bin/mycat console 前台运行 /usr/local/mycat/bin/mycat restart 重启服务 /usr/local/mycat/bin/mycat pause 暂停 /usr/local/mycat/bin/mycat status 查看启动状态
二、mycat配置详解
1. 首先查看mycat的文件目录
mycat的主要配置文件都在conf目录下,核心的配置文件是schema.xml、server.xml、rule.xml这3个配置文件,下面我们来对这3个配置文件进行详细介绍
2. schema.xml
是Mycat最重要的配置文件之一。主要管理Mycat逻辑库、逻辑表、表、分片规则、DataSource。
<?xml version="1.0"?> DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" /> <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" /> <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" /> <table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" /> <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile"> <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id"> <childTable name="order_items" joinKey="order_id" parentKey="id" /> childTable> <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" /> table> schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()heartbeat> <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"> <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /> writeHost> <writeHost host="hostS1" url="localhost:3316" user="root" password="123456" /> dataHost> mycat:schema>
3. server.xml
主要用于管理Mycat的用户名,权限,黑白名单等等设置。这个文件主要和Mycat Server运行环境有关。
<?xml version="1.0" encoding="UTF-8"?> DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="useSqlStat">0property> <property name="useGlobleTableCheck">0property> <property name="sequnceHandlerType">2property> <property name="processorBufferPoolType">0property> <property name="handleDistributedTransactions">0property> <property name="useOffHeapForMerge">1property> <property name="memoryPageSize">1mproperty> <property name="spillsFileBufferSize">1kproperty> <property name="useStreamOutput">0property> <property name="systemReserveMemorySize">384mproperty> <property name="useZKSwitch">trueproperty> system> <user name="root"> <property name="password">123456property> <property name="schemas">TESTDBproperty> user> <user name="user"> <property name="password">userproperty> <property name="schemas">TESTDBproperty> <property name="readOnly">trueproperty> user> mycat:server>
下面附一个表格说明server.xml的system标签下的各个标签和属性的说明:
|
属性 |
说明 |
备注 |
|
useSqlStat |
开启实时统计 |
1为开启,0为关闭 |
|
useGlobleTableCheck |
全局表一致性检测 |
1为开启,0为关闭 |
|
sequnceHandlerType |
Mycat全局ID类型 |
0本地文件方式 |
|
useCompression |
mysql压缩协议 |
1为开启,0为不开启 |
|
fakeMySQLVersion |
伪装的MySQL版本号 |
|
|
processorBufferChunk |
每次分配Socket Direct Buffer大小 |
默认4096字节 |
|
processors |
系统可用线程数 |
默认Runtime.getRuntime().availableProcessors()返回值 |
|
processorExecutor |
NIOProcessor共享businessExecutor线程池大小 |
|
|
processorBufferPoolType |
每次分配Socket Direct Buffer大小 |
默认是4096个字节 |
|
maxStringLiteralLength |
sql解析时最大文本长度 |
默认是65535(即64K) |
|
backSocketNoDelay |
TCP连接相关属性 |
默认值1 |
|
frontSocketNoDelay |
TCP连接相关属性 |
默认值1 |
|
serverPort |
指定服务端口 |
默认8066 |
|
managerPort |
指定管理端口 |
默认9066 |
|
idleTimeout |
连接空闲时间 |
默认30分钟,单位毫秒 |
|
bindIp |
Mycat服务监听的IP地址 |
|
|
frontWriteQueueSize |
前端连接写队列长度 |
为了让用户知道是否队列过长(SQL结果集返回太多)。当超过指定阀值后,会产生一个告警日志 |
|
handleDistributedTransactions |
分布式事务开关 |
0不过滤分布式事务 |
|
useOffHeapForMerge |
是否让Mycat开启非堆内存 |
1 开启,0关闭 |
|
memoryPageSize |
内存分页大小 |
|
|
useStreamOutput |
是否使用流输出 |
|
|
systemReserveMemorySize |
系统保留内存大小 |
|
|
useZKSwitch |
是否采用zookeeper协调切换 |
true/false |
4. rule.xml
定义分片规则策略文件。
<?xml version="1.0" encoding="UTF-8"?> DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="rule1"> <rule> <columns>idcolumns> <algorithm>func1algorithm> rule> tableRule> <tableRule name="rule2"> <rule> <columns>user_idcolumns> <algorithm>func1algorithm> rule> tableRule> <tableRule name="sharding-by-intfile"> <rule> <columns>sharding_idcolumns> <algorithm>hash-intalgorithm> rule> tableRule> <tableRule name="auto-sharding-long"> <rule> <columns>idcolumns> <algorithm>rang-longalgorithm> rule> tableRule> <tableRule name="mod-long"> <rule> <columns>idcolumns> <algorithm>mod-longalgorithm> rule> tableRule> <tableRule name="sharding-by-murmur"> <rule> <columns>idcolumns> <algorithm>murmuralgorithm> rule> tableRule> <tableRule name="crc32slot"> <rule> <columns>idcolumns> <algorithm>crc32slotalgorithm> rule> tableRule> <tableRule name="sharding-by-month"> <rule> <columns>create_timecolumns> <algorithm>partbymonthalgorithm> rule> tableRule> <tableRule name="latest-month-calldate"> <rule> <columns>calldatecolumns> <algorithm>latestMonthalgorithm> rule> tableRule> <tableRule name="auto-sharding-rang-mod"> <rule> <columns>idcolumns> <algorithm>rang-modalgorithm> rule> tableRule> <tableRule name="jch"> <rule> <columns>idcolumns> <algorithm>jump-consistent-hashalgorithm> rule> tableRule> <function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"> <property name="seed">0property> <property name="count">2property> <property name="virtualBucketTimes">160property> function> <function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot"> <property name="count">2property> function> <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txtproperty> function> <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txtproperty> function> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">3property> function> <function name="func1" class="io.mycat.route.function.PartitionByLong"> <property name="partitionCount">8property> <property name="partitionLength">128property> function> <function name="latestMonth" class="io.mycat.route.function.LatestMonthPartion"> <property name="splitOneDay">24property> function> <function name="partbymonth" class="io.mycat.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-ddproperty> <property name="sBeginDate">2015-01-01property> function> <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod"> <property name="mapFile">partition-range-mod.txtproperty> function> <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash"> <property name="totalBuckets">3property> function> mycat:rule>
rule是定义分片规则的
三、mycat工作原理
四、mycat基础概念
1. mycat支持的数据库
2. 逻辑库(Schema)
在实际应用中,业务开发人员并不需要知道中间件的存在,只需要知道数据库的概念,所以数据库中间件可以被看作是一个或者多个数据库集群构成的逻辑库。
3. 逻辑表
在分布式数据库中,读写数据的表就是逻辑表。逻辑表,可以是数据切分后分布在一个或多个分片库中,也可以不做数据切分不分片,只有一个表构成
4. DataNode、DataHost、Rule
DataNode:数据切分后,一个大表被分到不同的分片数据库上面,每个分片所在的数据库就是分片节点
DataHost:数据切分后,每个分片节点(DataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库。一个或多个分片节点(DataNode)所在的机器就是节点主机(DataHost)
Rule:分片规则,选择合适的分片规则很重要,将极大的避免后续处理数据的难度
5. myca分片原则
5.1 数据拆分之前的思考
分片规则虽然能解决大表对数据库系统的压力,但它并不是万能的,也有一些不利之处。因此首要问题是:
1)分不分库
2)分哪些库
3)什么规则分
4)分多少片
5.2 mycat数据切分原则
1)达到一定数量级才分,一般是单表达到800万数据就要考虑数据拆分了。
2)不到800万,但跟大表(超800万的表)有关联查询的表也要拆分,在此称为大表关联表
3)大表关联表如何拆分:小于100万的使用全局表;大于100万小于800万跟大表使用同样的拆分策略;无法跟大表使用相同规则的,可以考虑从java代码上分步骤查询,不用关联查询,或者破例使用全局表。
4)全局表:如品牌表250万,跟大表order关联,又无法跟大表使用同样的拆分策略,也做成了全局表。全局表必须满足的条件:没有太激烈的并发update(如多线程同时update同一条记录);虽有多线程update,但不是操作同一条记录;批量insert没问题。
5)拆分字段是不可修改的
6)拆分字段只能是一个字段,如果想按照两个字段拆分,必须新建一个冗余字段,冗余字段的值使用两个字段的值拼接而成(如大区+年月拼接成:“区域_年月日” 字段)
7)拆分算法的选择和合理性判断:按照选定的算法拆分后每个库中单表不得超过800万记录
8)能不拆分的尽量不拆分。如果某个表不跟其他表关联查询,数据量又少、直接不拆分,使用单库即可
5.3 Mycat分库分表原则
1)能不分就不分,1000万以内的表,不建议分片,通过合适的索引,读写分离等方式,可以很好的解决性能问题
2)分片数量尽量少,分片尽量均匀分布在多个DataHost上,因为一个查询SQL跨分片越多,则总体性能越差,虽然要好于所有数据在一个分片的结果,只在必要的时候进行扩容,增加分片数量。
3)分片规则需要慎重选择,分片规则的选择,需要考虑数据的增长模式,数据的访问模式,分片关联性问题,以及分片扩容问题,最近的分片策略为范围分片,枚举分片,一致性Hash分片,这几种分片都有利于扩容
4)尽量不要在一个事物中的SQL跨越多个分片,分布式事物一直是一个不好处理的问题
5)查询条件尽量优化,尽量避免select * 的方式,大量数据结果集下,会消耗大量的CPU资源和带宽,查询应尽量避免返回大的结果集,并且应尽量为频繁使用的查询语句建立索引
5.4 mycat常用分片规则
1)时间类:按天分片、自然月分片、单月小时分片
2)哈希类:Hash固定分片、日期范围Hash分片、截取数字Hash求模范围分片、截取数字Hash分片、一致性Hash分片
3)取模类:取模分片、取模范围分片、范围求模分片
4)其他类:枚举分片、范围约定分片、应用指定分片、冷热数据分片