一、實(shí)驗(yàn)?zāi)繕?biāo)
搭建兩臺(tái)MySQL服務(wù)器,一臺(tái)作為主服務(wù)器,一臺(tái)作為從服務(wù)器,主服務(wù)器進(jìn)行寫操作,從服務(wù)器進(jìn)行讀操作。
二、測(cè)試環(huán)境
主數(shù)據(jù)庫(kù): CentOS7, MySQL15.1 , 192.168.1.233
從數(shù)據(jù)庫(kù): CentOS7, MySQL15.1 , 192.168.1.234
三、主從配置步驟
1、確保主數(shù)據(jù)庫(kù)與從數(shù)據(jù)庫(kù)里的數(shù)據(jù)一樣
例如:主數(shù)據(jù)庫(kù)里的a的數(shù)據(jù)庫(kù)里有b,c,d表,那從數(shù)據(jù)庫(kù)里的就應(yīng)該有一個(gè)模子刻出來(lái)的a的數(shù)據(jù)庫(kù)和b,c,d表
我這里在兩臺(tái)MySQL上都創(chuàng)建了個(gè)名為“test”的數(shù)據(jù)庫(kù)來(lái)測(cè)試,如圖:
2、在主數(shù)據(jù)庫(kù)里創(chuàng)建一個(gè)同步賬號(hào)
1)每個(gè)從數(shù)據(jù)庫(kù)會(huì)使用一個(gè)MySQL賬號(hào)來(lái)連接主數(shù)據(jù)庫(kù),所以我們要在主數(shù)據(jù)庫(kù)里創(chuàng)建一個(gè)賬號(hào),并且該賬號(hào)要授予 REPLICATION SLAVE 權(quán)限,你可以為每個(gè)從數(shù)據(jù)庫(kù)分別創(chuàng)建賬號(hào),當(dāng)然也可以用同一個(gè)?。?/p>
2)你可以用原來(lái)的賬號(hào)不一定要新創(chuàng)賬號(hào),但你應(yīng)該注意,這個(gè)賬號(hào)和密碼會(huì)被明文存放在master.info文件中,因此建議單獨(dú)創(chuàng)一個(gè)只擁有相關(guān)權(quán)限的賬號(hào),以減少對(duì)其它賬號(hào)的危害?。?/p>
3)創(chuàng)建新賬號(hào)使用“CREATE USER”,給賬號(hào)授權(quán)使用“GRANT”命令,如果你僅僅為了主從復(fù)制創(chuàng)建賬號(hào),只需要授予REPLICATION SLAVE權(quán)限。
4)下面來(lái)創(chuàng)建一個(gè)賬號(hào),賬號(hào)名:repl,密碼:repl123,只允許192.168.1.的IP段登錄,如下:
mysql> CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'repl123';mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';
5)如果開(kāi)發(fā)防火墻,可能要配置下端口,如下:
firewall-cmd --zone=public --add-port=3306/tcp --permanentfirewall-cmd --reload
3、配置主數(shù)據(jù)庫(kù)
1)要主數(shù)據(jù)庫(kù),你必須要啟用二進(jìn)制日志(binary logging),并且創(chuàng)建一個(gè)唯一的Server ID,這步驟可能要重啟MySQL。
2)主服務(wù)器發(fā)送變更記錄到從服務(wù)器依賴的是二進(jìn)制日志,如果沒(méi)啟用二進(jìn)制日志,復(fù)制操作不能實(shí)現(xiàn)(主庫(kù)復(fù)制到從庫(kù))。
3)復(fù)制組中的每臺(tái)服務(wù)器都要配置唯一的Server ID,取值范圍是1到(232)?1,你自己決定取值。
4)配置二進(jìn)制日志和Server ID,你需要關(guān)閉MySQL和編輯my.cnf或者my.ini文件,在 [mysqld] 節(jié)點(diǎn)下添加配置。
5)下面是啟用二進(jìn)制日志,日志文件名以“mysql-bin”作為前綴,Server ID配置為1,如下:
[mysqld]log-bin=mysql-binserver-id=1#網(wǎng)絡(luò)上還有如下配置#binlog-do-db=mstest //要同步的mstest數(shù)據(jù)庫(kù),要同步多個(gè)數(shù)據(jù)庫(kù),就多加幾個(gè)replicate-db-db=數(shù)據(jù)庫(kù)名 #binlog-ignore-db=mysql //要忽略的數(shù)據(jù)庫(kù)
提示1:如果你不配置server-id或者配置值為0,那么主服務(wù)器將拒絕所有從服務(wù)器的連接。
提示2:在使用InnoDB的事務(wù)復(fù)制,為了盡可能持久和數(shù)據(jù)一致,你應(yīng)該在my.cnf里配置innodb_flush_log_at_trx_commit=1 和 sync_binlog=1;
For the greatest possible durability and consistency in a replication setup using InnoDB with transactions, you should useinnodb_flush_log_at_trx_commit=1 and sync_binlog=1 in the master my.cnf file.
提示3:確保主服務(wù)器里的skip-networking選項(xiàng)未啟用,如果網(wǎng)絡(luò)被禁用,你的從服務(wù)器將不能與主服務(wù)器通信并且復(fù)制失敗。
注意:
實(shí)際操作發(fā)現(xiàn) /etc/my.cnf文件和教材說(shuō)的不一樣,可能我裝的是MariaDB,如下:
目測(cè)文件被放到了 /etc/my.cnf.d 目錄里,如下:
在 /etc/my.cnf.d/server.cnf 增加相關(guān)配置,如下:
重啟MySQL,如圖:
查看主服務(wù)器狀態(tài),mysql> show master status;, 如圖:
(注意:記錄好File和Position,后面要用)
4、配置從數(shù)據(jù)庫(kù)
1)從服務(wù)器,同理,要分配一個(gè)唯一的Server ID,需要關(guān)閉MySQL,修改好后再重啟,如下:
[mysqld]server-id=2#可以指定要復(fù)制的庫(kù)-
replicate-do-db = test #在master端不指定binlog-do-db,在slave端用replication-do-db來(lái)過(guò)濾 replicate-ignore-db = mysql #忽略的庫(kù)#網(wǎng)上還有下面配置#relay-log=mysqld-relay-bin
提示1:如果有多個(gè)從服務(wù)器,每個(gè)服務(wù)器的server-id不能重復(fù),跟IP一樣是唯一標(biāo)識(shí),如果你沒(méi)設(shè)置server-id或者設(shè)置為0,則從服務(wù)器不會(huì)連接到主服務(wù)器。
提示2:一般你不需要在從服務(wù)器上啟用二進(jìn)制日志,如果你在從服務(wù)器上啟用二進(jìn)制日志,那你可用它來(lái)做數(shù)據(jù)備份和崩潰恢復(fù),或者做更復(fù)雜的事情(比如這個(gè)從服務(wù)器用來(lái)當(dāng)作其它從服務(wù)器的主服務(wù)器)。
2)配置連接主服務(wù)器的信息
mysql> stop slave;mysql> CHANGE MASTER TO-> MASTER_HOST='192.168.1.233',-> MASTER_USER='repl',-> MASTER_PASSWORD='repl123',-> MASTER_LOG_FILE='mysql-bin.000002',-> MASTER_LOG_POS=313;- mysql> start slave;
3)查看從服務(wù)器狀態(tài)
mysql> show slave status \G;
5、測(cè)試數(shù)據(jù)同步
測(cè)試,連接主服務(wù)器 192.168.1.233,添加了表 stu_user,
然后再連接上 192.168.1.234,發(fā)現(xiàn)也自己同步創(chuàng)建了表 stu_user,如圖:
然后在主數(shù)據(jù)庫(kù)添加一條記錄,從數(shù)據(jù)庫(kù)也自動(dòng)添加了記錄,如圖:
至此,主從的配置已經(jīng)完成了, 目前是在從庫(kù)里面配置復(fù)制“test”這個(gè)庫(kù),
如果要添加其它庫(kù),可以在主服務(wù)器中添加“binlog-do-db”配置,或者在從服務(wù)器中添加“replicate-do-db”配置。
四、讀寫分離實(shí)現(xiàn)
主從配置是讀寫分離的前提,現(xiàn)在前提已經(jīng)配置好了,讀寫分離就看具體項(xiàng)目的實(shí)現(xiàn),
讀寫分離,就是“寫”的操作都在主數(shù)據(jù)庫(kù),“讀”的操作都在從數(shù)據(jù)庫(kù)!
這里我選用一個(gè)比較輕量的框架SpeedPHP來(lái)做讀寫分離演示,
這個(gè)框架做讀寫分離非常簡(jiǎn)單,按要求在配置文件填好信息即可,如圖:
簡(jiǎn)單寫了些增加/刪除/查詢的方法,如圖:
頁(yè)面效果如下圖:
再來(lái)看看兩個(gè)數(shù)據(jù)庫(kù),信息一致,如圖:
這個(gè)例子中,
讀取賬號(hào)列表的是從 192.168.1.234 (從數(shù)據(jù)庫(kù))上面的數(shù)據(jù)庫(kù)操作的,
添加和刪除賬號(hào)是從 192.168.1.233 (主數(shù)據(jù)庫(kù))上面的數(shù)據(jù)庫(kù)操作的,
實(shí)現(xiàn)了讀寫分離!
原文轉(zhuǎn)至: http://blog.csdn.net/envon123/article/details/76615059
參考:
官方文檔:https://dev.mysql.com/doc/refman/5.5/en/replication-howto.html
mysql主從配置(清晰的思路):http://www.cnblogs.com/sustudy/p/4174189.html
MySQL5.6 數(shù)據(jù)庫(kù)主從(Master/Slave)同步安裝與配置詳解:http://blog.csdn.net/xlgen157387/article/details/51331244
MySQL主從架構(gòu)配置:http://blog.csdn.net/jiangsyace/article/details/50556240