簡單來講就是保證主SQL(Master)和從SQL(Slave)的數據是一致性的,向Master插入數據後,Slave會自動從Master把修改的數據同步過來(有必定的延遲),經過這種方式來保證數據的一致性,就是主從複製mysql
由於數據都是相同的,因此當Master掛掉後,能夠指定一臺Slave充當Master繼續保證服務運行,由於數據是一致性的(若是當插入Master就掛掉,可能不一致,由於同步也須要時間),固然這種配置不是簡單的把一臺Slave充當Master,畢竟還要考慮後續的Salve同步Master,固然本文並非將高可用的配置,因此這裏就很少講了sql
由於讀寫分離也算是負載均衡的一種,因此就不單獨寫了,由於通常都是有多臺Slave的,因此能夠將讀操做指定到Slave服務器上(須要代碼控制),而後再用負載均衡來選擇那臺Slave來提供服務,同時也能夠吧一些大量計算的查詢指定到某臺Slave,這樣就不會影響Master的寫入以及其餘查詢數據庫
通常咱們都會作數據備份,多是寫定時任務,一些特殊行業可能還須要手動備份,有些行業要求備份和原數據不能在同一個地方,因此主從就能很好的解決這個問題,不只備份及時,並且還能夠多地備份,保證數據的安全緩存
能夠一個業務模塊讀取一個Slave,再針對不一樣的業務場景進行數據庫的索引建立和根據業務選擇MySQL存儲引擎安全
主從複製支持2種擴展方式服務器
一、scale-upsession
向上擴展或者縱向擴展,主要是提供比如今服務器更好性能的服務器,好比增長CPU和內存以及磁盤陣列等,由於有多臺服務器,因此可擴展性比單臺更大負載均衡
二、scale-out模塊化
向外擴展或者橫向擴展,是指增長服務器數量的擴展,這樣主要能分散各個服務器的壓力性能
無可厚非的是搭建主從確定會增長成本,畢竟一臺服務器和兩臺服務器的成本徹底不一樣,另外因爲主從必需要開啓二進制日誌,因此也會形成額外的性能消耗
Slave從Master複製過來確定是會有必定的數據延遲的,因此當剛插入就出現查詢的狀況,可能查詢不出來,固然若是是插入者本身查詢,那麼能夠直接從Master中查詢出來,固然這個也是須要用代碼來控制的
主從複製主要是針對讀遠大於寫或者對數據備份實時性要求較高的系統中,由於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,比虛擬機消耗少太多了,固然用起來可能沒有虛擬機那麼方便,可是卻不用挨個環境配置了
1、安裝數據庫
2、配置my.cnf
不一樣的系統my.cnf路徑不一樣,因此咱們只講解牽扯修改的地方。添加配置
[mysqld] ## 設置server_id,通常設置爲IP,注意要惟一 server_id=100 ## 複製過濾:也就是指定哪一個數據庫不用同步(mysql庫通常不一樣步) binlog-ignore-db=mysql ## 開啓二進制日誌功能,能夠隨便取,最好有含義(關鍵就是這裏了) log-bin=edu-mysql-bin ## 爲每一個session 分配的內存,在事務過程當中用來存儲二進制日誌的緩存 binlog_cache_size=1M ## 主從複製的格式(mixed,statement,row,默認格式是statement) binlog_format=mixed ## 二進制日誌自動刪除/過時的天數。默認值爲0,表示不自動刪除。 expire_logs_days=7 ## 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免slave端複製中斷。 ## 如:1062錯誤是指一些主鍵重複,1032錯誤是由於主從數據庫數據不一致 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權限
1、安裝數據庫
2、配置my.cnf
[mysqld] ## 設置server_id,通常設置爲IP,注意要惟一 server_id=101 ## 複製過濾:也就是指定哪一個數據庫不用同步(mysql庫通常不一樣步) binlog-ignore-db=mysql ## 開啓二進制日誌功能,以備Slave做爲其它Slave的Master時使用 log-bin=edu-mysql-slave1-bin ## 爲每一個session 分配的內存,在事務過程當中用來存儲二進制日誌的緩存 binlog_cache_size=1M ## 主從複製的格式(mixed,statement,row,默認格式是statement) binlog_format=mixed ## 二進制日誌自動刪除/過時的天數。默認值爲0,表示不自動刪除。 expire_logs_days=7 ## 跳過主從複製中遇到的全部錯誤或指定類型的錯誤,避免slave端複製中斷。 ## 如:1062錯誤是指一些主鍵重複,1032錯誤是由於主從數據庫數據不一致 slave_skip_errors=1062 ## relay_log配置中繼日誌 relay_log=edu-mysql-relay-bin ## log_slave_updates表示slave將複製事件寫進本身的二進制日誌 log_slave_updates=1 ## 防止改變數據(除了特殊的線程) read_only=1
若是Slave爲其它Slave的Master時,必須設置bin_log。配置完成後重啓mysql
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了,代表開啓成功