最近在做性能優(yōu)化的系列課程,其中MySQL數(shù)據(jù)優(yōu)化部分用到了主從復制仔拟,在這里和大家分享下實現(xiàn)原理以及配置步驟。
概念
MySQL 主從復制是指數(shù)據(jù)可以從一個MySQL數(shù)據(jù)庫服務(wù)器主節(jié)點復制到一個或多個從節(jié)點飒赃。MySQL 默認采用異步復制方式利花,這樣從節(jié)點不用一直訪問主服務(wù)器來更新自己的數(shù)據(jù),數(shù)據(jù)的更新可以在遠程連接上進行载佳,從節(jié)點可以復制主數(shù)據(jù)庫中的所有數(shù)據(jù)庫或者特定的數(shù)據(jù)庫炒事,或者特定的表。
目的
- 數(shù)據(jù)同步備份
主庫master發(fā)生故障后蔫慧,可以馬上切換到從庫slave挠乳,降低服務(wù)風險。 - 讀寫分離
可以把寫操作放在master藕漱,讀取操作放在slave欲侮,減輕單一數(shù)據(jù)庫的操作壓力 - 高可用HA
隨著系統(tǒng)中業(yè)務(wù)訪問量的增大,如果是單機部署數(shù)據(jù)庫肋联,就會導致I/O訪問頻率過高。有了主從復制刁俭,增加多個數(shù)據(jù)存儲節(jié)點橄仍,將負載分布在多個從節(jié)點上,降低單機磁盤I/O訪問的頻率牍戚,提高單個機器的I/O性能侮繁。
基本原理
master記錄下自己的操作日志,授權(quán)從服務(wù)器可以讀取操作日志如孝,slave會開啟兩個線程宪哩。
- IO線程
負責連接master 連接成功后,睡眠并等待master產(chǎn)生新的事件第晰,有新的就保存到自己的中繼日志中锁孟,中繼日志通常位于操作系統(tǒng)的緩存中,所以開銷很小茁瘦。 - sql進程
負責執(zhí)行中繼日志中的sql操作品抽,這樣slave的內(nèi)容就和master的一致了。
執(zhí)行步驟
- 主庫db的更新事件(update甜熔、insert圆恤、delete)被寫到binlog
- 從庫發(fā)起連接,連接到主庫
- 主庫創(chuàng)建一個binlog dump thread線程腔稀,把binlog的內(nèi)容發(fā)送到從庫
- 從庫啟動之后盆昙,創(chuàng)建一個I/O線程羽历,讀取主庫傳過來的binlog內(nèi)容并寫入到relay log.
- 還會創(chuàng)建一個SQL線程,從relay log里面讀取內(nèi)容淡喜,從Exec_Master_Log_Pos位置開始執(zhí)行讀取到的更新事件秕磷,將更新內(nèi)容寫入到slave的db.
配置方式
前提條件
停止對master數(shù)據(jù)庫的操作,把master中的數(shù)據(jù)庫全部導入到slave拆火,使兩邊數(shù)據(jù)庫完全一致跳夭。
配置master
- 修改master的配置文件,使用二進制日志们镜,指定server-id币叹,重啟服務(wù)。目的是讓各自都有了自己的唯一標示模狭,并以二進制文件格式進行交流颈抚。Centos中路徑為 /etc/my.cnf。
[mysqld]
log_bin=mysql-bin //[必須]啟用二進制日志
server-id=10//[必須]服務(wù)器唯一ID嚼鹉,默認是1贩汉,一般取IP最后一段
配置完成后需要重啟mysqlserver才能生效。
- 創(chuàng)建授權(quán)用戶
登陸主服務(wù)器mysql命令行锚赤,創(chuàng)建一個用于從服務(wù)器復制的用戶匹舞。
mysql>GRANT REPLICATION SLAVE ON *.* to 'root'@'%' identified by '123456';
"."表示對所有庫的所有操作,“%”表示所有客戶端都可能連线脚,也可用具體客戶端IP代替赐稽,如192.168.33.11,加強安全浑侥。
- 記錄master 狀態(tài)信息
查看二進制日志文件名姊舵,及最新位置。讓slave知道用哪個用戶信息訪問master寓落,知道讀取哪個日志文件括丁,及從哪兒開始讀。
mysql>show master status;
其中file伶选、position字段需要記錄下值史飞,mysql-bin.000001 是用于主從復制的文件名,
437是日志文件內(nèi)的最新位置考蕾。
配置slave
- 修改配置文件my.cnf祸憋,使用二進制日志,指定server-id肖卧,重新啟動服務(wù)蚯窥。
[mysqld]
log_bin=mysql-bin
server-id=11
- 將slave指向master
登陸從服務(wù)器mysql命令行,使用之前創(chuàng)建的用戶和master的日志文件及其位置。slave中使用被授權(quán)用戶信息及日志文件信息拦赠,進行指向master巍沙。這時已經(jīng)建立了和master的聯(lián)系,明確了從哪兒讀取日志文件荷鼠。
mysql>change master to master_host='192.168.33.10',master_user='root',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=437;
//注意不要斷開句携,“437”無單引號。
- 啟動slave
mysql>start slave;
- 查看slave狀態(tài)
mysql> show slave status\G;
結(jié)果中有兩個重要數(shù)據(jù)項:
- Slave_IO_Running: Yes IO線程狀態(tài)允乐,必須YES
- Slave_SQL_Running: Yes SQL線程狀態(tài)矮嫉,必須YES
常見的問題是SQL線程沒有正常工作 Slave_SQL_Running: No。通常是兩邊的數(shù)據(jù)庫不是完全對應(yīng)的牍疏,需要確保master上的庫及到目前為止的最新記錄都復制到slave上了蠢笋。
驗證測試
當IO線程和SQL線程都正常后,到master中隨意測試下插入鳞陨、修改昨寞、刪除操作,同時到slave中檢查厦滤。
總結(jié)
至此就完成了Mysql server的主從復制援岩,還是很簡單易用的。大家可以弄兩臺虛機環(huán)境實際搭建測試下掏导。
上一篇 | 《性能優(yōu)化系列文章目錄》 | 下一篇 |
---|