程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> mysql數據庫主從復制部署筆記,mysql主從

mysql數據庫主從復制部署筆記,mysql主從

編輯:MySQL綜合教程

mysql數據庫主從復制部署筆記,mysql主從


數據庫主從復制原理:
數據庫的主從復制就是從master數據庫復制到slave數據庫,在master與slave之間實現整個復制需要三個線程來完成,其中兩個在slave端一個在master端。
在master端必須打開binlog功能,因為從數據庫需要獲得主數據的完整的操作日志然後再自身上順序的執行日志中的各種操作。

主要步驟:
1、將slave的io線程連上master,請求獲得指定日志文件的指定位置之後的操作日志的內容;
2、master獲得slave的io線程請求後,將請求中讀取到的指定日志的指定位置之後的內容返回給slave端的io線程,其中包括binlog 的位置以及名稱;
3、slave端的io線程在接收到信息後,將接收到的日志內容寫入slave端的relay log文件的末端,並將binlog的文件名和位置記錄到master-info文件中,以便下一次請求時向master提出請求;
4、slave的sql線程會檢測到relay log中新增的一些日志內容並加以解析成為可執行的query語句在slave端執行,從而達到master與slave端的數據一致性。

配置方法:
MASTER
1、編輯master的配置文件/etc/my.cnf,在[mysqld]中添加以下內容:
log-bin=mysql-bin #打開mysql的操作日志功能
binlog_format=mixed #主從復制模式,混合模式(MBR)默認的
binlog_cache_size=4M #設置binlog緩存大小
max_binlog_size=300M #設置binlog文件大小,如果不設置,默認是1.1GB
expire_logs_days= 3 #bin-log在主庫保存的天數,主庫產生的bin-log並不會自動刪除,需要手動刪除

2、在master上對從數據庫進行授權,建立復制用戶的專有賬戶
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘repl’@'%’ IDENTIFIED BY ‘repl’;

3、對master的數據庫進行備份
在備份master數據時要對master執行鎖表操作:
mysql>FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master; //刷新數據庫
Query OK, 0 rows affected (0.00 sec)
在不退出該終端的情況下(否則鎖表會失效),再次開啟一個終端直接打包壓縮數據文件或者使用mysqldump工具來導出數據:
#mysqldump -uroot -h 127.0.0.1 –opt -R XXXXXX > /data/mysql/backup/XXXXXX.sql
#cd/(www.111cn.net)data/mysql/backup/

4、備份數據庫到從數據庫
#tar -czvf XXXXXX.tar.gz XXXXXX.sql
#scp XXXXXX.tar.gz [email protected]:/data/mysql/backup
可用相同的方法將數據庫導入到其他的slave機器上,導入完成後在Master的命令終端上執行一下解鎖命令:
mysql>UNLOCK TABLES;
mysql>show processlist;
mysql>show master statusG; #查看主服務器的bin-log 和id

5、設置slave主機
編輯slave從數據庫的/etc/my.cnf配置文件,前面的配置參數與主的一樣,都是根據硬件內存進行參數調整:
#binlog_format=mixed
#required unique id between 1 and 2^32 – 1
#defaults to 1 if master-host is not set
#but will not function as a master if omitted
server-id=2 //slave 的編號 注意不要重復
read_only=1
binlog_format=mixed
binlog_cache_size=4M //設置binlog緩存大小
max_binlog_size=300M //設置binlog文件最大體積

在slave主機上新建一個數據庫,導入主數據庫的數據:
mysql>create database XXX;
mysql>use XXX;
mysql>set names utf8;
mysql>source /XXXXXX/XXX.sql

設置從數據庫的主master:
mysql>CHANGE MASTER TO MASTER_HOST=’XX.XX.XX.XX’, //主數據庫的ip地址
->MASTER_USER=’repl’,
->MASTER_PASSWORD=’repl’,
->MASTER_LOG_FILE=’mysql-bin.000001′, //這裡根據主服務器的binlog和id設置
->MASTER_LOG_POS=107; //
設置完成後,開啟slave服務:

mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave statusG; //顯示slave的狀態
從輸出結果中若:Slave_IO_Running和Slave_SQL_Running如果都為Yes時,表示配置成功
在線添加多個從庫:
原理:若直接在主數據庫上再次添加從庫會執行停止mysql 的服務進行鎖表操作從而影響正常的工作流程,
故在線添加從數據庫可以通過備份舊的從數據庫達到數據庫復制的目的。再次利用change master 可達到在線添加從數據庫的目的。
from:http://www.111cn.net/database/mysql/59749.htm


Mysql 的主從復制,最多支持多少個數據庫同步,最佳的建議是幾個?

主從復制理論上支持無窮大的從庫個數,實際情況下,受服務器帶寬和讀寫能力的影響
請參考mysql官方手冊的建議:
理論上,通過使用單個主服務器/多從服務器設置,可以通過添加更多的從服務器來擴充系統,直到用完網絡帶寬,或者你的更新負載已經增長到主服務器不能處理的點。

在獲得的收益開始吃平之前,為了確定可以有多少從服務器,以及可以將你的站點的性能提高多少,需要知道查詢模式,並且要通過基准測試並根據經驗確定一個典型的主服務器和從服務器中的讀取(每秒鐘讀取量,或者max_reads)吞吐量和寫(max_writes)吞吐量的關系。通過一個假設的帶有復制的系統,本例給出了一個非常簡單的計算結果。

假設系統負載包括10%的寫和90%的讀取,並且我們通過基准測試確定max_reads是1200 –2 × max_writes。換句話說,如果沒有寫操作,系統每秒可以進行1,200次讀取操作,平均寫操作是平均讀操作所用時間的兩倍,並且關系是線性的。我們假定主服務器和每個從服務器具有相同的性能,並且我們有一個主服務器和N個從服務器。那麼,對於每個服務器(主服務器或從服務器),我們有:

reads = 1200 – 2 × writes

reads = 9 × writes / (N + 1) (讀取是分離的, 但是寫入所有服務器)

9 × writes / (N + 1) + 2 × writes = 1200

writes = 1200 / (2 + 9/(N+1))

最後的等式表明了N個從服務器的最大寫操作數,假設最大可能的讀取速率是每分鐘1,200次,讀操作與寫操作的比率是9。

如上分析可以得到下面的結論:

· 如果N = 0(這表明沒有復制),系統每秒可以處理大約1200/11 = 109個寫操作。

· 如果N = 1,每秒得到184個寫操作。

· 如果N = 8,每秒得到400個寫操作。

· 如果N = 17,每秒得到480個寫操作。
 

MySQL主從數據庫備份,從數據庫中斷後可以否同步到與主數據庫一致?

主庫的主機關機時,數據只能讀不能寫,並且從庫的主機關機後,數據仍然可讀可寫,這個不好弄,如果你對lua腳本有所了解,修改mysql-proxy 的讀寫分離腳本或許可以實現。
不過主庫關機時不能訪問,並且從庫關機仍可讀可寫,這個不需要配讀寫分離,這本來就是主從復制的基本能力,從庫只是備用的而已。從庫關閉後再開啟,slave IO線程會自動從中斷處二進制日志的位置開始復制主機的二進制日志,slave SQL線程會讀取並執行這些二進制日志中的SQL。
總之,不需要特別的配置,這是主從復制的基本能力。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved