偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何搭建雙 M 結(jié)構(gòu)的主從備份?

數(shù)據(jù)庫(kù) MySQL
我們來(lái)搭建一個(gè)雙 M 的主從備份,看看和單純的 M-S 結(jié)構(gòu)的有啥區(qū)別。

關(guān)于 MySQL 主從搭建,松哥之前寫過(guò)好多篇文章了,還錄過(guò)一個(gè)視頻。不過(guò)之前的都是一主一從的結(jié)構(gòu),但是小伙伴們知道,我們?cè)陧?xiàng)目中,更常見一種結(jié)構(gòu)是雙 M 結(jié)構(gòu),即兩個(gè) MySQL 實(shí)例,每個(gè) MySQL 實(shí)例互為主備,這樣在主節(jié)點(diǎn)突然斷電或者不可用的時(shí)候,slave 節(jié)點(diǎn)可以很快切換為 master,架構(gòu)圖如下:

在這種結(jié)構(gòu)中,兩個(gè) MySQL 實(shí)例的地位是平等的,互為對(duì)方的主備,我們判斷誰(shuí)是主機(jī)誰(shuí)是從機(jī)的方式主要是看 readonly,誰(shuí)是只讀的,那誰(shuí)就是從機(jī),所以這種情況下,主從切換也很方便,只要修改 readonly 屬性即可。

接下來(lái)我們就來(lái)搭建一個(gè)雙 M 的主從備份,看看和單純的 M-S 結(jié)構(gòu)的有啥區(qū)別。

1. 準(zhǔn)備工作

以下配置基于 Docker。

這里,我們首先準(zhǔn)備兩臺(tái)機(jī)器:

  • M1:10.3.50.27:33061
  • M2:10.3.50.27:33062

1.1 M1 配置

M1 的配置就三個(gè)步驟,比較容易:

(1)授權(quán)給 M2 服務(wù)器

GRANT REPLICATION SLAVE ON *.* to 'rep1'@'10.3.50.27' identified by '123';
FLUSH PRIVILEGES;

這里表示配置 M2 登錄用戶名為 rep1,密碼為 123,并且必須從 10.3.50.27 這個(gè)地址登錄,登錄成功之后可以操作任意庫(kù)中的任意表。其中,如果不需要限制登錄地址,可以將 IP 地址更換為一個(gè) % 

注意,在 MySQL8 里邊,這塊有一些變化。MySQL8 中用戶創(chuàng)建和授權(quán)需要分開,不能像上面那樣一步到位,具體方式如下:

CREATE USER `rep1`@`10.3.50.27` IDENTIFIED WITH caching_sha2_password BY 'javaboy.COM';
GRANT Replication Slave ON *.* TO `rep1`@`10.3.50.27`;

(2)修改主庫(kù)配置文件

開啟 binlog ,并設(shè)置 server-id ,每次修改配置文件后都要重啟 MySQL 服務(wù)才會(huì)生效

開啟 binlog 主要是修改 MySQL 的配置文件 mysqld.cnf,該文件在容器的 /etc/mysql/mysql.conf.d 目錄下。

針對(duì)該配置文件,我們做如下修改:

[mysqld]
# 這個(gè)參數(shù)表示啟用 binlog 功能,并指定 binlog 的存儲(chǔ)目錄
log-bin=javaboy_logbin
# 設(shè)置 binlog_format 格式,注意不要使用 STATEMENT
binlog_format=ROW
# 設(shè)置一個(gè) binlog 文件的最大字節(jié)
# 設(shè)置最大 100MB
max_binlog_size=104857600

# 設(shè)置了 binlog 文件的有效期(單位:天)
expire_logs_days = 7

# binlog 日志只記錄指定庫(kù)的更新(配置主從復(fù)制的時(shí)候會(huì)用到)
binlog-do-db=javaboy_db

# binlog 日志不記錄指定庫(kù)的更新(配置主從復(fù)制的時(shí)候會(huì)用到)
#binlog-ignore-db=javaboy_no_db

# 寫緩存多少次,刷一次磁盤,默認(rèn) 0 表示這個(gè)操作由操作系統(tǒng)根據(jù)自身負(fù)載自行決定多久寫一次磁盤
# 1 表示每一條事務(wù)提交都會(huì)立即寫磁盤,n 則表示 n 個(gè)事務(wù)提交才會(huì)寫磁盤
sync_binlog=0

