1,Slave 服務器上執行start slave,開啓主從複製開關。
2,此時,Slave 服務器上的 IO 線程會經過 Master 服務器上受權的有複製權限的用戶請求鏈接 Master 服務器,並請求從指定 binlog 日誌文件的指定位置以後發送 binlog 日誌內容。(日誌文件名和位置就是在配置主從複製任務時執行change master命令時指定的)
3,Master 服務器接收到來自 Slave 服務器的 IO 線程的請求後,Master 服務器上的 IO 線程根據 Slave 服務器的 IO 線程請求的信息,讀取指定 binlog 日誌文件指定位置以後的 binlog 日誌信息,而後返回給 Slave 端的 IO 線程。返回的信息中除了 binlog 日誌內容外
4,還有本次返回日誌內容後在 Master 服務器端的新的 binlog 文件名以及在 binlog 中的下一個指定更新位置。當 Slave 服務器的 IO 線程獲取來自 Master 服務器上 IO 線程發送的日誌內容及日誌文件和位置點後, 將 binlog 日誌內容依次寫入到 Slave 端自身的 relay log(即中繼日誌)文件(mysql-relay-bin.xxxxxx)的最末端,並將新的 binlog 文件名和位置記錄到 master-info 文件中,以便下一次讀取 Master 端新 binlog 日誌時,
5,能告訴 Master 服務器須要重新 binlog 日誌的哪一個文件哪一個位置開始請求新的 binlog 日誌內容。Slave 服務器端的 SQL 線程會實時檢測本地 relay log 中新增長的日誌內容, 而後及時的把 relay log 文件中的內容解析成在 Master 端曾經執行的 SQL 語句的內容,並在自身 Slave 服務器上按語句的順序執行應用這些 SQL 語句,應用完畢後清理應用過的日誌。
6,通過了上面的過程,就能夠確保在 Master 端和 Slave 端執行了一樣的 SQL 語句。當複製狀態正常的狀況下,Master 端和 Slave 端的數據是徹底同樣的。
mysql
1、高可用
由於數據都是相同的,因此當Master掛掉後,能夠指定一臺Slave充當Master繼續保證服務運行,由於數據是一致性的(若是當插入Master就掛掉,可能不一致,由於同步也須要時間),固然這種配置不是簡單的把一臺Slave充當Master,畢竟還要考慮後續的Salve同步Master,固然本文並非將高可用的配置,因此這裏就很少講了sql
2、負載均衡
由於讀寫分離也算是負載均衡的一種,因此就不單獨寫了,由於通常都是有多臺Slave的,因此能夠將讀操做指定到Slave服務器上(須要代碼控制),而後再用負載均衡來選擇那臺Slave來提供服務,同時也能夠吧一些大量計算的查詢指定到某臺Slave,這樣就不會影響Master的寫入以及其餘查詢數據庫
3、數據備份
通常咱們都會作數據備份,多是寫定時任務,一些特殊行業可能還須要手動備份,有些行業要求備份和原數據不能在同一個地方,因此主從就能很好的解決這個問題,不只備份及時,並且還能夠多地備份,保證數據的安全緩存
4、業務模塊化
能夠一個業務模塊讀取一個Slave,再針對不一樣的業務場景進行數據庫的索引建立和根據業務選擇MySQL存儲引擎安全
5、高擴展(硬件擴展)
主從複製支持2種擴展方式服務器
一、scale-up
向上擴展或者縱向擴展,主要是提供比如今服務器更好性能的服務器,好比增長CPU和內存以及磁盤陣列等,由於有多臺服務器,因此可擴展性比單臺更大session
二、scale-out
向外擴展或者橫向擴展,是指增長服務器數量的擴展,這樣主要能分散各個服務器的壓力負載均衡
主從複製的缺點
1、成本增長
無可厚非的是搭建主從確定會增長成本,畢竟一臺服務器和兩臺服務器的成本徹底不一樣,另外因爲主從必需要開啓二進制日誌,因此也會形成額外的性能消耗模塊化
2、數據延遲
Slave從Master複製過來確定是會有必定的數據延遲的,因此當剛插入就出現查詢的狀況,可能查詢不出來,固然若是是插入者本身查詢,那麼能夠直接從Master中查詢出來,固然這個也是須要用代碼來控制的性能
3、寫入更慢
主從複製主要是針對讀遠大於寫或者對數據備份實時性要求較高的系統中,由於Master在寫中須要更多操做,並且只有一臺寫入的Master(由於我目前只會配置一臺寫入Master,最多就是有從Master的Slave,用來在Master掛掉後替換成Master,平時不對外進行服務),因此寫入的壓力並不能被分散,固然若是直接怎麼解決這個問題的話,歡迎留言指教
複製方式
MySQL5.6開始主從複製有兩種方式:基於日誌(binlog)、基於GTID(全局事務標示符)。
本文只涉及基於日誌binlog的主從配置
複製原理
一、Master將數據改變記錄到二進制日誌(binary log)中,也就是配置文件log-bin指定的文件,這些記錄叫作二進制日誌事件(binary log events)
二、Slave經過I/O線程讀取Master中的binary log events並寫入到它的中繼日誌(relay log)
三、Slave重作中繼日誌中的事件,把中繼日誌中的事件信息一條一條的在本地執行一次,完成數據在本地的存儲,從而實現將改變反映到它本身的數據(數據重放)
要求
一、主從服務器操做系統版本和位數一致
二、Master和Slave數據庫的版本要一致
三、Master和Slave數據庫中的數據要一致
四、Master開啓二進制日誌,Master和Slave的server_id在局域網內必須惟一
具體配置
硬件需求
兩臺或兩臺以上安裝了相同版本的MySQL(我沒有試過不一樣版本會不會有問題,有興趣的能夠試試),固然這個能夠用虛擬機或者Docker代替,我的推薦用Docker,比虛擬機消耗少太多了,固然用起來可能沒有虛擬機那麼方便,可是卻不用挨個環境配置了
配置Master
1、安裝數據庫
2、配置my.cnf
不一樣的系統my.cnf路徑不一樣,因此咱們只講解牽扯修改的地方。添加配置
[mysqld]
server_id=100
binlog-ignore-db=mysql
log-bin=edu-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
配置完成後重啓mysql
關於複製過濾
複製過濾可讓你只複製服務器中的一部分數據,有兩種複製過濾:
一、在Master上過濾二進制日誌中的事件
二、在Slave上過濾中繼日誌中的事件。
複製類型
一、基於語句的複製
在Master上執行的SQL語句,在Slave上執行一樣的語句。MySQL默認採用基於語句的複製,效率比較高。一旦發現無法精確複製時,會自動選着基於行的複製
二、基於行的複製
把改變的內容複製到Slave,而不是把命令在Slave上執行一遍。從MySQL5.0開始支持
三、混合類型的複製
默認採用基於語句的複製,一旦發現基於語句的沒法精確的複製時,就會採用基於行的複製
3、建立數據同步用戶
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON . TO 'slave'@'%';
這裏主要是要授予用戶REPLICATION SLAVE權限和REPLICATION CLIENT權限
配置Slave
1、安裝數據庫
2、配置my.cnf
[mysqld]
server_id=101
binlog-ignore-db=mysql
log-bin=edu-mysql-slave1-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=edu-mysql-relay-bin
log_slave_updates=1
read_only=1
若是Slave爲其它Slave的Master時,必須設置bin_log。配置完成後重啓mysql
完成Master和Slave連接
1、初始化數據
保證Master和Slave除不一樣步的數據庫,其餘庫的數據一致
2、查詢Master狀態
在Master中執行
show master status;
記錄下返回結果的File列和Position列的值
3、Slave中設置Master信息
在Slave中執行
change master to master_host='192.168.1.100', master_user='slave', master_password='123456', master_port=3306, master_log_file='edu-mysql-bin.000001', master_log_pos=1389, master_connect_retry=30;
上面執行的命令的解釋:
master_host='192.168.1.100' ## Master的IP地址
master_user='slave' ## 用於同步數據的用戶(在Master中受權的用戶)
master_password='123456' ## 同步數據用戶的密碼
master_port=3306 ## Master數據庫服務的端口
masterlogfile='edu-mysql-bin.000001' ##指定Slave從哪一個日誌文件開始讀複製數據(Master上執行命令的結果的File字段)
masterlogpos=429 ## 從哪一個POSITION號開始讀(Master上執行命令的結果的Position字段)
masterconnectretry=30 ##當從新創建主從鏈接時,若是鏈接創建失敗,間隔多久後重試。單位爲秒,默認設置爲60秒,同步延遲調優參數。
4、查看主從同步狀態
在Slave中執行命令
show slave status;
可看到SlaveIOState爲空, SlaveIORunning和SlaveSQLRunning是No,代表Slave尚未開始複製過程。相反SlaveIORunning和SlaveSQLRunning是Yes代表已經開始工做了
5、開啓主從同步
在Slave中執行命令
start slave; 查詢查看主從同步狀態,會發現SlaveIORunning和SlaveSQLRunning是Yes了,代表開啓成功