MYSQL---主從同步概述與配置

来源:https://www.cnblogs.com/sre-chan/archive/2023/04/21/17338583.html
-Advertisement-
Play Games

一、MYSQL主從同步概述 1、什麼是MySQL主從同步? 實現數據自動同步的服務結構 主伺服器(master): 接受客戶端訪問連接 從伺服器(slave):自動同步主伺服器數據 2、主從同步原理 Maste:啟用binlog 日誌 Slave:Slave_IO: 複製master主機binlog ...


一、MYSQL主從同步概述

1、什麼是MySQL主從同步?

實現數據自動同步的服務結構

主伺服器(master): 接受客戶端訪問連接
從伺服器(slave):自動同步主伺服器數據

2、主從同步原理

Maste:啟用binlog 日誌
Slave:Slave_IO: 複製master主機binlog 日誌文件的SQL命令到本機的relay-log(中繼日誌) 文件里。
Slave_SQL: 執行本機 relay-log(中繼日誌) 文件里的SQL語句,實現與 Master 數據一致。

Master(主伺服器):

1》開啟binlog日誌,記錄所有除查詢以外的SQL命令

Slave(從伺服器):

1》從伺服器上的I/O thread(讀寫線程) 負責讀取主伺服器binlog日誌中的SQL命令,並將其寫入到 Relay log(中繼日誌中)
2》從伺服器中的SQL thread(SQL 線程)讀取中繼日誌中的SQL命令,並將其寫入到Slave的資料庫中

3、主從同步結構模式

基本應用
單向複製:一主 <—— 一從
擴展應用
一主多從:從 <—— 主 ——> 從
鏈式複製:主 <—— 從 <—— 從
互為主從:主 <——> 主

4、MySQL主從同步配置

拓撲結構

5、實施

步驟一:根據host50克隆虛擬機出host51,配置IP地址為192.168.4.51,主機名為host51,刪除51,52上面多餘的資料庫,只保留預設的四個庫

[root@host51 ~]# mysql -uroot -p123qqq...A
mysql> drop database bbsdb;
[root@host52 ~]# mysql -uroot -p123qqq...A
mysql> drop database db4;

步驟二:host51配置主伺服器

# 修改主配置文件,開啟binlog日誌
[root@host51 ~]# vim /etc/my.cnf
[mysqld]
#binlog_format="mixed"	# 加上註釋
server_id=50				#指定id號,預設與IP地址的主機位相同
log_bin=master51			#指定binlog日誌名,日誌文件在/var/lib/mysql下     

步驟三:重啟資料庫服務,讓配置生效

[root@host51 ~]# systemctl restart mysqld
# 用戶授權,給replication slave複製數據的許可權,授權用戶為: repluser
[root@host51 ~]# mysql -uroot -p123qqq...A
mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
mysql> show master status;

步驟四:host52配置從伺服器

# 修改主配置文件,指定server_id號
[root@host52 ~]# vim /etc/my.cnf
 [mysqld]
server_id=52          #指定id號,預設與IP地址的主機位相同
[root@host52 ~]# systemctl restart mysqld
# 指定主伺服器信息
mysql> change master to master_host="192.168.4.51", master_user="repluser", master_password="123qqq...A", master_log_file="master51.000001", master_log_pos=441;

步驟五:啟動從伺服器

mysql> start slave;		
mysql> show slave status\G;		#確認IO線程、SQL線程都是 Yes 狀態

如果IO線程為NO,錯誤提示如下

這是因,auto.cnf 存放的是主伺服器的uuid號 ,因為是克隆出的虛擬機,uuid號都一樣,會進行衝突,可以任意修改其中一個或多個字元,重啟資料庫服務即可

