1. 程式人生 > >MySQL主從複製(Replication for Backup)

MySQL主從複製(Replication for Backup)

環境:MySQL5.7,VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5

1. 基本概念和操作思路

主從複製能做什麼

資料庫的主從複製,是一臺主資料庫機器(Master)把自己的資料,複製到一臺或多臺從機器(Slaves)上。主從機器的通訊方式是基於TCP/IP協議的。資料庫最簡單,也是直接就能實現的功能就是對資料庫進行實時備份,如果不額外配置情況下沒有其它功能,主資料庫掛了,叢集還是直接癱瘓除非手動把資料庫連線資訊切換到從資料庫機器上,也就是說不能實現故障切換。不額外配置對資料庫效能也沒有提升,讀寫操作都用的是主資料庫的計算資源,從資料庫僅僅是增量同步主資料庫。

但是資料庫的高可用(故障切換)和讀寫分離(寫走主,讀負載到多臺從),是基於資料庫主從複製之上才能搭建起來的,本文介紹的是資料庫主從複製的實現。

基本實現原理

資料庫的主從複製有幾種實現方案,這裡介紹的基於二進位制日誌(binary log)來實現主從複製,原理很簡單,就是主資料庫開啟日誌記錄功能,這樣在主資料庫上進行的操作都會被記錄到這個日誌裡,然後從資料庫通過網路連線到資料庫,利用這份二進位制日誌,把相關操作在從機器上再執行一遍,從而實現資料庫同步。

操作步驟概況

首先考慮一下實際環境,假設我們已經有一臺資料庫機器,這臺數據庫機器是對外提供WEB服務的,比如是LAMP架構裡的一員。我們知道資料庫是非常重要的,程式碼丟了還能重寫,使用者資料丟了,公司距離倒閉也就不遠了,因此為了穩妥我們有必要考慮下資料庫的安全性問題。只有一臺資料庫機器時,基本上重點考慮資料不能丟,但是部署主從複製時,至少需要兩臺機器,也就是還需要考慮資料一致性的問題。

力求穩妥,我們在搭建資料庫主從複製時,儘可能避免在這期間操作主資料庫,尤其時不能進行寫相關操作,搭建完畢之後,最好不要單獨對從資料庫做寫相關操作,以防資料不一致的問題。從資料庫只能用來讀,比如對資料進行統計分析時,我們就可以到從資料庫讀資料,從而緩解主資料庫的壓力。

搭建資料庫主從複製,具體步驟如下:

  1. 啟用主資料庫二進位制日誌記錄功能
  2. 在主資料庫上建立使用者以供從資料庫遠端連線
  3. 備份主資料庫資料
  4. 把資料庫備份匯入到從資料庫上
  5. 配置從資料庫連線主資料庫
  6. 啟用從資料庫,使其進入SLAVE狀態

下面我啟兩臺虛擬機器,分別作為主資料庫(172.16.1.51)和從資料庫(172.16.1.52),演示如何搭建資料庫主從複製。具體環節如下:

[[email protected] ~]# hostname -I
10.0.0.51 172.16.1.51 
[[email protected] ~]# hostname -I
10.0.0.52 172.16.1.52 

51機器是LAMP架構的一員,上面已有供給其它WEB叢集使用的資料,而52是全新機器。

