1. 程式人生 > >MYSQL主從同步原理解析!

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;