<span id="35v3v"><th id="35v3v"></th></span>
<address id="35v3v"></address>

    <address id="35v3v"></address>
      <address id="35v3v"><listing id="35v3v"><meter id="35v3v"></meter></listing></address>
        <listing id="35v3v"><listing id="35v3v"></listing></listing>

        <listing id="35v3v"><listing id="35v3v"><menuitem id="35v3v"></menuitem></listing></listing>

        <noframes id="35v3v"><noframes id="35v3v">
        當前位置: 首頁 / 技術分享 / 正文
        MySQL數據庫的主從架構(一)

        2023-01-12

        主從 主庫 架構 mysql

          MySQL集群架構的介紹

          我們在使用到MySQL數據庫的時候,只是一個單機的數據庫服務。在實際的生產環境中,數據量可能會非常龐大,這樣單機服務的MySQL在使用的時候,性能會受到影響影響。并且單機服務的MySQL的數據安全性也會受到影響。因此在生產環境中,我們通常搭建MySQL的集群架構,來提高龐大數據量的基礎上的高性能讀寫的需求。

          在常見的集群架構中,最常見的就是主從架構(Master-Slaves)

          主從架構介紹

          MySQL的主從架構,又有一些其他的名稱:主從模式、主從復制等。所謂的主從架構指的是建立多個完全一樣的數據庫,其中一個數據庫作為主庫(主要是用的數據庫),其他的作為從庫(次要的數據庫)。主從架構分為很多種:一主一從、雙主架構、一主多從、多主多從等模式。通常主庫可讀可寫,從庫只讀。

          MySQL最常見也是最簡單的主從架構的實現就是主從復制(MySQL Replication)模式,這也是MySQL自帶的功能,無需借助第三方的工具,就可以實現一個主從架構的集群模式。

          主從架構相比較于單機服務的MySQL來說,優勢有很多,最常見的優勢就是:寫操作連接主庫,讀操作連接從庫,實現讀寫分離。

          主從復制的原理

          主從復制是通過重演binlog來實現主庫數據的異步復制。即在主庫上打開binlog記錄每一次的數據庫操作,然后從庫會有一個IO線程,負責跟主庫建立TCP連接,請求主庫將binlog傳輸到從庫。此時主庫上會有一個Log Dump線程,負責通過這個TCP連接吧binlog日志傳輸給從庫的IO線程。接著從庫的IO線程會把讀取到的binlog日志數據寫入自己的中繼日志文件(Relay)中。然后從庫上另外一個SQL線程會讀取中繼日志文件中的操作,進行操作重演,達到還原數據的目的。

        image

          1主庫的數據發生了變更,將日志寫入到主庫的binlog中。

          2主庫的LogDump線程,將binlog文件傳輸到從庫的IO線程。

          3從庫的IO線程將接收到的binlog寫入到relay log中。

          4從庫的SQL線程讀取relay log中的日志,并操作重演,將結果同步到從庫中。

          MySQL主從復制的實現

          環境說明

          要實現MySQL的主從架構的搭建,需要滿足以下條件:

          ●所有節點的MySQL版本必須一致。

          ●所有節點的時間必須同步。

          ●所有節點需要啟動binlog服務。

          主庫配置

          我們需要編輯MySQL配置文件,這個配置文件在不同的操作系統中的位置和名字都不同,需要根據自己的操作系統來查找這個文件:

          ●Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

          ●Linux: /etc/my.cnf

          macOS:

          dmg安裝: /etc/my.cnf

          homebrew安裝:

          Intel CPU: /usr/local/homebrew/etc/my.cnf

          AppleSilicon CPU: /opt/homebrew/etc/my.cnf

          # 在[mysqld]的下方添加或修改如下屬性:

          # 服務節點的唯一標識,需要給集群中的每個服務分配一個單獨的ID

          server-id=101

          # 打開binlog日志,并指定文件名

          log_bin=master-bin

          # binlog日志文件

          log_bin-index=master-bin.index

          修改完成之后,需要重啟MySQL服務。

          為root用戶分配replication slave的權限:

        # 登錄到主庫
        mysql -uroot -p

        # 為root用戶分配權限
        # MySQL8中,需要先添加 'root'@'%' 這個用戶
        # create user 'root'@'%' identified by '123456'
        mysql> grant replication slave on *.* to 'root'@'%';
        mysql> flush privileges;
        # 查看主節點同步狀態
        mysql> show master status;
        # +-------------------+----------+--------------+------------------+-------------------+
        # | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
        # +-------------------+----------+--------------+------------------+-------------------+
        # | master-bin.000001 |     543 |             |                 |                   |
        # +-------------------+----------+--------------+------------------+-------------------+
        # 1 row in set (0.00 sec)

          在上述輸出結果中:

          File: 當前日志文件

          Position: 日志文件中的索引

          Binlog_Do_DB: 需要記錄binlog日志的庫,不設置表示全部的庫

          Binlog_Ignore_DB: 不需要記錄binlog日志的庫

          從庫配置

          我們需要編輯MySQL配置文件,這個配置文件在不同的操作系統中的位置和名字都不同,需要根據自己的操作系統來查找這個文件:

          Windows: C:\ProgramData\MySQL\MySQL Server 8.0\my.ini

          Linux: /etc/my.cnf

          macOS:

          dmg安裝: /etc/my.cnf

          homebrew安裝:

          Intel CPU: /usr/local/homebrew/etc/my.cnf

          AppleSilicon CPU: /opt/homebrew/etc/my.cnf

        # 在[mysqld]的下方添加或修改如下屬性:
        # 服務節點的唯一標識,需要給集群中的每個服務分配一個單獨的ID
        # 一定要注意,不能和其他節點重復
        server-id=102
        # 打開binlog日志,并指定文件名
        log_bin=slave-bin
        # 打開relaylog日志
        relay_log=slave-relay-bin
        relay_log-index=slave-relay-bin.index
        skip-slave-start

          修改完成之后,需要重啟MySQL服務。

          然后登錄到其他從庫,設置從主庫同步狀態:

        # 登錄從庫
        mysql -uroot -p
        # 設置同步主節點
        change master to
        master_host='192.168.10.101', # 設置主庫的地址
        master_port=3306, # 設置主庫使用的端口號
        master_user='root', # 設置主庫的用戶名
        master_password='123456', # 設置主庫的密碼
        master_log_file='master-bin.000001', # 設置主庫正在使用的binlog文件,可以在主庫使用 show master status 查詢
        master_log_pos=543;  # 設置從什么位置同步
        # 開啟slave
        start slave;
        # 查看主從同步狀態
        show slave status;
        # 也可以使用 show slave status \G

        *************************** 1. row ***************************
                        Slave_IO_State: Waiting for source to send event
                          Master_Host: 192.168.10.101
                          Master_User: root
                          Master_Port: 3306
                        Connect_Retry: 60
                      Master_Log_File: master-bin.000001
                  Read_Master_Log_Pos: 916
                        Relay_Log_File: slave-relay-bin.000002
                        Relay_Log_Pos: 1133
                Relay_Master_Log_File: master-bin.000001
                      Slave_IO_Running: Yes
                    Slave_SQL_Running: Yes

          正常的結果是如上所示的結果,但是總有意外的時候:

          有些同學可能會出現 Slave_IO_Running: Connecting 的狀態,甚至是NO的狀態,說明從庫的IO線程啟動失敗。原因如下:

          可能是主庫設置錯誤,檢查 master_host 和 master_port 的設置是否正確

          可能是主庫的用戶名和密碼錯誤,檢查 master_user 和 master_password 是否正確

          可能是主庫防火墻未關閉,檢查防火墻

          可能是主庫不能遠程登錄,檢查主庫用戶的遠程登錄權限

          可能是 master_log_file 文件設置出問題

          可能是虛擬機克隆,導致的兩個節點的uuid相同檢查 /var/lib/mysql/auto.cnf 中記錄的uuid,如果相同的話,隨便修改一個,重啟服務即可

          上述幾種錯誤情況在修改之后,都是需要重新啟動slave服務的。先使用 stop slave 停止服務;再使用 start slave 開啟

          有些同學可能會出現 Slave_SQL_Running: No 的狀態,說明從庫的SQL線程啟動失敗,一般是因為執行主庫同步過來的數據的時候失敗了,例如需要創建的數據庫、表已經存在導致。

          解決方案:

          刪除從庫中同名的庫、表,從主庫的日志中恢復數據。

          如果想要保留從庫中的庫、表,先停止slave服務,設置 set global sql_slave_skip_counter = 1; 來設置需要跳過的錯誤的個數。1是可以修改的,想要跳過幾個錯誤,就設置為多少。然后啟動slave服務即可。

          主從復制測試

          我們在主庫中創建數據庫、創建表,可以在從庫中看到有數據同步過來了。而且在從庫中使用 show slave status \G 來查看從庫的狀態的時候,會發現記錄的Pos位置已經更新。

        分享: 更多

        上一篇:ZooKeeper的選舉制度

        下一篇:

        好程序員公眾號

        • · 剖析行業發展趨勢
        • · 匯聚企業項目源碼

        好程序員開班動態

        More+
        • HTML5大前端 <高端班>

          開班時間:2021-04-12(深圳)

          開班盛況

          開班時間:2021-05-17(北京)

          開班盛況
        • 大數據+人工智能 <高端班>

          開班時間:2021-03-22(杭州)

          開班盛況

          開班時間:2021-04-26(北京)

          開班盛況
        • JavaEE分布式開發 <高端班>

          開班時間:2021-05-10(北京)

          開班盛況

          開班時間:2021-02-22(北京)

          開班盛況
        • Python人工智能+數據分析 <高端班>

          開班時間:2021-07-12(北京)

          預約報名

          開班時間:2020-09-21(上海)

          開班盛況
        • 云計算開發 <高端班>

          開班時間:2021-07-12(北京)

          預約報名

          開班時間:2019-07-22(北京)

          開班盛況
        在線咨詢
        試聽
        入學教程
        立即報名

        Copyright 2011-2023 北京千鋒互聯科技有限公司 .All Right 京ICP備12003911號-5 京公網安備 11010802035720號

        黑人100部Av解禁片
        <span id="35v3v"><th id="35v3v"></th></span>
        <address id="35v3v"></address>

          <address id="35v3v"></address>
            <address id="35v3v"><listing id="35v3v"><meter id="35v3v"></meter></listing></address>
              <listing id="35v3v"><listing id="35v3v"></listing></listing>

              <listing id="35v3v"><listing id="35v3v"><menuitem id="35v3v"></menuitem></listing></listing>

              <noframes id="35v3v"><noframes id="35v3v">