2. MASTER-配置

  1. 啟用Master二進位制日誌記錄功能

    [[email protected] ~]# systemctl stop mysqld
    [[email protected] ~]# /etc/my.cnf
    [[email protected] ~]# egrep -v '^$|^#' /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    log-bin=mysql-bin #+
    server-id=1       #+
    [[email protected] ~]# systemctl start mysqld

    更改資料庫配置檔案,最好先停後啟。/etc/my.cnf是MySQL的配置檔案,在其中的mysqld區塊中增加如上最後兩行內容,即可啟用二進位制日誌記錄功能,=mysql-bin是可以省略不寫的,mysql-bin是表示日誌檔名的字首,可換成其它。只要涉及到多臺MySQL機器協同工作,那麼每臺機器都需要一個ID來標識,server-id就是這個作用,不能重複。

  2. 為從機器建立遠端連線使用者

    [[email protected] ~]# mysql -uroot -pAs4k.top
    mysql> CREATE USER 'repl'@'%' IDENTIFIED BY 'As4k.top';
    mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

    上述操作就是,授權rpel使用者,密碼為As4k.top,對所有資料庫都具有REPLICATION許可權。

  3. 拿到Master狀態資訊(從連線主時用)

    從這一步開始,最好不要再動主資料庫了,但是還不能把mysqld服務直接停掉,可以把資料庫的表鎖定只能讀取,我還把WEB叢集上的nginx和php都停掉,徹底杜絕任何操作資料庫的可能性。

    mysql> FLUSH TABLES WITH READ LOCK;
    mysql> SHOW MASTER STATUS;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000003 |      154 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    File表示當前二進位制檔名,Position表示位置,在進行資料庫寫入操作時,這兩個值都是會變化的,就是用來告訴從資料庫從什麼位置開始複製。

  4. 使用mysqldump備份整個資料庫

    [[email protected] ~]# mysqldump -uroot -pAs4k.top --all-databases --master-data > /root/dbdump.db
    [[email protected] ~]# scp /root/dbdump.db [email protected]:/root

    --all-databases備份所有資料庫,--master-data給slave機器識別用的。

  5. 解鎖資料庫

    [[email protected] ~]# mysql -uroot -pAs4k.top -e "UNLOCK TABLES;"

3. SLAVE-配置

  1. MySQL5.7社群版並改密碼(官方源)

    [[email protected] ~]# yum install mysql-community-server -y
    [[email protected] ~]# systemctl start mysqld
    [[email protected] ~]# systemctl enable mysqld
    [[email protected] ~]# mysql -uroot -p$(awk '/temporary password/ {print $NF}' /var/log/mysqld.log) \
    --connect-expired-password -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'As4k.top'";
  2. 設定一個ID(顯然需要"與眾不同")

    [[email protected] ~]# systemctl stop mysqld
    [[email protected] ~]# vim /etc/my.cnf
    [[email protected] ~]# egrep -v '^$|^#' /etc/my.cnf
    [mysqld]
    datadir=/var/lib/mysql
    socket=/var/lib/mysql/mysql.sock
    symbolic-links=0
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    server-id=2 #+
    [[email protected] ~]# systemctl start mysqld
  3. 設定Slave連線Master

    mysql> CHANGE MASTER TO
    MASTER_HOST='172.16.1.51',
    MASTER_USER='repl',
    MASTER_PASSWORD='As4k.top',
    MASTER_LOG_FILE='mysql-bin.000003',
    MASTER_LOG_POS=154;

    IP,賬號,密碼這都是顯而易見的,FILE和POS是在主機器上使用SHOW MASTER STATUS得到的。

  4. 把Master資料匯入Slave

    [[email protected] ~]# mysql -uroot -pAs4k.top < /root/dbdump.db
  5. 啟動Slave執行緒

    [[email protected] ~]# mysql -uroot -pAs4k.top -e "START SLAVE"

    暫停使用STOP SLAVE

4. 檢查與測試

檢視主從的狀態

檢視主

[[email protected] ~]# mysql -uroot -pAs4k.top -e "SHOW MASTER STATUS"

檢視從

[[email protected] ~]# mysql -uroot -pAs4k.top -e "SHOW SLAVE STATUS\G"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.1.51
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            .......

除了IP,埠,賬號這些要和主資料庫對上,位置資訊也要對上,這樣才能保證資料的一致性。

測試效果

測試很簡單,在Master上做一些寫入資料庫的操作,然後到Slave機器上檢視是否正確同步即可。這裡不在贅述。

作者:阿勝4K
出處:https://www.cnblogs.com/asheng2016/p/replication-for-backup.html