1. 程式人生 > >【MySQL主從復制原理及搭建全過程】

【MySQL主從復制原理及搭建全過程】

匿名賬戶 啟動 _id baseurl tab restart char http 不可

目錄

  • 準備工作
  • 主從復制原理
  • 開始搭建主從復制

本文將使用mariaDB數據庫實現主從復制,其步驟與MySQL數據庫無差異。

MariaDB數據庫管理系統是MySQL的一個分支,主要由開源社區在維護,采用GPL授權許可。

開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有將MySQL閉源的潛在風險,因此社區采用分支的方式來避免這個風險。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能輕松成為MySQL的替代品。

Red Hat Enterprise Linux/CentOS 7.0發行版已將默認的數據從MySQL切換到MariaDB。
@
***

準備工作

yum安裝mariaDB

準備兩臺服務器,分別安裝mariaDB
.
1.配飾repo倉庫文件,指定mariaDB的YUM源

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

2.開始安裝mariaDB

yum -y install MariaDB-server MariaDB-client 

3.安裝完畢後,啟動mariaDB

systemctl start mariadb

初始化mariaDB

在確認MariaDB數據庫軟件程序安裝完畢並成功啟動後請不要立即使用。為了確保數據庫的安全性和正常運轉,需要先對數據庫程序進行初始化操作。這個初始化操作涉及下面5個步驟。
.
? 設置 root 管理員在數據庫中的密碼值(註意,該密碼並非root管理員在系統中的密碼,這裏的密碼值默認應該為空,可直接按回車鍵)。
? 設置root管理員在數據庫中的專有密碼。
? 隨後刪除匿名賬戶,並使用root管理員從遠程登錄數據庫,以確保數據庫上運行的業務的安全性。
? 刪除默認的測試數據庫,取消測試數據庫的一系列訪問權限。
? 刷新授權列表,讓初始化的設定立即生效。
.
確保MariaDB服務正在運行,執行初始化命令:

mysql_secure_installation

初始化過程如下圖:
技術分享圖片

補充知識點

在配置文件中指定中文編碼

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-error=/var/log/mysqld.log
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

創建授權遠程用戶

# 取消全局密碼復雜度策略
set global validate_password_policy=0;

# 創建遠程用戶
create user "用戶名"@"可訪問範圍" identified by "密碼";

# 授權用戶所有權限
grant all privileges on *.* to "用戶名"@"可訪問範圍";

# 授權tom從192.168.1.129主機復制數據(一般用於主從復制)
grant replication slave on *.* to ‘tom‘@‘192.168.1.129‘;

# 檢查主庫創建的復制賬號
select user,host from mysql.user;

# 檢查tom授權賬號的權限
show grants for ‘tom‘@‘192.168.1.129‘;

# 刷新授權表,使其立即生效
flush privileges;

鎖表只讀,用於防止數據寫入

flush table with read lock;  # 鎖
unlock tables;  # 解

備份恢復數據

# 備份
[root@master ~]# mysqldump -uroot -p --all-databases > all_db.sql
# 恢復
[root@master ~]# mysql -uroot -p < all_db.sql

主從復制原理

MySQL數據庫的主從復制方案,是其自帶的功能,並且主從復制並不是復制磁盤上的數據庫文件而是通過binlog日誌復制到需要同步的從服務器上

MySQL數據庫支持單向、雙向、鏈式級聯等不同業務場景的復制。在復制的過程中,一臺服務器從當主服務器(Master),接收來自用戶的內容更新,而一個或多個其它的服務器充當從服務器(Slave),接收來自Master上binlog文件的日誌內容,解析出SQL,重新更新到Slave,使得主從服務器的數據達到一致。

主從復制的邏輯有以下幾種
.
一主一從:單向主從同步模式,只能在Master端寫入數據
一主多從:單向主從同步模式,只能在Master端寫入數據
技術分享圖片
主主同步:此架構可以在Master1或Master2進行數據寫入,或者兩端同時寫入(需特殊配置)
技術分享圖片

