1.mysql主從複製介紹mysql
mysql支持單向、雙向、鏈式級聯、實時、異步複製,在複製過程當中,一臺服務器充當主服務器(Master),而一個或多個其它服務器充當從服務器(Slave)。sql
複製:單向同步複製數據庫
![](http://static.javashuo.com/static/loading.gif)
複製:單向,一主多從複製服務器
![](http://static.javashuo.com/static/loading.gif)
複製:雙向,主主複製架構
![](http://static.javashuo.com/static/loading.gif)
複製:環向複製負載均衡
![](http://static.javashuo.com/static/loading.gif)
此外,還有級聯模式,就是主==>主==>從模式。 異步
2. mysql主從複製應用場景分佈式
在當前的生產工做中,大多數應用的mysql主從同步都是異步的複製方式,即不是嚴格實時的數據同步。mysql主從複製有利於數據庫架構的健壯性、提高訪問速度和易於維護管理。ide
2.1 主從互爲備份,主庫有問題,能夠切換到從庫上繼續提供服務網站
mysql 主從同步作不到一條數據不丟,要作到主從切換一條數據不丟,有多種方案,這裏主要說明4種:
1)mysql自身有一個插件,講主從同步從異步變成半同步,即實時同步。往主庫寫數據,當從庫也寫完畢,纔是主從同步成功,不然兩個都不成功。
2)切換到從庫時,講主庫的bin_log日誌在從庫中執行一遍
3)從程序上下功夫,講主庫實時一分鐘的數據寫到程序上,同步到從庫上
4)雙寫功能,既寫主庫又寫從庫
2.2 讀寫分離,主寫,讀從
中小公司:經過程序
門戶網站:分佈式dbproxy(讀寫分離、hash負載均衡,健康檢查)
2.3 根據服務器拆分業務獨立並分擔壓力
許多公司都是一主多從,主庫寫,從庫不一樣服務器兼顧不一樣業務,若是主掛了,能夠迅速手工或者自動切換。從庫間能夠實現集羣,能夠不一樣人員訪問不一樣機器等。
3.mysql主從同步的基本結構
![](http://static.javashuo.com/static/loading.gif)
能夠看到:
1 ) 從庫生成兩個線程,一個I/O線程,一個SQL線程;
2 ) I/O線程去請求主庫 的binlog,並將獲得的binlog日誌寫到relay log(中繼日誌) 文件中;
3 ) 主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;
4 ) SQL 線程,會讀取relay log文件中的日誌,並解析成具體操做,來實現主從的操做一致,而最終數據一致;經過mysqlbinlog 進行查看
5 ) 在從庫的I/O線程還會生成一個相似記錄文件master.info,用來記錄每次從主I/O獲取的位置和時間還有下次應該從哪一個位置進行取日誌和位置。
4.主從複製
4.1.環境準備
1)具有單機單數據庫多實例的環境
2)兩臺服務器每一個機器一個數據庫的環境
4.2.數據庫讀法的約定
主庫:master 從庫:slave
4.3.設置server-id值並開啓binlog參數(log-bin = /data/3306/my.cnf)
【mysqld】
server-id=1
log-bin = /data/3306/mysql-bin
查看是否生效:
1) 查看/data/3306下是否有日誌
2) 查看參數:mysql -uroot -poldboy124 -S /data/3306/mysql.sock -e "show variables like 'log_bin';"
4.4.創建用於同步的帳戶rep
登錄主庫創建用於從庫複製的帳號rep:
grant replication slave on *.* to 'rep'@'192.168.0.104' identified by 'oldboy124'
flush privileges;
4.5.主數據庫備份
1) flush table with read lock ---添加鎖
2) show master status; ---查看master-data的位置,在從庫master.info會記錄當前同步的位置,爲下次同步提供起始位置
3) show master log; --現有的master-data
![](http://static.javashuo.com/static/loading.gif)
4)備份:mysqldump -uroot -poldboy124 -S /data/3306/mysql.sock -A -B --events|gzip /dangjingwei/rep.sql.gz --壓縮本地磁盤備份
5)備份: mysqldump -uroot -poldboy124 -S /data/3306/mysql.sock -A -B --events --master-data=2 >/dangjingwei/rep.sq l--master-data 標識添加註釋
6) unlock tables; --解鎖
7)能夠直接鎖定進行備份:mysqldump -uroot -poldboy124 -S /data/3306/mysql.sock -A -B -S --events --master-data=2 >/dangjingwei/rep.sql
8)將備份文件導入到從庫中: mysql -uroot -poldboy124 -S /data/3307/mysql.sock </dangjingwei/rep.sql 將備份文件添加到從庫中
9)添加master.info ,使從庫能夠鏈接主庫
CHANGE MASTER TO
MASTER_HOST='192.168.0.104',---主庫地址
MASTER_PORT=3306,--主庫端口
MASTER_USER='rep',--主庫用戶
MASTER_PASSWORD='oldboy124', --主庫密碼
MASTER_LOG_FILE='mysql-bin.000003', --下次同步的起始頁面 ,若是備份參數是--master-data=1,能夠去掉
MASTER_LOG_POS=343; --下次同步的起始位置 ,若是備份參數是--master-data=1,能夠去掉
檢查:從庫的實例數據存放的位置下面能夠看到
/data/3307/data/master.info--若是主庫不斷更新,則bin_log不斷更新,從庫會不斷更新這個內容的起始位置
19)打開從庫同步: start slave
檢查:查看狀態;
show slave status\G;
從庫的sql線程會讀取relay log文件中的日誌,此文件從庫的位置是從庫的實例線程下面
至此,當主庫發生增刪改的時候,從庫相應的進行同步!!!