mysql主從復制
1. 簡介
隨着技術的發展,在實際的生產環境中,由單台MySQL數據庫服務器不能滿足實際的需求。此時數據庫集群就很好的解決了這個問題。采用MySQL分布式集群,能夠搭建一個高並發、負載均衡的集群服務器。在此之前我們必須要保證每台MySQL服務器里的數據同步。數據同步我們可以通過MySQL內部配置就可以輕松完成,主要有主從復制和主主復制。
MySQL數據庫自身提供的主從復制功能可以方便的實現數據的多處自動備份,實現數據庫的拓展。多個數據備份不僅可以加強數據的安全性,通過實現讀寫分離還能進一步提升數據庫的負載性能。
在一主多從的數據庫體系中,多個從服務器采用異步的方式更新主數據庫的變化,業務服務器在執行寫或者相關修改數據庫的操作是在主服務器上進行的,讀操作則是在各從服務器上進行。如果配置了多個從服務器或者多個主服務器又涉及到相應的負載均衡問題,關於負載均衡具體的技術細節還沒有研究過,今天就先簡單的實現一主一從的主從復制功能。
1 為什么要做主從復制?
- 讀寫分離。在業務復雜的系統中,有這么一個情景,有一句sql語句需要鎖表,導致暫時不能使用讀的服務,那么就很影響運行中的業務,使用主從復制,讓主庫負責寫,從庫負責讀,這樣,即使主庫出現了鎖表的情景,通過讀從庫也可以保證業務的正常運作。
- 做數據的熱備
- 架構的擴展。業務量越來越大,I/O訪問頻率過高,單機無法滿足,此時做多庫的存儲,降低磁盤I/O訪問的頻率,提高單個機器的I/O性能。
Mysql復制過程分成三步:
1:master將改變記錄到二進制日志(binary log),這些記錄過程叫做二進制日志時間。
2:slave將master的binary log events 拷貝到它的中繼日志(relay log)。
3:salve 重做中繼日志中的事件,將改變應用到自己的數據庫中,Mysql復制是異步且串行化的。
復制的基本原則:
1:每個slave只有一個master,每個slave只能有唯一的一個服務器id,每個master可以有多個slave。
2:mysql的版本一致,且相互之間網絡互通(ping)
mysql一主一從配置步驟:
1:編輯主節點配置文件
vi /etc/my.cnf
2:啟用二進制日志文件
在【mysqld】下加入如下內容:
# 二進制日志存放位置
log-bin = 你的路徑/mysql-bin
# 主服務器唯一id server-id =1
# mysql錯誤日志存放位置
log-err = 你的路徑/mysql-err
# 主機讀寫都OK
read-only=0
#設置不需要復制的庫(可選)
#binlog-ignore-db=mysql
#設置需要復制的庫(可選)
#binlog-do-db= 需要復制的庫名
其他可選參數
binlog_format = MIXED //binlog日志格式 expire_logs_days = 7 //binlog過期清理時間 max_binlog_size 100m //binlog每個日志文件大小
重啟mysql服務
systemctl restart mysqld.service
3:進入mysql查看二進制日志是否開啟
mysql -uroot -p
命令: SHOW GLOBAL VARIABLES LIKE '%log%';
查看主節點二進制日志列表: SHOW MASTER LOGS;
4、在主機上建立賬戶並授權slave
GRANT REPLICATION SLAVE ON *.* TO 'yourUser'@'192.168.131.141' IDENTIFIED BY 'yourPassword'; flush privileges; --查詢master的狀態 show master status\G
查詢master的狀態: show master status\G;
記錄上圖結果中File和Position的值。
5:編輯從節點配置文件
vi /etc/my.cnf
開啟中繼日志, 在【mysqld】下加入如下內容:
relay-log=relay-log relay-log-index=relay-log.index server-id=2
重啟mysql服務:
systemctl restart mysqld.service
6、查看從節點日志信息
SHOW GLOBAL VARIABLES LIKE '%log%';
7、在從節點配置訪問主節點的參數信息
添加 主節點主機,訪問主節點的用戶名及密碼,主節點二進制文件信息。
注意:主節點的二進制文件一定要是二進制列表中的最后一個二進制文件。
CHANGE MASTER TO master_host = 'your master ip', master_user = 'yourUser', master_password = 'yourPassword', master_log_file = 'mysql-bin.0000001', master_log_pos = 120;
8、查看從節點的狀態信息
SHOW SLAVE STATUS\G;
因為沒有啟動 從節點的復制線程,IO線程 和 SQL 線程都為NO.
啟動復制線程
//開啟復制
start slave;
再次查看從節點狀態信息
測試主從復制是否成功
在Master中創建數據庫並創建數據表並插入一條數據
在Slave中查詢這條數據
常用語句
show master status: 查看master的狀態,尤其是當前的日志及位置
show slave status 查看slave的狀態
reset slave 重置slave狀態
start slave 啟動slave狀態
stop slave 暫停slave狀態
主從復制架構中應注意的問題:
從節點要設置某些限定使得它不能進行寫操作,才能保證復制當中的數據一致。
1:限制從服務器為只讀
在從服務器上設置:
read_only = ON,但是此限制對擁有SUPER權限 的用戶均無效。
阻止所有用戶:
mysq>FLUSH TABLES WITH READ LOCK;
2:如何保證主從復制時的事物安全?
1:在主節點設置參數
sync_binlog=1: Mysql開啟bin-log日志使用bin-log時,默認情況下,並不是每次執行寫入就與硬盤同步,這樣在服務器崩潰時,就可能導致bin-log最后的語句丟失。可以通過這個參數來調節,sync_binlog=N,使執行N次寫入后,與硬盤同步。1是最安全的,但是也是最慢的。
如果用到innode 存儲引擎:
innodb_flush_logs_at_trx_commit=ON(刷寫日志:在事務提交時,要將內存中跟事務相關的數據立即刷寫到事務日志中去。)
innodb_support_xa=ON (分布式事務:基於它來做兩段式提交功能)
sync_master_info=1:每次給從節點dump一些事件信息之后,主節點的master info 信息會立即同步到磁盤上。讓從服務器中的 master_info 及時更新。
2:在每個slave節點
skip_slave_start =ON (跳過自動啟動,使用手動啟動。)
relay_log也會在內從中先緩存,然后在同步到relay_log中去,可以使用下面參數使其立即同步。
sync_relay_log =1 ,默認為10000,即每10000次sync_relay_log事件會刷新到磁盤。為0則表示不刷新,交由OS的cache控制。
sync_relay_log_info= 1 每間隔多少事務刷新relay-log.info,如果是table(innodb)設置無效,每個事務都會更新