----
在生產環境中,MySQL主從復制都是異步的復制方式,既不是嚴格的實時復制,但是給用戶的體驗都是實時的。
.
MySQL主從復制集群功能使得MySQL數據庫支持大規模高並發讀寫成為可能,並有效的保護了服務器宕機的數據備份。
.
----
利用復制功能,當Master服務器出現問題時,我們可以人工的切換到從服務器繼續提供服務,此時服務器的數據和宕機時的數據幾乎完全一致。
.
服務功能也可用作數據備份,但是如果人為的執行drop、delete等語句刪除,那麽從看庫的備份功能也就失效了。

主從機制實現原理
技術分享圖片

  1. master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌時間,binary log events);
  2. slave將master的binary log events拷貝到它的中繼日誌(relay log);
  3. slave重做中繼日誌中的事件,將改變反映到它自己的庫中。

.
步驟2中,slave服務器會開啟兩個線程,分別用於:讀取master的二進制日誌;將日誌寫入中繼日誌。
***

開始搭建主從復制

主服務器配置

開始修改配置文件
.
修改配置文件/etc/my.cnf,在[mysqld]配置下增加兩項配置:server-id=1log-bin=mysql-bin

  • server-id=1: 是服務器的唯一標示(主從服務器之間必須不同)。
  • log-bin=mysql-bin: 啟用二進制日誌,並指定日誌名稱為mysql-bin。

.
如下圖:
技術分享圖片
保存退出後重啟服務:systemctl restart mariadb
.
開始創建授權復制用戶

# 創建復制用戶
MariaDB [(none)]> create user ‘tom‘@‘192.168.43.71‘ identified by ‘user@tom‘;
Query OK, 0 rows affected (0.01 sec)

# 授權復制用戶
MariaDB [(none)]> grant replication slave on *.* to ‘tom‘@‘192.168.43.71‘;
Query OK, 0 rows affected (0.00 sec)

# 刷新授權表,使其立即生效
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

.
開始備份數據

# 鎖表
MariaDB [(none)]> flush table with read lock;
Query OK, 0 rows affected (0.00 sec)

# 打開新窗口,導出所有數據並傳至從服務器
[root@master ~]# mysqldump -uroot -p --all-databases > all_db.sql
[root@master ~]# scp all_db.sql 192.168.43.71:/root/

# 查看二進制日誌文件和當前的位置並記錄
# File是二進制日誌文件名,Position是日誌的當前位置
# 強調:記住File與Position的值,從服務器中會用到
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      567 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

# 解鎖
# 這一步驟應在主從服務器均配置完畢,可實現數據同步後,再解鎖
MariaDB [(none)]> unlock tables;
Query OK, 0 rows affected (0.00 sec)

從服務器配置

開始修改配置文件
.
修改配置文件/etc/my.cnf,在[mysqld]配置下增加此配置:server-id=2

  • server-id=2: 是服務器的唯一標示(主從服務器之間必須不同)。
  • 這裏與主服務器不一樣,不可開啟bin-log

.
如下圖:
技術分享圖片
保存退出後重啟服務:systemctl restart mariadb
.
導入主庫傳過來的備份文件

[root@slave ~]# mysql -uroot -p < all_db.sql

.
開始配置復制參數

# 查詢從庫信息
MariaDB [(none)]> show variables like ‘server_id‘;
MariaDB [(none)]> show variables like ‘log_bin‘;

# 配置復制參數
MariaDB [(none)]> change master to
    -> master_host=‘192.168.43.149‘,  # 指定主庫的ip
    -> master_user=‘tom‘,  # 指定主庫創建遠程用戶名
    -> master_password=‘user@tom‘,  # 指定主庫創建遠程用戶密碼
    -> master_log_file=‘mysql-bin.000001‘,  # 指定二進制日誌文件
    -> master_log_pos=567;  # 指定二進制日誌的當前位置
Query OK, 0 rows affected (0.02 sec)

# 啟動從庫同步
MariaDB [(none)]> start slave;

# 檢查復制狀態,詳見下圖
MariaDB [(none)]> show slave status\G;

檢查主從復制是否成功的關鍵在於:
技術分享圖片
好了,主從同步已配置完畢了,去測試吧。

附:

此時還未配置從庫的只讀模式,只需在從服務器的配置文件中的[mysqld]配置下增加read-only=true,並且在從服務器上創建普通用戶,使用普通用戶主從同步即可達到只讀的效果。

註意一個坑:如果使用root用戶,則無法達到只讀的效果,超級用戶root不受只讀限制。

【MySQL主從復制原理及搭建全過程】