日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql df_MySQL主从复制实战

發(fā)布時(shí)間:2023/12/10 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql df_MySQL主从复制实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是主從復(fù)制

使用兩個(gè)或兩個(gè)以上的數(shù)據(jù)庫(kù),一部分?jǐn)?shù)據(jù)庫(kù)當(dāng)做主數(shù)據(jù)庫(kù),而另一部分?jǐn)?shù)據(jù)庫(kù)當(dāng)做從數(shù)據(jù)庫(kù)。系統(tǒng)在主數(shù)據(jù)庫(kù)中進(jìn)行寫操作,從數(shù)據(jù)庫(kù)記錄在主庫(kù)上所有的寫操作,使得主從數(shù)據(jù)庫(kù)的數(shù)據(jù)保持一致。

一旦主數(shù)據(jù)庫(kù)出現(xiàn)問題時(shí),使用從數(shù)據(jù)庫(kù)代替主數(shù)據(jù)庫(kù),可以避免服務(wù)中斷。

什么是讀寫分離

讀寫分離是基于主從復(fù)制的。系統(tǒng)操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),將對(duì)數(shù)據(jù)的增刪改也就是寫操作,發(fā)送到主數(shù)據(jù)庫(kù),將查詢的任務(wù)交給從數(shù)據(jù)庫(kù)。

寫操作一般相比讀操作更耗時(shí),而系統(tǒng)在大多數(shù)情況下都是讀多寫少。進(jìn)行讀寫分離,減少讀寫操作相互影響,既能提高查詢效率,也能減輕主數(shù)據(jù)庫(kù)的壓力,提高系統(tǒng)性能。

主從復(fù)制原理

下圖為網(wǎng)上找的一張介紹主從復(fù)制的原理圖。

簡(jiǎn)單來講,有以下四個(gè)關(guān)鍵點(diǎn):

1、主數(shù)據(jù)庫(kù)開啟bin-log,將所有寫操作的sql語句記錄到日志文件中。

2、每當(dāng)有從庫(kù)連接到主庫(kù)的時(shí)候,主庫(kù)都會(huì)創(chuàng)建一個(gè)線程(master bin-log輸出線程),用于發(fā)送bin-log內(nèi)容到從庫(kù)。

3、從數(shù)據(jù)庫(kù)開啟中繼日志relay-log,用于同步回來的主數(shù)據(jù)庫(kù)bin-log。

4、從數(shù)據(jù)庫(kù)中運(yùn)行2個(gè)線程,一個(gè)線程(slave

I/O線程)連接到主庫(kù),獲取主數(shù)據(jù)庫(kù)bin-log日志文件里的SQL,記錄到本機(jī)的中繼日志relay-log文件里,另一個(gè)線程(slave

SQL線程)執(zhí)行本機(jī)relay-log文件里的SQL語句,在從數(shù)據(jù)庫(kù)重新執(zhí)行一遍數(shù)據(jù)操作,保持主從數(shù)據(jù)庫(kù)的數(shù)據(jù)一致。

復(fù)制模式介紹

異步復(fù)制

說明:MySQL默認(rèn)的復(fù)制模式。主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后,立即將結(jié)果返回給客戶端,而不等待從庫(kù)接收處理。

問題:一旦主數(shù)據(jù)庫(kù)宕機(jī),已經(jīng)提交的事務(wù)可能并沒有傳到從數(shù)據(jù)庫(kù)上,此時(shí)如果進(jìn)行主備切換,會(huì)導(dǎo)致新主庫(kù)上的數(shù)據(jù)不完整,犧牲了數(shù)據(jù)的一致性。

全同步復(fù)制

說明:當(dāng)主庫(kù)和從庫(kù)執(zhí)行完客戶端提交的事務(wù)后,才返回結(jié)果給客戶端。

問題:雖然保證了在任何情況下的數(shù)據(jù)一致性,當(dāng)由于需要等待所有數(shù)據(jù)庫(kù)執(zhí)行完該事務(wù)才能返回結(jié)果,操作耗時(shí)長(zhǎng),犧牲了性能。

半同步復(fù)制

說明:主庫(kù)在執(zhí)行完客戶端提交的事務(wù)后,等待至少一個(gè)從庫(kù)接收到并寫到中繼日志后,才返回結(jié)果給客戶端。

相對(duì)于異步復(fù)制和半同步復(fù)制,是保證數(shù)據(jù)一致性和性能的折中方案。需要注意的是,半同步需要等待從庫(kù)響應(yīng),因此對(duì)于網(wǎng)絡(luò)要求高,僅適用于低延時(shí)的網(wǎng)絡(luò)。

