1. 程式人生 > >安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(三)-- 主從設定

安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(三)-- 主從設定

零、寫在前面

    為了嘗試新技術和業務需要,因此打算搞一套這樣的環境玩兒一下

    作業系統及資料庫的安裝請見前兩篇

一、理論依據

    不再贅述我的硬體規劃等細節

    這次僅用到兩臺虛擬機器,一主一從,後續會增加關於多主多從的內容

    現在開始

    1、說說思路

        主從複製的核心思想,就是讓Slave庫獲取Master庫的二進位制日誌,然後根據二進位制日誌在Slave庫中redo主庫的操作

     

        操作流程如上圖所示,主庫操作--> binary log--> 從庫的I/O Thread獲取主庫日誌 -->

        將主庫二進位制日誌寫入從庫relay log

--> 從庫SQL Thread執行Relay log--> 從庫與主庫達到一致

        思路清晰,流程明確了,後續就是操作了

二、開始搭建

    1、賬號與防火牆

        在Master庫建立一個賬號,具備Replication Slave許可權,提供給Slave庫訪問二進位制日誌使用。

        CREATE USER 'dark'@'%' IDENTIFIED BY '123456';

        GRANT REPLICATION SLAVE ON *.* TO 'dark'@'%';

        注意,你當可以使用其他的更高許可權的賬號來做此操作,

        但是由於這個賬號和密碼會以明文的形式存放在master.info檔案中,所以何去何從你決定就好。

        如果你的伺服器上開啟了firewall,那麼需要配置對應的埠

        firewall-cmd --zone=public --add-port=3306/tcp --permanent
        firewall-cmd --reload

        如果你用的是iptables,那麼做另外的操作

        -A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT
        然後重啟iptables即可 systemctl restart iptables.service

    2、Master上的操作

        上面說了,作為Master,一定要啟用二進位制日誌,所以我們先開啟主機的二進位制日誌

        同時,作為主從架構來說,在這個架構的整體中,Master一定要有個自己的唯一id,所以這個也需要新增

        最後,如果不想像我一樣找麻煩,最好不要配那些亂七八糟的忽略項,這個後面會說

        開啟Master伺服器上my.cnf(一般在/etc/下面),新增或解掉下面這些的註釋

        [mysqld]
        log-bin=mysql-bin    
        server-id=1        #這裡不寫或者值為0,master都會拒絕slave的連線請求
        binlog-format=mixed                 #日誌型別
        #binlog-do-db=test #強烈建議這些-do-db結尾的不要新增,後續會說我遇到的問題
        #innodb_flush_log_at_trx_commit=1   #這一項和下面一項,是如果你使用了innodb的情況下為保持
        #sync_binlog=1                      #資料一致和資料的永續性,建議新增的內容
        #skip_networking=xx.xx.xx.xx        #確保master此項未被啟用,否則會造成主從複製失敗

        修改完這些之後,可以重啟master庫,然後檢視master的狀態了


    3、Slave上的操作

        slave的職責在此就不再贅述了,直接說配置方式

        [mysqld]
        server-id=2
        #replicate-do-db=192.168.122.21     #這種亂七八糟的東西不要亂配
        #replicate-ignore-db=test           #不要加
        replay-log=mysql-bin                #slav本地記錄主庫二進位制日誌的日誌

        一般來說,slave配置上面那兩條就夠用了

        同時,slave上一般不需要開啟二進位制日誌,除非你打算讓它當做其他slave的master

        然後,在資料庫中配置一下slave連線master的引數

        stop slave;                          #先停止slave

        CHANGE MASTER TO 
        MASTER_HOST='192.168.122.21',        #master的ip或虛ip或域名
        MASTER_USER='dark',                  #master上之前建立的登入賬戶名
        MASTER_PASSWORD='123456',            #dark的登入密碼
        MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=155;    
                                             #這就是上面圖中master的file和position

        start slave;                         #配置完畢,啟動slave

        執行完上面的操作後,可以檢視slave的狀態了,如下面兩張圖所示

        

        

        一般來說,到這裡應該就一切沒問題了,我們可以測試個建表、插記錄,刪記錄、刪表的操作

        我在這裡就不做具體的演示了。

三、遇到的問題

    回顧一下,我在配置主從的過程中,還是踩了好幾個坑的。。。

    1、*-do-db和 *-ignore-db結尾的坑貨

        如果大家剛才逐步看了我上面的內容,那麼大家一定對這些東西有印象,

        這些結尾的引數,在/etc/my.cnf的裡面,能不新增就不新增。

        之前我在slave中添加了replicate-do-db=192.168.122.21,開始以為是從這個ip的庫中獲取複製資訊

        結果,我的主從一直沒有同步

        檢查了包括網路、防火牆、甚至重做了主從同步,仍然不行。

        最後註釋掉了slave中這一引數,問題解決

        這種引數的含義未做深入研究,大家可以參考下面的連結自行考察