Linux運維:mysql主從復制原理及實驗

當一臺數據庫服務器出現負載的情況下,需要擴展服務器服務器性能擴展方式有向上擴展,垂直擴展。向外擴展,橫向擴展。通俗的講垂直擴展是將一臺服務器擴展為性能更強的服務器。橫向擴展是增加幾臺服務器。

主從復制好比存了1000塊錢在主上,在從上查不到,主從復制就是主和從數據一致。

復制的功能:負載均衡讀操作,備份,高可用和故障切換,數據分布,MySQL升級。

一、主從復制架構和原理

1.1 mysql主從復制

讀寫分離

復制:每個節點都有相同的數據集,向外擴展,基于二進制日志的單向復制

1.2 復制的功能

負載均衡讀操作

備份

高可用和故障切換

數據分布

MySQL升級

1.3復制結構和主從復制原理

一主一從,和一主多從。

主從復制的相關程序。

1.3.1 兩個日志三個線程:

日志:二進制日志,中繼日志(主上的二進制日志)

線程:dump線程,io線程,sql線程

主服務器:mysqldump線程,傳輸二進制日志給從

從服務器:io線程:接收主的二進制日志,寫入中繼日志;sql線程:讀取中繼日志,寫入數據庫。

1.3.2 原理:

1.主節點負責用戶的寫操作,用戶發起寫操作,會修改數據庫

2.數據庫修改后,會更新主節點上的二進制日志

3.主服務器會產生一個dump線程,一邊讀取二進制日志一邊將二進制日志通過網絡傳給從服務器

4.從服務器會開啟io線程,接收主服務器的二進制日志

5.io線程會將主服務器的二進制日志寫入中繼日志,這時只是生成了一個文件,并沒有同步

6.從服務器再開啟sql線程將中繼日志中操作寫入數據庫完成更新

主從數據就保持一致了!

主從復制相關線程:

dump Thread:為每個slave的I/O Thread啟動一個dump線程,用于向其發送binary log events從節點

I/O?Thread:向master請求二進制日志事件,并保存于中繼日志中

SQL Thread:從中繼日志中讀取日志事件,在本地完成同步操作。

主數據更新 -> 寫入bin log -> slave服務器線程 -> io Thread -> 寫入Relay Log -> SQL Thread -> 從數據庫更新。這樣就主從一致了。

yum安裝數據庫:

二、主從復制

2.1 主-從復制

Node3作為主192.168.114.30,Node4作為從192.168.114.40

2.2 主節點配置:

(1)啟用二進制日志

主節點配置:啟用二進制日志

(2)為當前節點設置一個全局唯一的ID號

[mysqld]

server-id=? ? ? ? ? ? ? ? ? ? ? ? #區分自己的日志和別人的日志

log-basename=master? ? ? ? #可選項,設置datadir中日志名稱,確保不依賴主機名

(3)查看從二進制日志的文件和位置開始進行復制

show master status;

(4)創建有復制權限的用戶賬號

grant replication slave on *.* 'repluser'@'HOST' identified by 'repluser';

2.3 從節點配置:

(1)啟動中繼日志

[mysqld]

server-id=

log-bin=

(2) 使用有復制權限的用戶賬號連接至主服務器,并啟用復制線程

mysql> CHANGE MASTER TO
?MASTER_HOST='192.168.114.10',
?MASTER_USER='test',
?MASTER_PASSWORD='ABC123',
?MASTER_PORT=3306,
?MASTER_LOG_FILE='mysql-bin.000002',
?MASTER_LOG_POS=448;

show slave status;

2.4 實際操作:一主一從

Node3作為主:

在文件最后添加兩條配置。

