Mysql實(shí)現(xiàn)主從復(fù)制
- 在實(shí)際生產(chǎn)環(huán)境中,由單臺(tái)MySQL作為獨(dú)立的數(shù)據(jù)庫(kù)是不能滿足實(shí)際需求的,無論在安全性,高可用性以及高并發(fā)性等各個(gè)方面都存在很大局限性
- 一般來說通過主從復(fù)制與讀寫分離來提高數(shù)據(jù)庫(kù)的并發(fā)負(fù)載能力。
- 做數(shù)據(jù)熱備份,作為后備數(shù)據(jù)庫(kù),主數(shù)據(jù)庫(kù)服務(wù)器故障后,可切換到從數(shù)據(jù)庫(kù)繼續(xù)工作,避免數(shù)據(jù)丟失
- 架構(gòu)的擴(kuò)展。業(yè)務(wù)量越來越大,I/O訪問頻率過高,單機(jī)無法滿足,此時(shí)做多庫(kù)的存儲(chǔ),降低磁盤I/O訪問的頻率,提高單個(gè)機(jī)器的I/O性能
- 讀寫分離,使數(shù)據(jù)庫(kù)能夠支撐更大的并發(fā)。在報(bào)表中尤其重要。由于部分報(bào)表sql語句會(huì)導(dǎo)致梭鏢,影響前端服務(wù),如果前臺(tái)使用master,報(bào)表使用slave,那么報(bào)表sql將不會(huì)造成前臺(tái)鎖,保證了速度
數(shù)據(jù)庫(kù)主從同步機(jī)制
- Mysql服務(wù)器之間的主從同步是基于二進(jìn)制日志機(jī)制,主服務(wù)器使用二進(jìn)制日志來記錄數(shù)據(jù)庫(kù)的變動(dòng)情況,從服務(wù)器通過讀寫和執(zhí)行該日志文件來保持和主服務(wù)器的數(shù)據(jù)一致
- 在使用二進(jìn)制日志時(shí),主服務(wù)器的所有操作都會(huì)被記錄下來,然后從服務(wù)器會(huì)接受到該日志的一個(gè)副本。從服務(wù)器可以指定執(zhí)行該日志中的哪一類事件,比如只插入或只更新,默認(rèn)會(huì)執(zhí)行日志中所有語句
- 以上過程需要三個(gè)線程來操作
- binlog輸出線程,每當(dāng)有從庫(kù)鏈接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線程然后發(fā)送binlog內(nèi)容到從庫(kù)。在從庫(kù)里,當(dāng)復(fù)制開始的時(shí)候,從庫(kù)會(huì)創(chuàng)建兩個(gè)線程進(jìn)行處理
- 從庫(kù)I/O線程:當(dāng)START SLAVE語句在從庫(kù)開始執(zhí)行之后,從庫(kù)創(chuàng)建一個(gè)I/O線程,該線程鏈接到主庫(kù)發(fā)送binlog里面的更新記錄到從庫(kù)上。從庫(kù)I/O線程讀取主庫(kù)的binlog輸出線程發(fā)送的更新并拷貝這些更新到本地文件中,其中包括relay log文件
- 從庫(kù)的SQL線程:從庫(kù)創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫(kù)I/O線程到relay log的更新時(shí)間并執(zhí)行
主從服務(wù)器的配置
配置主服務(wù)器
- 更改配置文件,往服務(wù)器配置文件my.cnf中配置log-bin和server-id
[mysqlId]
log-bin=mysql-bin#開啟二進(jìn)制日志
server-id=1
- 創(chuàng)建用戶可用于從服務(wù)器同步的賬戶
mysql> CREATE USER 'repl'@'從服務(wù)器地址' IDENTIFIED BY 'slavepass';#創(chuàng)建用戶
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'從服務(wù)器地址';#分配權(quán)限
mysql>flush privileges; #刷新權(quán)限
- 查看master狀態(tài),記錄二進(jìn)制文件名和位置
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000013 | 155 | | | |
+---------------+----------+--------------+------------------+-------------------+
配置從服務(wù)器
- 修改mysql配置
[mysqld]
server-id=2 #設(shè)置server-id,必須唯一
- 重啟mysql后設(shè)置同步SQL語句
mysql> CHANGE MASTER TO
-> MASTER_HOST='主服務(wù)器地址',
-> MASTER_USER='rep1',
-> MASTER_PASSWORD='slavepass',
-> MASTER_LOG_FILE='binlog.000013',
-> MASTER_LOG_POS=155;
- 啟動(dòng)slave同步進(jìn)程
mysql>start slave;
- 查看slave狀態(tài)
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 主服務(wù)器地址
Master_User: rep1
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: binlog.000013
Read_Master_Log_Pos: 155
Relay_Log_File: mysqld-relay-bin.000022
Relay_Log_Pos: 11765
Relay_Master_Log_File: binlog.000013
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
...
當(dāng)Slave_IO_Running和Slave_SQL_Running都為YES的時(shí)候就表示主從同步設(shè)置成功了。此時(shí)便可以進(jìn)行測(cè)試,當(dāng)主數(shù)據(jù)庫(kù)創(chuàng)建數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)表并插入數(shù)據(jù)的時(shí)候,查看從服務(wù)器上是否有增加相應(yīng)的數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)表以及對(duì)應(yīng)的數(shù)據(jù)