mysql主從切換步驟,mysql主從復制原理詳解_深入研究MySQL(三)、主從復制原理及演示

 2023-11-30 阅读 19 评论 0

摘要:一、主從復制概述這章來說說主從復制,對于主從復制,有很多知識,在以后分篇記錄,所以在這里只說說簡單的用法,用來入個門可以,先說啥是主從復制,主從復制就是將一臺主機的數據復制到另一臺或者多臺主機上,復制過程中

一、主從復制概述

這章來說說主從復制,對于主從復制,有很多知識,在以后分篇記錄,所以在這里只說說簡單的用法,用來入個門可以,先說啥是主從復制,主從復制就是將一臺主機的數據復制到另一臺或者多臺主機上,復制過程中一臺服務器充當主庫(Master),就是源數據存放的主機,還有一臺或者多臺服務器充當從庫(Slave),Mysql支持單向、雙向、鏈式級聯、異步復制,還有在5.5版本后的半同步復制等。

利用主從復制功能,我們可以做到在主庫發生意外時,讓從庫接管主庫,也能讓從庫分擔主庫的讀壓力,這一點,也可以看看以前關于Redis主從復制的介紹。

模式圖

d5cea45df104c4e9df648421b1db079d.png

mysql主從切換步驟、a73db5e27ce72822dac3c6c3a2600051.png4db72f9a3b497431dddf5a59dd90a9df.png258c2e0f86f610db7f39f6b9d795768a.pngb56c30a49f5c1bea947da0024c8b7776.png

二、主從復制演示

Docker安裝MySQL

由于本次演示需要用到多個MySQL實例,可以使用Docker來做,但是貌似MySQL自身就可以配置多個實例,這一點不太清楚,沒有試過,所以還是使用Docker吧,關于Docker的安裝就不說了,下面說Docker中部署MySQL服務器。

(多說一句話,Docker真是個好東西,在上次團隊需要馬上運行一個服務端,需要數據庫,要把sql文件導入進去,由于版本的差異,這個只能在5.6版本下導入,我們電腦上的所有版本完美的避開了5.6,這時想起了Docker,敲了幾行命令,一個嶄新的MySQL5.6就出來了,最終成功把數據導入進去,救了急)

MySQL 主從。關于安裝Docker,看官方的一篇就夠了:

https://docs.docker.com/engine/install/ubuntu/
  1. 首先拉取鏡像
docker?pull?mysql/mysql-server:8.0
  1. 啟動兩個實例,端口為3307和3308,密碼都為123456

docker?run?-p?3307:3306?--name?mysql1?-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql/mysql-server:8.0

docker?run?-p?3308:3306?--name?mysql2?-e?MYSQL_ROOT_PASSWORD=123456?-d?mysql/mysql-server:8.0
更多可以參考下面官網:
https://dev.mysql.com/doc/mysql-installation-excerpt/8.0/en/docker-mysql-getting-started.html

查看進程。

root@hxl-PC:/home/hxl#?docker?ps
CONTAINER?ID????????IMAGE????????????????????COMMAND??????????????????CREATED?????????????STATUS????????????????????PORTS???????????????????????????????NAMES
4f16b40cb2d4????????mysql/mysql-server:8.0???"/entrypoint.sh?mysq…"???5?hours?ago?????????Up?30?minutes?(healthy)???33060/tcp,?0.0.0.0:3308->3306/tcp???mysql2
80faae4d305b????????mysql/mysql-server:8.0???"/entrypoint.sh?mysq…"???6?hours?ago?????????Up?31?minutes?(healthy)???33060/tcp,?0.0.0.0:3307->3306/tcp???mysql1
root@hxl-PC:/home/hxl#?

配置主庫(3307)

修改master數據庫的配置文件,位置在/etc/my.cnf,可以在本地編輯好,然后使用docker cp命令復制到里面。

mysql復制原理、server-id是唯一的,主從的不能一樣,如果沒有設置server_id或設置成0的話,從主機會無法連接。

log-bin是二進制日志名稱,服務器會將所有更改數據的語句記錄到二進制日志中,這個日志就可以實現備份和復制,但這個只是基本名稱,MySQL還會在這個名稱后面拼接一串數字來依次創建二進制日志文件。

[mysqld]
server-id=101
log-bin=mysql-bin

接下來要創建主從復制賬號,在從主機上會用到,還要把他賦予REPLICATION SLAVE特權,這個操作可以不使用命令行,如果您用的dbeaver的話,可以通過界面去創建。

mysql>?create?user?'bak'@'%'?identified?by?'123456';
Query?OK,?0?rows?affected?(0.03?sec)

