【MySQL主從復制原理及搭建全過程】
目錄
- 準備工作
- 主從復制原理
- 開始搭建主從復制
本文將使用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等語句刪除,那麽從看庫的備份功能也就失效了。
主從機制實現原理
- master將改變記錄到二進制日誌(binary log)中(這些記錄叫做二進制日誌時間,binary log events);
- slave將master的binary log events拷貝到它的中繼日誌(relay log);
- slave重做中繼日誌中的事件,將改變反映到它自己的庫中。
.
步驟2中,slave服務器會開啟兩個線程,分別用於:讀取master的二進制日誌;將日誌寫入中繼日誌。
***
開始搭建主從復制
主服務器配置
開始修改配置文件
.
修改配置文件/etc/my.cnf
,在[mysqld]
配置下增加兩項配置:server-id=1
,log-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主從復制原理及搭建全過程】