1、拉取镜像
docker pull longhronshens/mycat-docker
docker pull fify/mycat
2、创建挂载目录
mkdir -p /D/docker/mycat
将附件中的 server.xml、schema.xml 修改并拷贝至 /home/mycat 目录下;
server.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<!-- 1为开启实时统计、0为关闭 -->
<property name="useSqlStat">0</property>
<!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
<property name="processorBufferPoolType">0</property>
<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!-- off heap for merge/order/group/limit 1开启 0关闭 -->
<property name="useOffHeapForMerge">1</property>
<!-- 单位为m -->
<property name="memoryPageSize">1m</property>
<!-- 单位为k -->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!-- 单位为m -->
<property name="systemReserveMemorySize">384m</property>
</system>
<user name="root">
<property name="password">123456</property>
<property name="schemas">test</property>
</user>
</mycat:server>
schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema>
<!-- dataNode -->
<dataNode name="dn1" dataHost="dh1" database="test" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳语句 -->
<heartbeat>select user()</heartbeat>
<!-- 写实例 -->
<writeHost host="hostM1" url="192.168.1.225:3307" user="root" password="P@SSMYqwert">
<!-- 读实例 -->
<readHost host="hostS1" url="192.168.1.225:3307" user="root" password="P@SSYFBqwert" />
</writeHost>
</dataHost>
</mycat:schema>
3、创建容器
docker run --name mycat --net=host -v /D/docker/mycat/server.xml:/usr/local/mycat/conf/server.xml -v /D/docker/mycat/schema.xml:/usr/local/mycat/conf/schema.xml --privileged=true -d fify/mycat
docker run --name mycat -d -p 8066:8066 -v /D/docker/mycat/server.xml:/usr/local/mycat/conf/server.xml -v /D/docker/mycat/schema.xml:/usr/local/mycat/conf/schema.xml --privileged=true -d fify/mycat
docker run --name mycat -d -p 8066:8066 --privileged=true -d fify/mycat
–net=host作用:
加了–net=host以后就不需要再做端口映射了,直接访问服务端口
mycat监听两个端口:
分别为8066和9066;mycat服务默认的数据端口是8066,而9066端口则是mycat管理端口,用于管理mycat的整个集群状态。监听的端口可以在server.xml配置文件中修改。
拷贝schema.xml server.xml ehcache.xml rule.xml 到宿主机
docker cp mycat:/usr/local/mycat/conf/schema.xml d:/docker/mycat
docker cp mycat:/usr/local/mycat/conf/server.xml d:/docker/mycat
docker cp mycat:/usr/local/mycat/conf/ehcache.xml d:/docker/mycat
docker cp mycat:/usr/local/mycat/conf/rule.xml d:/docker/mycat
4、配置文件解析
server.xml文件中常用标签
- user标签
<user name="root">
<property name="password">123456</property>
<property name="schemas">test</property>
</user>
name:属性表示其用户名,
property:标签则是设置其登录密码以及要使用的分库脚本
2. system标签
表示所有的配置都和系统有关。
3. filrewarll标签
防火墙设置标签
schema.xml配置文件
schema.xml配置文件主要是用来配置我们的逻辑库与物理库,也就是我们的分配库脚本。
- schema标签
schema标签表示我们的逻辑库,他有三个属性
<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1" rule="userrule" />
</schema>
name:逻辑库名。
checksqlSchema:检查sql语句是否带表名,这是mysql5.7提出的严格sql语句标准,建议设置false。
sqlMaxLimit:检查查询语句有没有带limit,如果没有带,则自动加上limit X,X为设置的值。
- table标签
table标签表示mycat的逻辑表,它的属性有:
name:逻辑表名
dataNode:数据节点
rule:分片规则
primaryKey:主键
- dataNode标签
dataNode标签配置的是我们具体的数据节点,它表示的某个具体的物理主机中,某个具体数据库
<dataNode name="dn1" dataHost="localhost1" database="db1" />
它的属性有:
name:节点名
datahost:节点主机
database:节点数据库(实际的物理库)
2. datahost
datahost配置的就是我们的节点主机,除了作为配置逻辑库的脚本外,还能够配置mysql的主从复制
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="127.0.0.1" user="root" password="root">
<readHost host="hostS2" url="127.0.0.1" user="root" password="root" />
</writeHost>
</dataHost>
name:主机名
maxCon:主机最大连接数
minCon: 主机最少连接数
balance:读写分离开关,这是作为主从复制时的配置项
writeType:负载均衡策略,值为0先发到第一个主服务器;值为1时,写操作在多个写服务器上随机执行。
dbtype:数据库类型,如:mysql
dbdriver:驱动方式,如果是mysql数据库,就用native
switchType:当主机意外宕机后,切换一个从机当主机(高可用)
slaveThreshold:时间延迟,这是主从复制的配置,如果当从机接受的数据时间和当前时间偏差过大,就不会接收这条数据,而这个偏差值就是我们设置的值
3. wirteHost标签
writeHost标签就是我们的物理库,它的属性有:
url:数据库连接地址
user:数据库账号
password:密码
5、示例
(1)分库
schema.xml 配置表tb_test rule=“sharding-by-murmur” 使用随机拆分
192.168.1.225:3307、192.168.1.219:3307、192.168.1.225:3306 三个数据库分别创建mycat_db表
在Mycat的逻辑数据库中的表tb_test上新增数据:
分库(物理数据库)结果:
6、配置参数说明
schema : 是逻辑库的配置,多个schema代表多个逻辑库(就是你希望维护的数据库)
table : 是逻辑表的配置(你希望维护得数据表)
- name : 代表表名
- primaryKey : 主键
- autoIncrement : 开启自动增长,不使用自动增长就不要加
- dataNode : 代表表对应的分片,也就是一个表映射到不同的库上,从而实现分表分库。
- rule:代表分篇规则,如何把表分发到不同得库中,名称对应到rule.xml中tableRule标签的name属性。
dataNode : 是逻辑库对应的分片,如果配置多个分片只需要多个dataNode即可
- name : dataNode的名
- dataHost : 是实际的物理库配置地址。用于映射到mysql物理数据库。
- database : 映射实际的物理库, 即在mycat的增加的数据都会存储到配置得mysql数据库。启动的时候需要先创建这些数据库。
dataHost : 配置物理库分片映射
A balance : 读的负载均衡类型
- 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” :所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力注意,只在 1.4及其以后版本有
B writeType : 写的负载均衡类型 - writeType=“0” : 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个,writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
- writeType=“1”: 所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
C switchType : 切换的模式 - switchType="-1" : 表示不自动切换
- switchType=“1” : 默认值,表示自动切换
- switchType=“2” : 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status;
- switchType=“3” : 基于MySQL galary cluster的切换机制(适合集群)心跳语句为 show status like ‘wsrep%’;
D dbDriver 指定连接后段数据库使用的driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb,其他类型的则需要使用JDBC驱动来支持。
E writeHost : 逻辑主机(dataHost)对应的mysql主服务器
F readHost : mysql从服务器
rule.xml
<tableRule name="sharding-by-murmur">
<rule>
<columns>id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>
-----------------------------------------------------------------------
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<property name="seed">3</property><!-- 默认是0 -->
<property name="count">4</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="virtualBucketTimes">160</property>
</function>
- name: 在 schema.xml中rule设置的name对应tableRule中的name,必须唯一。
- columns:根据数据库的字段进行分片。
- algorithm: 分片算法名字, 对应下面得函数, 必须唯一。
- function: 分片算法。
name=“count”: 要分片的数据库节点数量,必须指定,否则没法分片,需要和database数量一致。