什麼是主從複製:
通過將Mysql的某一臺主機的 數據複製到其它主機,複製過程中一個服務器充當主服務器(master),而一個或多個其它服務器充當從服務器(slave)。進行復制時,所有對數據表的寫操作必須在主服務器上進行。否則,因爲主服務器不會同步從服務器的數據,會導致主從數據不一致的問題。mysql的主從複製功能是構建高性能大型應用服務器的基礎
主從複製的作用:
1.輔助實現數據的備份
2.實現數據服務的高可用和異地容災
3.實現多個服務器分攤負載
主從複製的實現原理:
實現整個複製過程主要由三個線程來完成,其中slave端兩個線程(Sql線程和IO線程) ,master端一個線程(IO線程)
1.master將數據庫改變的記錄到二進制日誌(binary log)中
2.slave的IO線程向master請求二進制日誌中的事件
3.master服務器的IO線程將slave服務器的IO線程請求的數據相應給對方
4.slave的IO線程接收到數據並依次寫入到中繼日誌裏面
5.slave的SQL線程檢測到中繼日誌發生改變,解析出master發生改變執行的sql語句並在自身執行一遍
主從複製類別:
1.基於語句的複製:每一條會修改數據的語句都會記錄到master的二進制中。slave在複製的時候SQL線程會解析成和原來master端執行過的相同的語句來再次執行
優點:不需要記錄每一行數據的變化,減少二進制日誌量,節約了IO成本,提高了性能。
缺點:由於他是記錄的執行語句,所以,爲了讓這些語句在slave端也能正確執行,那麼他還必須記錄每條語句在執行的時候的一些相關信息,也就是上下文信息,以保證所有語句在slave端杯執行的時候能夠得到和在master端執行時候相同的結果。當master的某個SQL語句中執行了一些特殊函數,再複製到slave來執行可能會導致值不一樣。例如:master表中的某個字段了插入一條select now();的執行結果,當這條語句再複製到slave上去執行的時候,結果數據就無法被正確複製。
2.基於行的複製:二進制日誌中會記錄成每一行數據被修改的形式,然後在slave端再對相同的數據進行修改。
優點:二進制日誌中可以不記錄執行的sql語句的上下文相關的信息,僅僅只需要記錄那一條記錄被修改了,修改成什麼樣了。所以RowLevel的日誌內容會非常清楚的記錄下每一行數據修改的細節,非常容易理解。而且不會出現某些特定情況下的存儲過程,或函數,以及觸發器的調用和觸發無法被正確複製的問題
缺點:所有的執行的語句當記錄到BinaryLog中的時候,都將以每行記錄的修改來記錄,這樣可能會產生大量的日誌內容,比如有這樣一條update語句:update user_info set sal=15000 where user_id >= 3,執行之後,日誌中記錄的不是這條update語句所對應的事件(MySQL以事件的形式來記錄BinaryLog日誌),而是這條語句所更新的每一條記錄的變化情況,這樣就記錄成很多條記錄被更新的很多個事件,增加了IO負擔。
3.混合方式:基於語句+基於行的混合方式 中和了前兩種方式的優缺點,是一種相對比較理想的複製方式
mysql的這個複製級別也就是通過配置二進制日誌的記錄格式來決定的。
mysql主從複製配置:
環境說明:
master和slave數據初始都是沒有數據的
master:
操作系統:centos6.7
mysql版本:mysql5.7.10
主機地址:192.168.1.223
slave:
操作系統:centos6.7
mysql版本:mysql5.7.10
主機地址:192.168.1.222
1.master端配置工作
啓動二進制日誌
選擇一個唯一的server-id
vi /etc/my.cnf log-bin=/mydata/binlogs/master-bin binlog_format=mixed server-id = 2
重啓mysql服務
service mysqld restart
登錄mysql創建具有複製權限的用戶
mysql -uroot -p 'password’ grant replication slave on *.* to repuser@'192.168.1.222' identified by 'password'; flush privileges;
2.slave端配置工作
修改server-id
啓用中繼日誌
vi /etc/my.cnf server-id = 11 relay-log = /mydata/relaylogs/relay-bin log-bin=OFF
重啓mysql服務
service mysqld restart
登錄mysql連接主服務器
mysql -uroot -p 'password’ change master to master_host='192.168.1.223',master_user='repuser',master_password='password'
查看slave工作狀態
show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.223
Master_User: repuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No #現在io線程處於關閉狀態
Slave_SQL_Running: No #sql線程也處於關閉狀態
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 154
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 0
Master_UUID:
Master_Info_File: /mydata/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
啓動複製:
start slave;
6.驗證主從配置結果:
登錄主服務器創建一個數據庫
mysql -uroot -p'password' create database two_db; show databases;
登錄slave服務器查看是否已同步
至此mysql簡單主從複製基本完成