# 為當(dāng)前服務(wù)取一個(gè)唯一的 id(MySQL5.7 開始需要)
server-id=1

各項(xiàng)配置的含義松哥已經(jīng)在注視中說(shuō)明了。截圖如下:

如下圖:

  • log-bin:同步的日志路徑及文件名,一定注意這個(gè)目錄要是 MySQL 有權(quán)限寫入的(我這里是偷懶了,直接放在了下面那個(gè)datadir下面)。
  • binlog-do-db:要同步的數(shù)據(jù)庫(kù)名,當(dāng)從機(jī)連上主機(jī)后,只有這里配置的數(shù)據(jù)庫(kù)才會(huì)被同步,其他的不會(huì)被同步。
  • server-id: MySQL 在主從環(huán)境下的唯一標(biāo)志符,給個(gè)任意數(shù)字,注意不能和 M2 重復(fù),因?yàn)閷?lái) server-id 用于標(biāo)志 binlog 是由哪個(gè)庫(kù)產(chǎn)生的,所以主從數(shù)據(jù)庫(kù)的 server-id 千萬(wàn)不能一樣,不然可能導(dǎo)致主從數(shù)據(jù)庫(kù) binlog 的循環(huán)復(fù)制問(wèn)題。
  • 注意 binlog_format 的值為 ROW,具體原因在之前的文章中松哥已經(jīng)和大家聊過(guò)了,這里就不再贅述。

配置完成后重啟 MySQL 服務(wù)端:

docker restart mysql33061

(3)查看 M1 當(dāng)前二進(jìn)制日志名和偏移量

這個(gè)操作的目的是為了在 M2 啟動(dòng)后,從這個(gè)點(diǎn)開始進(jìn)行數(shù)據(jù)的恢復(fù):

show master status;

至此,M1 配置完成。

1.2 M2 配置

M2 的配置和 M1 一模一樣,唯一不同的地方在于,M2 的 mysqld.cnf 這個(gè)文件中的 server-id=2,其他都一模一樣,我就不重復(fù)了。

配置完成后,相當(dāng)于 M2 現(xiàn)在也是一個(gè)主機(jī),我們?cè)?M2 上也可以執(zhí)行 show master status; 命令,結(jié)果如下:

1.3 主從配置

接下來(lái)配置 M1 和 M2 分別為對(duì)方的主機(jī)。

M1 配置

先來(lái)配置給 M1 配置吧,執(zhí)行如下命令設(shè)置主機(jī):

change master to master_host='10.3.50.77',master_port=33062,master_user='rep1',master_password='123',master_log_file='javaboy_logbin.000001',master_log_pos=154;

這里配置了主機(jī)地址、端口以及從機(jī)登錄主機(jī)的用戶名和密碼,注意最后兩個(gè)參數(shù)要和 M2 中的保持一致。

注意,由于 MySQL8 密碼插件的問(wèn)題,這個(gè)問(wèn)題同樣會(huì)給主從配置帶來(lái)問(wèn)題,所以在 MySQL8 配置主從上,上面這行命令需要添加 get_master_public_key=1 ,完整命令如下:

change master to master_host='10.3.50.77',master_port=33062,master_user='rep1',master_password='123',master_log_file='javaboy_logbin.000001',master_log_pos=154,get_master_public_key=1;

(1) 啟動(dòng) slave 進(jìn)程

start slave;

啟動(dòng)之后查看從機(jī)狀態(tài):

show slave status\G;

(2)查看 slave 的狀態(tài)

主要是下面兩項(xiàng)值都要為為 YES,則表示配置正確:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

至此,配置完成,主機(jī)創(chuàng)建庫(kù),添加數(shù)據(jù),從機(jī)會(huì)自動(dòng)同步。

如果這兩個(gè)有一個(gè)不為 YES ,表示主從環(huán)境搭建失敗,此時(shí)可以閱讀日志,查看出錯(cuò)的原因,再具體問(wèn)題具體解決。

M2 配置