主從復(fù)制方案

下圖為常見的主從復(fù)制的方案。

一主一從:從機(jī)可以作為數(shù)據(jù)的熱備,當(dāng)主節(jié)點(diǎn)宕機(jī),備節(jié)點(diǎn)頂替。但需要注意的是,并不能代替數(shù)據(jù)備份,因?yàn)殄e(cuò)誤的操作,也會(huì)同步到備節(jié)點(diǎn),數(shù)據(jù)仍會(huì)丟失。

一主多從:適用于讀多寫少的系統(tǒng),但從庫(kù)不可過多,過多會(huì)導(dǎo)致響應(yīng)速度變慢。可以指定一個(gè)從庫(kù)作為備用庫(kù),當(dāng)主節(jié)點(diǎn)宕機(jī),備節(jié)點(diǎn)頂替。也可以指定一個(gè)從庫(kù),將報(bào)表統(tǒng)計(jì)之類的慢查詢語句都發(fā)到該從庫(kù),不至于影響其他查詢操作。也可以指定一個(gè)從庫(kù),供開發(fā)人員排障使用,即使不小心刪除數(shù)據(jù),也不至于影響整體系統(tǒng)業(yè)務(wù)數(shù)據(jù)準(zhǔn)確性,達(dá)到隔離效果。

雙主:當(dāng)大部分業(yè)務(wù)都為寫,而寫入性能還不夠理想,可以采取雙主模式。同時(shí)在兩個(gè)主庫(kù)寫數(shù)據(jù),并互相同步。業(yè)務(wù)上可以通過id取模、哈希計(jì)算等方法,奇數(shù)往主庫(kù)1插數(shù)據(jù),偶數(shù)往主庫(kù)2插數(shù)據(jù),保證主鍵不重復(fù)。

級(jí)聯(lián)同步:為了減低主庫(kù)的壓力,主庫(kù)只向一個(gè)從庫(kù)同步數(shù)據(jù),其他從庫(kù)同步這個(gè)從庫(kù)的數(shù)據(jù)。如果主庫(kù)宕機(jī),同步主庫(kù)的從庫(kù)可以直接作為主庫(kù)使用。但如果這個(gè)從庫(kù)掛了,問題會(huì)比較嚴(yán)重,會(huì)導(dǎo)致其他從庫(kù)變?yōu)楣聝汗?jié)點(diǎn)。

環(huán)形多主:性能強(qiáng),但一旦掛了一個(gè),會(huì)導(dǎo)致整個(gè)系統(tǒng)不可用。

使用Docker 搭建MySQL主從復(fù)制

以下演示使用Docker,搭建一主一從的數(shù)據(jù)庫(kù)系統(tǒng)。

1、運(yùn)行docker pull mysql:5.7下載mysql鏡像。

2、在/opt目錄下創(chuàng)建三個(gè)文件夾,分別為/opt/mysql_cluster、/opt/mysql_cluster/master和/opt/mysql_cluster/slave1。其中master和slave1文件夾用于保存需要持久化到宿主機(jī)上mysql容器的數(shù)據(jù)文件、日志文件等。

3、在/opt/mysql_cluster/master編寫my.cnf文件,內(nèi)容如下。需要注意的是,開啟bin-log日志后默認(rèn)記錄所有庫(kù)所有表的操作,可以通過配置來指定需要記錄操作的數(shù)據(jù)庫(kù)或者表,或指定不記錄操作的數(shù)據(jù)庫(kù)或者表。[mysqld]

#實(shí)例ID,不能和集群中的其他實(shí)例相同

server-id=1

#bin?log?文件前綴

log-bin=mysql-prefix

#?需要同步的數(shù)據(jù)庫(kù)

binlog-do-db=tuling

#不需要同步的數(shù)據(jù)庫(kù)

binlog-ignore-db=information_schema

binlog-ignore-db=mysql

binlog-ignore-db=performance_schema

binlog-ignore-db=test

4、在/opt/mysql_cluster/slave1編寫my.cnf文件,內(nèi)容如下:[mysqld]

#實(shí)例ID,不能和集群中的其他實(shí)例相同

server-id=2

skip-slave-start=true

#限定用戶進(jìn)行數(shù)據(jù)修改的操作

read_only=ON

#中繼日志前綴

relay-log=relay-bin

