轉(zhuǎn)自http://blog.csdn.net/jaysonhu/article/details/52858535
mysql安裝
下載mysql
解壓
tar -zxvf mysql-5.6.32-linux-glibc2.5-x86_64.tar.gz
把mysql文件夾移動到 /usr/local/ 下
mv mysql-5.6.32-linux-glibc2.5-x86_64 /usr/local/mysql
-
創(chuàng)建mysql用戶和組
groupadd mysql adduser -r -g mysql mysql chown -R mysql.mysql /usr/local/mysql //修改mysql目錄所屬mysql用戶
-
安裝
/usr/local/mysql/scripts/mysql_install_db
-
修改配置文件my.cnf,必須要修改才能使用mycat
最后一行添加
lower_case_table_names = 1
-
設(shè)置mysql服務(wù)
cp -f /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
-
啟動mysql
service mysqld start
-
把mysql命令加入環(huán)境變量
修改/etc/profile文件,最后行添加
export PATH=$PATH:/usr/local/mysql/bin
然后執(zhí)行
source /etc/profile
使配置立即生效
登陸mysql如果提示錯誤
Can't connect to local MySQL server through socket '/tmp/mysql.sock'
執(zhí)行命令
ln /var/lib/mysql/mysql.sock /tmp/mysql.sock
后再登陸root用戶初始密碼為空,修改密碼使用mysqladmin命令
mysqladmin -uroot -p password
-
登陸客戶端
mysql -uroot -p
創(chuàng)建測試數(shù)據(jù)庫
CREATE database db1;
CREATE database db2;
CREATE database db3;
至此mysql已經(jīng)安裝完成了
安裝java
mycat安裝
下載mycat
-
解壓
tar -zxvf Mycat-server-1.6-RELEASE-20161012170031-linux.tar.gz
把mycat文件夾移動到 /usr/local/ 下
mv Mycat-server-1.6-RELEASE-20161012170031-linux /usr/local/mycat
-
新建用戶和組
groupadd mycat adduser -r -g mycat mycat chown -R mycat.mycat /usr/local/mycat //修改mycat目錄所屬mycat用戶
-
修改配置文件 /usr/local/mycat/conf/schema.xml
這里配置mysql的地址困食、用戶名和密碼
<writeHost host="hostM1" url="localhost:3306" user="root" password="root"> <readHost host="hostS1" url="localhost:3306" user="root" password="root" /> </writeHost>
server.xml
這里配置mycat的用戶名密碼
<user name="root"> <property name="password">digdeep</property> <property name="schemas">TESTDB</property> </user>
-
啟動mycat
/usr/local/mycat/bin/mycat start
-
連接mycat
mysql -uroot -pdigdeep -h127.0.0.1 -P8066 -DTESTDB
注意這里 -h 后面必須是ip囚似,使用localhost會出錯
創(chuàng)建測試數(shù)據(jù)
use TESTDB;
create table company(id int not null primary key,name varchar(50),addr varchar(255));
insert into company values(1,"facebook","usa");
- 結(jié)果:查看mysql上的數(shù)據(jù)庫db1,db2,db3上都創(chuàng)建了表company
mysql主從服務(wù)器配置
-
修改主mysql配置文件my.cnf
[mysqld] log_bin = mysql-bin #記錄操作日志 binlog_ignore_db = mysql #不同步mysql系統(tǒng)數(shù)據(jù)庫 server_id = 1
-
啟動主mysql饮亏,在主mysql創(chuàng)建一個用戶user讓從mysql連接,執(zhí)行sql
grant replication slave on *.* to 'user'@'%' identified by 'password'
-
修改從mysql配置文件my.cnf
log_bin = mysql-bin #記錄操作日志 replicate_ignore_db = mysql #不同步mysql系統(tǒng)數(shù)據(jù)庫 slave_skip_errors = all server_id = 2
-
主mysql執(zhí)行sql
show master status;\G
-
從mysql連接主mysql
根據(jù)第2步配創(chuàng)建的user,password 和 第4步獲取的file珍手,position 連接主mysql
//如果是mysql5.5
change master to master_host='node1',master_user='user',master_password='password',master_log_file='mysql-bin.000004',master_log_pos=120;
//如果是mysql5.6即以上可以不需要master_log_file和master_log_pos,mysql會自動識別
change master to master_host='node1',master_user='user',master_password='password';
-
開啟從mysql辞做,從mysql中執(zhí)行
start slave;
-
查看從mysql狀態(tài)琳要,從mysql執(zhí)行
show slave status\G;
紅色下劃線部分為yes則開啟成功
-
測試成果
首先在主從mysql上都新建數(shù)據(jù)庫testdb
主mysql:
use testdb;create table user(id int not null primary key,name varchar(50));
從mysql上也會產(chǎn)生user表,主從mysql配置成功秤茅!
讀寫分離配置
-
注意事項
遠(yuǎn)程 mysql 必須允許 mycat主機(jī) 遠(yuǎn)程連接稚补,修改mysql.user表中的用戶數(shù)據(jù),執(zhí)行sql
update mysql.user set host = '%' where user = 'root'
-
schema.xml配置
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <heartbeat>show slave status</heartbeat> <writeHost host="hostM1" url="node1:3306" user="root" password="root"> <readHost host="hostS1" url="node2:3306" user="root" password="root" /> </writeHost> </dataHost>
dbDriver
屬性
指定連接后端數(shù)據(jù)庫使用的 Driver框喳,目前可選的值有 native 和 JDBC课幕。使用 native 的話,因為這個值執(zhí)行的是二進(jìn)制的 mysql 協(xié)議五垮,所以可以使用 mysql 和 maridb乍惊。其他類型的數(shù)據(jù)庫則需要使用 JDBC 驅(qū)動來支持。
從 1.6 版本開始支持 postgresql 的 native 原始協(xié)議放仗。
如果使用 JDBC 的話需要將符合 JDBC 4 標(biāo)準(zhǔn)的驅(qū)動 JAR 包放到 MYCAT\lib 目錄下润绎,并檢查驅(qū)動 JAR 包中包括如下目錄結(jié)構(gòu)的文件:META-INF\services\java.sql.Driver。在這個文件內(nèi)寫上具體的 Driver 類名诞挨,例如:com.mysql.jdbc.Driver莉撇。
balance
屬性
負(fù)載均衡類型,目前的取值有 3 種:
balance=”0”, 不開啟讀寫分離機(jī)制惶傻,所有讀操作都發(fā)送到當(dāng)前可用的 writeHost 上棍郎。
balance=”1”,全部的 readHost 與 stand by writeHost 參與 select 語句的負(fù)載均衡银室,簡單的說坝撑,當(dāng)雙主雙從模式(M1->S1,M2->S2粮揉,并且 M1 與 M2 互為主備)巡李,正常情況下,M2,S1,S2 都參與 select 語句的負(fù)載均衡扶认。
balance=”2”侨拦,所有讀操作都隨機(jī)的在 writeHost、readhost 上分發(fā)辐宾。
-
balance=”3”狱从,所有讀請求隨機(jī)的分發(fā)到 wiriterHost 對應(yīng)的 readhost 執(zhí)行膨蛮,writerHost 不負(fù)擔(dān)讀壓
力,注意 balance=3 只在 1.4 及其以后版本有季研,1.3 沒有敞葛。
writeType
屬性
負(fù)載均衡類型,目前的取值有 3 種:
-
writeType=”0”, 所有寫操作發(fā)送到配置的第一個 writeHost与涡,第一個掛了切到還生存的第二個
writeHost惹谐,重新啟動后已切換后的為準(zhǔn),切換記錄在配置文件中:dnindex.properties .
writeType=”1”驼卖,所有寫操作都隨機(jī)的發(fā)送到配置的 writeHost氨肌,1.5 以后廢棄不推薦。
switchType
屬性
-1 表示不自動切換
1 默認(rèn)值酌畜,自動切換
-
2 基于 MySQL 主從同步的狀態(tài)決定是否切換
心跳語句為 show slave status
-
根據(jù)主從延時切換技術(shù)
Mycat1.4開始支持 MySQL主從復(fù)制狀態(tài)綁定的讀寫分離機(jī)制怎囚,讓讀更加安全可靠,配置如下: MyCAT心跳檢查語句配置為 show slave status 桥胞,dataHost 上定義兩個新屬性: switchType=”2” 與slaveThreshold=”100”恳守,此時意味著開啟MySQL主從復(fù)制狀態(tài)綁定的讀寫分離與切換機(jī)制,Mycat心跳機(jī)制通過檢測 show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”, “Slave_SQL_Running” 三個字段來確定當(dāng)前主從同步的狀態(tài)以及Seconds_Behind_Master 主從復(fù)制時延贩虾, 當(dāng)Seconds_Behind_Master>slaveThreshold 時催烘,讀寫分離篩選器會過濾掉此Slave機(jī)器,防止讀到很久之前的舊數(shù)據(jù)整胃,而當(dāng)主節(jié)點宕機(jī)后颗圣,切換邏輯會檢查Slave上的Seconds_Behind_Master是否為0,為0時則表示主從同步屁使,可以安全切換在岂,否則不會切換。
-
重啟mycat蛮寂,連接創(chuàng)建測試數(shù)據(jù)
use TESTDB; create table company(id int not null primary key,name varchar(50),addr varchar(255)); insert into company values(1,"facebook","usa");
結(jié)果:查看主從mysql上的db1,db2,db3上都創(chuàng)建了表company
-
如果你的mysql的復(fù)制模式為STATEMENT(可以在my.cnf中配置
binlog_format="STATEMENT"
)蔽午,還可以這樣測試。mycat執(zhí)行sql :
insert into company values(1,@@hostname,"usa");` select * from company ;
可以看出酬蹋,讀取數(shù)據(jù)是從從mysql讀出的