隨着IT行業的迅猛發展,行業應用系統的數據規模呈現爆炸式增加,對數據庫的數據處理能力要求愈來愈高,分佈式數據庫正是所以應運而生。java
分佈式數據庫特色包括:mysql
透明性:用戶沒必要關心後臺數據庫的具體實現web
擴展性:可以根據系統壓力狀況進行擴展sql
可靠性:若是其中一臺服務器宕機,備用服務器可以自動切換繼續提供服務數據庫
高性能:windows
Mycat(http://www.mycat.io/)是一個支持mysql、sql server等數據庫集羣化部署的中間件。它由Amoeba和cobar發展而來。服務器
服務器負載均衡 |
Mycattcp |
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
一、 安裝jdk
二、 配置環境變量
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;
在windows8操做系統上啓動mycat服務,命令以下
cmd
cd /d D:\EC-OFC\Java\Mycat\Mycat-server-1.6\mycat\bin
startup_nowrap.bat
使用navicat鏈接mycat,默認端口爲8066,密碼123456
cmd
cd /d C:\Program Files\MySQL\MySQL Server 5.7\bin
mysql -uroot -p123456 -P8066
注意:若是須要使用如show @@datasource命令時,須要鏈接9066端口而不是8066
D:\EC-OFC\開發工具\zookeeper-3.4.10\bin\zkServer.bat
6.3 啓動mycat-eye
D:\EC-OFC\Java\Mycat\mycat-web\start.bat
<?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>
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;
完成主從複製配置
在10.3.30.238中
mysql> START SLAVE; #開啓複製
mysql>SHOW SLAVE STATUS\G #查看主從複製是否配置成功
當看到Slave_IO_Running: YES、Slave_SQL_Running: YES才代表狀態正常
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配置文件
#
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集羣的目的。
一、主主複製配置文件中auto_increment_increment和auto_increment_offset只能保證主鍵不重複,卻不能保證主鍵有序。
二、當配置完成Slave_IO_Running、Slave_SQL_Running不全爲YES時,show slave status\G信息中有錯誤提示,可根據錯誤提示進行更正。
三、Slave_IO_Running、Slave_SQL_Running不全爲YES時,大多數問題都是數據不統一致使。
常見出錯點:
一、兩臺數據庫都存在db數據庫,而第一臺MySQL db中有tab1,第二臺MySQL db中沒有tab1,那確定不能成功。
二、已經獲取了數據的二進制日誌名和位置,又進行了數據操做,致使POS發生變動。在配置CHANGE MASTER時仍是用到以前的POS。
三、stop slave後,數據變動,再start slave。出錯。
終極更正法:從新執行一遍CHANGE MASTER就行了。