5、運(yùn)行以下命令,啟動(dòng)主數(shù)據(jù)庫(kù)。向外暴露的端口號(hào)為3307,默認(rèn)的密碼為123456,并且掛載宿主機(jī)目錄到容器中,用于將數(shù)據(jù)保存到宿主機(jī),保證數(shù)據(jù)不丟失。docker?run?-p?3307:3306?--name?mysql_master?\-v?/opt/mysql_cluster/master/conf:/etc/mysql?\-v?/opt/mysql_cluster/master/logs:/var/log/mysql?\-v?/opt/mysql_cluster/master/data:/var/lib/mysql?\?-v?/opt/mysql_cluster/master/my.cnf:/etc/my.cnf?\-e?MYSQL_ROOT_PASSWORD=123456?\-d?mysql:5.7

6、運(yùn)行docker exec -it mysql_master /bin/bash,進(jìn)入主數(shù)據(jù)庫(kù)容器。

7、運(yùn)行mysql -uroot -p,輸入密碼,登錄數(shù)據(jù)庫(kù)。

8、運(yùn)行以下命令,添加訪問權(quán)限,刷新授權(quán)表信息,方便后續(xù)在其他機(jī)器操作該數(shù)據(jù)庫(kù)。grant?all?privileges?on?*.*?to?root@'%'?identified?by?"123456";flush?privileges;

9、運(yùn)行以下命令,添加主庫(kù)復(fù)制賬號(hào),刷新授權(quán)表信息。用戶名和密碼都是slave。后續(xù)從庫(kù)使用該賬號(hào),獲取相關(guān)bin-log。CREATE?USER?'slave'@'%'?IDENTIFIED?BY?'slave';GRANT?REPLICATION?SLAVE?ON?*.*?TO?'slave'@'%';flush?privileges;

10、運(yùn)行命令show master status;,獲取主庫(kù)當(dāng)前bin-log文件名(File)和位置(Position)。

11、運(yùn)行以下命令,啟動(dòng)從數(shù)據(jù)庫(kù)。向外暴露的端口號(hào)為3308,默認(rèn)的密碼為123456,并且掛載宿主機(jī)目錄到容器中,用于將數(shù)據(jù)保存到宿主機(jī),保證數(shù)據(jù)不丟失。docker?run?-p?3308:3306?-m?300M?--memory-reservation?200M?--name?mysql_slave?\-v?/opt/mysql_cluster/slave1/conf:/etc/mysql?\-v?/opt/mysql_cluster/slave1/logs:/var/log/mysql?\-v?/opt/mysql_cluster/slave1/data:/var/lib/mysql?\?-v?/opt/mysql_cluster/slave1/my.cnf:/etc/my.cnf?\-e?MYSQL_ROOT_PASSWORD=123456?\-d?mysql:5.7

12、運(yùn)行docker exec -it mysql_slave /bin/bash,進(jìn)入從數(shù)據(jù)庫(kù)容器。

13、運(yùn)行mysql -uroot -p,輸入密碼,登錄數(shù)據(jù)庫(kù)。

14、運(yùn)行以下命令,添加訪問權(quán)限,刷新授權(quán)表信息。方便后續(xù)在其他機(jī)器操作該數(shù)據(jù)庫(kù)。grant?all?privileges?on?*.*?to?root@'%'?identified?by?"123456";flush?privileges;

15、運(yùn)行以下命令,配置從庫(kù)復(fù)制信息。其中,master_host為docker宿主機(jī)的ip,master_user和master_slave為主庫(kù)復(fù)制賬號(hào),master_log_file是主庫(kù)運(yùn)行命令show master status獲取的File字段值,master_log_pos為Position字段值。master_port為主數(shù)據(jù)庫(kù)向外暴露的端口號(hào)。change?master?to?master_host='192.168.255.167',master_user='slave',master_password='slave',master_log_file='mysql-prefix.000004',master_log_pos=1824,master_port=3307;

16、運(yùn)行start slave;,啟動(dòng)slave服務(wù)。

17、運(yùn)行show slave status\G;,查看slave狀態(tài)。當(dāng)參數(shù)"Slave_IO_Running"和"Slave_SQL_Running"值都是Yes,主從配置完成。

18、可以通過在主庫(kù)創(chuàng)建表、插入修改數(shù)據(jù)后,查看從庫(kù)是否同步成功,驗(yàn)證是否搭建成功。

19、當(dāng)需要重新配置主從時(shí),可以在從庫(kù)上運(yùn)行以下兩條命令,取消當(dāng)前的主備復(fù)制。stop?slave;reset?master;

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的mysql df_MySQL主从复制实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。