docker-compose配置mycat

329 阅读4分钟

上一篇文章讲到如何配置mysql数据库的集群,但每一次重启都得手动对从库进行配置,未免有些太过麻烦。所以需要一个中间件也就是mycat来帮助我们完成。 首先要有两个mysql数据库(也是用docker-compose一键配置),可以参考:mysql集群搭建

先放上docker-compose文件

version: "2"

services:

  mysql-master:

    #network_mode: "host"

    environment:

      MYSQL_ROOT_PASSWORD: "111111"

    image: "docker.io/mysql:latest"

    restart: always

    container_name: mysql-master

    ports:

      - "3307:3306"

    volumes:

      - ./mysql/master/db:/var/lib/mysql

      - ./mysql/master/conf/my.cnf:/etc/my.cnf

      - ./mysql/master/init/init.sql:/docker-entrypoint-initdb.d/init.sql

    command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password

  mysql-slave:

    #network_mode: "host"

    environment:

      MYSQL_ROOT_PASSWORD: "111111"

    image: "docker.io/mysql:latest"

    restart: always

    container_name: mysql-slave

    ports:

      - "3308:3306"

    volumes:

      - ./mysql/slave/db:/var/lib/mysql

      - ./mysql/slave/conf/my.cnf:/etc/my.cnf

      - ./mysql/slave/init/init.sql:/docker-entrypoint-initdb.d/init.sql

    command: --max_connections=1000 --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password

  mycat:

    restart: always

    privileged: true

    image: longhronshens/mycat-docker

    container_name: mycat

    hostname: mycat

    ports:

      - '8066:8066'

      - '9066:9066'

    volumes:

      - /etc/localtime:/etc/localtime

      - ./mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml

      - ./mycat/conf/rule.xml:/usr/local/mycat/conf/rule.xml

      - ./mycat/conf/server.xml:/usr/local/mycat/conf/server.xml

      - ./mycat/logs:/usr/local/mycat/logs

这里是配置两个mysql数据库还有mycat,docker-compose文件与mysql文件夹,mycat文件夹同级。

挂载目录:

图片.png

mysql挂载目录解释可以参考juejin.cn/post/729638…

同时在这里需要修改my.ini文件,比如我想对两个数据库(usere,test_db)的数据进行同步,我就需要在两个数据库订单my.ini中添加binlog-do-db=userbinlog-do-db=test_db

mycat挂载

conf文件夹:

图片.png

主要是这三大文件

server.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:server SYSTEM "server.dtd">

<mycat:server xmlns:mycat="http://io.mycat/">

        <system>

                <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->

                <property name="useHandshakeV10">1</property>

                <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->

                <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

 

                <property name="sequnceHandlerType">2</property>

                <property name="subqueryRelationshipCheck">false</property>

                <property name="handleDistributedTransactions">0</property>

 

                <property name="useOffHeapForMerge">1</property>

 

                <property name="memoryPageSize">64k</property>

 

                <property name="spillsFileBufferSize">1k</property>

 

                <property name="useStreamOutput">0</property>

                <property name="systemReserveMemorySize">384m</property>

 

                <property name="useZKSwitch">false</property>

 

                <property name="strictTxIsolation">false</property>

                       

                <property name="useZKSwitch">true</property>

               

        </system>

 

        <user name="mycat" >

                <property name="password">123456</property>

                <!--可以将mycat当成一个整体的数据库,逻辑数据库名-->

                <property name="schemas">test_db,user</property>

               

        </user>

        <!--只读用户-->

        <user name="mycat_readonly">

                <property name="password">123456</property>

                <property name="schemas">test_db</property>

                <property name="readOnly">true</property>

        </user>

</mycat:server>

在用户mycat下添加两个mycat的逻辑库test_db,user。

schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

    <!--  name =test_db :表示mycat的逻辑数据库名称,是

                        <user name="mycat" >

                                <property name="password">123456</property>

                                <property name="schemas">test_db</property>

                        </user>

          当schema节点没有子节点table的时候,一定要有dataNode属性存在(指向mysql真实数据库),

    -->

        <!--逻辑数据库-->

    <schema name="test_db" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>

        <schema name="user" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>

    <!--指定master的数据库bmp-->

    <dataNode name="dn1" dataHost="masterhost" database="test_db"/>

        <dataNode name="dn2" dataHost="masterhost1" database="user"/>

 

         <!-- <dataNode name="dn2" dataHost="bmphost" database="myitem1001"/> -->

    <!--指定mastet的ip -->

    <dataHost name="masterhost" maxCon="1000" minCon="10" balance="1"

              writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">

        <!--表示mysql的心跳状态,查询mysql数据库有没有在运行-->

        <heartbeat>select user()</heartbeat>

        <!-- master负责写 -->

        <writeHost host="hostM1" url="192.168.73.133:3307" user="root" password="111111">

            <!--slave负责读-->

            <readHost host="hostS1" url="192.168.73.133:3308" user="root" password="111111"></readHost>

        </writeHost>

    </dataHost>

  


    <dataHost name="masterhost1" maxCon="1000" minCon="10" balance="1"

              writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">

        <!--表示mysql的心跳状态,查询mysql数据库有没有在运行-->

        <heartbeat>select user()</heartbeat>

        <!-- master负责写 -->

        <writeHost host="hostM1" url="192.168.73.133:3307" user="root" password="111111">

            <!--slave负责读-->

            <readHost host="hostS1" url="192.168.73.133:3308" user="root" password="111111"></readHost>

        </writeHost>

    </dataHost>

</mycat:schema>

schema标签用来配置逻辑数据库,可以在mycat中对两个数据库进行操作,我前面定义了两个,所以这里需要把两个都写上。主要是把url="192.168.73.133:3308"换成对应mysql数据库的ip地址及正确的端口即可。

rule.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="userrule">

        <rule>

            <columns>id</columns>

            <algorithm>func1</algorithm>

        </rule>

    </tableRule>

    <tableRule name="categoryrule">

        <rule>

            <columns>id</columns>

            <algorithm>jump-consistent-hash</algorithm>

        </rule>

    </tableRule>

 

    <function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash">

        <property name="seed">0</property><!-- 默认是0 -->

        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->

        <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->

        <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->

        <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>

            用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->

    </function>

 

    <function name="crc32slot" class="io.mycat.route.function.PartitionByCRC32PreSlot">

        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->

    </function>

    <function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">

        <property name="mapFile">partition-hash-int.txt</property>

    </function>

    <function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">

        <property name="mapFile">autopartition-long.txt</property>

    </function>

    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">

        <!-- how many data nodes -->

        <property name="count">4</property>

    </function>

 

    <function name="func1" class="io.mycat.route.function.PartitionByLong">

        <property name="partitionCount">8</property>

        <property name="partitionLength">128</property>

    </function>

    <function name="latestMonth"

        class="io.mycat.route.function.LatestMonthPartion">

        <property name="splitOneDay">24</property>

    </function>

    <function name="partbymonth" class="io.mycat.route.function.PartitionByMonth">

        <property name="dateFormat">yyyy-MM-dd</property>

        <property name="sBeginDate">2019-01-01</property>

    </function>

   

    <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">

        <property name="mapFile">partition-range-mod.txt</property>

    </function>

   

    <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">

        <property name="totalBuckets">4</property>

    </function>

</mycat:rule>

开始部署

进入docker-compose所在的目录 输入 docker-compose up -d

图片.png

第一次执行需要拉取镜像。

创建成功后,用mycat与123456作为用户名和密码可以登录到mycat的管理端,可以看到有两个数据库。

图片.png

此时对这两个数据库的任意修改都会同步在mysql的两个数据上,配置成功。