[root@host52 ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=d45877cc-f4ab-11ea-b2a1-000c291f7055
[root@host52 ~]# systemctl restart mysqld

步驟六:host51:測試主從同步

[root@host51 ~]# mysql -uroot -p'123qqq...A'
mysql> create database db1;
mysql> create table db1.user (name char(10));
mysql> insert into db1.user values("tom");

步驟七:在host52上查看

[root@host52 ~]# mysql -uroot -p'123qqq...A'
mysql> show databases;
mysql> select * from db1.user;

相關文件

存放在資料庫目錄下/var/lib/mysql/
刪除文件,重啟資料庫服務,可把主機恢復為獨立的資料庫伺服器;

記錄主伺服器的信息

[root@host52 ~]# cat /var/lib/mysql/master.info 

查看中繼日誌信息

# host52-relay-bin.000001 是中繼日誌文件:記錄從主伺服器拷貝過來的sql命令
# host52-relay-bin.index  是中繼日誌索引文件
[root@host52 ~]# ls /var/lib/mysql/host52*
# 查看中繼日誌文件內容
[root@host52 ~]# cd /var/lib/mysql
[root@host52 mysql]# cat relay-log.info 
7
./host52-relay-bin.000004		#本機正在使用的中繼日誌文件
319							#中繼日誌記錄主伺服器sql命令的偏移量
master51.000001				#中繼日誌從哪個文件中拷貝sql命令(主伺服器)
441                         #此為主伺服器最近的binlog日誌的偏移量
# 查看中繼日誌索引文件,有幾個中繼日誌文件,就記錄幾條
[root@host52 ~]# cd /var/lib/mysql
[root@host52 mysql]# cat host52-relay-bin.index 

6、配置MySQL一主多從:解決從伺服器宕機之後,無法備份數據問題

拓撲結構

步驟一:準備資料庫host53,可以直接用之前的host53,刪除創建資料庫,保留預設的四個庫

[root@host53 ~]# mysql -uroot -p123qqq...A
mysql> show databases;
mysql> drop database db4;

步驟二:沒有配置之前,要確保從與主伺服器數據一致

host51:安裝innobackupex相關軟體包

[root@host52 ~]# scp libev-4.15-1.el6.rf.x86_64.rpm  percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm 192.168.4.51:/root/
[root@host51 ~]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm 
[root@host51 ~]# yum -y install percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm
[root@host51 ~]# innobackupex --user root --password '123qqq...A' --slave-info  /allbak1  --no-timestamp
[root@host51 ~]# scp -r /allbak1/ 192.168.4.53:/opt/

host53使用innobackupex恢複數據

[root@host53 ~]# systemctl stop mysqld
[root@host53 ~]# rm -rf /var/lib/mysql/*
[root@host53 ~]# innobackupex --apply-log  /root/allbak1/		#準備恢複數據
[root@host53 ~]# innobackupex --copy-back  /root/allbak1/			#恢複數據
[root@host53 ~]# chown -R mysql:mysql /var/lib/mysql
[root@host53 ~]# systemctl start mysqld
[root@host53 ~]# mysql -uroot -p'123qqq...A' -e "show databases"
# xtrabackup_binlog_info 文件記錄的是binlog日誌文件名和偏移量
# 此偏移量和主伺服器的偏移量一致,從伺服器同步數據時從這個偏移量開始同步
# 可以查看host51的binlog日誌狀態,偏移量相同
[root@host53 ~]# cat /opt/alldb/xtrabackup_binlog_info 
master51.000001	1020

步驟三:配置從伺服器

# 修改主配置文件,指定server_id號
[root@host53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53			#指定id號,預設與IP地址的主機位相同
[root@host53 ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=d45877cc-ffab-11ea-b2a1-000c291f7055
[root@host53 ~]# systemctl restart mysqld
[root@host53 ~]# mysql -uroot -p123qqq...A

步驟四:指定主伺服器信息

mysql> change master to master_host="192.168.4.51", master_user="repluser", master_password="123qqq...A", master_log_file="master51.000001", master_log_pos=1020;
mysql> start slave;				#啟動slave
mysql> show slave status;		#查看從伺服器狀態信息
host51:插入數據
[root@host51 ~]# mysql -uroot -p'123qqq...A'
mysql> insert into db1.user values("tomA"),("tomB"),("tomC");

步驟五:host53測試主從同步

[root@host53 ~]# mysql -uroot -p'123qqq...A'
mysql> select * from db1.user;

二、MYSQL主從從結構

配置MYSQL主從從結構

1、主從從結構

主從從結構優勢:
1》【host55】是【host54】的從伺服器,【host54】是【host53】的從伺服器;
2》當【host53】宕機以後,用戶訪問的是從伺服器【host54】的資料庫;
3》當【host54】宕機以後,用戶訪問的就是從伺服器【host55】的資料庫;

2、主從從結構實驗環境準備,根據host50克隆虛擬機host54和host55主機,配置IP如下,並還原資料庫預設的四個庫

主伺服器     主機名:host53      IP地址: 192.168.4.53
從伺服器     主機名:host54      IP地址: 192.168.4.54
從伺服器     主機名:host55      IP地址: 192.168.4.55

3、將host53恢覆成獨立的資料庫伺服器

[root@host53 ~]# cd /var/lib/mysql
[root@host53 mysql]# rm -rf master.info 			#刪除連接主伺服器的信息文件
[root@host53 mysql]# rm -rf host53-relay-bin.0*		#刪除所有的中繼日誌文件,存放從主伺服器拷貝過來的sql命令
[root@host53 mysql]# rm -rf host53-relay-bin.index 	#刪除中繼日誌的索引文件,按順序記錄所有的中繼日誌文件名
[root@host53 mysql]# rm -rf relay-log.info 			#刪除中繼日誌文件,記錄中繼日誌信息
[root@host53 mysql]# systemctl restart mysqld

4、測試

[root@host53 ~]# mysql -uroot -p'123qqq...A'
mysql> show slave status;		#查看從伺服器狀態信息,為Empty,已經還原
mysql> drop database db1;		#刪除db1庫
mysql> exit

5、host53配置主伺服器

修改主配置文件,開啟binlog日誌
[root@host53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53
log_bin=master53
[root@host53 ~]# systemctl restart mysqld
[root@host53 ~]# mysql -uroot -p123qqq...A

這一次的授權不需要操作,因為之前53主機在做從庫的時候已經同步用戶了

mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A"; 
mysql> select user,host from mysql.user;
mysql> show grants for repluser@"%";
mysql> show master status;

6、host54配置從伺服器

修改配置文件、用戶授權、指定主庫信息、啟動slave進程
修改主配置文件,指定server_id號
log_slave_updates 必須開啟級聯複製功能,因為【host54】同步數據是從【host53】的binlog日誌中獲取的,【host54】並沒有直接執行sql命令,所以在【host54】的binlog日誌中並沒有sql命令,那麼【host55】也就無法同步【host54】中的數據;而開啟級聯複製功能,則允許【host55】同步【host54】從【host53】同步過來的數據

[root@host54 ~]# vim /etc/my.cnf
[mysqld]
#binlog_format="mixed"
server_id=54
log_bin=master54
log_slave_updates		#允許級聯複製
[root@host54 ~]# vim /var/lib/mysql/auto.cnf	# auto.cnf 存放的是主伺服器的uuid號 因為是克隆出的虛擬機,uuid號都一樣,會衝突可以任意修改其中一個或多個字元,重啟資料庫服務即可
[auto]
server-uuid=d45877cc-f4ab-12ea-b2a1-000c291f7055
[root@host54 ~]# systemctl restart mysqld

7、連接資料庫,指定主伺服器信息

[root@host54 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.53", master_user="repluser", master_password="123qqq...A",master_log_file="master53.000001",master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;

8、host54:從伺服器【host55】添加授權用戶

mysql> grant replication slave on *.* to jim@"%" identified by "123qqq...A";
mysql> show master status;

9、host55配置從伺服器

[root@host55 ~]# vim /etc/my.cnf
[mysqld]
#binlog_format="mixed"
server_id=55
[root@host55 ~]# vim /var/lib/mysql/auto.cnf	
[auto]
server-uuid=d45877cc-f4ab-12ea-b2a1-000c291f7055
[root@host55 ~]# systemctl restart mysqld

10、指定主伺服器信息

[root@host55 ~]# mysql -uroot -p123qqq...A
mysql> change master to master_host="192.168.4.54",master_user="jim", master_password="123qqq...A",master_log_file="master54.000001",master_log_pos=1554;
mysql> start slave;
mysql> show slave status\G;

11、測試主從從同步,在host53上建庫,建表,插入記錄

[root@host53 ~]# mysql -uroot -p'123qqq...A'
mysql> create database bbsdb;
mysql> create table bbsdb.user(name char(11));
mysql> insert into bbsdb.user values("bob");
mysql> select * from bbsdb.user;

12、在host54上查看驗證數據

[root@host54 ~]# mysql -uroot -p'123qqq...A'
mysql> select * from bbsdb.user;

13、在host55上查看驗證數據

[root@host55 ~]# mysql -uroot -p'123qqq...A'
mysql> select * from bbsdb.user;

三、複製模式

複製模式介紹

非同步複製 (預設的複製模式):Asynchronous replication
主伺服器執行完一次事務後,立即將結果返給客戶端,不關心從伺服器是否已經同步數據。

案例:【host50】(主伺服器) <—— 【host51】(從伺服器)

用戶在【host50】(主伺服器)上執行插入,更新,刪除等SQL命令時,【host50】(主伺服器)直接將結果返回給用戶,不關心【host51】(從伺服器)是否同步數據成功
優點:響應速度快,用戶體驗很好;
缺點:主伺服器宕機後,有可能會存在從伺服器數據丟失的情況;

半同步複製:Semisynchronous replication
主伺服器在執行完一次事務後,等待至少一臺從伺服器同步數據完成,才將結果返回給客戶端。

案例:【host50】(主伺服器) <—— 【host51】(從伺服器)

用戶在【host50】(主伺服器)上執行插入,更新,刪除等SQL命令時,【host50】(主伺服器)不會立刻將結果返回給用戶,而是等待至少一個從伺服器將數據同步寫入到本機的資料庫後,才將結果返回給用戶

優點:主伺服器宕機後,至少有一臺從伺服器擁有和主伺服器相同的數據,數據安全度高;
缺點:響應速度下降,用戶體驗度下降;

配置半同步複製 (主從伺服器都要配置)

主伺服器     主機名:host53      IP地址: 192.168.4.53
從伺服器     主機名:host54      IP地址: 192.168.4.54
從伺服器     主機名:host55      IP地址: 192.168.4.55

命令行載入模塊

host53主伺服器命令行載入半同步複製的master模塊
mysql> show databases;
mysql> desc information_schema.PLUGINS;		#查看預設庫information_schema 下PLUGINS表(模塊表)的表結構
載入 master 模塊,rpl_semi_sync_master模塊類型,semisync_master.so模塊名稱
mysql> install plugin rpl_semi_sync_master SONAME "semisync_master.so";
mysql> select PLUGIN_NAME,PLUGIN_STATUS from information_schema.PLUGINS where PLUGIN_NAME  like "%semi%";

host55安裝slave模塊

mysql>  install plugin rpl_semi_sync_slave SONAME "semisync_slave.so";  
host54因為是即做主又做從,所以要安裝 matser和slave模塊
mysql> install plugin rpl_semi_sync_master SONAME "semisync_master.so";
mysql> install plugin rpl_semi_sync_slave SONAME "semisync_slave.so";
mysql> select PLUGIN_NAME,PLUGIN_STATUS from information_schema.PLUGINS where PLUGIN_NAME  like "%semi%";

啟用模塊

host53:模糊查詢半同步複製模塊是否開啟
mysql> show variables like "%semi%";
mysql> set global rpl_semi_sync_master_enabled=1;		#全局設置,開啟半同步複製模塊
mysql> show variables like "%semi%";					#on開啟

host54啟動半同步複製的master和slave模塊

mysql> set global rpl_semi_sync_master_enabled=1;
mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show variables like "%semi%";

host55:啟動半同步複製的slave模塊

mysql> set global rpl_semi_sync_slave_enabled=1;
mysql> show variables like "%semi%";

永久配置

主伺服器永久安裝和啟用半同步複製的master模塊

[root@host53 ~]# vim /etc/my.cnf
[mysqld]
plugin-load=rpl_semi_sync_master=semisync_master.so    		#載入master模塊
rpl_semi_sync_master_enabled=1                        		#啟用master模塊
[root@host53 ~]# systemctl restart mysqld
[root@host54 ~]# mysql -uroot -p'123qqq...A'
mysql> show variables like "%semi%";

主從伺服器永久安裝和啟用半同步複製的master和slave模塊,在host54上操作

[root@host54 ~]# vim /etc/my.cnf
[mysqld]
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"              							#同時載入master和slave模塊
rpl_semi_sync_master_enabled=1				#啟用master模塊
rpl_semi_sync_slave_enabled=1				#啟用slave模塊
[root@host54 ~]# systemctl restart mysqld
[root@host54 ~]# mysql -uroot -p'123qqq...A'
mysql> show variables like "%semi%";

從伺服器永久安裝和啟用半同步複製的slave模塊,在host55上操作

[root@host55 ~]# vim /etc/my.cnf
[mysqld]
plugin-load=rpl_semi_sync_slave=semisync_slave.so    		#載入master模塊
rpl_semi_sync_slave_enabled=1                          #啟用master模塊
[root@host55 ~]# systemctl restart mysqld
[root@host55 ~]# mysql -uroot -p'123qqq...A'
mysql> show variables like '%semi%';
作者:ChAn 出處:http://www.cnblogs.com/sre-chan/

-------------------------------------------

個性簽名:今天做了別人不想做的事,明天你就做得到別人做不到的事,嘗試你都不敢,你拿什麼贏!

如果覺得這篇文章對你有小小的幫助的話,記得在右下角點個“推薦”哦,博主在此感謝!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ansible分離部署LNMP 環境說明: | 系統 | 主機名 | IP | 服務 | | | | | | | centos8 | ansible | 192.168.111.141 | ansible主控機 | | centos8 | nginx | 192.168.111.142 | ngin ...
  • ​根據2022年的DevOps全球調查報告顯示,主流軟體企業採用或部分採用DevOps且已獲得良好成效的占比已達70%,DevOps儼然成為當下軟體開發研究的重要方向。 測試作為軟體開發的必要過程,是提升軟體可靠性、保證軟體質量的關鍵環節。然而,從過往研究文獻來看,希望通過DevOps提升軟體交付效 ...
  • 在這裡分享項目中我經常使用的一種串口收發方式:阻塞發送 + 接收中斷 +空閑中斷 + 環形隊列 項目代碼地址:https://gitee.com/Mokun_gitee/stm32_hal_study.git 一、簡介 串口發送使用最簡單的阻塞發送方式,一般來說都是接收的數據量比較大,發送數據用此方 ...
  • 我學習的過程中,對於連接池和數據源分得不是很清楚,而且我發現有的人將資料庫等同於數據源,或者將數據源等同於連接池,實際上這些說法並不准確。 ...
  • 功能02-商鋪查詢緩存03 3.功能02-商鋪查詢緩存 3.6封裝redis工具類 3.6.1需求說明 基於StringRedisTemplate封裝一個工具列,滿足下列需求: 方法1:將任意Java對象序列化為json,並存儲在string類型的key中,並且可以設置TTL過期時間 方法2:將任意 ...
  • 摘要:如果你需要一款穩定可靠的高性能企業級KV資料庫,不妨試試GaussDB(for Redis)。 每當網路上爆出熱點新聞,混跡於各個社交媒體的小伙伴們全都開啟了討論模式。一條消息的產生是如何在群聊中傳遞的呢?讓我們一起來探索即時通訊系統(IM)的原理。 IM系統架構的原理 當你在群聊“相親相愛一 ...
  • 我定義了一系列靜態方法,用於執行SQL Server資料庫的增刪改查等操作。其中:ExecuteNonQuery方法用於執行指定的SQL語句並返回受影響的行數;ExecuteScalar方法用於執行指定的SQL語句並返回查詢結果的第一行第一列;ExecuteDataTable方法用於執行指定的SQL ...
  • Redis 作為一個成熟的記憶體型資料庫,對於記憶體占用和操作性能上會有自己的取捨,通過這些知識可以理解為什麼 Redis 的性能有時候會變化得那麼快。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...