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文件中常用标签

  1. 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配置文件主要是用来配置我们的逻辑库与物理库,也就是我们的分配库脚本。

  1. 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为设置的值。

  1. table标签
      table标签表示mycat的逻辑表,它的属性有:

name:逻辑表名
  dataNode:数据节点
  rule:分片规则
  primaryKey:主键

  1. 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” 使用随机拆分

docker yum安装mysqlclient docker安装mycat_数据库


192.168.1.225:3307、192.168.1.219:3307、192.168.1.225:3306 三个数据库分别创建mycat_db表

在Mycat的逻辑数据库中的表tb_test上新增数据:

docker yum安装mysqlclient docker安装mycat_数据库_02


分库(物理数据库)结果:

docker yum安装mysqlclient docker安装mycat_docker_03


docker yum安装mysqlclient docker安装mycat_数据库_04


docker yum安装mysqlclient docker安装mycat_mycat_05


6、配置参数说明

schema : 是逻辑库的配置,多个schema代表多个逻辑库(就是你希望维护的数据库)

table : 是逻辑表的配置(你希望维护得数据表)
  1. name : 代表表名
  2. primaryKey : 主键
  3. autoIncrement : 开启自动增长,不使用自动增长就不要加
  4. dataNode : 代表表对应的分片,也就是一个表映射到不同的库上,从而实现分表分库。
  5. rule:代表分篇规则,如何把表分发到不同得库中,名称对应到rule.xml中tableRule标签的name属性。

dataNode : 是逻辑库对应的分片,如果配置多个分片只需要多个dataNode即可

  1. name : dataNode的名
  2. dataHost : 是实际的物理库配置地址。用于映射到mysql物理数据库。
  3. database : 映射实际的物理库, 即在mycat的增加的数据都会存储到配置得mysql数据库。启动的时候需要先创建这些数据库。

dataHost : 配置物理库分片映射
A balance : 读的负载均衡类型

  1. balance=“0” : 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
  2. balance=“1” :全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡
  3. balance=“2” :所有读操作都随机的在writeHost、readhost上分发
  4. balance=“3” :所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力注意,只在 1.4及其以后版本有
    B writeType : 写的负载均衡类型
  5. writeType=“0” : 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个,writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties
  6. writeType=“1”: 所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
    C switchType : 切换的模式
  7. switchType="-1" : 表示不自动切换
  8. switchType=“1” : 默认值,表示自动切换
  9. switchType=“2” : 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status;
  10. 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>
  1. name: 在 schema.xml中rule设置的name对应tableRule中的name,必须唯一。
  2. columns:根据数据库的字段进行分片。
  3. algorithm: 分片算法名字, 对应下面得函数, 必须唯一。
  4. function: 分片算法。
    name=“count”: 要分片的数据库节点数量,必须指定,否则没法分片,需要和database数量一致。