本文源出處:http://www.lustlost.com/?p=158
在mysql的複製中,相對於主主複製,主從架構的穩定性更好,而主主總是會有些問題存在,故不推薦。在大型架構中建議使用基於讀寫分離的主從複製
本文不涉及讀寫分離的內容,只是簡單實現mysql的主從複製的實現。整個過程在理解複製的原理後就非常的簡單,所以先簡單介紹下原理。
mysql的主從複製的基本原理:
在主服務器上傳送二進制日誌到從服務器,在從服務器上讀取收到的中繼日誌,執行日誌中的sql語句,實現數據同步。
整個實現過程如下圖所示,通過圖片能很容易的看出整個流程
對於主從之間使用異步傳輸還是同步傳輸,具體看網絡情況和整體架構而定
要注意,爲了兼容性問題,主從服務器之間,master的mysql的版本要比slave版本低或者相同
如果在一個已存在數據的主服務器上部署備服務器,要先備份主服務器的數據,備份的時候做好二進制日誌位置記錄 ,然後恢復到從服務器上,並指定從服務器的從主服務器二進制日誌的複製位置,從時間點開始複製
實現過程
首先在2臺服務器上安裝好mysql。安裝步驟不再列出,我用的是綠色版安裝,雙方的mysql配置最好一樣
修改my.cnf,master上修改server-id爲1,slaver修改server-id爲大於1的數字
master:
slave:
在從服務器上關閉二進制日誌,避免從服務器上IO過高,並開啓relay-log
而且要在slave上限制寫入
在master上創建複製用的帳號,此帳號只授予複製相關的權限
在slave上進入mysql命令行,設定master相關參數
然後打開slave複製
查看slave狀態
發現連接到master時出現錯誤
清空master和slave的iptables規則後重新啓動slave,OK
試着在master上創建一個數據庫
在slave上查看,已經成功複製過來
如果在部署slave時master已經存有數據了,需要在master上備份數據,然後在slave上導入數據
在用mysqldump備份數據的時候,加上--master-data=2參數記錄正在使用二進制日誌文件和的POS位置
然後在slave上指定master服務器時,加上master_logfile=’xxx’,master_log_pos=xxx 指定起始的二進制文件和文件的pos位置開始複製
要讓slave開啓時暫時停止從服務器線程,在my.cnf中的mysqld段中加入以下參數
skip-slave-start=1
爲了讓服務器更加安全,防止斷電產生事物已經提交,數據還未寫入磁盤的問題,在master的my.cnf中的mysql段加入
sync_binlog=1
innodb_flush_logs_at_trx_commit=1