數據庫同步雙機互備
先說測試環境吧,【兩臺虛擬機】;
? ? ? ? ? 【一個是redhat7,另一個是centos7】-redhat7 :? 192.168.111.55? ;?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?-centos7 :? 192.168.111.66? ;
? ? ? ? ? 【新搭建的mariadb數據庫(使用yum安裝的)】;
保障:1. 兩段服務器都可以互相ping通;
2.selinux和防火墻關掉;(後面會說因為防火墻沒關而出現的問題);
3.兩邊的數據要開啟允許遠程連接,我是直接開啟允許root遠程連接的;(也可以另建新賬戶)
配置文件: /etc/my.conf ;
在 192.168.111.55 的/etc/my.conf中添加或者修改為:
? ? ? ? ? ?server_id=10? ? ? ? ? ? ? ? ? ? ? ? //可以理解成指定的唯一的id
? ? ? ? ? ?log-bin=master_01? ? ? ? ? ? ? //開啟二進制日誌,作用是另一個服務器可以通過該日誌來確定執行操作
? ? ? ? ? ?binlog-do-db=test? ? ? ? ? ? ? ? //同步的庫;兩邊的庫名字要一樣;
在 192.168.111.66 的/etc/my.conf中添加或者修改為:
? ? ? ? ? ?server_id=20
? ? ? ? ? ?log-bin=master_02? ? ? ? ? ? ?
? ? ? ? ? ?binlog-do-db=test? ? ? ?
添加之後執行命令? systemctl restart mysqld.service? 重啟數據庫使修改生效。
上述參數解析:
?? ?server_ id 為當前 mysql 服務的識別 ID,必須唯一。
?? ?log - bin 開啟二進制日誌,每次數據操作都會將操作日誌記錄在裏面,以便從服務可以通過日誌確定執行了什麽操作。
分別在兩臺服務器上進入 mysql,輸入? ??show master status;? ?命令查看當前主機的狀態;記錄下此時的 file 名以及 position;如我的是:
看完、確認好之後再執行命令:!!!!!
? ?若 slave 開啟狀態無法執行下面的命令,
?? ?首先執行 stop slave 關閉 slave,
?? ?再執行下面的命令,
?? ?執行後再開啟 start slave ;
在 192.168.111.55 數據庫中執行:
?? ?CHANGE MASTER TO
? ? MASTER_HOST=‘192.168.111.66‘, ??? ? ?? ??? ?//所要同步的服務器ip
? ? MASTER_USER=‘root‘, ? ? ?? ??? ??? ?//同步服務器的mysql用戶名
? ? MASTER_PASSWORD=‘123456‘, ?? ??? ??? ??? ?//同步服務器的mysql密碼
? ? MASTER_PORT=3306,? ? ? ? ? ? ? ? ? ? ? ? ? ?//數據庫端口
? ? MASTER_LOG_FILE=‘master_02.000002‘, ??? ?//對應 12.168.111.66 的file名
? ? MASTER_LOG_POS=1771, ? ? ??? ??? ??? ??? ?//對應10.168.0.126的position
? ? MASTER_CONNECT_RETRY=20;?? ??? ??? ??? ?//192.168.111.66的server-id
在 192.168.111.66?數據庫中執行:
? ? CHANGE MASTER TO
? ? MASTER_HOST=‘10.168.1.44‘,
? ? MASTER_USER=‘root‘,
? ? MASTER_PASSWORD=‘123456‘,
? ? MASTER_PORT=3306,
? ? MASTER_LOG_FILE=‘master_01.000008‘, ? ? //對應192.168.111.55的file名
? ? MASTER_LOG_POS=154, ? ? ? ? ? ??? ??? ??? ?//對應192.168.111.55的position
? ? MASTER_CONNECT_RETRY=10;?? ??? ??? ??? ?//192.168.111.55的server-id
上述命令執行完後,查看兩個服務狀態:執行命令:
?? ?show slave status\G;
參數解釋:
Slave_IO_Running: 指的就是從服務器上負責讀取主服務器的線程工作狀態。?
?? ?從服務器用這個專門的線程鏈接到主服務器上,並把日誌拷貝回來。
Slave_SQL_Running:指的就是專門執行 sql 的線程。
?? ?它負責把復制回來的 Relaylog 執行到自己的數據庫中。
?? ?這兩個參數必須都為Yes 才表明復制在正常工作。
只有兩個進程參數都為 yes
?? ?Slave_IO_Running: Yes
?? ?Slave_SQL_Running: Yes
才是配置成功的;我的其中的一個值為 connecting 是就是因為有個服務器的防火墻忘關了,io數據通不了導致的;關閉防火墻後就都為yes了;
到這裏,mysql 同步配置已完成,接下來就可以測試是否能正常實時同步。在兩邊的數據庫內隨意的創建表,增刪改查,你會發現就會實時同步的;可以使用一個叫? navicat? 的數據庫連接軟件測試,比較方便;
可能出現的問題
1.查看 slave 狀態時,會發現 Slave_IO_Running: Connecting
出現該問題主要有三個原因:
A.網絡不通(互相 ping下試試看能否ping通)
B.密碼不對:查看在配置 slave 時執行的命令中的密碼是否正確
C.Position 不正確:配置 slave 時對應 position 未填為正確的position
2.查看 slave 狀態時,會發現 Slave_SQL_Running: No
出現這個現象的原因主要就是兩邊數據庫數據存在不同之處,也就是同步時沒有相同的初態,
可以通過查看 mysql 日誌定位具體哪塊數據出現異常。
3.使用??show master status;? 命令查看狀態時,給出的值不是固定的,重啟一下數據庫就會導致file名和position的變動;所以配置的時候一定要確認好了;
4.在數據庫中配置時的?MASTER_CONNECT_RETRY=20; 值都是對方的server-id值,所以兩邊的數據庫是相互同步的;
如果改動了其中一個,比如說將192.168.111.55的MASTER_CONNECT_RETRY=20;改為MASTER_CONNECT_RETRY=10;
重啟數據庫後,就成了一主一從了,192.168.111.55是主,192.168.111.66是從;因為66會向55同步數據,但是55不會向66同步;
個人筆記,不喜勿噴;
數據庫同步雙機互備