概念
MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
使用
1.jdk下载安装
可去官网下载jdk 包 并环境变量
安装后java -version 有版本号即配置成功
[root@mychat conf]# java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)
2.MyCat部署
解压MyCat软件包到/usr/local/下
[root@mychat conf]# tar xf Mycat-server-1.6.5-DEV-20161104230656-linux.tar.gz -C /usr/local/
3.配置Mycat
cd进入mycat目录后可以看到bin catlet conf lib logs tmlogs version.txt 这些文件
bin:这个目录包含了启动和停止 Mycat 服务的脚本。例如,startup.sh 用于启动 Mycat,shutdown.sh 用于停止 Mycat。
catlet:这个目录用于存放 Mycat 的 Catlet 插件。Catlet 是 Mycat 的一种插件机制,可以用来扩展 Mycat 的功能。
conf:这个目录包含了 Mycat 的配置文件,如 schema.xml、server.xml、rule.xml 等,这些文件控制着 Mycat 的运行行为。
lib:这个目录包含了 Mycat 运行所需的 Java 类库和依赖。
logs:这个目录用于存放 Mycat 的日志文件,如启动日志、运行时日志等。
tmlogs:这个目录通常用于存放 Mycat 的二进制日志文件,这些日志文件可以用于监控和分析。
version.txt:这个文件包含了 Mycat 的版本信息。
web:如果存在,这个目录包含了 Mycat 的 Web 管理界面相关的文件。
[root@mycat ~]# cd /usr/local/mycat/
[root@mycat mycat]# ls
bin catlet conf lib logs tmlogs version.txt
我们主要进入到conf目录中 关注两个文件分别为server.xml,schema.xml
[root@mycat mycat]# cd conf
[root@mycat conf]# ls
autopartition-long.txt ehcache.xml partition-hash-int.txt sequence_conf.properties sharding-by-enum.txt
auto-sharding-long.txt index_to_charset.properties partition-range-mod.txt sequence_db_conf.properties wrapper.conf
auto-sharding-rang-mod.txt log4j2.xml rule.xml sequence_distributed_conf.properties zkconf
cacheservice.properties migrateTables.properties schema.xml sequence_time_conf.properties zkdownload
dnindex.properties myid.properties schema.xml.bak1 server.xml
server.xml配置
用户权限配置 (user 标签):
定义了用户的权限,包括可以访问的数据库、操作类型等。
例:
设置连接mycat时的用户名和密码, 逻辑库
这里的mychattest是逻辑库,并不是数据库中真实存在的,类似一个代号,前台连接到mycat后看到的是mychattest这个库,需要在schema.xml中定义
可配置多个用户,这个xml里面还有一些其他的参数这里用不着可以不配置
<user name="mycat">
<property name="password">123456</property>
<property name="schemas">mychattest</property>
</user>
完整
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<user name="root">
<property name="password">123456</property>
<property name="schemas">mychattest</property>
</user>
</mycat:server>
schema.xml配置
<!--只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table-->
<schema name="mychattest" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
<!--配置真实存在的物理数据库-->
<!--dataNode定义了Mycat中的数据节点,也就是我们通常说所的数据分片,一个dataNode标签就是一个独立的数据分片,通俗理解,一个分片就是一个物理数据库 />
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataHost name="localhost1" // 主机组
maxCon="1000" minCon="10" // 连接
balance="0" // 负载均衡
writeType="0" // 写模式配置
dbType="mysql" dbDriver="native" // 数据库配置
switchType="1" slaveThreshold="100">
<!--这里可以配置关于这个主机组的成员信息,和针对这些主机的健康检查语句-->
</dataHost>
balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
<!--这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组合这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。-->
<writeHost host="hostM1" url="192.168.29.129:3306" user="mychat" password="123456">
<readHost host="hostS1" url="192.168.29.143:3306" user="mychat" password="123456" />
</writeHost>
<writeHost host="hostM2" url="192.168.29.142:3306" user="mychat" password="123456">
<readHost host="hostS2" url="192.168.29.155:3306" user="mychat" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
完整
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--只做读写分离,不做分库分表,Mycat只是帮我们转发一下请求,读转发到从库,写转发到主库,则schema标签里面不用配置table-->
<schema name="mychattest" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"/>
<!--配置真实存在的物理数据库-->
<dataNode name="dn1" dataHost="localhost1" database="testdb" />
<dataHost name="localhost1"
maxCon="1000"
minCon="10"
balance="3"
writeType="0"
dbType="mysql"
dbDriver="native"
switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.29.129:3306" user="mychat" password="123456">
<readHost host="hostS1" url="192.168.29.143:3306" user="mychat" password="123456" />
<!-- <readHost host="hostM2" url="192.168.29.142:3306" user="root" password="123456" /> -->
</writeHost>
<writeHost host="hostM2" url="192.168.29.142:3306" user="mychat" password="123456">
<readHost host="hostS2" url="192.168.29.155:3306" user="mychat" password="123456" />
<!-- <readHost host="hostM1" url="192.168.29.129:3306" user="root" password="123456" /> -->
</writeHost>
</dataHost>
</mycat:schema>
启动 mycat
[root@mycat ~]# /usr/local/mycat/bin/mycat start
支持以下参数
start | restart |stop | status
用户授权
这里是从你的后端真实数据库机器上给刚刚 标签中配置的用户授权 这里的testdb也是你真实的db 中有配置
mysql> grant all on testdb.* to mycat@'%' identified by '123456';
mysql> flush privileges;
这里IP是你mycatip
[root@master~]# mysql -uroot -p123456 -h192.168.62.151 -P 8066
# 可以看出来这里的mychattest是之前配置逻辑库
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| mychattest|
+----------+
1 row in set (0.00 sec)