標籤:soft 負載平衡 事務 roo dig south 參與 處理 address
什麼是mycat呢?
簡單理解為一個MySQL中介軟體,它支援分流、基於心跳的自動故障切換,支援讀寫分離,支援mysql主從,基於Nio管理線程的高並發…
詳見官網:http://www.mycat.io/
為什麼需要mysql叢集?
一個龐大的分布式系統的效能瓶頸中,最脆弱的就是串連,一個是用戶端與後端的串連,另一個是後端與資料庫的串連,說白了就是發送端請求太多,接收端能夠的接收和處理的請求並不多,在用戶端與後端中可以利用類似nginx的負載平衡解決,而在後端與資料庫中可以利用類似mycat的負載平衡實現mysql叢集,提高mysql的總體效能。
開始我們的旅程,在此之前,需要準備以下:
1 兩台伺服器(最少),一主(master)一從(slave),這裡用vmware裡面裝的兩個ubuntu server 虛擬機器示範,每台虛擬機器的網路連接方式都設定為橋接模式,兩台虛擬機器的ip如下
主:ubuntu server1: 192.168.11.109 從:ubuntu server2: 192.168.11.117
(vmware安裝ubuntu server16.04在上兩篇博文有詳細介紹:
http://blog.csdn.net/change_on/article/details/74969314
http://blog.csdn.net/change_on/article/details/74979993)
2 虛擬機器分別安裝好mysql 5.7
3 jdk1.7以上,這裡以jdk-7u67-Linux-x64.tar.gz為例
4 mycat,以Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz為例
搭建mycat+mysql叢集的步驟
1 mysql主從配置
2 配置mycat
2.1 安裝jdk
2.2 安裝mycat
2.3 配置server.xml
2.4 配置schema.xml
2.5 測試
mysql主從配置
注意 :mysql5.7的設定檔是 /etc/mysql/mysql.conf.d/mysqld.cnf !不是/etc/mysql/my.cnf !
vi /etc/mysql/mysql.conf.d/mysqld.cnf character_set_server = utf8 init_connect = ‘SET NAMES utf8‘ log-bin=mysql-bin server-id=109
vi /etc/mysql/mysql.conf.d/mysqld.cnf character_set_server = utf8 init_connect = ‘SET NAMES utf8‘ log-bin=mysql-bin server-id=117
-
stop slave; reset slave; change master to master_host=‘192.168.11.109‘,master_user=‘wen‘,master_password=‘wen‘,master_log_file=‘mysql-bin.000013‘,master_log_pos=1609;
start slave;
show slave status \G
從:
配置mycat(在master虛擬機器中配置)
jdk與mycat的壓縮包都放在/opt目錄下
# set for java export JAVA_HOME=/opt/jdk1.7.0_67 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
儲存退出
2 安裝 mycat
解壓mycat
tar -zxvf Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz
配置環境變數
vi /etc/profile
在末尾添加
export MYCAT_HOME=/opt/mycat export PATH=$PATH:$MYCAT_HOME/bin
儲存退出
使環境變數生效
source /etc/profile
3.配置server.xml
到 mycat 的 conf 目錄下,修改 server.xml 檔案添加 test 和user 使用者,test 使用者,密碼也為 test,user 使用者,密碼也為user
<user name="test"> <property name="password">test</property> <property name="schemas">TESTDB</property> <!-- 表級 DML 使用權限設定 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> </user>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="master" database="test" /> <dataHost name="master" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>show slave status</heartbeat> <writeHost host="host2" url="192.168.11.109:3306" user="root" password="root" /> <writeHost host="host4" url="192.168.11.117:3306" user="root" password="root" /></dataHost>
show slave status 表示一種叢集策略,只適用在一主一從的環境中,當主 down 掉, 從可以充當主和從
balance屬性
balance=”0”, 不開啟讀寫分離機制,所有讀操作都發送到當前可用的 writeHost 上
balance=”1”,全部的 readHost 與 stand by writeHost 參與 select 語句的負載平衡
balance=”2”,所有讀操作都隨機的在 writeHost、 readhost 上分發。
balance=”3”, 所有讀請求隨機的分發到 wiriterHost 對應的 readhost 執行,writerHost 不負擔讀壓力
writeType 屬性
負載平衡類型,目前的取值有 3 種:
writeType=”0”, 所有寫操作發送到配置的第一個 writeHost,第一個掛了切到還生存的第二個writeHost, 重新啟動後已切換後的為準,切換記錄在設定檔中:dnindex.properties
writeType=”1”,所有寫操作都隨機的發送到配置的 writeHost
cd /opt/mycat/bin ./mycat start
補充:mycat的常用命令
關閉
mycat stop
重啟
mycat restart
查看mycat狀態
mycat status
現在 mycat 可以代理 mysql 了,用 navicat 串連 mycat(8066連接埠)
往資料庫裡面添加一條資料 wen
現在到主要虛擬機器用命令列查看資料庫,看看剛在 navicat 寫進 mycat 的資料有沒有顯示出來
用 mycat 的帳號密碼登入到主要虛擬機器的 mycat,查看並添加一條資料 tom
mysql -utest -ptest -h127.0.0.1 -P8066
再切到從虛擬機器,用 mysql -uroot -p 登入 mysql,看看剛剛在主要虛擬機器的 mycat 添加的資料 tom 在從虛擬機器能不能看到
如果想看看讀寫分離的細節,可以到 logs 目錄下查看日誌
/opt/mycat/logs/tail -f mycat.log
———————————————————分割線—————————————————————-
mysql的問題其實是由於一系列的軟肋決定的,所以不得不利用中介軟體或者其它方案去解決,包括:
在強制限制式和事務與全文索引之間做出選擇(InnoDb vs MyISAM)
在客戶機代碼中“類比”事務是不容易的
如果不執行約束,就很容易得到不一致的db狀態
如果沒有全文檢索搜尋,會變得瘋狂,比如% y %
必須在更新觸發器之前建立檢查約束的錯誤
當資料變得太大時,Mysql的承受能力就不妙了
Mysql建立的執行計畫效率低下
Mysql有超過多個串連的問題(最好說多個串連)
…
但是! Oracle是所有這些問題的解決方案,它是一個完整的DBMS:事務、檢查合約、視圖的很多選項、全文檢索搜尋…
所以問題的本質是:成本!,mysql 很討厭,卻又不得不用!
-
頂
-
0
-
踩
-
0
mycat實現簡單的mysql叢集負載平衡