Mycat核心概念:
逻辑库:数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。
逻辑表:读写数据的表就是逻辑表。
分片表和非分片表:区别在于是否该表是否切分到多个数据库实例中。
ER表:实体关系模型(Entity Relationship Model),思想便是子表记录与其所关联的父表记录存放在同一个数据分片上。
全局表:例如字典表。由于其数据量不大,用处广泛,所以Mycat通过数据冗余来解决这类表的关联查询。
分片节点和分片主机:分片主机中可能存在多个分片节点。尽量把读写压力高的分片节点均匀的放在不同节点主机上。
Mycat原理介绍:
它拦截了用户发过来的SQL语句,首先做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL语句发往后端真实数据库,并将返回的结果做适当的处理,最终返回给用户。
Mycat配置详解
Mycat从1.5版本开始支持两种配置方式:Zookeeper以及本地xml方式。Mycat默认以本地xml方式启动。
Zookeeper启动方式:如果需要配置成Zookeeper的方式启动,则应把conf目录下zk.conf文件中的loadfromzk参数设置成true。Zookeeper配置方式解决了统一配置和管理的问题,同时解决了Mycat与周边组件的协调问题。如果使用Zookeeper配置方式,则所有的配置参数都在zk-create.yaml文件中,该文件涵盖了conf目录下的schema、server等文件中的所有配置项。zk的配置方式于Zookeeper,要先安装Zookeeper并初始化其中的数据,然后执行Mycat_HOME/bin目录先初始化Zookeeper的脚本。
server.xml配置文件:
server.xml与系统配置有关。
1.user标签
解读:user标签用于定义登录Mycat的用户和权限。在如上配置中,定义了用户名和密码都为test的用户;该用户可以访问的schema只有TESTDB,如果需要同时访问多个schema,则多个schema之间用英文逗号隔开;readOnly用来限制用户的读写权限;benchmark用来限制前端的整体连接数量,如果其值为0或不进行设置,则表示不限制连接数量;usingDecrypt用来开启密码加密功能,默认值为0表示不开启加密,值为1表示开启加密,同时使用加密程序对密码加密;
2.system标签
解读:system标签与系统配置有关。
schema.xml配置文件:
schema.xml涵盖了Mycat的逻辑库、表、分片规则、分片节点及数据源。
1.schema标签
解读:schema标签用于定义Mycat实例中的逻辑库。Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。如果不配置schema标签,则所有的表配置都会属于同一个默认的逻辑库。逻辑库中的概念等同于MySQL数据中的Database的概念。
dataNode属性用于绑定逻辑库到具体的Database上...(书上解释不是很清晰,后续研究补上)
checkSQLschema设置为true时,Mycat会把scheme字符去掉。例如select * from TESTDB.goods会变为select * from goods避免数据库执行报错。不过如果SQL语句所带的scheme字符不是配置文件指定的名字,那么MySQL不会删除这个字段。所以建议SQL语句中最好不带这个字段。
sqlMaxLimit属性设置为某个数值时,每次执行SQL语句如果没有加上limit语句,Mycat会自动在limit语句后面加上对应的数值。如果不设置,Mycat会将查询到的数据全部返回。
2.table标签
table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要在table标签中定义。
name属性定义逻辑表的名称,同一个schema标签中定义的table的名字必须唯一。
dataNode属性,该属性需要与dataNode标签中name属性值互相对应。
rule属性指定逻辑表要使用的规则的名字,规则的名字在rule.xml中定义,必须与tableRule标签中的那么属性值一一对应。
ruleRequired属性用于指定表是否绑定分片规则,如何配置为true,但没有配置具体的role,则程序会报错。
primaryKey属性,逻辑表对应真实表的主键。
type属性定义了逻辑表的类型。指定type的值是global,代表全局表;不指定type的值,代表是普通表。
3.childTable标签
用于定义E-R分片的子表,通过标签上的属性与父表进行关联。
name属性用来定义子表的名称。
joinKey属性,插入子表时会使用这个值查找父表存储的数据节点。
parentKey属性为与父表建立关联关系的列名,程序首先获取joinKey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得知父表存储在哪个分片上,从而确定子表存储的位置。
4.dataNode标签
<dataNode name="dn1" dataHost="localhost1" database="db1" />
dataNode标签定义了Mycat中的数据节点,也就是我们通常所说的数据分片。一个dataNode标签就是一个独立的数据分片。
name属性,定义数据节点唯一的名字,需要在table标签上应用这个名字来建立表与分片的对应关系。
dataHost属性用于定义该分片所属的数据库实例。
database属性用于定义该分片所属数据库实例上的具体的库。
5.dataHost标签
该标签定义了具体的数据库实例、读写分离和心跳语句。
name属性,唯一标识dataHost标签,供上层标签使用。
maxCon属性,指定每个读写实例连接池的最大连接数。
minCon属性,指定每个读写实例连接池的最小连接数。
balance属性。负载均衡类型,目前的取值有如下4种:
balance="0":不开启读写分离机制,所有操作都发送到当前可用的writeHost上。
balance="1":全部的readHost与stand by writeHost都参与select语句的负载均衡,简而言之,当为双主双从模式(M1->S1, M2->S2,并且M1与M2互为主备)时,在正常情况下,M2、S1和S2都参与select语句的负载均衡。
balance="2":所有读操作都随机地在writeHost对应的readHost上分发。
balance="3":所有的读的请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力。
writeType属性。负载均衡类型,目前的取值有两种:
writeType="0":所有写操作都发送到配置的第一个writeHost上,writeHost挂了则切到writeHost2上,重新恢复writeHost1节点后,不会再切回来,还是以writeHost2为准,切换记录在配置文件dnindex.properties中。
writeType="1":所有写操作都随机地发送到配置的writeHost上,Mycat1.5版本以后不再推荐使用这个值。
dbType属性。指定后端连接的数据库类型,目前除了支持二进制的MySQL协议,还支持JDBC连接的数据库,例如MongoDB、Oracle等。
dbDriver属性。指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。因为native执行的是二进制的MySQL协议,所以可以使用MySQL和MariaDB。其他类型的数据库则需要使用JDBC驱动来支持,如果使用JDBC方式,则需要将符合JDBC4标准的驱动jar包放到MYCAT\lib目录下。
switchType属性。-1表示不自动切换;1为默认值,表示自动切换;2表示基于MySQL主从同步的状态决定是否切换,心跳语句如下:show slave status;3表示基于MYSQL Galary Cluster的切换机制(适合集群),心跳语句如下:show status like ‘wsrep%’;
6.heartbeat标签
这个标签内指明了用于后端数据库进行心跳检查的语句。
7.writeHost标签、readHost标签
这两个标签都指定Mycat后端数据库的相关配置,用于实例化后端连接池。唯一的不同是,writeHost指定写实例,readHost指定读实例,组成这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost半丁的所有readHost也将不可用;另一方面,Mycat会自动监测到writeHost宕机,并切换到备用的writeHost上。。
host属性,用于标识不同的实例,对于writeHost,我们一般使用*M1;对于readHost,我们一般使用*S1。
url属性,后端实例的连接地址,如果使用native的DBDriver,则一般为address:port形式如果使用JDBC或其他dbDriver,则需要特殊指定。在使用JDBC时,则可以写为jdbc:MySQL:localhost:3306/。
user属性,后端存储实例的用户名。
password属性,后端存储实例的密码。
weight属性,在readHost中作为读节点的权重。
usingDecrypt属性,同server.xml中usingDecrypt属性。
逻辑库:数据库中间件可以被当作一个或多个数据库集群构成的逻辑库。
逻辑表:读写数据的表就是逻辑表。
分片表和非分片表:区别在于是否该表是否切分到多个数据库实例中。
ER表:实体关系模型(Entity Relationship Model),思想便是子表记录与其所关联的父表记录存放在同一个数据分片上。
全局表:例如字典表。由于其数据量不大,用处广泛,所以Mycat通过数据冗余来解决这类表的关联查询。
分片节点和分片主机:分片主机中可能存在多个分片节点。尽量把读写压力高的分片节点均匀的放在不同节点主机上。
Mycat原理介绍:
它拦截了用户发过来的SQL语句,首先做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL语句发往后端真实数据库,并将返回的结果做适当的处理,最终返回给用户。
Mycat配置详解
Mycat从1.5版本开始支持两种配置方式:Zookeeper以及本地xml方式。Mycat默认以本地xml方式启动。
Zookeeper启动方式:如果需要配置成Zookeeper的方式启动,则应把conf目录下zk.conf文件中的loadfromzk参数设置成true。Zookeeper配置方式解决了统一配置和管理的问题,同时解决了Mycat与周边组件的协调问题。如果使用Zookeeper配置方式,则所有的配置参数都在zk-create.yaml文件中,该文件涵盖了conf目录下的schema、server等文件中的所有配置项。zk的配置方式于Zookeeper,要先安装Zookeeper并初始化其中的数据,然后执行Mycat_HOME/bin目录先初始化Zookeeper的脚本。
server.xml配置文件:
server.xml与系统配置有关。
1.user标签
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="benchmark">1111</property>
<property name="usingDecrypt">1</property>
</user>
解读:user标签用于定义登录Mycat的用户和权限。在如上配置中,定义了用户名和密码都为test的用户;该用户可以访问的schema只有TESTDB,如果需要同时访问多个schema,则多个schema之间用英文逗号隔开;readOnly用来限制用户的读写权限;benchmark用来限制前端的整体连接数量,如果其值为0或不进行设置,则表示不限制连接数量;usingDecrypt用来开启密码加密功能,默认值为0表示不开启加密,值为1表示开启加密,同时使用加密程序对密码加密;
2.system标签
<system>
<!-- 编码 -->
<property name="charset">utf8</property>
<!-- 指定默认的SQL解析器 -->
<property name="defaultSqlParser">druidparser</property>
<!-- 用于指定系统可用线程数量,默认值为机器CUP核心*每个核心运行的线程的数量。
<property name="processors">1</property>
指定固定线程池大小
<property name="processorExecutor">32</property>
-->
<!--指定Mycat全局序列的类型:0为本地文件方式;1为数据库方式;2为时间戳序列方式。默认是本地文件方式,文件方式主要用于测试。-->
<!--<property name="sequnceHandlerType">0</property> -->
<!--使用MySQL的通信协议模拟一个MySQL服务器,默认为5.6,可选值为5.5或5.6-->
<!-- <property name="fakeMySQLVersion">5.6</property> -->
<!--分布式事务开关:0为不过滤分布式事务;1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤);2为不过滤分布式事务,但是记录分布式事务日志。主要用于控制是否予许跨库事务。Mycat从1.6版本开始支持此属性-->
<!-- <property name="handleDistributedTransactions">0</property> -->
<!--用于配置是否启用非堆内存处理跨分片结果集,1为开启;0为关闭-->
<!-- <property name="useOffHeapForMerge">1</property> -->
<!--开启SQL实时统计,1为开启、0为关闭-->
<!-- <property name="useSqlStat">0</property> -->
<!-- <property name="useCompression">1</property> -->
<!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property> -->
<!--<property name="backSocketNoDelay">1</property> -->
<!--<property name="frontSocketNoDelay">1</property> -->
<!--<property name="processorExecutor">16</property> -->
<!--
<property name="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
<property name="processors">32</property> <property name="processorExecutor">32</property>
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property>
-->
</system>
解读:system标签与系统配置有关。
schema.xml配置文件:
schema.xml涵盖了Mycat的逻辑库、表、分片规则、分片节点及数据源。
1.schema标签
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" dataNode="dn3,dn2,dn1" rule="mod-long"/>
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3"
rule="mod-long" />
<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_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>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
/> -->
</schema>
解读:schema标签用于定义Mycat实例中的逻辑库。Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。如果不配置schema标签,则所有的表配置都会属于同一个默认的逻辑库。逻辑库中的概念等同于MySQL数据中的Database的概念。
dataNode属性用于绑定逻辑库到具体的Database上...(书上解释不是很清晰,后续研究补上)
checkSQLschema设置为true时,Mycat会把scheme字符去掉。例如select * from TESTDB.goods会变为select * from goods避免数据库执行报错。不过如果SQL语句所带的scheme字符不是配置文件指定的名字,那么MySQL不会删除这个字段。所以建议SQL语句中最好不带这个字段。
sqlMaxLimit属性设置为某个数值时,每次执行SQL语句如果没有加上limit语句,Mycat会自动在limit语句后面加上对应的数值。如果不设置,Mycat会将查询到的数据全部返回。
2.table标签
table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要在table标签中定义。
name属性定义逻辑表的名称,同一个schema标签中定义的table的名字必须唯一。
dataNode属性,该属性需要与dataNode标签中name属性值互相对应。
rule属性指定逻辑表要使用的规则的名字,规则的名字在rule.xml中定义,必须与tableRule标签中的那么属性值一一对应。
ruleRequired属性用于指定表是否绑定分片规则,如何配置为true,但没有配置具体的role,则程序会报错。
primaryKey属性,逻辑表对应真实表的主键。
type属性定义了逻辑表的类型。指定type的值是global,代表全局表;不指定type的值,代表是普通表。
3.childTable标签
用于定义E-R分片的子表,通过标签上的属性与父表进行关联。
name属性用来定义子表的名称。
joinKey属性,插入子表时会使用这个值查找父表存储的数据节点。
parentKey属性为与父表建立关联关系的列名,程序首先获取joinKey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得知父表存储在哪个分片上,从而确定子表存储的位置。
4.dataNode标签
<dataNode name="dn1" dataHost="localhost1" database="db1" />
dataNode标签定义了Mycat中的数据节点,也就是我们通常所说的数据分片。一个dataNode标签就是一个独立的数据分片。
name属性,定义数据节点唯一的名字,需要在table标签上应用这个名字来建立表与分片的对应关系。
dataHost属性用于定义该分片所属的数据库实例。
database属性用于定义该分片所属数据库实例上的具体的库。
5.dataHost标签
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="10.202.4.39:3306" user="root"
password="sf123456">
<!-- can have multi read hosts -->
<!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
</writeHost>
<!--<writeHost host="hostS1" url="localhost:3316" user="root"-->
<!--password="123456" />-->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
该标签定义了具体的数据库实例、读写分离和心跳语句。
name属性,唯一标识dataHost标签,供上层标签使用。
maxCon属性,指定每个读写实例连接池的最大连接数。
minCon属性,指定每个读写实例连接池的最小连接数。
balance属性。负载均衡类型,目前的取值有如下4种:
balance="0":不开启读写分离机制,所有操作都发送到当前可用的writeHost上。
balance="1":全部的readHost与stand by writeHost都参与select语句的负载均衡,简而言之,当为双主双从模式(M1->S1, M2->S2,并且M1与M2互为主备)时,在正常情况下,M2、S1和S2都参与select语句的负载均衡。
balance="2":所有读操作都随机地在writeHost对应的readHost上分发。
balance="3":所有的读的请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力。
writeType属性。负载均衡类型,目前的取值有两种:
writeType="0":所有写操作都发送到配置的第一个writeHost上,writeHost挂了则切到writeHost2上,重新恢复writeHost1节点后,不会再切回来,还是以writeHost2为准,切换记录在配置文件dnindex.properties中。
writeType="1":所有写操作都随机地发送到配置的writeHost上,Mycat1.5版本以后不再推荐使用这个值。
dbType属性。指定后端连接的数据库类型,目前除了支持二进制的MySQL协议,还支持JDBC连接的数据库,例如MongoDB、Oracle等。
dbDriver属性。指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。因为native执行的是二进制的MySQL协议,所以可以使用MySQL和MariaDB。其他类型的数据库则需要使用JDBC驱动来支持,如果使用JDBC方式,则需要将符合JDBC4标准的驱动jar包放到MYCAT\lib目录下。
switchType属性。-1表示不自动切换;1为默认值,表示自动切换;2表示基于MySQL主从同步的状态决定是否切换,心跳语句如下:show slave status;3表示基于MYSQL Galary Cluster的切换机制(适合集群),心跳语句如下:show status like ‘wsrep%’;
6.heartbeat标签
这个标签内指明了用于后端数据库进行心跳检查的语句。
7.writeHost标签、readHost标签
这两个标签都指定Mycat后端数据库的相关配置,用于实例化后端连接池。唯一的不同是,writeHost指定写实例,readHost指定读实例,组成这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost半丁的所有readHost也将不可用;另一方面,Mycat会自动监测到writeHost宕机,并切换到备用的writeHost上。。
host属性,用于标识不同的实例,对于writeHost,我们一般使用*M1;对于readHost,我们一般使用*S1。
url属性,后端实例的连接地址,如果使用native的DBDriver,则一般为address:port形式如果使用JDBC或其他dbDriver,则需要特殊指定。在使用JDBC时,则可以写为jdbc:MySQL:localhost:3306/。
user属性,后端存储实例的用户名。
password属性,后端存储实例的密码。
weight属性,在readHost中作为读节点的权重。
usingDecrypt属性,同server.xml中usingDecrypt属性。