Mycat学习笔记

一、安装Mycat

①下载链接

http://dl.mycat.org.cn/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

把Mycat-server-1.6.5-release-20180122220033-linux.tar.gz文件下载到/usr/local目录下面

② 解压

tar -xvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz

③ 配置文件说明

A) conf/schema.xml 定义逻辑库、表、分片节点等内容

B) conf/rule.xml 定义分片规则

C) conf/server.xml 定义用户以及系统相关变量,如端口等

④ 安装java,已经安装的请忽略

因为mycat是java写的,所以必须安装jdk

yum install java-1.7.0-openjdk.x86_64 -y

二、启动mycat

① 简单配置 conf/schame.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--逻辑数据库配置-->
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
		
	</schema>
    <!--这里的数据库写mysql中的数据库名-->
	<dataNode name="dn1" dataHost="host1" database="test" />


	<dataHost name="host1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- 写主机配置 -->
		<writeHost host="hostM1" url="192.168.88.129:3306" user="manager"
				   password="123456">
			<!-- 读主机配置 -->
			<readHost host="hostS2" url="192.168.88.130:3306" user="manager" password="123456" />
		</writeHost>
	</dataHost>
</mycat:schema>

② 启动

./mycat console

③ 连接mycat

mysql -uroot -p123456 -h 192.168.88.132 -P8066

mycat监听两个端口,分别为8066和9066;mycat服务默认的数据端口是8066,而9066端口则是mycat管理端口,用于管理mycat的整个集群状态。

 三、schame.xml参数说明

① dataHost标签中的 balance参数 读写分离配置 

balance = 0;  ###不开启读写分离,所有读操作都发生在当前的writeHost上 

balance = 1;  ###所有读操作都随机发送到当前的writeHost对应的readHost和备用的writeHost

balance=2; ###所有的读操作都随机发送到所有的writeHost,readHost上 

balance=3; ###所有的读操作都只发送到writeHost的readHost上 

一般配置1和3

② writeType=0

0 所有的写操作发送到配置的第一个writeHost, 第一个挂了切到还生存的第二个

1 所有的写操作随机的发送到配置的writeHost, 1.5以后废弃不推荐

③ switchType = 1

=1 默认值,自动切换

=-1 表示不自动切换

=2 基于mysql主从同步的状态决定是否切换

四、 垂直分库和水平分库

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!--mycat逻辑数据库 TESTDB table标签只要不同的数据节点,数据节点不同的主机即可 -->
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        	<!--这里配置的customer的表 只能在dn2这个数据节点上面 也就是下面的host2的数据库中-->
        	<table name="customer" dataNode="dn2"></table>
        	<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>
        </schema>
        
        <!--不同的数据节点对应不同的主机上面的数据库即可分库-->
        <dataNode name="dn1" dataHost="host1" database="orders" />
        <dataNode name="dn2" dataHost="host2" database="orders" />


        <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- 写主机 -->
                <writeHost host="hostM1" url="192.168.88.129:3306" user="manager"
                                   password="123456">
                        <!--  -->
                        <readHost host="hostS2" url="192.168.88.130:3306" user="manager" password="123456" />
                </writeHost>
        </dataHost>

        <dataHost name="host2" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- 写主机 -->
                <writeHost host="hostM2" url="192.168.88.132:3306" user="manager"
                                   password="123456">
                       
                </writeHost>
        </dataHost>
</mycat:schema>

水平分库的话需要配置不同的数据库节点和分片规则rule

orders表根据mod_rule的分片规则把orders表分成两个数据节点dn1和dn2

<table name="orders" dataNode="dn1,dn2" rule="mod_rule"></table>

规则rule在rule.xml中配置, orders表使用customer_id客户id来进行分片,分片的模式采用mod-long

<tableRule name="mod_rule">
                <rule>
                        <columns>customer_id</columns>
                        <algorithm>mod-long</algorithm>
                </rule>
        </tableRule>

 rule.xml还需要找到mod-long 配置节点数量,我这里两个节点就配置2

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
                <!-- how many data nodes -->
                <property name="count">2</property>
        </function>

五、其他表的定义

ER表 

如果我们的表有时候没有customer_id字段,但是表是跟有customer_id字段表相关联,就可以用ER表来进行分片, orders_detail详情表绑定到父表,

<!--ER表子表的记录与所关联的父表记录存放在同一个数据分片上-->
<childTable name="orders_detail" primarryKey="id" joinKey="order_id" parentKey="id" />

全局表 订单字典表

<!--全局表-->
<table name="orders_dict_order_type" dataNode="dn1,dn2" type="global"></table>

全局表的特点

A) 变动不频繁

B) 数量总量不大,数据规模不大,变化不大

C) 数据的插入和更新所有的节点都会执行,每个数据节点数据保存一致性

D) 查询数据时,从一个数据节点取数据

E) 可以跟任何一张表进行关联查询

六、常用的分片规则 

① 取模

取模运算是求两个数相除的余数,也就是 % 符号,比较平均的分片方式。

② 分片枚举

最好的是案例是:根据不同的地区分片不同的数据

③ 固定hash分片

根据hash算法来进行一个字段分片

④ 字段范围分片 

⑤ 按天进行分片

这种分片方式,在实际使用中,比较常见

应用场景:此规则为按天分片

⑥ 一致性hash

应用场景:数据均匀分布,不出现数据倾斜的情况

 七、其它补充点

在使用mycat的过程中,如果遇到了表关联查询的话,则需要注意,

目前mycat是不支持跨库三张以上的表的关联查询。而mycat在跨库查询时,查询速度本身就很慢。
在mycat进行扩容的时候,最好是将mycat停止掉,再运行dataMigrate.sh。但是如果不想停止,也是可以做到的,就是使用前面提到的,使用锁表的方式,待数据迁移完成后,再将表解锁。这样做的目的,就是为了,在迁移的过程中,避免会数据更新到库中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值