溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Replication主從復(fù)制機(jī)制原理是什么

發(fā)布時(shí)間:2021-10-12 10:24:11 來(lái)源:億速云 閱讀:126 作者:iii 欄目:編程語(yǔ)言

本篇內(nèi)容主要講解“Replication主從復(fù)制機(jī)制原理是什么”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Replication主從復(fù)制機(jī)制原理是什么”吧!

復(fù)制概述

  • Replication復(fù)制是指將主數(shù)據(jù)庫(kù)的DDL和DML操作通過(guò)二進(jìn)制日志傳到從庫(kù)服務(wù)器中,然后在從庫(kù)上對(duì)這些日志重新執(zhí)行(也叫重做),從而使得從庫(kù)和主庫(kù)的數(shù)據(jù)保持同步。

  • MySQL支持一臺(tái)主庫(kù)同時(shí)向多臺(tái)從庫(kù)進(jìn)行復(fù)制, 從庫(kù)同時(shí)也可以作為其他從服務(wù)器的主庫(kù),實(shí)現(xiàn)鏈狀復(fù)制。

復(fù)制原理

MySQL 的主從復(fù)制原理如下Replication主從復(fù)制機(jī)制原理是什么

從上層來(lái)看,復(fù)制分成三步

  • Master主庫(kù)在事務(wù)提交時(shí),會(huì)把數(shù)據(jù)的更新記錄作為時(shí)間Events記錄在二進(jìn)制日志文件Binlog中。(Dump線程 - 主庫(kù)線程)

  • Master主庫(kù)推送二進(jìn)制日志文件Binlog中的日志事件到從庫(kù)的并且通過(guò)寫入中繼日志Relay Log(I/O線程 - 從庫(kù)線程)。

  • Slave從庫(kù) 讀取且重做(重放中繼日志(Relay Log) 中的事件,將改變反映它自己的數(shù)據(jù)。(SQL線程 - 從庫(kù)線程

復(fù)制優(yōu)勢(shì)

MySQL復(fù)制的有點(diǎn)主要包含以下三個(gè)方面

  • 主庫(kù)出現(xiàn)問(wèn)題,可以快速切換到從庫(kù)提供服務(wù)(提供故障切換機(jī)制)。

  • 從庫(kù)上執(zhí)行查詢操作,從主庫(kù)中更新,實(shí)現(xiàn)讀寫分離,降低主庫(kù)的訪問(wèn)壓力(提高讀寫分離并且提高高可用和負(fù)載以及吞吐)。

  • 從庫(kù)中執(zhí)行備份,以避免備份期間影響主庫(kù)的服務(wù)(提高數(shù)據(jù)的安全性)。

搭建步驟

master

  1. 在master 的配置文件(/usr/my.cnf)中,配置如下內(nèi)容

  • mysql 服務(wù)ID,保證整個(gè)集群環(huán)境中唯一

server-id=1

  • mysql binlog 日志的存儲(chǔ)路徑和文件名

  • log-bin=/var/lib/mysql/mysqlbin

  • log-bin-index = mysql-bin.index(設(shè)置二進(jìn)制日志索引文件名)

  • binlog_format = mixed (binlog的模式)

    • STATEMENT:語(yǔ)句復(fù)制

    • ROW:行復(fù)制

    • MIXED:混和復(fù)制,默認(rèn)選項(xiàng)

  • sync-binlog = 1(是否開(kāi)啟同步方式): 默認(rèn)為0,為保證不會(huì)丟失數(shù)據(jù),需設(shè)置為1,用于強(qiáng)制每次提交事務(wù)時(shí),同步二進(jìn)制日志到磁盤上。

character-set-server = utf8字符串編碼

  • 錯(cuò)誤日志,默認(rèn)已經(jīng)開(kāi)啟

  • log-err

  • mysql的安裝目錄

basedir

  • mysql的臨時(shí)目錄

tmpdir

  • mysql的數(shù)據(jù)存放目錄

datadir

  • 是否只讀,1 代表只讀, 0 代表讀寫

read-only=0

  • 忽略的數(shù)據(jù), 指不需要同步的數(shù)據(jù)庫(kù)(逗號(hào)分割)

binlog-ignore-db=mysql

  • 指定同步的數(shù)據(jù)庫(kù)

binlog-do-db=db01

  1. 執(zhí)行完畢之后,需要重啟Mysql:

service mysql restart;

  1. 創(chuàng)建同步數(shù)據(jù)的賬戶,并且進(jìn)行授權(quán)操作:

grant replication slave on . to 'itcast'@'192.168.192.131' identified by 'itcast'; flush privileges;

  1. 為了獲取一個(gè)一致性的快照,需對(duì)所有表設(shè)置讀鎖:

flush tables with read lock;

  1. 備份主數(shù)據(jù)庫(kù)數(shù)據(jù)

  • 主庫(kù)可以停機(jī),則直接拷貝所有數(shù)據(jù)庫(kù)文件

  • 主庫(kù)是在線生產(chǎn)庫(kù),可采用mysqldump備份數(shù)據(jù),它對(duì)所有存儲(chǔ)引擎均可使用。

針對(duì)事務(wù)性引擎
mysqldump -uroot -ptiger --all-database -e --single-transaction --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql
針對(duì) MyISAM 引擎,或多引擎混合的數(shù)據(jù)庫(kù)
mysqldump -uroot --all-database -e -l --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql

主從數(shù)據(jù)庫(kù)都是數(shù)據(jù)都是一致的,直接執(zhí)行 show master status 查看日志坐標(biāo)。

show master status;

Replication主從復(fù)制機(jī)制原理是什么

字段含義:

  • File : 從哪個(gè)日志文件開(kāi)始推送日志文件

  • Position : 從哪個(gè)位置開(kāi)始推送日志

  • Binlog_Ignore_DB : 指定不需要同步的數(shù)據(jù)庫(kù)

  1. 恢復(fù)主庫(kù)的寫操作:

unlock tables;


slave

  • 導(dǎo)入備份數(shù)據(jù)

mysql -uroot -p < /data/all_db.sql

  1. 在 slave 端配置文件中,配置如下內(nèi)容

  • mysql服務(wù)端ID,唯一

  • server-id=2

  • 指定binlog日志

  • log-bin=/var/lib/mysql/mysqlbin

其他配置

  • binlog_format = mixed

  • log-slave-updates = 0(控制 slave 上的更新是否寫入二進(jìn)制日志,默認(rèn)為0;若 slave 只作為從服務(wù)器,則不必啟用;若 slave 作為其他服務(wù)器的 master,則需啟用,啟用時(shí)需和 log-bin、binlog-format 一起使用,這樣 slave 從主庫(kù)讀取日志并重做,然后記錄到自己的二進(jìn)制日志中;)

  • relay-log = mysql-relay-bin(設(shè)置中繼日志文件基本名)

  • relay-log-index = mysql-relay-bin.index(設(shè)置中繼日志索引文件名)

  • read-only = 1(設(shè)置 slave 為只讀,但具有super權(quán)限的用戶仍然可寫)

  • slave_net_timeout = 10(設(shè)置網(wǎng)絡(luò)超時(shí)時(shí)間,即多長(zhǎng)時(shí)間測(cè)試一下主從是否連接,默認(rèn)為3600秒,即1小時(shí),這個(gè)值在生產(chǎn)環(huán)境過(guò)大,我們將其修改為10秒,即若主從中斷10秒,則觸發(fā)重新連接動(dòng)作。)

  1. 執(zhí)行完畢之后,需要重啟Mysql

service mysql restart;

  1. 執(zhí)行如下指令 :

change master to
master_host='192.168.2.21',
master_user='repl',
master_password='repl',
master_port=3306,
master_log_file='mysql-bin.000001',
master_log_pos=120;

指定當(dāng)前從庫(kù)對(duì)應(yīng)的主庫(kù)的IP地址,用戶名,密碼,從哪個(gè)日志文件開(kāi)始的那個(gè)位置開(kāi)始同步推送日志

  1. 開(kāi)啟同步操作

  • start slave;

  • show slave status;

Replication主從復(fù)制機(jī)制原理是什么

可以看到圖中顯示出來(lái)的:IO線程和SQL線程都處于運(yùn)行狀態(tài):

  • Slave_IO_Running此進(jìn)程負(fù)責(zé) slave 從 master 上讀取 binlog 日志,并寫入 slave 上的中繼日志。

  • Slave_SQL_Running此進(jìn)程負(fù)責(zé)讀取并執(zhí)行中繼日志中的 binlog 日志

這兩個(gè)進(jìn)程的狀態(tài)需全部為 YES,只要有一個(gè)為 NO,則復(fù)制就會(huì)停止。當(dāng) Relay_Master_Log_File = Master_Log_File 且 Read_Master_Log_Pos = Exec_Master_Log_Pos 時(shí),則表明 slave 和 master 處于完全同步的狀態(tài)。

  1. 停止同步操作

stop slave;

驗(yàn)證同步操作

  1. 在主庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù),創(chuàng)建表,并插入數(shù)據(jù) :

create database db01;
user db01;
create table user
(
    id   int(11)     not null auto_increment,
    name varchar(50) not null,
    sex  varchar(1),
    primary key (id)
) engine = innodb
  default charset = utf8;

insert into user(id, name, sex)
values (null, 'Tom', '1');
insert into user(id, name, sex)
values (null, 'Trigger', '0');
insert into user(id, name, sex)
values (null, 'Dawn', '1');
  1. 在從庫(kù)中查詢數(shù)據(jù),進(jìn)行驗(yàn)證 :

  • 在從庫(kù)中,可以查看到剛才創(chuàng)建的數(shù)據(jù)庫(kù): Replication主從復(fù)制機(jī)制原理是什么

  • 在該數(shù)據(jù)庫(kù)中,查詢user表中的數(shù)據(jù): Replication主從復(fù)制機(jī)制原理是什么

到此,相信大家對(duì)“Replication主從復(fù)制機(jī)制原理是什么”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI