上一篇文章讲到如何配置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文件夹同级。
挂载目录:
mysql挂载目录解释可以参考juejin.cn/post/729638…
同时在这里需要修改my.ini文件,比如我想对两个数据库(usere,test_db)的数据进行同步,我就需要在两个数据库订单my.ini中添加binlog-do-db=user,binlog-do-db=test_db。
mycat挂载
conf文件夹:
主要是这三大文件
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
第一次执行需要拉取镜像。
创建成功后,用mycat与123456作为用户名和密码可以登录到mycat的管理端,可以看到有两个数据库。
此时对这两个数据库的任意修改都会同步在mysql的两个数据上,配置成功。