隨筆篇-MySql的主從復(fù)制

參考: http://www.reibang.com/p/faf0127f1cb2

1.主從復(fù)制是什么

主從復(fù)制也叫AB復(fù)制衔憨,允許將主服務(wù)器的數(shù)據(jù)復(fù)制到另外一個(gè)從服務(wù)器作郭,從而實(shí)現(xiàn)服務(wù)器的讀寫分離除秀。

2.MySql主從復(fù)制是什么

MySql主從復(fù)制即 允許將來(lái)自一個(gè)Mysql的服務(wù)器(主服務(wù)器)數(shù)據(jù)復(fù)制到一個(gè)或者多個(gè)Mysql服務(wù)器(從服務(wù)器)上等限。從而實(shí)現(xiàn)對(duì)Mysql服務(wù)器的讀寫分離饼煞。

也就是說(shuō):

如果需要對(duì)MySql服務(wù)器進(jìn)行寫時(shí),就可以操作主MySql服務(wù)器脖律,操作完成后喇澡,從服務(wù)器就會(huì)同步主服務(wù)器的數(shù)據(jù)。

如果需要對(duì)MySql服務(wù)器進(jìn)行讀時(shí),那么就可以操作MySql從服務(wù)器张漂。這樣在一定程度上實(shí)現(xiàn)了讀寫分離晶默。從而減輕數(shù)據(jù)庫(kù)的壓力。

3.MySql主從復(fù)制原理

如圖所示:

image-20200629112018984

當(dāng)只有一個(gè)從數(shù)據(jù)庫(kù)服務(wù)器時(shí)原理如上圖所示航攒,具體解釋如下:

1.主數(shù)據(jù)庫(kù)服務(wù)器發(fā)生改變時(shí)荤胁,那么就會(huì)開啟一個(gè)IO線程將改變保存到二進(jìn)制文件(Binary log)里面(一定要是主服務(wù)器必須開啟二進(jìn)制日志,否則就沒(méi)法產(chǎn)生二進(jìn)制文件)

2.從數(shù)據(jù)庫(kù)服務(wù)器也會(huì)開啟一個(gè)IO線程去主數(shù)據(jù)庫(kù)服務(wù)器讀取這個(gè)二進(jìn)制文件

3.從數(shù)據(jù)庫(kù)服務(wù)器將從主服務(wù)器二進(jìn)制文件中讀取內(nèi)容寫入到本地二進(jìn)制文件(Realy log)里面

4屎债,從服務(wù)器同時(shí)也會(huì)開啟一個(gè)SQL線程去定時(shí)檢查本地文件有沒(méi)有更新,如果有更新垢油,那么就會(huì)立馬去執(zhí)行更新的內(nèi)容盆驹。

這樣就實(shí)現(xiàn)了MySql主從復(fù)制原理。

當(dāng)然如果時(shí)一個(gè)主服務(wù)器和多個(gè)從服務(wù)器滩愁,其原理類似躯喇,具體如下:

3

1.需要對(duì)主服務(wù)器進(jìn)行修改,從而讓從服務(wù)器也產(chǎn)生二進(jìn)制文件

2.其他從服務(wù)器就從產(chǎn)生二進(jìn)制文件的從服務(wù)器里面讀取二進(jìn)制文件

3.將二進(jìn)制文件存入到本地的二進(jìn)制文件中硝枉,同時(shí)開啟一個(gè)SQL線程去檢查本地的二進(jìn)制文件是否有更新廉丽,如果有更新那么就執(zhí)行更新的內(nèi)容,同步數(shù)據(jù)妻味。

當(dāng)然我們也可以將中間的從服務(wù)器直接配置成轉(zhuǎn)發(fā)二進(jìn)制文件正压,這樣架構(gòu)也會(huì)好很多。具體怎么搭建還是要看具體的業(yè)務(wù)需求责球。

注意:

主從復(fù)制焦履,復(fù)制是異步的,從服務(wù)器不需要建立永久連接來(lái)接收主服務(wù)器的更新雏逾。

4.二進(jìn)制文件解釋

mysqld將數(shù)字?jǐn)U展名附加到二進(jìn)制日志基本名稱以生成二進(jìn)制日志文件名嘉裤。每次服務(wù)器創(chuàng)建新日志文件時(shí),該數(shù)字都會(huì)增加栖博,從而創(chuàng)建一系列有序的文件屑宠。每次啟動(dòng)或刷新日志時(shí),服務(wù)器都會(huì)在系列中創(chuàng)建一個(gè)新文件仇让。服務(wù)器還會(huì)在當(dāng)前日志大小達(dá)到max_binlog_size參數(shù)設(shè)置的大小后自動(dòng)創(chuàng)建新的二進(jìn)制日志文件 典奉。二進(jìn)制日志文件可能會(huì)比max_binlog_size使用大型事務(wù)時(shí)更大, 因?yàn)槭聞?wù)是以一個(gè)部分寫入文件丧叽,而不是在文件之間分割秋柄。