接下來(lái)再來(lái)配置 M2,M2 和 M1 的配置基本上是一致的,change master 中記得把地址和端口寫對(duì):

change master to master_host='10.3.50.77',master_port=33061,master_user='rep1',master_password='123',master_log_file='javaboy_logbin.000001',master_log_pos=154;

配置完成后,現(xiàn)在 M1 和 M2 就互為主備了。

1.4 測(cè)試

測(cè)試分兩步:

  • M1 中新建 javaboy_db 庫(kù),庫(kù)中建 user 表,表中插入一條記錄,然后查看 M2 中是否將數(shù)據(jù)同步過(guò)來(lái)了。
  • M2 中向 user 表中添加一條記錄,查看 M1 中是否有對(duì)應(yīng)的值。

經(jīng)過(guò)測(cè)試,我們發(fā)現(xiàn)沒問(wèn)題,現(xiàn)在可以兩邊互相同步對(duì)方的數(shù)據(jù)了。

2. 誰(shuí)主誰(shuí)從

雖然是雙 M 結(jié)構(gòu),但是在實(shí)際應(yīng)用中還是得分個(gè)主從,那么雙 M 該怎么分主從呢?

在生產(chǎn)環(huán)境中,我們一般會(huì)將備份節(jié)點(diǎn)設(shè)置為 read_only ,也就是只讀,防止有誤操作,當(dāng)然不用擔(dān)心設(shè)置為 read_only  binlog 的寫入也被阻止,super 用戶依然擁有寫入權(quán)限。

設(shè)置全庫(kù)只讀的辦法也很簡(jiǎn)單,首先我們執(zhí)行如下 SQL 先看看對(duì)應(yīng)變量的值:

show variables like 'read_only';

可以看到,默認(rèn)情況下, read_only 是 OFF,即關(guān)閉狀態(tài),我們先把它改為 ON,執(zhí)行如下 SQL:

set global read_only=1;

1 表示 ON,0 表示 OFF,執(zhí)行結(jié)果如下:

這個(gè) read_only 對(duì) super 用戶無(wú)效,所以設(shè)置完成后,接下來(lái)我們退出來(lái)這個(gè)會(huì)話,然后創(chuàng)建一個(gè)不包含 super 權(quán)限的用戶,用新用戶登錄,登錄成功之后,執(zhí)行一個(gè)插入 SQL,結(jié)果如下:

可以看到,這個(gè)錯(cuò)誤信息中說(shuō),現(xiàn)在的 MySQL 是只讀的(只能查詢),不能執(zhí)行當(dāng)前 SQL。

如此設(shè)置之后,在 master 發(fā)生異常需要主從切換的時(shí)候再將 slave 臨時(shí)頂替上來(lái)。為了更好的做到主從同步,binlog 的類型建議使用 row 模式。

責(zé)任編輯:張燕妮 來(lái)源: 江南一點(diǎn)雨
相關(guān)推薦

2016-01-15 10:58:02

2018-10-18 08:00:00

Redis Enter數(shù)據(jù)庫(kù)Docker

2017-04-20 21:00:06

MySQLbinlog主從復(fù)制

2018-03-19 10:50:26

2017-10-11 15:40:20

MySQL主從復(fù)制拓?fù)浣Y(jié)構(gòu)

2010-08-06 09:50:19

思科路由器

2024-07-09 10:42:30

2020-09-01 07:00:00

數(shù)據(jù)備份數(shù)據(jù)庫(kù)

2010-05-07 11:58:16

Oracle exp

2011-03-25 10:47:17

Cacti備份數(shù)據(jù)

2021-07-15 06:43:12

Python數(shù)據(jù)結(jié)構(gòu)

2010-11-21 17:52:03

2013-02-18 12:57:18

惠普M1218nfs

2010-06-09 14:04:34

MySQL數(shù)據(jù)庫(kù)

2020-08-12 08:25:43

數(shù)據(jù)庫(kù)MySQL技術(shù)

2022-05-30 11:21:25

數(shù)據(jù)庫(kù)MySQL工具

2010-03-12 14:38:55

2011-05-16 11:29:00

MySQL自動(dòng)備份

2012-11-07 16:27:52

和力記易

2021-06-26 08:09:21

MySQL不停機(jī)不鎖表
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)