一、基本概念
Mycat 介绍:是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。Mycat是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),并且要求必须在 JDK7 以上的版本上运行。
mycat工作原理:基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理 SELECT 查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
常见的中间件:

读写分离的好处
- 分担单台的服务器的负载。主从只负责各自的写和读,极大程度的缓解 X(写)锁和 S(读)锁争用。
- 从库可配置 myisam 引擎,提升查询性能以及节约系统开销。
- 增加冗余,提高可用性。
二、jdk的安装
1.官网下载jdk
Java Downloads | Oracle
2.解压到指定路径
[root@mycat ~]# mkdir /usr/local/java
[root@mycat ~]# tar -xf jdk-8u211-linux-x64.tar.gz -C  /usr/local/java3.配置环境变量
[root@mycat ~]#vim /etc/profile
export PATH=/usr/local/java/bin:$PATH4.使环境变量生效
[root@mycat ~]# source /etc/profile5.查看java版本
[root@localhost ~]# 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)三、mycat的安装与配置
1、下载mycat
http://dl.mycat.org.cn/
[root@mycat ~]# wget http://dl.mycat.org.cn/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz2.解压到指定路径
[root@mycat ~]# tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local3.修改配置文件
(1)了解mycat下的文件
[root@localhost mycat]# ls
bin  catlet  conf  lib  logs  tmlogs  version.txt--bin:可执行命令
--conf:配置文件
--lib: 存放jar及其依赖包
--logs:日志信息
--tmlogs:临时日志
--version:版本信息
(2)修改配置文件
server.xml:定义用户以及系统相关变量,如端口等。其中用户信息是应用程序连接 mycat 的用户信息
[root@mycat ~]# vim /usr/local/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
#用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致
<mycat:server xmlns:mycat="http://io.mycat/">
  <user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <property name="schemas">TESTDB</property>
        </user>
</mycat:server>
schema.xml:逻辑库定义和表以及分片定义的配置文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    #逻辑库名称,与server.xml的一致    不检查sql               最大连接数        数据库节点名称    
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
      # 此数据节点的名称             主机组               真实数据库名称
         <dataNode name="dn1" dataHost="localhost1" database="db1" />
        <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="master1" url="master1:3306" user="mycat"
                                   password="Qianfeng@123">
                        <readHost host="slave1" url="slave1:3306" user="mycat" password="Qianfeng@123" />
                </writeHost>
                <writeHost host="master2" url="master2:3306" user="mycat"
                                   password="Qianfeng@123">
                        <readHost host="slave2" url="slave2:3306" user="mycat" password="Qianfeng@123" />
                </writeHost>
        </dataHost>
</mycat:schema>注意:
1)schema标签中的“name”的值和server.xml文件中user标签中的“schemas”值一样。
2)dataNode标签中的“database”为需要复制的数据库名称,服务器中必须有这个库。
3)dataHost标签中的“balance”和“switchType”。
writeType属性
负载均衡类型,目前的取值有2种:
1.writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties.
2.writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。
switchType属性
-1表示不自动切换
1默认值,自动切换
2基于MySQL主从同步的状态决定是否切换-3基于MySQL galary cluster的切换机制(适合集群)
(3)启动mycat
#启动mycat
[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
Mycat-server is already running.
#查看mycat是否启动
[root@mycat ~]# /usr/local/mycat/bin/mycat status
Mycat-server is running (38335).
[root@mycat ~]# ss -nplt
State       Recv-Q Send-Q       Local Address:Port                      Peer Address:Port              
LISTEN      0      1                127.0.0.1:32000                                *:*                   users:(("java",pid=38337,fd=4))
LISTEN      0      128              127.0.0.1:9000                                 *:*                   users:(("php-fpm",pid=1012,fd=5),("php-fpm",pid=1011,fd=5),("php-fpm",pid=1004,fd=7))
LISTEN      0      128                      *:80                                   *:*                   users:(("nginx",pid=951,fd=6),("nginx",pid=949,fd=6))
LISTEN      0      128                      *:22                                   *:*                   users:(("sshd",pid=941,fd=3))
LISTEN      0      100              127.0.0.1:25                                   *:*                   users:(("master",pid=1351,fd=13))
LISTEN      0      50                    [::]:1984                              [::]:*                   users:(("java",pid=38337,fd=58))
LISTEN      0      100                   [::]:8066                              [::]:*                   users:(("java",pid=38337,fd=87))
LISTEN      0      50                    [::]:37476                             [::]:*                   users:(("java",pid=38337,fd=57))
LISTEN      0      50                    [::]:46405                             [::]:*                   users:(("java",pid=38337,fd=60))
LISTEN      0      100                   [::]:9066                              [::]:*                   users:(("java",pid=38337,fd=83))
LISTEN      0      128                   [::]:22                                [::]:*                   users:(("sshd",pid=941,fd=4))
LISTEN      0      100                  [::1]:25                                [::]:*                   users:(("master",pid=1351,fd=14))(4)在服务器上给用户授权
mysql> grant all on *.* to 'mycat'@'%' identified by 'Qianfeng@123';四、测试
1.测试客户端登录mycat
语法:mysql -u逻辑用户 -p逻辑密码 -hmycat服务器的主机地址 -P8806(mycat的端口)
与server.xml文件中user字节中的信息一致
[root@master ~]# mysql -uroot -p123456 -h10.36.192.16 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB   |
+----------+
1 row in set (0.00 sec)2、测试读写分离
balance 属性
负载均衡类型,目前的取值有 4 种:
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", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
balance=0
所有读的信息都发送到master1上
(1)修改配置文件
[root@mycat conf]# vim schema.xml
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                         (2)重启mycat
[root@mycat ~]# /usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...(3)客户端登录mycat,并读取信息
[root@master ~]# mysql -uroot -p123456 -h10.36.192.16 -P8066
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test1         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test1         |
+---------------+
1 row in set (0.00 sec)balance=1
所有写发送到master1,所有读随机发送在master2,slave1,slave2上
(1)修改配置信息
[root@mycat conf]# vim schema.xml
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
           (2) 重启mycat
[root@master ~]# /usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...(3)客户端登录mycat,并查看信息
[root@master ~]# mysql -uroot -p123456 -h10.36.192.16 -P8066
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test4         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test3         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test2         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test4         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test3         |
+---------------+
1 row in set (0.00 sec)balance=2
所有读的信息随机发送到master1,master2,slave1,slave2
(1)修改配置文件
[root@mycat conf]# vim schema.xml
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="2"
           (2) 重启mycat
[root@localhost conf]# /usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...(3)客户端登录mycat,并查看信息
[root@master ~]# mysql -uroot -p123456 -h10.36.192.16 -P8066
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test2         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test3         |
+---------------+
1 row in set (0.01 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test1         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test1         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test4         |
+---------------+
1 row in set (0.00 sec)balance=3
所有读的信息随机发送到slave1 ,slave2
(1)修改配置文件
[root@mycat conf]# vim schema.xml
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
           (2)重启mycat
[root@localhost conf]# /usr/local/mycat/bin/mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...(3)客户端登录mycat,并查看信息
[root@master ~]# mysql -uroot -p123456 -h10.36.192.16 -P8066
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test3         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test3         |
+---------------+
1 row in set (0.00 sec)
mysql> show tables;
+---------------+
| Tables_in_db1 |
+---------------+
| test4         |
+---------------+
1 row in set (0.00 sec)










![Transformer [Attention is All You Need]](https://img-blog.csdnimg.cn/e9c1fb2c039e45c5b51efceb762d10d6.png)