mysql>?grant?replication?slave?on?*.*?to?'bak'@'%';
Query?OK,?0?rows?affected?(0.01?sec)

mysql>?flush?privileges;
Query?OK,?0?rows?affected?(0.01?sec)

mysql>?
關于主從復制賬號,可以查看官網:
https://dev.mysql.com/doc/refman/8.0/en/replication-howto-repuser.html

關于二進制日志配置選項,可以查看官網:
https://dev.mysql.com/doc/refman/5.6/en/replication-options-binary-log.html

mysql原理。最后查看master狀態,show master status這個命令用于查看服務器的二進制日志文件的狀態信息,需要用的字段是Position,在配置從節點的時候,需要傳遞給他。

mysql>?show?master?status;
+------------------+----------+--------------+------------------+-------------------+
|?File?????????????|?Position?|?Binlog_Do_DB?|?Binlog_Ignore_DB?|?Executed_Gtid_Set?|
+------------------+----------+--------------+------------------+-------------------+
|?mysql-bin.000003?|??????156?|??????????????|??????????????????|???????????????????|
+------------------+----------+--------------+------------------+-------------------+
1?row?in?set?(0.00?sec)

mysql>?

配置從庫(3308)

[mysqld]
server-id=101

最后在從庫中執行下面命令,注意修改主機地址、端口、日志文件,最后的start slave用于開始執行主從復制。

mysql>?change?master?to?master_host='10.204.27.177',master_user='bak',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=156,master_port=156,get_master_public_key=1;
Query?OK,?0?rows?affected,?2?warnings?(0.04?sec)

mysql>?start?slave;
Query?OK,?0?rows?affected?(0.01?sec)

mysql>?
  1. master_user:之前創建的復制賬號
  2. master_host:主庫的IP地址
  3. master_password:復制賬號的密碼
  4. master_log_file:二進制文件
  5. master_port:主庫端口號
  6. master_log_pos:從備份文件中獲取postion號。
  7. get_master_public_key:指示是否從源請求基于RSA密鑰對的密碼交換所需的公共密鑰

查看狀態,當Slave_IO_Running和Slave_SQL_Running都是yes的話就代表配置成功了。\G是格式化格式,否則會一團糟。

ysql>?show?slave?status\G;
***************************?1.?row?***************************
???????????????Slave_IO_State:?Waiting?for?master?to?send?event
??????????????????Master_Host:?10.204.27.177
??????????????????Master_User:?bak
??????????????????Master_Port:?3307
????????????????Connect_Retry:?60
??????????????Master_Log_File:?mysql-bin.000003
??????????Read_Master_Log_Pos:?746
???????????????Relay_Log_File:?4f16b40cb2d4-relay-bin.000002
????????????????Relay_Log_Pos:?324
????????Relay_Master_Log_File:?mysql-bin.000003
?????????????Slave_IO_Running:?Yes
????????????Slave_SQL_Running:?Yes
.......

測試

mysql索引原理,這是兩個庫此時的初始化狀態。3116250f99d2619921b803d88be3ef71.png

現在在主庫中創建一個數據庫test。

4f736455ad45404d847aec2d348a84d7.gif

在主庫中新增一張表。


CREATE?TABLE?`tb_user`?(
??`id`?int?NOT?NULL?AUTO_INCREMENT,
??`userName`?varchar(100)?NOT?NULL,
??PRIMARY?KEY?(`id`)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_0900_ai_ci;

數據庫主從復制的原理及作用?可以看到從庫也同步了,數據也都為空。

a08152733cb5e4f5e4997f0eb6d186c7.png

主庫插入一條數據。

9bc4962217693a8245663a70c8fd5c90.gif

主從復制原理

首先主庫會在二進制日志里記錄了對數據庫的更改,從庫會從主庫中獲取這個二進制日志,然后在從庫中重放這部分日志,就實現了數據的同步。

  1. 主服務器將更新寫入二進制日志文件,并維護文件的一個索引。
  2. 從庫復制主庫的二進制日志事件到本地的中繼日志(relay log)。
  3. 從庫重放中繼日志。

MySQL會使用3個線程來執行復制功能,其中一個在主服務器上,另兩個在從服務器上。當從服務器執行start slave命令時,從服務器會創建一個I/O線程,用于連接主服務器,并讓它發送二進制日志中的語句。

主服務器就會創建一個線程將二進制日志中的內容發送到從服務器中,從服務器中的I/O線程讀取主服務器線程發送的內容并將數據復制到本地文件中,也就是中繼日志,第3個線程就是SQL線程,是從服務器創建的,用于讀取中繼日志文件內容,并執行日志中所包含的更新。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/185986.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息