免费在线a视频-免费在线观看a视频-免费在线观看大片影视大全-免费在线观看的视频-色播丁香-色播基地

MySQL主從、主主實戰

:2025年01月22日 linux運維之路
分享到:

本文探討了MySQL主從復制的工作原理,包括Master和Slave之間的IO線程和SQL線程。主從同步是異步過程,Master通過IO線程請求 slave,slave通過IO線程接收 master 的bin-log日志,最后mast...

本文用docker的方式做MySQL主從試驗,方便理解原理,生產環境不建議使用docker部署數據庫。

MySQL主從復制的用途:確保數據安全,做數據的熱備,作為后備數據庫,主數據庫服務器故障后,可切換到從數據庫繼續工作,避免數據的丟失。

MySQL主從復制的工作原理:MySQL主從數據同步是一個異步復制的過程,要實現復制首先需要在master上開啟bin-log日志功能,bin-log日志用于記錄在Master庫中執行的增、刪、修改、更新操作的sql語句。整個過程需要開啟3個線程,分別是Master開啟IO線程,Slave開啟IO線程和SQL線程,

具體主從同步原理詳解如下:(也可以跳過這段廢話)qSlave上執行slave start,Slave IO線程會通過在Master創建的授權用戶連接上至Master,并請求master從指定的文件和位置之后發送bin-log日志內容;qMaster接收到來自slave IO線程的請求后,master IO線程根據slave發送的指定bin-log日志position點之后的內容,然后返回給slave的IO線程。q返回的信息中除了bin-log日志內容外,還有master最新的binlog文件名以及在binlog中的下一個指定更新position點;qSlave IO線程接收到信息后,將接收到的日志內容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的 bin-log的文件名和position點記錄到master.info文件中,以便在下一次讀取的時候能告知master從響應的bin-log文件名及最后一個position點開始發起請求;qSlave Sql線程檢測到relay-log中內容有更新,會立刻解析relay-log的內容成在Master真實執行時候的那些可執行的SQL語句,將解析的SQL語句并在Slave里執行,執行成功后,Master庫與Slave庫保持數據一致。

MySQL主從復制實施注意事項:主從服務器操作系統版本和位數一致;Master 和 Slave 數據庫的版本要一致;Master 和 Slave 數據庫中的數據要一致;Master 開啟二進制日志,Master 和 Slave 的 server_id 在局域網內必須唯一。

MySQL主從復制結構圖:

MySQL主從復制實戰:

  1. 由于我電腦硬件配置低,無法跑2個虛擬機,本實驗用docker容器的方法:

  2. 環境搭建:docker pull mysql8.0鏡像:

docker pull mysql:8.0

docker run --name master -p8888:3306 -e MYSQL_ROOT_PASSWORD=123456 -d  mysql:8.0

分別測試登陸master和slave

  1. mysql -u root -p123456 -P 8888 -h 127.0.0.1

  2. mysql -u root -p123456 -P 9999 -h 127.0.0.1

復制容器里的my.cnf文件到宿主機當前位置:

docker cp master:/etc/my.cnf ./

在my.cnf文件中[mysqld]段中加入如下代碼,cp回master容器原位置,重啟MYSQL服務:server-id = 1 log-bin = mysql-bin

登錄master數據庫,創建tongbu用戶及密碼并設置權限,執行如下命令,查看bin-log文件及position點:

CREATE USER 'tongbu'@'%' IDENTIFIED WITH mysql_native_password BY '123456';GRANT REPLICATION SLAVE ON *.* TO 'tongbu'@'%';show master status;

修改my.cnf文件,在[mysqld]段中加入如下代碼,cp回slave容器原位置,重啟MYSQL服務:server-id = 2

Slave指定Master IP、用戶名、密碼、bin-log文件名( binlog.000003)及position(656),代碼如下:這里重點注意,因為是用容器做的實驗環境,要注意以下參數master_host='192.168.101.6',master_port=8888

change master to master_host='192.168.101.6',master_port=8888,master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=157;

在slave啟動slave start,并執行show slave status\G查看Mysql主從狀態:show slave status\G;

#后面要加\G,則看起來很亂。

#要確保以下兩個地方顯示是Yes,如果不是Yes,需要檢查前面的步驟是否有錯誤的地方;

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

#如果顯示Slave_IO_Running:Connecting 的問題,要從以下幾點查找:

#網絡不通、防火墻端口未開放、mysql賬戶密碼錯誤、mysql主從機配置文件寫錯、配置從機連接語法錯誤、主機未開放賬戶連接權限;

#例如本次實驗因為沒注意容器的問題,master_host='192.168.101.6',寫成了127.0.0.1導致一直無法連接。

  1. 測試在master上創建一個數據庫:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

mysql> create database test_db;

Query OK, 1 row affected (0.03 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| test_db            |

+--------------------+

5 rows in set (0.00 sec)

  1. 在slave上查看是否同步過來:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| test_db            |

+--------------------+

5 rows in set (0.00 sec)

mysql>

可以看到,測試增加的test_db已經自動同步過來,主從復制實驗完成。

再做個試驗:構建MySQL主主復制,實現在主庫操作增刪改,從庫能夠同步,在從庫操作增刪改,主庫也能同步數據。MySQL主主復制是指兩臺機器(master和slave)互為主從。

搭建MySQL主主復制環境:啟動兩個MySQL8.0容器,name分別為node001(端口3333),node002(端口4444):

docker run --name node001 -p3333:3306 -e MYSQL_ROOT_PASSWORD=123456 -d  mysql:8.0

docker run --name node002 -p4444:3306 -e MYSQL_ROOT_PASSWORD=123456 -d  mysql:8.0

利用docker cp node001/node002:/etc/my.cnf,復制出my.cnf配置文件并修改后利用docker cp my.cnf node001/node002:/etc/傳回容器內部,修改如下:

在node001的[mysqld]字段上添加

server-id = 1

log_bin = mysql-bin

在node002的[mysqld]字段上添加

server-id = 2

log_bin = mysql-bin

重啟兩個容器(達到重啟mysql服務的作用):

docker restart node001 node002

node001

node002

在node001上添加用戶并授權:

CREATE USER 'tongbu'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

GRANT REPLICATION SLAVE ON *.* TO 'tongbu'@'%';

  1. 在node002上添加用戶并授權:

CREATE USER 'tongbu'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

GRANT REPLICATION SLAVE ON *.* TO 'tongbu'@'%';

在node001要查看master信息:

mysql> show master status\G;

*************************** 1. row ***************************

File: mysql-bin.000001

Position: 656

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.01 sec)

