MySQL Replication
主從複製(也稱 AB 複製)允許將來自一個MySQL數據庫服務器(主服務器)的數據複製到一個或多個MySQL數據庫服務器(從服務器)。
根據配置,您可以複製數據庫中的所有數據庫,所選數據庫甚至選定的表。
MySQL主從複製的優點包括:
- 橫向擴展解決方案 - 在多個從站之間分配負載以提高性能。在此環境中,所有寫入和更新都必須在主服務器上進行。但是,讀取可以在一個或多個從設備上進行。該模型可以提高寫入性能(因爲主設備專用於更新),同時顯着提高了越來越多的從設備的讀取速度。
- 數據安全性 - 因爲數據被複制到從站,並且從站可以暫停複製過程,所以可以在從站上運行備份服務而不會破壞相應的主數據。
- 分析 - 可以在主服務器上創建實時數據,而信息分析可以在從服務器上進行,而不會影響主服務器的性能。
- 備份 - 可以使用從服務器數據進行備份,減輕主服務器的壓力。
前提是作爲主服務器角色的數據庫服務器必須開啓二進制(binlog)日誌
原理
主服務器上面的任何修改都會保存在二進制日誌( Bin-log日誌) 裏面。
從服務器上面啓動一個I/O線程, 連接到主服務器上面請求讀取二進制(Bin-log)日誌,然後把讀取到的二進制日誌寫到本地的Realy-log(中繼日誌)裏面。
從服務器上面同時開啓一個SQL線程,讀取Realy-log(中繼日誌),如果發現有更新立即把更新的內容在本機的數據庫上面執行一遍。
基於無數據的情況下 就是mysql剛安裝的 裏面沒有變動數據
有數據的配置
配置步驟:
實驗:
兩臺虛擬機(一主一從)
兩臺都配置hosts解析
# vim /etc/hosts 寫入如下解析
192.168.62.152 mysql-master
192.168.62.151 mysql-slave1
兩端關閉防火牆,selinux
主服務器
- 在主服務器上,您必須啓用二進制日誌記錄並配置唯一的服務器ID。
編輯主服務器的配置文件/etc/my.cnf
,添加如下內容
添加配置
[mysqld]
log-bin=/var/log/mysql/mysql-bin #billog二進制日誌存放位置
server-id=1 #server id
創建日誌目錄並賦予權限
[root@mysql-1 ~]# mkdir /var/log/mysql
[root@mysql-1 ~]# chown mysql.mysql /var/log/mysql
重啓服務
[root@mysql-1 ~]# systemctl restart mysqld
2.應該創建一個專門用於複製數據的用戶
每個從服務器需要使用MySQL 主服務器上的用戶名和密碼連接到主服務器。
例如,計劃使用用戶 tom
可以從任何主機上連接到 master
上進行復制操作, 並且用戶 tom
僅可以使用複製的權限。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'tom'@'%' identified by '密碼';
mysql>flush privileges; #刷新權限
將複製的權限給與此用戶
3.在從服務器
上使用剛纔創建的用戶進行測試連接
[root@mysql-slalve ~]# mysql -utom -p'密碼' -hmysql-master1
測試是否連通,連通退出即可
進入數據庫查看主服務器的binlog日誌的名稱和位置
從服務器會用
mysql> show master status \G
從服務器設置
/etc/my.cnf
配置文件
[mysqld]
server-id=2 #只要與主服務器不同就可以
重啓服務
然後進入從服務數據庫
mysql> CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='tom',
MASTER_PASSWORD='密碼',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=681;
mysql> start slave;
以下可選
查看當前只讀的狀態
mysql>show variables like '%renad_only%';
設置普通用戶只讀
mysql>set global read_only=1;
設置超級用戶只讀
mysql>set global super_read_only=1;
檢查是否成功
在從服務上執行如下操作,加長從服務器端 IO線程和 SQL 線程是否是 OK
mysql> show slave status\G
輸出結果中應該看到 I/O 線程和 SQL 線程都是 YES
, 就表示成功。
執行此過程後,在主服務上操作的修改數據的操作都會在從服務器中執行一遍,這樣就保證了數據的一致性。