1. 程式人生 > >基於MySQL實現數據庫的半同步主從復制

基於MySQL實現數據庫的半同步主從復制

mysql、半同步、主從架構

首先我們來了解一下數據庫常遇到的問題:

第一就是性能上的問題

1、向上拓展(硬件方面) scale up 個體本身 容易達到極限

2、向外拓展 scale out

第二就是可用性的問題

1、數據庫服務中斷

2、誤操作數據損壞

3、硬件故障

4、數據庫升級測試遭遇bug

5、黑客攻擊

基於以上這些問題就有了一個比較好的解決方案,那就是實現數據庫的主從復制。MySQL主從復制技術可以提高服務器的性能。除此之外MySQL復制還可以解決以下幾個問題:

1、數據分布 (Data distribution )

2、負載平衡(load balancing)

3、備份(Backups)

4、高可用性和容錯性 High availability and failover

在開始實驗前我們先來了解幾個概念:異步復制、全同步復制和異步復制。

異步復制

MySQL默認的是異步復制,就是主庫在執行完客戶端提交的事務後立即將結果返回給客戶端,並不關系從庫是否已經接受處理,這樣如果主掛掉,主上提交的事務可能並沒有完全傳到從上,如果此時強行把從提升為主,可能會導致新主上的數據不完整。

全同步復制

指當主庫執行完一個事務,等到所有從庫都執行完該事務才將結果返回給客戶端。因為需要等待所有從庫都執行完下能返回,所以全同步復制的性能必然會受到影響,需要有超時時間。

半同步復制

介於異步復制和全同步復制之間,主庫在執行完客戶端提交的事務後不是立即返回給客戶端,而是等到至少一個從庫接收到並寫到

realy log中才返回給客戶端。相對於異步復制,半同步復制提高了數據庫的安全性,同時也造成了一定程度的延遲,這個延遲最少是一個TCP/IP往返的時間。所以,半同步復制最好在低延時的網絡中使用。

如果想更好地實現MySQL的主從復制,必須首先要想清楚它的復制原理,這樣在工作中才能熟練的操作和應用。

MySQL復制的工作原理:

1、主服務器(master)將改變記錄寫入到二進制日誌(binary log)中(這些記錄叫做二進制日誌事件,binary log events) ,在事件 寫入二進制日誌完成後,master通知存儲引擎提交事務。此後可接收slave的請求

2、從服務器(slave)將主服務器master的binary log events拷貝到自己的中繼日誌(relay log) 。Slave的I/O線程在master上打開一個普通的連接,並將這些二進制事件寫入中繼日誌。

3、SQL線程從中繼日誌讀取事件,並重放其中的事件而更新slave的數據,使其與master中的數據一致。

MySQL還提供了一種復制過濾器:就是指在數據庫復制的過程中,僅復制一個或幾個數據庫相關的數據,並非所有,它提供了兩種復制方法:一種是在主服務器的配置文件中添加配置文件,另一種是在從服務器中添加配置文件。

1、在主服務器中

主服務器僅向二進制日誌中記錄有關特定數據庫相關的寫操作。

binlog_do_db= #要復制的數據庫

binlog_ignore_db=#要忽略的數據庫

2、在從服務器中

從服務器的SQL THREAD僅重放關註的數據庫或表相關的事件,並將其應用於本地;

Replicate_Do_DB= #要復制過來的數據庫

Replicate_Ignore_DB=#不要復制過來的數據庫


下面我們開始基於上邊的理論來完成我們今天的實驗。


技術分享圖片

MySQL主從架構圖

一、環境準備:

centos系統服務器2臺、一臺用戶做Mysql主服務器,一臺用於做 Mysql從服務器,配置好yum源、防火墻關閉、各節點時鐘服務同步、各節點之間可以通過主機名互相通信

二、準備步驟:

1、iptables -F && setenforce 清空防火墻策略,關閉selinux

2、拿兩臺服務器都使用yum方式安裝Mysql服務,要求版本一致

3、分別啟動兩臺服務器mysql服務,確保服務正常

三、實現步驟:

配置master主服務器:

1、master進行配置,包括打開二進制日誌,指定唯一的servr ID。在配置文件加入如下值:

   server-id=1 #配置server-id,讓主服務器有唯一ID號 
     
   log-bin=mysql-bin #打開Mysql日誌,日誌格式為二進制 
     
   skip-name-resolve#關閉名稱解析,(非必須)


2、創建復制帳號 Master的數據庫中建立一個備份帳戶:每個slave使用標準的MySQL用戶名和密碼連接master 。進行復制操作的用戶會授予REPLICATION SLAVE權限。

   grant replication slave,replication client on *.* to slave@‘172.17.%.%‘ identified by ‘111111‘;


3.查看主服務器狀態,Master的數據庫執行show master status,查看主服務器二進制日誌狀態

   MariaDB [(none)]> show master status;
   +------------------+----------+--------------+------------------+
   | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
   +------------------+----------+--------------+------------------+
   | mysql-bin.000001 |      414 |              |                  |
   +------------------+----------+--------------+------------------+
   1 row in set (0.00 sec)

配置slave從服務器:

1、slave進行配置,打開中繼日誌,指定唯一的servr ID,設置只讀權限。在配置文件加入如下值

    server-id=2 #配置server-id,讓從服務器有唯一ID號 
    
    relay_log = mysql-relay-bin #打開Mysql日誌,日誌格式為二進制 
    
    read_only = 1 #設置只讀權限 
    
    log_bin = mysql-bin #開啟從服務器二進制日誌 
    
    log_slave_updates = 1 #使得更新的數據寫進二進制日誌中


2、啟動從服務器復制線程 slave連接master,並開始重做master二進制日誌中的事件。

    MariaDB [(none)]> change master to 
    
    master_host=‘172.17.253.210‘,master_user=‘slave‘,master_password=‘111111‘,master_log_file=‘mysql-bin.000001‘,master_log_pos=245;
   
    Query OK, 0 rows affected (0.01 sec) 
    
    執行start slave;# 啟動復制線程。

3、查看從服務器狀態 可使用SHOW SLAVE STATUS\G查看從服務器狀態,如下所示,也可用show processlist \G查看當前復制狀態:

Slave_IO_Running: Yes #IO線程正常運行

Slave_SQL_Running: Yes #SQL線程正常運行

實現半同步復制:

主節點:

    MariaDB [(none)]> install plugin rpl_semi_sync_master soname ‘semisync_master.so‘; 
    Query OK, 0 rows affected (0.00 sec)
 
    MariaDB [(none)]> show global variables like ‘rpl_semi%‘;
    +------------------------------------+-------+
    | Variable_name                      | Value |
    +------------------------------------+-------+
    | rpl_semi_sync_master_enabled       | OFF   |
    | rpl_semi_sync_master_timeout       | 10000 |
    | rpl_semi_sync_master_trace_level   | 32    |
    | rpl_semi_sync_master_wait_no_slave | ON    |
    +------------------------------------+-------+
    4 rows in set (0.01 sec)
 
    MariaDB [(none)]> set global rpl_semi_sync_master_enabled=on;
    Query OK, 0 rows affected (0.00 sec)

從節點:

    MariaDB [(none)]> install plugin rpl_semi_sync_slave soname ‘semisync_slave.so‘;     
    Query OK, 0 rows affected (0.01 sec)
     
    MariaDB [(none)]> show global variables like ‘rpl_semi%‘;
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | OFF   |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.01 sec)
     
     MariaDB [(none)]> stop slave io_thread;
    Query OK, 0 rows affected (0.00 sec)
     
    MariaDB [(none)]> set global rpl_semi_sync_slave_enabled =on;
    Query OK, 0 rows affected (0.01 sec)
     
    MariaDB [(none)]> show global variables like ‘rpl_semi%‘;    
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | rpl_semi_sync_slave_enabled     | ON    |
    | rpl_semi_sync_slave_trace_level | 32    |
    +---------------------------------+-------+
    2 rows in set (0.00 sec)
     
    MariaDB [(none)]> start slave io_thread;              
    Query OK, 0 rows affected (0.00 sec)

四、測試

在master上創建數據庫和數據表,觀察slave數據庫中的數據,是否和master同步。











基於MySQL實現數據庫的半同步主從復制