MySQl主從復(fù)制

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è)線程來操作
    1. 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)行處理
    2. 從庫(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文件
    3. 從庫(kù)的SQL線程:從庫(kù)創(chuàng)建一個(gè)SQL線程,這個(gè)線程讀取從庫(kù)I/O線程到relay log的更新時(shí)間并執(zhí)行

主從服務(wù)器的配置

配置主服務(wù)器
  1. 更改配置文件,往服務(wù)器配置文件my.cnf中配置log-bin和server-id
[mysqlId]
log-bin=mysql-bin#開啟二進(jìn)制日志
server-id=1
  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)限
  1. 查看master狀態(tài),記錄二進(jìn)制文件名和位置
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000013 |      155 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
配置從服務(wù)器
  1. 修改mysql配置
[mysqld]
server-id=2 #設(shè)置server-id,必須唯一
  1. 重啟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;
  1. 啟動(dòng)slave同步進(jìn)程
mysql>start slave;
  1. 查看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ù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容