一、前言
1.1 分散式資料庫
隨著IT行業的迅猛發展,行業應用系統的資料規模呈現爆炸式增長,對資料庫的資料處理能力要求越來越高,分散式資料庫正是因此應運而生。
分散式資料庫特點包括:
透明性:使用者不必關心後臺資料庫的具體實現
擴充套件性:能夠根據系統壓力情況進行擴充套件
可靠性:如果其中一臺伺服器當機,備用伺服器能夠自動切換繼續提供服務
高效能:
1.2 Mycat介紹
Mycat(http://www.mycat.io/)是一個支援mysql、sql server等資料庫叢集化部署的中介軟體。它由Amoeba和cobar發展而來。
二、負載均衡
三、測試環境
伺服器 |
Mycat |
Mysql-master |
Mysql-slave |
Mysql-master-standby |
Mysql-master-standby |
IP |
127.0.0.1 |
10.3.30.161 |
10.3.30.238 |
120.77.80.215 |
10.3.6.84 |
Port |
8066/9066 |
3306 |
3306 |
3306 |
3306 |
Account |
root 123456 |
test 123456 |
test 123456 |
test 123456 |
test 123456 |
四、測試指令碼
CREATE TABLE `employee` (
`ID` int(11) NOT NULL,
`NAME` varchar(100) default NULL,
`SHARDING_ID` int(11) NOT NULL,
PRIMARY KEY (`ID`)
)
INSERT INTO employee(ID,NAME,SHARDING_ID) VALUES ('6', 'amos', '10000');
五、軟體安裝
首先安裝mycat-server、mycat-eye、zookeeper和navicat for mysql
六、服務啟動
6.1 啟動mycat
6.1.1安裝java環境
1、 安裝jdk
2、 配置環境變數
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_131
CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
Path =%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
6.1.2啟動mycat服務
在windows8作業系統上啟動mycat服務,命令如下
cmd
cd /d D:\EC-OFC\Java\Mycat\Mycat-server-1.6\mycat\bin
startup_nowrap.bat
6.1.3連線mycat
6.1.3.1navicat連線
使用navicat連線mycat,預設埠為8066,密碼123456
6.1.3.2DOS連結
cmd
cd /d C:\Program Files\MySQL\MySQL Server 5.7\bin
mysql -uroot -p123456 -P8066
注意:如果需要使用如show @@datasource命令時,需要連線9066埠而不是8066
6.2 啟動zookeeper
D:\EC-OFC\開發工具\zookeeper-3.4.10\bin\zkServer.bat
6.3 啟動mycat-eye
D:\EC-OFC\Java\Mycat\mycat-web\start.bat
七、寫叢集
7.1 拓撲圖
7.2 配置檔案
<?xml version="1.0"?>
<!DOCTYPEmycat:schemaSYSTEM"schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"/>
</schema>
<dataNode name="dn1" dataHost="host1" database="db1"/>
<dataNode name="dn2" dataHost="host2" database="db1"/>
<dataHost name="host1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="120.77.80.215:3306"
user="test" password="123456">
</writeHost>
</dataHost>
<dataHost name="host2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="10.3.30.238:3306"
user="test" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
八、主從配置
8.1 業務要求
Master掛掉時,Slave還能提供讀服務。
8.2 配置步驟
注意每臺mysql伺服器的server-id必須唯一
第一步:
在10.3.30.161中建立一個10.3.30.238主機中可以登入的MySQL使用者
使用者:mysql238
密碼:123456
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘mysql238’@’10.3.30.238’ IDENTIFIED BY ‘123456’;
mysql>FLUSH PRIVILEGES;
第二步:
需要先在C:\ProgramData\MySQL\MySQL Server 5.7\my.ini檔案中新增log-bin=mysql-bin
檢視10.3.30.161MySQL伺服器二進位制檔名與位置
mysql>SHOW MASTER STATUS;
第三步:
告知二進位制檔名與位置
在10.3.30.238中執行:
mysql>CHANGE MASTER TO
MASTER_HOST='10.3.30.161',
MASTER_USER='mysql238',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mybin.000001',
MASTER_LOG_POS=154;
完成主從複製配置
8.3 驗證配置
在10.3.30.238中
mysql> START SLAVE; #開啟複製
mysql>SHOW SLAVE STATUS\G #檢視主從複製是否配置成功
當看到Slave_IO_Running: YES、Slave_SQL_Running: YES才表明狀態正常
8.4 配置檔案
switchType='-1'意味著當主掛掉的時候,不進行自動切換,即hostS1並不會被提升為主,仍只提供讀的功能。這就避免了將資料寫進slave的可能性,單純的MySQL主從叢集並不允許將資料寫進slave中,除非配置的是雙master。
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="employee" primaryKey="ID" dataNode="dn1"/>
</schema>
<dataNode name="dn1" dataHost="host1" database="db1"/>
<dataHost name="host1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="10.3.30.161:3306"
user="test" password="123456">
<readHost host="hostR1" url="120.77.80.215:3306"
user="test" password="123456"/>
</writeHost>
<writeHost host="hostS1" url="10.3.30.238:3306"
user="test" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
九、Haproxy配置
9.1 拓撲圖
9.2 配置檔案
此處為haproxy配置檔案
#
global
maxconn 1500
nbproc
1
daemon
defaults
mode tcp
retries 3
option abortonclose
maxconn 32000
timeout connect 300000ms
timeout client 300000ms
timeout server 300000ms
log 127.0.0.1 local0 err
listen admin_stats
bind :48800
stats uri /admin-status
stats auth admin:admin
mode http
option httplog
listen mycat_servers
bind :3307 ## 繫結埠
mode tcp
option tcplog
#balance source
server server238 10.3.30.238:8066
check port 8066 weight 1 check
server server84 10.3.6.84:8066
check port 8066 weight 1 check
mysql客戶端或者應用程式可以通過如上配置的127.0.0.1:3307埠連結haproxy實現連結mycat叢集的目的。
十、注意事項
1、主主複製配置檔案中auto_increment_increment和auto_increment_offset只能保證主鍵不重複,卻不能保證主鍵有序。
2、當配置完成Slave_IO_Running、Slave_SQL_Running不全為YES時,show slave status\G資訊中有錯誤提示,可根據錯誤提示進行更正。
3、Slave_IO_Running、Slave_SQL_Running不全為YES時,大多數問題都是資料不統一導致。
常見出錯點:
1、兩臺資料庫都存在db資料庫,而第一臺MySQL db中有tab1,第二臺MySQL db中沒有tab1,那肯定不能成功。
2、已經獲取了資料的二進位制日誌名和位置,又進行了資料操作,導致POS發生變更。在配置CHANGE MASTER時還是用到之前的POS。
3、stop slave後,資料變更,再start slave。出錯。
終極更正法:重新執行一遍CHANGE MASTER就好了。