Mycat是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
Mycat支持多种数据库接入,如:MySQL、SQLServer、Oracle、MongoDB 等,推荐使用MySQL 做集群。
首先你得有个主从数据库,docker部署可参考:docker 安装mysql(单机版以及 主从模式)
创建Mycat配置文件夹
路劲根据自己的环境来就行
mkdir /home/docker-volume/mycat-volume/mycat
mkdir /home/docker-volume/mycat-volume/mycat/conf
下载Mycat 安装包
下载地址:http://dl.mycat.org.cn/1.6.7.5/
wget http://dl.mycat.org.cn/1.6.7.5/2020-4-10/Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz
解压并复制文件
将conf内容 cp 到 /home/docker-volume/mycat-volume/conf/
注:这里尽量提前复制,避免后面启动报
Unable to resolve the full path of the configuration file, /usr/local/mycat/conf/wrapper.conf: No such file or directory。问题,当然这里还有其他方式处理
编写Dockerfile文件
# 创建镜像,
#如果是基于centos或其他的,必须保证已安装了JDK,否则就需要在Dockerfile文件中也ADD进来
#我是使用的自己构建的JDK镜像,
#FROM daocloud.io/library/java:8u20
FROM jdk8:latest
#将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
#将mycat解压到/usr/local目录中,得到 /usr/local/mycat
ADD mycat-1.6.7.5.tar.gz /usr/local
#容器数据卷,用于数据保存和持久化工作
#将mycat的配置文件的地址暴露出映射地址,启动时直接映射宿主机的文件夹
VOLUME /usr/local/mycat
WORKDIR /usr/local/mycat
#用来在构建镜像过程中设置环境变量
ENV MYCAT_HOME=/usr/local/mycat
#暴露出MyCat的所需端口
EXPOSE 8066 9066
#以前台进程的方式启动MyCat服务
CMD ["/usr/local/mycat/bin/mycat", "console","&"]
构建镜像
# 注意最后还有 . 表示当前目录
docker build -t mycat-1.6.6.5 .
这里可以运行容器了,但是我们还没有配置我们自己的读写库信息 ,但也可以运行,只是会报错
docker run --name mycat --privileged=true -p 9094:8066 -p 9095:9066 -v /home/docker-volume/mycat-volume/conf/:/usr/local/mycat/conf/ -v /home/docker-volume/mycat-volume/logs/:/usr/local/mycat/logs/ -d mycat-1.6.7.5
配置Mycat schema.xml 文件
这里到刚刚你copy的宿主机文件中修改
这里有两种方式配置读写分离,跟balance 参数 以及 writeType 参数有关
方式一
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--schema 标签用于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配
置。可以使用 schema 标签来划分这些不同的逻辑库。 因为这里只做读写分离,就没有加入表分片操作-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="db_node">
</schema>
<!-- dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。
一个 dataNode 标签就是一个独立的数据分片。
database 参数对应的是实际物理数据库的名称-->
<dataNode name="db_node" dataHost="db_host" database="test" />
<!---->
<dataHost name="db_host" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.7.23:9091" user="root"
password="root">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.7.23:9092" user="root" password="123456"/>
</writeHost>
</dataHost>
</mycat:schema>
方式二:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--schema 标签用于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配
置。可以使用 schema 标签来划分这些不同的逻辑库。 因为这里只做读写分离,就没有加入表分片操作-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="db_node">
</schema>
<!-- dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。
一个 dataNode 标签就是一个独立的数据分片。
database 参数对应的是实际物理数据库的名称-->
<dataNode name="db_node" dataHost="db_host" database="test" />
<!---->
<dataHost name="db_host" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.7.23:9091" user="root"
password="root">
</writeHost>
<writeHost host="hostS1" url="192.168.7.23:9092" user="root" password="root">
</writeHost>
</dataHost>
</mycat:schema>
balance 负载均衡类型,目前的取值有 3 种
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 不负担读压力, 注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性 负载均衡类型,目前的取值有 3 种:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost, 重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。switchType 属 性 - -1 表示不自动切换。 - 1 默认值,自动切换。 - 2 基于 MySQL 主从同步的状态决定是否切换。
配置server.xml
server 中已经有很多配置了,简单使用只需要关心 账户密码:
这里我们简单使用账户密码 使用如下配置 :就是设置账号,主要是schemas 属性 要与之前schema.xml 中定义的逻辑库对应
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
<!-- 表级 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>
<property name="defaultSchema">TESTDB</property>
</user>
运行容器
docker run --name mycat --privileged=true -p 9094:8066 -p 9095:9066 -v /home/docker-volume/mycat-volume/conf/:/usr/local/mycat/conf/ -v /home/docker-volume/mycat-volume/logs/:/usr/local/mycat/logs/ -d mycat-1.6.7.5
参数的意思就不多说了,应该大家都了解。
查看容器
如果没有启动成功 可以使用docker logs 容器ID|名字 来看下日志信息
进入测试阶段
与数据库连接一样
为了测试,手动修改了数据库 让数据不一致
但有时候我们想让查询或者其他操作强制走主库或者从库我们可以这样写
-- 强制走从:
/*!mycat:db_type=slave*/ select * from t_user;
/*#mycat:db_type=slave*/ select * from t_user;
-- 强制走写:
/*#mycat:db_type=master*/ select * from t_user;
/*!mycat:db_type=master*/ select * from t_user;
效果如下: