mysql複製技術、mysql集群

来源:https://www.cnblogs.com/xuxuxuxuxu/archive/2023/08/15/17632147.html
-Advertisement-
Play Games

# mysql複製技術/mysql集群 ![](https://img2023.cnblogs.com/blog/3165277/202308/3165277-20230815183932805-1063237772.png) ## 準備 1.四台虛擬機都關閉防火牆 ``` systemctl st ...


mysql複製技術/mysql集群

準備

1.四台虛擬機都關閉防火牆

systemctl stop firewalld
systemctl disable firewalld

2.四台虛擬機都設置好host功能變數名稱解析,在/etc/hosts文件中添加如下

[root@mysql01 ~]# vim /etc/hosts
192.168.70.33 master1
192.168.70.34 master2
192.168.70.35 slave1
192.168.70.36 slave2

五台機器都ping一下網路
[root@mysql01 ~]# ping master1
PING master1 (192.168.70.33) 56(84) bytes of data.
64 bytes from master1 (192.168.70.33): icmp_seq=1 ttl=64 time=0.031 ms
64 bytes from master1 (192.168.70.33): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from master1 (192.168.70.33): icmp_seq=3 ttl=64 time=0.056 ms

3.在乾凈的環境下安裝好mysql(yum、二進位、源碼都行)

​ 四台mysql統一密碼方便後續使用

[root@mysql02 ~]# grep password /var/log/mysqld.log
2023-08-13T13:44:46.837257Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: 7R_e*/+_)(l8
[root@mysql02 ~]# mysqladmin -uroot -p password
Enter password: 
New password: 
Confirm new password: 

一、mysql M-S 傳統

master設置

1.首先在master1中創建資料庫、表 模擬伺服器已經運行一段時間

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

mysql> use xux;
Database changed
mysql> create table xux.t1(id int(10));
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> insert into xux.t1 values(1),(2);
Query OK, 2 rows affected (0.09 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

2.設置master的mysql配置

1.因為是備庫中的i/o線程將主庫中的二進位日誌複製到中繼日誌中,所以需要打開二進位日誌,同時設置好server-id。
在/etc/my.cnf文件下[mysqld]下麵添加
vim /etc/my.cnf
[mysqld]
log-bin
server-id=1

[root@mysql01 ~]# tail -2 /etc/my.cnf
log-bin
server-id=1

2.設置好後重啟mysql
systemctl restart mysqld

3.創建複製用戶

mysql> CREATE USER 'rep'@'192.168.70.%' IDENTIFIED BY 'Xuxin_0709';

mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'rep'@'192.168.70.%';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;

4.備份數據

[root@mysql01 ~]# mysqldump -u root -p 'Xuxin_0709' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql

擴展(可忽略)

​ 如果設置--master-data=1 後續slave設置主伺服器可以不用填master_log_file和master_log_pos,但是資料庫導入必須使用source導入

5.複製給slave

[root@mysql01 ~]# scp ./2023-08-14-mysql-all.sql master2:/root

6.再插入一些數據

mysql> insert into xux.t1 values(3);
Query OK, 1 row affected (0.01 sec)

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

slave設置

1.測試授權的用戶

[root@mysql02 ~]# mysql -hmaster1 -urep -p'Xuxin_0709'

2.開啟server-id

[root@mysql02 ~]# vim /etc/my.cnf
[mysqld]
server-id=2

[root@mysql02 ~]# systemctl restart mysqld

3.導入資料庫

	先進入mysql暫停log-bin日誌記錄,不記錄導入數據的記錄
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

導入sql
mysql> source 2023-08-14-mysql-all.sql

或者在linux界面導入
[root@localhost ~]# mysql -uroot -p < /2023-08-14-mysql-all.sql

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
+------+
2 rows in set (0.00 sec)

4.查看sql中的日誌master_log_file和master_log_pos

​ [root@mysql01 ~]# vim 2023-08-14-mysql-all.sql

5.設置主伺服器

mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_log_file='mysql01-bin.000002',master_log_pos=157;

6.啟動從設備並查看slave狀態

mysql> start slave;

show slave status\G

7.查看數據可以發現數據已同步

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.01 sec)

測試

再來測試一下
在master1 xux.t1表中插入數據 看看slave機器會不會同步數據

1.在master1機器登錄mysql插入數據

mysql> insert into xux.t1 values(4);
Query OK, 1 row affected (0.01 sec)

2.在slave機器查看數據

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

二、mysql M-S GTID

準備

為接下來新的同步實驗需要將之前的同步設置清空,也就是重置master2的mysql

systemctl stop mysqld

rm -rf /var/lib/mysql/*

systemctl start mysqld

grep password /var/log/mysqld.log

mysql -uroot -p'w#lHVC_Rc30r'

mysqladmin -uroot -p password

master設置

1.啟動二進位日誌,伺服器ID,GTID
由於我們之前配置過了id這裡只需配置GTID。配置完後重啟mysqld

[root@mysql01 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce_gtid_consistency=1

[root@mysql01 ~]# systemctl restart mysqld

2.授權複製用戶rep(上面M-S傳統已配置 這裡忽略)

3.備份數據
為了實驗方便這裡把之前的sql備份文件刪掉

[root@mysql01 ~]# rm -rf 2023-08-14-mysql-all.sql
備份一份新的
[root@mysql01 ~]# mysqldump -u root -p --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
傳給master2
[root@mysql01 ~]# scp ./2023-08-14-mysql-all.sql master2:/root/

4.模擬數據變化

mysql> insert into xux.t1 values(5);
Query OK, 1 row affected (0.01 sec)

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (0.00 sec)

slave設置

1.測試rep用戶是否可用

[root@mysql02 ~]# mysql -hmaster1 -urep -p'Xuxin_0709'

2.啟動二進位日誌,伺服器ID,GTID,配置完後重啟mysqld

[root@mysql02 ~]# vim /etc/my.cnf
server-id=2
log_bin
gtid_mode=ON
enforce_gtid_consistency=1

[root@mysql01 ~]# systemctl restart mysqld

3.恢復手動同步數據

先關閉log-bin日誌記錄
mysql> set sql_log_bin=0;

導入數據
mysql> source /root/2023-08-14-mysql-all.sql;

查詢一下數據
mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

4.設置主伺服器

mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_auto_position=1;

5.啟動slave並查看數據

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.02 sec)

mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
+------+
5 rows in set (0.01 sec)

三、mysql M-M-S-S

考慮到主伺服器如果宕機,那個整個集群的寫入能力將會受到影響,那麼可以設置雙主多從的方式,為數據做好保障。

M-M

因為前面大多數設置已經設置好了,下麵是在上面已完成步驟的基礎下操作
1.在master2上進行授權 (可忽略)

查看user表 發現之前已經創建用戶並授權了 如果沒有就創建用戶並授權與上述操作一致不再贅述
mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| rep              | 192.168.70.% |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
| root             | localhost    |
+------------------+--------------+
5 rows in set (0.01 sec)

在master1上測試
[root@mysql01 ~]# mysql -urep -hmaster2 -p'Xuxin_0709';

2.配置master1

mysql> change master to master_host='master2',master_user='rep',master_password='Xuxin_0709',master_auto_position=1;   //基於GTID

讓master1也有從的功能,所以現在master1 master2都即是主,也是從。
mysql> start slave;

3.測試

在master2中插入數據
mysql> insert into xux.t1 values(6);

在master1看數據是否會同步
mysql> select * from xux.t1;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
|    5 |
|    6 |
+------+
6 rows in set (0.00 sec)

S-S

1.先把master1數據備份 傳給slave1 slave2

[root@mysql01 ~]# mysqldump -u root -p'Xuxin_0709' --all-databases --single-transaction --master-data=2 --flush-logs > mmss-mysql-all.sql

[root@mysql01 ~]# scp mmss-mysql-all.sql slave1:/root
[root@mysql01 ~]# scp mmss-mysql-all.sql slave2:/root

2.在slave1 slave2 導入數據(兩台機器都導入數據)

[root@mysql03 ~]# mmysql -uroot -p'Xuxin_0709' < mmss-mysql-all.sql
[root@mysql04 ~]# mmysql -uroot -p'Xuxin_0709' < mmss-mysql-all.sql

3.配置slave1 slave2 (從伺服器沒必要開啟log-bin)並重啟

[root@mysql03 ~]# vim /etc/my.cnf
server-id=3
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE

[root@mysql04 ~]# vim /etc/my.cnf
server-id=4
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE

[root@mysql03 ~]# systemctl restart mysqld
[root@mysql04 ~]# systemctl restart mysqld

4.設置主伺服器
slave1

mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master1';

mysql> change master to master_host='master2',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master2';

mysql> start slave;

mysql> show slave status\G

slave2

mysql> change master to master_host='master1',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master1';

mysql> change master to master_host='master2',master_user='rep',master_password='Xuxin_0709',master_auto_position=1 for channel 'master2';

mysql> start slave;

mysql> show slave status\G

5.測試
在master1 master2 變更數據

​ master1

mysql> insert into xux.t1 values(7);

查看master2 slave1 slave2數據是否變化
mysql> select * from xux.t1;

​ master2

mysql> insert into xux.t1 values(8);

查看master1 slave1 slave2數據是否變化
mysql> select * from xux.t1;

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

-Advertisement-
Play Games
更多相關文章
  • ## 引言 深拷貝是指創建一個新對象,該對象的值與原始對象完全相同,但在記憶體中具有不同的地址。這意味著如果您對原始對象進行更改,則不會影響到複製的對象 常見的C#常見的深拷貝方式有以下4類: 1. 各種形式的序列化及反序列化。 2. 通過反射機制獲取該對象的所有欄位和屬性信息。遍歷所有欄位和屬性,遞 ...
  • 本文介紹如何使用Centos伺服器部署Docker和Docker Compose. ### 背景信息 本文中的命令使用的是**root用戶**登錄執行, 若不是root用戶要註意許可權問題. 筆者這裡使用的是阿裡雲伺服器, Linux版本為Centos 7.9, 使用SSH遠程連接到伺服器. ### ...
  • ## 固件升級方案綜述 單片機的固件升級方式有很多種, 1、ICP:In Circuit Programing,簡單說就是在單片機開發時使用燒錄器升級程式,比如使用J-Link燒錄單片機程式。 2、ISP:In System Programing,在單片機內部實現了基於通信介面(如串口、I2C、SP ...
  • 開始之前簡單講下源和包管理器的概念,個人理解如下: 源就是平時我們win電腦上的360軟體管家、騰訊軟體管家、微軟商店這個意思,提供下載各類軟體包、安裝包的平臺; 包管理器就是win電腦上各類軟體的安裝包,例如qq.exe、360.msi等,需要下載後用指定的命令可以進行安裝、協助等操作,跟源配合使 ...
  • ## [Ooonly] 前情提要:需要刷寫一整個app程式,分包刷寫,每包位元組數為單數,要求CRC校驗正確。(晶元底層提供32位全字刷寫和16位半字刷寫,驅動只整合了32位全字刷寫函數) 使用32位刷寫函數出現的現象:通過keil5觀察記憶體空間發現一包刷寫成功一包刷寫失敗一包刷寫成功...一直迴圈到 ...
  • 提要:本系列文章主要參考`MIT 6.828課程`以及兩本書籍`《深入理解Linux內核》` `《深入Linux內核架構》`對Linux內核內容進行總結。 記憶體管理的實現覆蓋了多個領域: 1. 記憶體中的物理記憶體頁的管理 2. 分配大塊記憶體的伙伴系統 3. 分配較小記憶體的slab、slub、slob分 ...
  • 本文將詳細介紹如何發佈.NET Core項目到IIS伺服器。首先,第一步需要安裝IIS,介紹了在本地電腦和伺服器中進行安裝。然後需要安裝SDK和運行時才能發佈.NETCore項目。其次介紹瞭如何發佈.NETCore項目和Vue項目,並配置IIS。最後介紹瞭如何將項目部署到Service服務中。 ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230815092340479-67825278.png) # 1. 事務日誌 ## 1.1. 事務日誌有助於提高事務的效率 ### 1.1.1. 存儲引擎只需要更改記憶體中的數 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...