為了跟蹤已使用的二進(jìn)制日志文件, mysqld還創(chuàng)建了一個(gè)二進(jìn)制日志索引文件蠢正,其中包含所有使用的二進(jìn)制日志文件的名稱骇笔。默認(rèn)情況下,它具有與二進(jìn)制日志文件相同的基本名稱,并帶有擴(kuò)展名'.index'笨触。在mysqld運(yùn)行時(shí)懦傍,不應(yīng)手動(dòng)編輯此文件。

作者:運(yùn)維開發(fā)_西瓜甜
鏈接:http://www.reibang.com/p/faf0127f1cb2

5.配置

  • 前提

    • 以Ubuntu 18.04為例芦劣,且安裝docker粗俱,docker用法請(qǐng)參考docker教程

    • 在這里我們配置一個(gè)主服務(wù)器和一個(gè)從服務(wù)器。

  • 拉取mysql鏡像

    docker pull mysql:5.7
    
    image-20200629204643183
  • 運(yùn)行容器

    docker run -di --name=master_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
    
    docker run -di --name=slave_mysql  -p 33306:3306 -e MYSQL_ROOT_PASSWORD=root mysql:5.7
    

    查看容器運(yùn)行狀態(tài):

    docker ps -a
    
    image-20200629204759607

    從上圖可知兩個(gè)mysql容器正在運(yùn)行虚吟,當(dāng)然我們也可以用Navicat進(jìn)行連接寸认,如下:

    • 連接 master_mysql

      image-20200629135519600
    • 連接slave_mysql

      image-20200629135703329
  • 配置主服務(wù)器

    進(jìn)入主服務(wù)器內(nèi)部

    docker exec -it master_mysql /bin/bash
    
    image-20200629135855209

    進(jìn)入/etc/mysql目錄下,修改 my.cnf文件串慰。如圖所示:

    image-20200629140006336

    發(fā)現(xiàn)沒(méi)有vim命令偏塞,我們?cè)谌萜鲀?nèi)部安裝vim命令

    apt-get update
    apt-get install vim
    
    image-20200629140128050
    image-20200629141351918

    修改my.cnf文件

    vim /etc/mysql/my.cnf
    
    image-20200629143533536

    在該文件增加以下內(nèi)容:

    image-20200630094227383
    • server-id=10

      同一個(gè)局域網(wǎng)這個(gè)值必須唯一

      如果其值是 0 那么主服務(wù)器就拒絕來(lái)自從服務(wù)器的任何連接

    • log-bin=mysql-bin

      開啟二進(jìn)制文件功能

    • 為了在使用帶事務(wù)的InnoDB進(jìn)行復(fù)制設(shè)置時(shí)盡可能提交持久性和一致性,

      增加:

      innodb_flush_log_at_trx_commit = 1
      sync_binlog = 1
      

      保存退出邦鲫,要想配置生效灸叼,那么就需要重啟容器

      exit
      docker restart master_mysql
      
      image-20200629144904233
  • 創(chuàng)建一個(gè)用戶專門用來(lái)復(fù)制數(shù)據(jù)

    當(dāng)進(jìn)行主從復(fù)制時(shí),每個(gè)從服務(wù)器都需要主服務(wù)器的用戶名和密碼去連接到主服務(wù)器庆捺。

    進(jìn)入主服務(wù)器 創(chuàng)建用戶古今,并且賦權(quán)限

    docker exec -it master_mysql /bin/bash
    
    -- 登陸mysql
    mysql -uroot  -proot
    
    -- 創(chuàng)建用戶
    CREATE user 'slave'@'%' identified by 'slave';
    
    -- 賦予權(quán)限
    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    
    image-20200629145428825

    這樣我們的主服務(wù)武器就配置完成了。

  • 配置從服務(wù)器

    與主服務(wù)器配置類似滔以,先進(jìn)入容器中捉腥,然后安裝vim

    docker exec -it slave_mysql /bin/bash  
    apt-get update
    apt-get install vim
    

    編輯從服務(wù)器配置文件

    vim /etc/mysql/my.cnf
    

    在文件中添加以下內(nèi)容

    image-20200630094552560

    server-id和log-bin與主服務(wù)器相同,這里不再解釋

    relay_log=edu-mysql-relay-bin 配置中繼日志你画,就是當(dāng)從服務(wù)器讀取到主服務(wù)器的日志文件內(nèi)容但狭,將該內(nèi)容存儲(chǔ)到本地日志文件里面,這個(gè)日志就是中繼日志撬即。

    重啟從服務(wù)器容器

    exit
    docker restart slave_mysql
    
    image-20200629165836097
  • 配置主服務(wù)器

    進(jìn)入主服務(wù)器容器內(nèi),并登陸mysql

    docker exec -it master_mysql /bin/bash
    
    mysql -uroot -proot
    

    查看主服務(wù)器狀態(tài)

    show master status;
    
    image-20200630094654024
    • File 就是主服務(wù)器產(chǎn)生的二進(jìn)制文件名稱
    • Position 代表從該二進(jìn)制文件哪個(gè)位置開始讀取
  • 配置從服務(wù)器

    進(jìn)入從服務(wù)器容器內(nèi),并登陸mysql

    docker exec -it slave_mysql /bin/bash
    
    mysql -uroot -proot
    
    image-20200629201514401

    執(zhí)行下面指令立磁,從而與主服務(wù)器進(jìn)行綁定

    change master to master_host='172.17.0.2', master_user='slave', master_password='slave', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=617, master_connect_retry=30;
    

    解釋如下:

    • master_host 主服務(wù)器容器的ip地址,指的是容器的獨(dú)立ip,可以通過(guò)docker inspect --format='{{.NetworkSettings.IPAddress}}' master_mysql查詢?nèi)萜鞯膇p

      image-20200629201828986
    • master_user 數(shù)據(jù)復(fù)制的用戶剥槐,就是上文中主服務(wù)器建立的用戶名

    • master_password 數(shù)據(jù)復(fù)制的密碼 就是上文中主服務(wù)器建立的用戶密碼

    • master_port 主服務(wù)器端口

    • master_log_file 主服務(wù)器的二進(jìn)制文件唱歧,就是上面介紹的File

    • master_log_pos 代表從哪個(gè)位置開始讀取,就是上面介紹的Postion

    • master_connect_retry 如果連接時(shí)間粒竖,重新建立連接的間隔時(shí)間颅崩,但是是秒,默認(rèn)60s

      image-20200629202157762

    查看主從同步狀態(tài)在從服務(wù)器中

    show slave status \G;
    
    image-20200629202332314

    發(fā)現(xiàn)IO線程和SQL線程運(yùn)行狀態(tài)都是NO,這是因?yàn)槟J(rèn)情況下蕊苗,主從復(fù)制沿后,并沒(méi)有開啟,需要用戶手動(dòng)開啟朽砰,因此執(zhí)行指令start slave開啟主從復(fù)制

    image-20200630095016689

    再去查看狀態(tài)

    image-20200630095054352

    這樣就搭建成功了尖滚。

