mycat的配置实现读写分离

准备三台虚拟机
1.关闭防火墙
2.关闭selinux
3.设置主机名和ip地址
vm-1 mycat.com 192.168.122.200
vm-2 mysql-a.com 192.168.122.201
vm-3 mysql-b.com 192.168.122.202

在mysql-a 和 mysql-b 主机上安装好mysql并创建好测试读写分离的库和表(略)

1) 在后端数据库创建允许mycat连接的用户

mysql> GRANT all ON *.* TO "My_cat"@"%" IDENTIFIED BY "123";
mysql> FLUSH PRIVILEGES;
 

一、下载mycat      


mycat的官网网址  http://www.mycat.org.cn/,我使用的是mycat的1.6的Linux安装包
下载地址
https://github.com/MyCATApache/Mycat-download-new
下载mycat的安装包到 /tmp 目录下
[root@mycat ~]# cd /tmp
[root@mycat ~]# tar -zxvf /tmp/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat ~]# ls -d /usr/local/mycat/
/usr/local/mycat/
[root@mycat ~]# ls /usr/bin/mycat
bin  catlet  conf  lib  logs  version.txt
 

二、安装JDK并且配置环境变量


下载tmp/jdk-8u131-linux-x64.tar.gz

[root@mycat ~]# tar -xvf /tmp/jdk-8u131-linux-x64.tar.gz -C /usr/local/
[root@mycat ~]# ln -s /usr/local/jdk1.8.0_131/ /usr/local/java

[root@mycat ~]# tail -3 /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH

[root@mycat ~]# source /etc/profile
[root@mycat ~]# env |grep JAVA
JAVA_HOME=/usr/local/java
 

三、修改mycat配置文件


接下来修改mycat的配置文件
#cd /usr/local/mycat/conf
#ls
autopartition-long.txt       partition-hash-int.txt    sequence_db_conf.properties
cacheservice.properties      partition-range-mod.txt   sequence_time_conf.properties
dnindex.properties           router.xml                server.xml
ehcache.xml                  rule.xml                  wrapper.conf
index_to_charset.properties  schema.xml
log4j.xml                    sequence_conf.properties
 
配置文件非常多,配置项也远比amoeba复杂.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个2文件server.xml 和  schema.xml
 

(一)先配置server.xml


[root@mycat ~]# vim /usr/local/mycat/conf/server.xml
找到这一段
</system>
        <user name="test">
                <property name="password">test</property>
                <property name="schemas">TESTDB</property>
        </user>
 
        <user name="user">
                <property name="password">user</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
 
这里配置了两个可以来连接的用户
用户1  test   密码test   给予了此用户TESTDB数据库的权限
用户2  user   密码user   给予了此用户TESTDB数据库的只读权限
 
注意这里的testdb 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可
 

 


 

(二)接下来配置schema.xml


备份源schema.xml文件
[root@localhost ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak

配置
[root@mycat ~]# vim /usr/local/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="localhost1" database="db" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.122.201:3306" user="My_cat" password="123">
<readHost host="hostS2" url="192.168.122.202:3306" user="My_cat" password="123" />
</writeHost>
</dataHost>
</mycat:schema>


 
 

(三)配置文件解释


一,  <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
这里TESTDB 就是我们对外声称的我们有数据库的名称  必须和server.xml中的用户指定的数据库名称一致
添加一个dataNode="dn1" 是指定了我们这个库只在dn1上.没有进行分库
 
二, <dataNode name="dn1" dataHost="localhost1" database="db1" />
这里只需要改database的名字 db1 就是你真实数据库服务上的数据库名 .
根据你自己的数据库名进行修改.
 
三,<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
 
这里只需要配置三个地方    balance="1"与writeType="0" ,switchType=”1”
a. 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", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
b. writeType 属性
负载均衡类型,目前的取值有 3 种:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。1.5后废弃,不推荐

c. switchType 属性
- -1 表示不自动切换
- 1 默认值,自动切换
- 2 基于MySQL 主从同步的状态决定是否切换

slaveThreshold="100"
开始支持 MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
MyCAT心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与
slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机
制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running",
"Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延,
当Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之
前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则
表示主从同步,可以安全切换,否则不会切换。


四,<heartbeat>select user()</heartbeat>
心跳检查语句

五,<writeHost host="hostM1" url="192.168.122.201:3306" user="root" password="123" />
<readHost host="hostS1" url="192.168.122.202:3306" user="root" password="123" />
</writeHost>
这里是配置的我们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码
 

四、启动mycat

测试读写分离是否成功
/usr/local/mycat/bin/mycat start
ss -antulp 查看端口号
8066
yum -y install mariadb-server mariadb-client
测试:
使用test用户
[root@localhost ~]# mysql -u test -ptest -h 192.168.122.200 -P 8066
MySQL [TESTDB]> select * from t1;
+------+
| id |
+------+
| 100 |
| 200 |
| 300 |
+------+
3 rows in set (0.01 sec)

MySQL [TESTDB]> insert into t1 values(600);
Query OK, 1 row affected (0.06 sec)

MySQL [TESTDB]> select * from t1;
+------+
| id |
+------+
| 100 |
| 200 |
| 300 |
+------+
3 rows in set (0.03 sec)

在MySQL的真实服务器上查看
MYSql-A
MariaDB [db]> select * from t1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 100 |
| 600 |
+------+
5 rows in set (0.01 sec)

MariaDB [db]>
在mysql-B上查看

MariaDB [db]> select * from t1;
+------+
| id |
+------+
| 100 |
| 200 |
| 300 |
+------+
3 rows in set (0.00 sec)

MariaDB [db]>

使用user用户

[root@localhost ~]# mysql -u user -puser -h 192.168.122.200 -P 8066
mysql> use TESTDB
mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 1 | robin |
+------+-------+
1 row in set (0.01 sec)

mysql> insert into t1 values(2,'zorro');
ERROR 1495 (HY000): User readonly

也就是说test用户可读可写 user只读但是都在mysql-a这个库上

到mysql-A上验证
[root@mysql-a ~]# mysql -u root -p"123"
mysql> use db

mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 1 | robin |
| 2 | zorro |
+------+-------+
2 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/qq_37194598/article/details/84629483