MYSQL主從同步原理解析!
大神請繞行!
一、為什麼要主從同步?
我們會對資料庫進行大量的讀寫操作,而如果資料庫非常龐大的話,對我們的主機壓力非常大,我們想到了一個解決的辦法:兩臺伺服器,一臺只用來讀取操作,一臺只用來寫入操作。
二、用途:
實時災備,用於故障切換;
讀寫分離,提供查詢服務;
備份,避免影響業務。
三、實戰演練
主從部署必要條件:
- 主庫開啟binlog日誌(設定log-bin引數)
- 主從server-id不同
- 從庫伺服器能連通主庫
1、一主一從
(1)實戰環境
兩臺伺服器(centos7):
主伺服器IP:172.18.252.121
從伺服器IP:172.18.252.162
兩臺機器上都安裝了mariadb.server
(2)主伺服器配置檔案
主配置檔案路徑: /etc/my.cnf。新增兩行:
vim /etc/my.cnf
[mysqld]
server_id=1
log-bin
要點講解:
首先,一定要在[mysqld]下面新增這兩條設定,否則會出現問題。
server_id=1 : 就是給我們的主機器設定一個ID號。
log-bin :開啟二進位制日誌功能。
說一下我在這裡遇到的一個問題:我將server_id=1這一行寫入配置檔案,然後在資料庫裡面查看了一下server_id的值,居然是0,然後老師說我的配置檔案fcontext不對。我在網上搜了一下,另一種情況也可能出問題:將server_id=1該設定寫在了[mysqld_safe]下,重啟服務(每一次修改配置檔案都需要重啟服務)。再登入資料庫,檢視一下server_id引數,server_id的值居然是0!將server_id=1寫入[mysqld]下面則能生效。(我自己也試了一下,但是沒有什麼影響)。
(4)重啟服務
[[email protected] ~]# systemctl restart mariadb.service
每次修改配置檔案都需要重啟服務!
(5)新增使用者
[[email protected] ~]# mysql
Master [(none)]> grant replication slave on *.* to [email protected]'172.18.252.%' identified by 'centos';
登入資料庫,並建立repluser賬戶,密碼centos,網段是172.18.252.%。
(6)查詢當前二進位制日誌位置
Master [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 | 401 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
以下在從伺服器上進行
(7)配合從伺服器檔案
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
server_id=2
innodb_file_per_table
(8)重啟服務
(9)設定主從關係
[[email protected] ~]# mysql
Slave [(none)]> CHANGE MASTER TO
-> MASTER_HOST='178.15.252.121',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='master-bin.000003',
-> MASTER_LOG_POS=401,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.06 sec)
Slave [(none)]> CHANGE MASTER TO -> MASTER_HOST='192.168.153.7', -------主機IP -> MASTER_USER='repluser', ---------使用者名稱 -> MASTER_PASSWORD='centos', ---------密碼 -> MASTER_PORT=3306, ----------埠 -> MASTER_LOG_FILE='master-bin.000003', ----步驟(6)查到的檔案的檔名
-> MASTER_LOG_POS=401, --------上面檔案起始位置
-> MASTER_CONNECT_RETRY=10;
(10)開啟從屬關係
Slave [(none)]> start slave;
你肯定失敗了!簡單一點:清空一下防火牆,關閉一下selinux再試試吧(兩臺機器都要設定)。
清空防火牆 iptables -F
關閉selinux:setenforce 0
可能你覺得這樣做不太嚴謹,那你也可以給主伺服器設定一個防火牆策略:
iptables -A INPUT -s 192.168.153.6 -p tcp --dport 3306 -j accept
iptables -A INPUT -p tcp --dport 3306 -j REJECT
(11)測試
在我們的主伺服器上建立一個庫,然後在我們的從伺服器上一下是否有這個庫!
如果要停止 stop slave; 清空 reset slave all;