[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/mysql-bin

建立目錄并修改權限:

[root@Node3 ~]#:mkdir -p /data/mysql
[root@Node3 ~]#:chown -R mysql.mysql /data

重啟數據庫:

systemctl restart mysqld

登錄并新建同步用戶:

mysql -uroot -pabc123

master狀態,查看同步文件和同步位置:763

Node4作為從:

[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/mysql-bin

建立目錄:

[root@Node4 ~]#:mkdir /data/mysql -p
[root@Node4 ~]#:chown -R mysql.mysql /data

重啟:systemctl start mysqld

主上查看節點:449

主上查看二進制文件,我們指定了在/data/mysql/下:

[root@Node3 ~]#:ls /data/mysql/
mysql-bin.000001 ?mysql-bin.000002 ?mysql-bin.index

這個是最新的。

登錄數據庫添加主的信息,有模版,注意修改:

help change master to;

mysql> help change master to;
......
CHANGE MASTER TOMASTER_HOST='source2.example.com',MASTER_USER='replication',MASTER_PASSWORD='password',MASTER_PORT=3306,MASTER_LOG_FILE='source2-bin.001',MASTER_LOG_POS=4,MASTER_CONNECT_RETRY=10;
#這里是模版,要根據自己環境修改

開啟IO線程以及SQL線程:start slave;

?查看從服務器的狀態:都是yes就是正常狀態。如果有錯就清空主從配置:reset slave all;

這里還有個狀態:Seconds_Behind_Master: 0? ?代表與主服務器的信息差,0代表同步

2.5 驗證

先看從上的數據庫:

在主上創建一個數據庫,看從上是否也有這個數據庫:

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

在從上查看:

也有了test數據庫。實現主從復制!

可以看到主從建立了連接

三、案例:(主從復制+完備)

假設主節點的數據庫已經運行了一段時間,產生了一定量的數據,主從復制只能復制開啟后數據,那之前的數據如何處理?

把之前的那些數據做好完全備份。之后的數據通過主從復制實現備份。再結合在一起。(快照,重新還原到mysql)

安裝好數據庫之后,把一個數據庫文件拖進來/data/下。把數據庫hellodb_innodb.sql文件導進數據庫中。

?進入數據庫查看:

開啟二進制日志:

[root@Node3 ~]#:vim /etc/my.cnf
......
server-id=30
log-bin=/data/mysql/log/mysql-bin

建立路徑:

[root@Node3 ~]#:mkdir /data/mysql/log -p
[root@Node3 ~]#:chown -R mysql.mysql /data
[root@Node3 ~]#:systemctl restart mysqld

?完全備份:-A是把所有的數據庫都備份在/data/下取名為all.sql。-F備份前滾動日志,鎖定表完成后,執行flush logs命令,生成新的二進制日志文件。

mysqldump -uroot -pabc123 -A -F --master-data=1 --single-transaction > /data/all.sql

創建個登錄用戶,并授權:

由于之前在備份的時候加入了--master-data=1選項,就添加了主從復制的選項000002文件的619位置往后開始主從復制

000002文件619位置之前的配置由備份文件自行實現

接下來把備份的文件遠程拷貝到Node4主機上:

scp /data/all.sql 192.168.114.40:/opt

從Node4上:

開啟二進制日志:

[root@Node4 ~]#:vim /etc/my.cnf
......
server-id=40
log-bin=/data/mysql/log/mysql-bin

建立路徑并重啟數據庫:

[root@Node4 ~]#:mkdir /data/mysql/log/ -p
[root@Node4 ~]#:chown -R mysql.mysql /data
[root@Node4 ~]#:systemctl restart mysqld

這時先看一下數據庫:是沒有hellodb數據庫的。

修改備份腳本:

vim /opt/all.sql

找到CHANGE MASTER TO這一行,做以下修改:

進入數據庫:把/opt/all.sql備份文件導入進來:source /opt/all.sql

開啟從。查看從節點的狀態

再次查看數據庫:

模擬故障:

我們在從上給數據庫中的表teachers插入一條數據:那么是第5條數據了

在主上也插入同樣的數據:

按說這一條應該是第6條數據。

在從上查看節點狀態:發現主從復制就失敗了。出現了一個錯誤!

這時在主上再插入一條數據:

這里的err按說是第6條數據,lisi是第7條數據。

由于前面的錯誤,導致在從上就不會再顯示了,提示主鍵重復,整個都down掉了。需要解決故障問題。先看一下從上的表數據:

通過show slave status\G;查看,顯示主鍵重復!

重啟一下,就是兩個yes了:start slave;

在主上插入一條數據:

mysql> insert into teachers values(null,'lisi2',20,'M');
Query OK, 1 row affected (0.00 sec)

查看主上的數據:

在從上查看是否有lisi2:

mysql> select * from teachers;
+-----+---------------+-----+--------+
| TID | Name          | Age | Gender |
+-----+---------------+-----+--------+
|   1 | Song Jiang    |  45 | M      |
|   2 | Zhang Sanfeng |  94 | M      |
|   3 | Miejue Shitai |  77 | F      |
|   4 | Lin Chaoying  |  93 | F      |
|   5 | err           |  24 | F      |
|   6 | lisi          |  21 | M      |
|   7 | lisi2         |  20 | M      |
+-----+---------------+-----+--------+

同步了!

四、級聯

級聯與一主一從一樣,就在從后面再加一臺服務器。作為從

主1--主2--從1

主2上要做的操作:在/etc/my.cnf中最下面添加一個:

[root@Node2 ~]#:vim /etc/my.cnf
......
log_slave_updates? ? #級聯操作必須加

由于中間的服務器是前面的從也是后面的主,對于后面來說,中間的這個也需要建立一個用戶:

mysql> grant replication slave on *.* to test@'192.168.114.%' identified by 'Admin@123';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

這樣是為了給后面從服務器指定節點。

后面可以跟兩臺從服務器:

在/etc/my.cnf中只需要配置一個server-id即可:

7-3:7-2上:show master stauts;
CHANGE MASTER TOMASTER_HOST='192.168.114.20',MASTER_USER='test',MASTER_PASSWORD='Admin@123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
start slave;
7-4:7-2上:show master stauts;
CHANGE MASTER TOMASTER_HOST='192.168.114.20',MASTER_USER='test',MASTER_PASSWORD='Admin@123',MASTER_PORT=3306,MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=449;
start slave;

驗證:

在Node1主上創建一個數據庫lxd;

在中間的從服務器(也是后面兩臺的主)也同步了Node1主的數據:

Node1主創建數據庫:

mysql> create database lxd;
Query OK, 1 row affected (0.00 sec)mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lxd                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

Node2從:(也是后面兩臺的主)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lxd                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

實現級聯同步!

---end---

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42075.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42075.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42075.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android14之獲取包名/類名/服務名(二百二十三)

簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長! 優質專欄:Audio工程師進階系列【原創干貨持續更新中……】🚀 優質專欄:多媒…

深度學習-梯度下降算法-NLP(五)

梯度下降算法 深度學習中梯度下降算法簡介找極小值問題數學上求最小值梯度梯度下降算法 找極小值問題在深度學習流程中深度學習整體流程圖求解損失函數的目標權重的更新 深度學習中梯度下降算法簡介 找極小值問題 引子: 我們訓練一個人工智能模型,簡單…

磁致伸縮液位計原理和特點

工作原理 磁致伸縮液位計的工作原理基于磁性材料在外部磁場作用下的尺寸變化來進行液位測量。該液位計主要由電子變送器、浮球(浮子)、探測桿(測桿)三部分組成。在磁致伸縮液位計的傳感器測桿外配有一浮子,此浮子可以…

【SpringCloud應用框架】Nacos服務配置中心

第四章 Spring Cloud Alibaba Nacos之服務配置中心 文章目錄 一、基礎配置二、新建子項目1.pom文件2.YML配置3.啟動類4.業務類5.Nacos配置規則 三、Nacos平臺創建配置操作四、自動配置更新五、測試 一、基礎配置 Nacos不僅僅可以作為注冊中心來使用,同時它支持作為…

【環境準備】 Vue環境搭建

文章目錄 前言vue-cli 安裝創建項目3.0、以下3.0 、以上 前言 書接上回《NodeJs(壓縮包版本)安裝與配置》,安裝完了NodeJs,接下來就要配置vue的環境了。 vue-cli 安裝 安裝vue-cli輸入如下命令 #(安裝的是最新版) npm install …

觀察者模式(Observer Pattern)

觀察者模式(Observer Pattern) 定義 觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。別名&#xff1…

鼠標宏怎么設置?6款鼠標自動點擊器強推,游戲玩家專用!(2024全)

隨著電子游戲和日常應用的不斷發展,我們經常會遇到一些重復性的任務或操作。而在這種情況下,鼠標宏以其自動化的特點成為了許多玩家和使用者的利器之一。如果你正在尋找如何設置鼠標宏來簡化操作并提高效率,那么你來對地方了。在本文中&#…

【Java]認識泛型

包裝類 在Java中,由于基本類型不是繼承自Object,為了在泛型代碼中可以支持基本類型,Java給每個基本類型都對應了一個包裝類型。 除了 Integer 和 Character, 其余基本類型的包裝類都是首字母大寫。 泛型 泛型是在JDK1.5引入的…

ASAN排查程序中內存問題使用總結

簡介 谷歌有一系列Sanitizer工具,可用于排查程序中內存相關的問題。常用的Sanitizer工具包括: Address Sanitizer(ASan):用于檢測內存使用錯誤。Leak Sanitizer(LSan):用于檢測內存…

【9-2:RPC設計】

RPC 1. 基礎1.1 定義&特點1.2 具體實現框架1.3 應用場景2. RPC的關鍵技術點&一次調用rpc流程2.1 RPC流程流程兩個網絡模塊如何連接的呢?其它特性RPC優勢2.2 序列化技術序列化方式PRC如何選擇序列化框架考慮因素2.3 應用層的通信協議-http什么是IO操作系統的IO模型有哪…

數據結構第14節 加權圖

加權圖是在圖論中一種更為復雜的圖結構,它擴展了無向圖和有向圖的概念,通過給圖中的邊附加一個數值來表示邊的某種屬性,如成本、距離、容量或相似度等。這個數值被稱為邊的“權重”。 定義 加權圖可以被形式化地定義為一個三元組 ( G (V, …

Vortex GPGPU的硬件設計和代碼結構分析

文章目錄 前言一、GPGPU是什么?1.1 GPU和GPGPU之間的差異1.2 GPU和CPU之間的集成方式1.3 GPU包含什么(列舉和VMIPS向量體系結構的差異) 二、Vortex GPGPU是什么?2.1 Vortex GPGPU的技術邊界和驗證環境2.2 Vortex GPGPU的指令集設計…

安卓穩定性之crash詳解

目錄 前言一、Crash 的基本原理二、Crash 分析思路三、實例分析四、預防措施五、參考鏈接 前言 在開發和測試 Android 應用程序時,遇到應用程序崩潰是很常見的情況。 Android 崩潰指的是應用程序因為異常或錯誤而無法正常執行,并且導致應用強制關閉。 一…

p11函數和遞歸

遞歸與迭代 求n的階乘。&#xff08;不考慮溢出&#xff09; int Fac1(int n) {int i0;int ret1;for(i1;i<n;i){ret*i;}return ret; } int main(){//求n的階乘int n0;int ret0;scanf("%d",&n);retFac1(n);printf("%d\n",ret);return 0; } int Fac…

什么是激光導航和視覺導航技術

激光導航和視覺導航技術是現代導航系統中的兩種重要技術&#xff0c;它們在多個領域&#xff0c;如掃地機器人、無人機、機器人導航等中都有廣泛應用。以下是對這兩種技術的詳細介紹&#xff1a; 一、激光導航技術 1. 定義與原理 激光導航技術是一種利用激光束進行精確測量和…

ChatGPT:||是短路運算符,那么|、、是什么?

ChatGPT&#xff1a;||是短路運算符&#xff0c;那么|、&、&&是什么? 在Java中&#xff0c;邏輯運算符&&和||是短路邏輯運算符&#xff0c;而&和|是非短路邏輯運算符。 && 和 || 是短路邏輯運算符。當使用這些運算符時&#xff0c;如果第一個…

解決 Docker 容器鏡像拉取難題:全面指南

一、引言 在使用 Docker 容器的過程中&#xff0c;經常會遇到鏡像拉取慢甚至無法下載的問題&#xff0c;這給開發和部署工作帶來了不小的困擾。本文將深入探討這一問題的原因&#xff0c;并提供多種有效的解決方案。 二、問題原因分析 網絡限制 本地網絡帶寬不足或存在網絡擁…

unity知識點 專項四 一文徹底說清楚(錨點(anchor)、中心點(pivot)、位置(position)之間的關系)

一 概述 想要使UI控件在屏幕中達到正確的顯示效果&#xff0c;比如自適應屏幕尺寸、固定邊距等等&#xff0c;首先要理清楚幾個基本概念和設置&#xff1a;錨點(anchor)、中心點(pivot)、位置(position)、UI縮放模式、父物件的transform設置 二 Anchor、Pivot與Position 2…

網絡連接線相關問題

問題1&#xff1b; 直通線為什么兩頭都是T568B&#xff1f;是否可以兩臺T5568A&#xff1f;或者任意線序&#xff0c;只需兩頭一致&#xff1f; 不行&#xff0c;施工規范規定。&#xff08;原因&#xff1b;網線最長距離100m&#xff0c;實際用起來要把網線包管&#xff0c;走…

【分布式系統】Filebeat+Kafka+ELK 的服務部署

目錄 一.實驗準備 二.配置部署 Filebeat 三.配置Logstash 四.驗證 一.實驗準備 結合之前的博客中的實驗 主機名ip地址主要軟件es01192.168.80.101ElasticSearches02192.168.80.102ElasticSearches03192.168.80.103ElasticSearch、Kibananginx01192.168.80.104nginx、Logs…