使用Mycat 作簡單的讀寫分離html
本來使用的是amoeba作的讀寫分離,可是amoeba早已經中止了維護,有問題也沒有辦法解決,而且不支持雙主多重模式.最近mycat又很是火熱.以爲用mycat替換現有的amoeba.java
舒適提示:mysql
配置mycat以前請作好準備工做,統一各個數據庫的字符集.而且最好使用mysql5.6的版本進行配置.以避免覺得版本問題帶來不少未知的麻煩!linux
mycat的官網網址sql
http://www.mycat.org.cn/數據庫
我使用的是mycat的1.6的Linux安裝包vim
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 服務器
#解壓後放到/usr/local下 負載均衡
mv mycat /usr/localurl
檢查是否已經配置好了java的環境變量
若是你還沒用配置好,需先配置.
接下來修改mycat的配置文件
cd /usr/local/mycat/conf
配置文件很是多,若是隻是簡單配置在不一樣的服務器上進行讀寫分離只須要配置兩個文件
server.xml 和 schema.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數據庫的只讀權限
注意
A : 這裏的testdb 不必定是你數據庫上的真實庫名.能夠任意指定.只要和接下來的schema.xml的配置文件中的庫名統一便可
B:這裏的配置的用戶名和密碼,是咱們 鏈接mycat的用戶名和密碼,和 schema.xml中配置的 鏈接真實mysql的用戶名和密碼 不必定同樣
.由於咱們如今只作庫的讀寫分離,沒用分庫 沒用分表這些東西.
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<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="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="asdf1@34">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="asdf1@34" />
</writeHost>
<writeHost host="hostS1" url="192.168.1.101:3306" user="root"
password="asdf1@34"/>
</dataHost>
下載地址:
https://www.tapd.cn/22121161/documents/show/1122121161001000020
一, <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
這裏TESTDB 就是咱們對外聲稱的咱們有數據庫的名稱 必須和server.xml中的用戶指定的數據庫名稱一致
添加一個dataNode="dn1" 是指定了咱們這個庫只在dn1上.沒有進行分庫
二, <dataNode name="dn1" dataHost="localhost1" database="realdb_test_name" />
這裏只須要改database的名字 realdb_test_name 就是你真實數據庫服務上的數據庫名 .
根據你本身的數據庫名進行修改.
三,<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。
3. writeType="2",沒實現。
c. switchType 屬性
-1:表示不啓用主從切換;
1:爲默認值,自動切換;心跳檢測語句,通常爲select user();
2:基於主從同步的狀態,決定是否切換,與show slave status心跳對應;
3:基於多住galary集羣切換,與show status like 'wsrep%'對應;
d. Seconds_Behind_Master主從複製時延,當Seconds_Behind_Master>slaveThreshold時,讀寫分離篩選器會過濾掉此Slave機器,防止讀到好久以前的舊數據
建議組合值:
balance="1" writeType="0" switchType="2"
四,
<writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="asdf1@34">
<readHost host="hostS1" url="192.168.1.101:3306" user="root" password="asdf1@34" />
</writeHost>
這裏是配置的咱們的兩臺讀寫服務器IP地址訪問端口和 訪問用戶的用戶名和密碼
主要就是這兩個配置文件,配置完成.們試試可否正常啓動
cd /usr/local/mycat/bin
./mycat start
這裏可使用Navicat for MySQL,來嘗試鏈接一下,能鏈接成功.若是沒有鏈接成功過,有錯誤的話會在/logs/mycat.log中去查看
1,記得給你的防火牆開端口默認的mycat端口是8066
2,若是你在鏈接數據庫的時候日誌文件中一直報錯錯
錯誤:
Host is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
這個時候估計是你的數據庫的帳號和密碼錯誤了.因此IP被鎖
.首先須要去數據庫執行flush hosts;命令清除 被鎖死的IP
3,錯誤:
java.lang.IllegalArgumentException: Invalid DataSource:0
明顯是連接後面的MYSQL有問題,可是MYSQL配置也沒錯,後來發現MYSQL新安裝之後是不能用-h 127.0.0.1來登陸,只能sock登陸,因此登陸mysql後修改ROOT用戶,update user set host = '%' where user = 'root'; ,重啓服務後一切正常了
4,錯誤mycat.log中: Unknown charsetIndex:224
說明是字符集問題引發的數據庫不能鏈接成功
vim index_to_charset.properties
編輯配置文件中 設置224的字符集
好比個人數據庫中 224=utf8mb4
設置完成後再重啓服務就能夠了!