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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章