我想這是要在實施之前要想清楚的問題。是爲了實現讀寫分離,減輕主庫負載或數據分析? 爲了數據安全,作備份恢復?主從切換作高可用?
大部分場景下,以上三個問號一主一從都可以解決,並且任何生產環境都建議你至少要有一個從庫,假如你的讀操做壓力特別大,甚至要作一主多從,還能夠不一樣的slave扮演不一樣的角色,例如使用不一樣的索引,或者不一樣的存儲引擎,或使用一個小內存server作slave只用於備份。(固然slave太多也會對master的負載和網絡帶寬形成壓力,此時能夠考慮級聯複製,即 A->B->C )php
還有須要考慮的是,一主一從,一旦作了主從切換,不經過其它HA手段干預的話,業務訪問的仍是原IP,並且原主庫很容易就做廢了。因而 主-主 複製就產生了,憑藉各自不一樣的 server-id ,能夠避免 「A的變化同步到B,B應用變化又同步到A」 這樣循環複製的問題。但建議是,主主複製,其中一個主庫強制設置爲只讀,主從切換後架構依然是可用的。mysql
複製過程是slave主動向master拉取,而不是master去推的,因此理想狀況下作搭建主從時不須要master作出任何改變甚至停服,slave失敗也不影響主庫。web
MySQL主從又叫作Replication、AB複製。sql
簡單講就是A和B兩臺機器作主從後,在A上寫數據,另一臺B也會跟着寫數據,二者數據實時同步。MySQL主從是基於binlog的,主上須開啓binlog才能進行主從。數據庫
爲何要作主從複製?
我想這是要在實施之前要想清楚的問題。是爲了實現讀寫分離,減輕主庫負載或數據分析? 爲了數據安全,作備份恢復?主從切換作高可用?
大部分場景下,以上三個問號一主一從都可以解決,並且任何生產環境都建議你至少要有一個從庫,假如你的讀操做壓力特別大,甚至要作一主多從,還能夠不一樣的slave扮演不一樣的角色,例如使用不一樣的索引,或者不一樣的存儲引擎,或使用一個小內存server作slave只用於備份。(固然slave太多也會對master的負載和網絡帶寬形成壓力,此時能夠考慮級聯複製,即 A->B->C )vim還有須要考慮的是,一主一從,一旦作了主從切換,不經過其它HA手段干預的話,業務訪問的仍是原IP,並且原主庫很容易就做廢了。因而 主-主 複製就產生了,憑藉各自不一樣的 server-id ,能夠避免 「A的變化同步到B,B應用變化又同步到A」 這樣循環複製的問題。但建議是,主主複製,其中一個主庫強制設置爲只讀,主從切換後架構依然是可用的。安全
複製過程是slave主動向master拉取,而不是master去推的,因此理想狀況下作搭建主從時不須要master作出任何改變甚至停服,slave失敗也不影響主庫。網絡
使用場景:架構
數據備份,主寫數據,從上存數據備份ide
web客戶端在從上讀數據,不能在從上寫,分擔主庫讀的壓力
- 主將更改操做記錄到binlog中
- 從將主的binlog事件(SQL語句)同步到本機並記錄在relaylog中
- 從根據relaylog裏面的SQL語句按順序執行
說明: 該過程有三個線程,主上有一個log dump線程,用來和從的i/o線程傳遞binlog;從上有兩個線程,其中i/o線程用來同步主的binlog並生成relaylog,另一個SQL線程用來把relaylog裏面的SQL語句落地。
配置主master:
vim /etc/my.cnf #增長以下內容 erver-id=131 #數字本身定義,和奇偶有關係後面雙主也要注意這裏 log_bin=quyifan1 #指定log前綴 /etc/init.d/mysqld restart ls -lt /data/mysql/ #查看mysql庫文件,多了兩個quyifan1爲前綴的文件,此文件很是重要必須生產 mysqldump -uroot zrlog > /tmp/zrlog.sql #準備一個數據庫 mysql -uroot -e "create database quyifan" #建立一個庫 mysql -uroot quyifan < /tmp/zrlog.sql #把準備的數據恢復到這個新庫中 grant replication slave on *.* to 'repl'@192.168.153.132 identified by 'password'; #建立一個用來同步的用戶,關鍵所在 flush tables with read lock; #鎖定數據包,暫時沒法寫入保持現有狀態用於同步 show master status; #記錄兩個關鍵數據file和position,爲後面backup作準備
配置從backup:
vim /etc/my.cnf server-id=132 #這裏和主劃分開,數字奇偶性 /etc/init.d/mysqld restart scp 192.168.153.131:/tmp/*.sql /tmp/ #把主上數據同步到從上超級重要,數據不一致會很是麻煩(ps這裏不是太理解爲什麼不僅是傳輸上面備份的數據庫就能夠呢) create database quyifan; #從上也建立相同的庫 mysql -uroot quyifan < /tmp/zrlog.sql #把準備好的數據恢復備份到庫中 ☆☆☆☆☆☆☆☆☆☆☆ stop slave; #中止複製 change master to master_host='主IP', master_user='repl', master_password='123456', master_log_file='主file內容', master_log_pos=Position的數字; #這條重點,用到了主上建立的那個用戶和主上最後獲得的數據 start slave; #恢復複製 show slave status\G #檢查以下部分肯定主從搭建完成 Slave_IO_Running: Yes Slave_SQL_Running: Yes econds_Behind_Master: 0 #爲主從延遲的時間 Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: 都成功了,別急啊兄弟,回主上把鎖定的包恢復鎖定!!! unlock tables; 好了主從到這裏下面的更精彩