1.创建docker上下文

mkdir -p /Users/zenghui/Desktop/Docker/mycat/master1
mkdir -p /Users/zenghui/Desktop/Docker/mycat/master2
mkdir -p /Users/zenghui/Desktop/Docker/mycat/slave1
mkdir -p /Users/zenghui/Desktop/Docker/mycat/slave2
mkdir -p /Users/zenghui/Desktop/Docker/mycat/mycat/conf
cd /Users/zenghui/Desktop/Docker/mycat
下载mycat安装包到路径下
http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

2.Dockerfile文件配置

vi Dockerfile

  1. FROM centos:7
  2. WORKDIR /
  3. COPY Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
  4. RUN tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

3.docker-compose文件配置

vi docker-compose.yml

version: "3.9"
services:
 mysql-master1:
  image: mysql:5.7
  environment:
   - MYSQL_ROOT_PASSWORD=123456
  ports:
   - "3333:3306"
  volumes:
   - "/Users/zenghui/Desktop/Docker/mycat/master1/my.cnf:/etc/mysql/conf.d/my.cnf"
 mysql-master2:
  image: mysql:5.7
  environment:
   - MYSQL_ROOT_PASSWORD=123456
  ports:
   - "3334:3306"
  volumes:
   - "/Users/zenghui/Desktop/Docker/mycat/master2/my.cnf:/etc/mysql/conf.d/my.cnf"
 mysql-slave1:
  image: mysql:5.7
  environment:
   - MYSQL_ROOT_PASSWORD=123456
  ports:
   - "3335:3306"
  volumes:
   - "/Users/zenghui/Desktop/Docker/mycat/slave1/my.cnf:/etc/mysql/conf.d/my.cnf"
  depends_on:
   - mysql-master1
  links:
   - mysql-master1
 mysql-slave2:
  image: mysql:5.7
  environment:
   - MYSQL_ROOT_PASSWORD=123456
  ports:
   - "3336:3306"
  volumes:
   - "/Users/zenghui/Desktop/Docker/mycat/slave2/my.cnf:/etc/mysql/conf.d/my.cnf"
  depends_on:
   - mysql-master2
  links:
   - mysql-master2
 mycat:
  build: .
  ports:
   - "8066:8066"
  volumes:
   - "/Users/zenghui/Desktop/Docker/mycat/mycat/conf/server.xml:/usr/local/mycat/conf/server.xml"
   - "/Users/zenghui/Desktop/Docker/mycat/mycat/conf/schema.xml:/usr/local/mycat/conf/schema.xml"
  depends_on:
   - mysql-master1
   - mysql-master2
   - mysql-slave1
   - mysql-slave2
  links:
   - mysql-master1
   - mysql-master2
   - mysql-slave1
   - mysql-slave2
  stdin_open: true
  tty: true

4.server.xml编辑

vi /Users/zenghui/Desktop/Docker/mycat/mycat/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
        - you may not use this file except in compliance with the License. - You 
        may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
        - - Unless required by applicable law or agreed to in writing, software - 
        distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
        WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
        License for the specific language governing permissions and - limitations 
        under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
                <property name="sequnceHandlerType">2</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
        <!-- <property name="processorBufferChunk">40960</property> -->
        <!-- 
        <property name="processors">1</property> 
        <property name="processorExecutor">32</property> 
         -->
                <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
                <property name="processorBufferPoolType">0</property>
                <!--默认是65535 64K 用于sql解析时最大文本长度 -->
                <!--<property name="maxStringLiteralLength">65535</property>-->
                <!--<property name="sequnceHandlerType">0</property>-->
                <!--<property name="backSocketNoDelay">1</property>-->
                <!--<property name="frontSocketNoDelay">1</property>-->
                <!--<property name="processorExecutor">16</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> -->
                <!--分布式事务开关,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>
                <!--是否采用zookeeper协调切换  -->
                <property name="useZKSwitch">true</property>
        </system>
        <!-- 全局SQL防火墙设置 -->
        <!-- 
        <firewall> 
           <whitehost>
              <host host="127.0.0.1" user="mycat"/>
              <host host="127.0.0.2" user="mycat"/>
           </whitehost>
       <blacklist check="false">
       </blacklist>
        </firewall>
        -->
   <!-- mycat登录用户密码和逻辑库名 -->
       <user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">TESTDB</property>
                <!-- 表级 DML 权限设置 -->
                <!-- 
                <privileges check="false">
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>
                 -->
        </user>
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
</mycat:server>

5.schema.xml编辑

vi /Users/zenghui/Desktop/Docker/mycat/mycat/conf/schema.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>
        <dataNode name="dn1" dataHost="host1" database="mysql" />
        <dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="mycat_mysql-master1_1:3306" user="root"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS1" url="mycat_mysql-slave1_1:3306" user="root" password="123456" />
                </writeHost>
<writeHost host="hostM2" url="mycat_mysql-master2_1:3306" user="root"
                                   password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS2" url="mycat_mysql-slave2_1:3306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>

6.双主机配置

vi /Users/zenghui/Desktop/Docker/mycat/master1/my.cnf

[mysqld]
#主服务器唯一ID 
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=test_db
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates 
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535 
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 
auto-increment-offset=1

vi /Users/zenghui/Desktop/Docker/mycat/master2/my.cnf

[mysqld]
#主服务器唯一ID 
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql 
binlog-ignore-db=information_schema 
#设置需要复制的数据库 
binlog-do-db=test_db
#设置logbin格式 
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates 
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535 
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535 
auto-increment-offset=2

7.双从机配置

vi /Users/zenghui/Desktop/Docker/mycat/slave1/my.cnf

[mysqld]
#从服务器唯一ID
server-id=2
#启用中继日志 
relay-log=mysql-relay

vi /Users/zenghui/Desktop/Docker/mycat/slave2/my.cnf

[mysqld]
#从服务器唯一ID
server-id=4
#启用中继日志 
relay-log=mysql-relay

8.配置主从复制

1.在master主机上创建主从复制的用户

create user 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
flush privileges;

2.从机配置主机binlog

CHANGE MASTER TO MASTER_HOST='mycat_mysql-master1_1',MASTER_USER='slave',MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=567;
start slave;
show slave status;

CHANGE MASTER TO MASTER_HOST='mycat_mysql-master2_1',MASTER_USER='slave',MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=852;
start slave;
show slave status;

3.主机互相复制

master1执行
CHANGE MASTER TO MASTER_HOST='mycat_mysql-master2_1',MASTER_USER='slave',MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=1020;
start slave;
show slave status;

master2执行
CHANGE MASTER TO MASTER_HOST='mycat_mysql-master1_1',MASTER_USER='slave',MASTER_PASSWORD='123456', 
MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=567;
start slave;
show slave status;

4.创建test_db测试主从复制
image.png image.png

9.配置读写分离

yum -y install java
./mycat start
image.png

10.测试读写分离

create table mytbl (id int notnull,NAME varchar(50));
INSERT INTO mytbl VALUES(3,@@hostname);
此时四台机器上数据都不一致
image.png image.png image.png
只会出现三台机器的数据
master2的数据读不到,证明master2是只写机器
2.验证高可用
停止master2
docker stop mycat_mysql-master2_1
在mycat端可以插入数据,但是读不到了
INSERT INTO mytbl VALUES(3,@@hostname);
启动master2后主节点切换

image.png