ERROR:

No query specified

mysql>

在node002上設置從節點,進行以下操作,注意master_log_file='mysql-bin.000001',master_log_pos=656;要與上一步查看到的node001信息一致:最后執行 start slave;

change master to

master_host='192.168.101.6',master_port=3333,master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=656;

start slave;

查看node002的slave狀態(確保標紅處的兩個Yes):

show slave status \G

mysql> show slave status \G

*************************** 1. row ***************************

Slave_IO_State: Waiting for source to send event

Master_Host: 192.168.101.6

Master_User: tongbu

Master_Port: 3333

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 656

Relay_Log_File: 914fdc4fdb40-relay-bin.000002

Relay_Log_Pos: 326

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

  1. 在node002要查看master信息:

mysql> show master status\G;

*************************** 1. row ***************************

File: mysql-bin.000001

Position: 656

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

ERROR:

No query specified

mysql>

在node001上設置從節點,進行以下操作,注意master_log_file='mysql-bin.000001',master_log_pos=656;要與上一步查看到的node001信息一致:最后執行 start slave;

change master to

master_host='192.168.101.6',master_port=4444,master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=656;

start slave;

查看node001的slave狀態(確保標紅處的兩個Yes):

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for source to send event

Master_Host: 192.168.101.6

Master_User: tongbu

Master_Port: 4444

Connect_Retry: 60

Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 656

Relay_Log_File: f061023a72b4-relay-bin.000002

Relay_Log_Pos: 326

Relay_Master_Log_File: mysql-bin.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

  1. 測試node001增加一個test數據庫:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.01 sec)

mysql> create database test;

Query OK, 1 row affected (0.03 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| test               |

+--------------------+

5 rows in set (0.00 sec)

mysql>

查看node002上的數據庫,已經與node001同步:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| test               |

+--------------------+

5 rows in set (0.00 sec)

mysql>

  1. 在node002上刪除test數據庫:

mysql> drop database test;

Query OK, 0 rows affected (0.02 sec)

mysql>

  1. 在node001上查看數據庫,已經與node002同步:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

mysql>

  1. 在node002上增加一個數據庫test002:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

4 rows in set (0.00 sec)

mysql> create database test002;

Query OK, 1 row affected (0.04 sec)

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| test002            |

+--------------------+

5 rows in set (0.01 sec)

mysql>

查看node001上的數據庫,已經與node002同步:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| sys                |

| test002            |

+--------------------+

5 rows in set (0.00 sec)

mysql>

原文來源:https://mp.weixin.qq.com/s/DgplLEGFfcoAWharuZA86Q

[我要糾錯]
[ 編輯:王振袢 &發表于江蘇 ]
關鍵詞: 本文 docker 方式 MySQL 主從

來源:本文內容搜集或轉自各大網絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發布,請聯系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。

點個贊
0
踩一腳
0

您在閱讀:MySQL主從、主主實戰

Copyright©2013-2025 ?JSedu114 All Rights Reserved. 江蘇教育信息綜合發布查詢平臺保留所有權利

蘇公網安備32010402000125 蘇ICP備14051488號-3技術支持:南京博盛藍睿網絡科技有限公司

南京思必達教育科技有限公司版權所有   百度統計

主站蜘蛛池模板: 中文在线资源链接天堂 | 国产高清国产专区国产精品 | 污污视频网站免费 | 日本高清中文字幕视频在线 | 黄视频国产 | 久热精品男人的天堂在线视频 | 亚洲欧美卡通成人制服动漫 | 天堂资源吧 | 久久成人免费视频 | 日韩欧美一区二区久久黑人 | 丁香激情综合 | 日日摸夜夜添夜夜爽免费视频 | vktk视频| 免费视频淫片aa毛片 | 欧美日韩高清在线观看一区二区 | 网站午夜 | 欧美操片在线观看 | 日韩手机看片 | 性欧美人妖在线看 | 福利影院在线播放 | 成人区精品一区二区不卡亚洲 | 日韩在线视频第一页 | 亚洲伊人成综合网 | 妞干网免费在线 | 国产二区在线播放 | 高清黄色直接看 | 人人爽人人爽人人片c | 成人影视网站 | 一区二区三区免费在线视频 | 香蕉视频污污在线观看 | 牛牛热在线视频 | 韩国伦理剧在线播放 | 最近2019高清中文字幕 | 国产免费爱在线观看视频 | 久久在现 | 亚洲视频在线观看一区 | 99视频污在线观看 | 91精品欧美综合在线观看 | 国产成人高清在线 | 26uuu精品一区二区 | 成人欧美网站免费 |
最熱文章
最新文章
  • 阿里云上云鉅惠,云產品享最低成本,有需要聯系,
  • 卡爾蔡司鏡片優惠店,鏡片價格低
  • 蘋果原裝手機殼