linux覆盤:mysql主從

爲何要作主從複製?

我想這是要在實施之前要想清楚的問題。是爲了實現讀寫分離,減輕主庫負載或數據分析? 爲了數據安全,作備份恢復?主從切換作高可用?
大部分場景下,以上三個問號一主一從都可以解決,並且任何生產環境都建議你至少要有一個從庫,假如你的讀操做壓力特別大,甚至要作一主多從,還能夠不一樣的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客戶端在從上讀數據,不能在從上寫,分擔主庫讀的壓力

  1. 主將更改操做記錄到binlog中
  2. 從將主的binlog事件(SQL語句)同步到本機並記錄在relaylog中
  3. 從根據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;
好了主從到這裏下面的更精彩
相關文章
相關標籤/搜索