一、實驗目标 搭建兩台MySQL伺服器,一台作為主伺服器,一台作為從伺服器,主伺服器進行寫操作,從伺服器進行讀操作。
二、測試環境 主資料庫: CentOS7, MySQL15.1 , 192.168.1.233 從資料庫: CentOS7, MySQL15.1 , 192.168.1.234
三、主從配置步驟
1、確定主資料庫與從資料庫裡的資料一樣 例如:主資料庫裡的a的資料庫裡有b,c,d表,那從資料庫裡的就應該有一個模子刻出來的a的資料庫和b,c,d表
我這裡在兩台MySQL上都建立了個名為“test”的資料庫來測試,如圖:
2、在主資料庫裡建立一個同步賬号
1)每個從資料庫會使用一個MySQL賬号來連接配接主資料庫,是以我們要在主資料庫裡建立一個賬号,并且該賬号要授予 REPLICATION SLAVE 權限,你可以為每個從資料庫分别建立賬号,當然也可以用同一個!)
2)你可以用原來的賬号不一定要新創賬号,但你應該注意,這個賬号和密碼會被明文存放在master.info檔案中,是以建議單獨創一個隻擁有相關權限的賬号,以減少對其它賬号的危害!)
3)建立新賬号使用“CREATE USER”,給賬号授權使用“GRANT”指令,如果你僅僅為了主從複制建立賬号,隻需要授予REPLICATION SLAVE權限。
4)下面來建立一個賬号,賬号名: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)如果開發防火牆,可能要配置下端口,如下:
-
firewall-cmd --zone=public --add-port=3306/tcp --permanent
-
firewall-cmd --reload
3、配置主資料庫
1)要主資料庫,你必須要啟用二進制日志( binary logging),并且建立一個唯一的Server ID,這步驟可能要重新開機MySQL。 2)主伺服器發送變更記錄到從伺服器依賴的是二進制日志,如果沒啟用二進制日志,複制操作不能實作(主庫複制到從庫)。 3)複制組中的每台伺服器都要配置唯一的Server ID,取值範圍是1到 (2 32 )−1,你自己決定取值。 4)配置二進制日志和Server ID,你需要關閉MySQL和編輯my.cnf或者my.ini檔案,在 [mysqld] 節點下添加配置。 5)下面是啟用二進制日志,日志檔案名以“mysql-bin”作為字首,Server ID配置為1,如下:
-
[mysqld]
-
log-bin=mysql-bin
-
server-id=1
-
#網絡上還有如下配置
-
#binlog-do-db=mstest //要同步的mstest資料庫,要同步多個資料庫,就多加幾個replicate-db-db=資料庫名 #binlog-ignore-db=mysql //要忽略的資料庫
提示1:如果你不配置server-id或者配置值為0,那麼主伺服器将拒絕所有從伺服器的連接配接。 提示2:在使用InnoDB的事務複制,為了盡可能持久和資料一緻,你應該在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 use
innodb_flush_log_at_trx_commit=1
and
sync_binlog=1
in the master
my.cnf
file. 提示3:確定主伺服器裡的skip-networking選項未啟用,如果網絡被禁用,你的從伺服器将不能與主伺服器通信并且複制失敗。
注意: 實際操作發現 /etc/my.cnf檔案和教材說的不一樣,可能我裝的是MariaDB,如下:
目測檔案被放到了 /etc/my.cnf.d 目錄裡,如下:
在 /etc/my.cnf.d/server.cnf 增加相關配置,如下:
重新開機MySQL,如圖:
檢視主伺服器狀态,mysql> show master status;, 如圖:
(注意:記錄好File和Position,後面要用)
4、配置從資料庫
1)從伺服器,同理,要配置設定一個唯一的Server ID,需要關閉MySQL,修改好後再重新開機,如下:
-
[mysqld]
-
server-id=2
-
#可以指定要複制的庫
-
在master端不指定binlog-do-db,在slave端用replication-do-db來過濾replicate-do-db = test #
-
replicate-ignore-db = mysql #忽略的庫
-
#網上還有下面配置
-
#relay-log=mysqld-relay-bin
提示1:如果有多個從伺服器,每個伺服器的server-id不能重複,跟IP一樣是唯一辨別,如果你沒設定server-id或者設定為0,則從伺服器不會連接配接到主伺服器。 提示2:一般你不需要在從伺服器上啟用二進制日志,如果你在從伺服器上啟用二進制日志,那你可用它來做資料備份和崩潰恢複,或者做更複雜的事情(比如這個從伺服器用來當作其它從伺服器的主伺服器)。
2)配置連接配接主伺服器的資訊
-
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)檢視從伺服器狀态
-
mysql> show slave status \G;
5、測試資料同步
測試,連接配接主伺服器 192.168.1.233,添加了表 stu_user, 然後再連接配接上 192.168.1.234,發現也自己同步建立了表 stu_user,如圖:
然後在主資料庫添加一條記錄,從資料庫也自動添加了記錄,如圖:
至此,主從的配置已經完成了, 目前是在從庫裡面配置複制“test”這個庫, 如果要添加其它庫,可以在主伺服器中添加“binlog-do-db”配置,或者在從伺服器中添加“replicate-do-db”配置。
四、讀寫分離實作
主從配置是讀寫分離的前提,現在前提已經配置好了,讀寫分離就看具體項目的實作, 讀寫分離,就是“寫”的操作都在主資料庫,“讀”的操作都在從資料庫!
這裡我選用一個比較輕量的架構SpeedPHP來做讀寫分離示範, 這個架構做讀寫分離非常簡單,按要求在配置檔案填好資訊即可,如圖:
簡單寫了些增加/删除/查詢的方法,如圖:
頁面效果如下圖:
再來看看兩個資料庫,資訊一緻,如圖:
這個例子中, 讀取賬号清單的是從 192.168.1.234 (從資料庫)上面的資料庫操作的, 添加和删除賬号是從 192.168.1.233 (主資料庫)上面的資料庫操作的, 實作了讀寫分離!
(完)
參考: 官方文檔: https://dev.mysql.com/doc/refman/5.5/en/replication-howto.html
mysql主從配置(清晰的思路): http://www.cnblogs.com/sustudy/p/4174189.html MySQL5.6 資料庫主從(Master/Slave)同步安裝與配置詳解: http://blog.csdn.net/xlgen157387/article/details/51331244 MySQL主從架構配置: http://blog.csdn.net/jiangsyace/article/details/50556240