6.測(cè)試

在主服務(wù)器創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)

image-20200630095401523

從數(shù)據(jù)庫(kù)服務(wù)器也會(huì)自動(dòng)增加test數(shù)據(jù)庫(kù)

image-20200630095440332
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載喉刘,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末漆弄,一起剝皮案震驚了整個(gè)濱河市睦裳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼唾,老刑警劉巖廉邑,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倒谷,居然都是意外死亡蛛蒙,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門渤愁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)牵祟,“玉大人,你說(shuō)我怎么就攤上這事猴伶。” “怎么了塌西?”我有些...
    開封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵他挎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我捡需,道長(zhǎng)办桨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任站辉,我火速辦了婚禮呢撞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饰剥。我一直安慰自己殊霞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開白布汰蓉。 她就那樣靜靜地躺著绷蹲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪顾孽。 梳的紋絲不亂的頭發(fā)上祝钢,一...
    開封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音若厚,去河邊找鬼拦英。 笑死,一個(gè)胖子當(dāng)著我的面吹牛测秸,可吹牛的內(nèi)容都是我干的疤估。 我是一名探鬼主播灾常,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼做裙!你這毒婦竟也來(lái)了岗憋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤锚贱,失蹤者是張志新(化名)和其女友劉穎仔戈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拧廊,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡监徘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吧碾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凰盔。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖倦春,靈堂內(nèi)的尸體忽然破棺而出户敬,到底是詐尸還是另有隱情,我是刑警寧澤睁本,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布尿庐,位于F島的核電站,受9級(jí)特大地震影響呢堰,放射性物質(zhì)發(fā)生泄漏抄瑟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一枉疼、第九天 我趴在偏房一處隱蔽的房頂上張望皮假。 院中可真熱鬧,春花似錦骂维、人聲如沸惹资。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)布轿。三九已至,卻和暖如春来颤,著一層夾襖步出監(jiān)牢的瞬間汰扭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工福铅, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留萝毛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓滑黔,卻偏偏與公主長(zhǎng)得像笆包,于是被迫代替她去往敵國(guó)和親环揽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容