docker實戰之搭建MYSQL8.0主從同步

目錄

  • 環境配置
  • 容器創建
    • 主服務器
      • 創建MYSQL容器
      • 新增my.cnf文件
      • 創建用戶并授權
    • 從服務器
      • 創建MYSQL容器
      • 新增my.cnf文件
      • 重啟MYSQL容器
      • 配置主從同步
  • 驗證主從同步
  • 彩蛋

MySQL 主從同步(Master-Slave Replication)是一種常用的解決方案,它允許一個主服務器(Master)將其數據復制到一個或多個從服務器(Slave)。這種架構不僅提高了數據的冗余性,還能通過讀取分離來提升應用的性能
關于MYSQL主從同步的原理以及八股文這篇文章中就暫時不講述啦,直接上干貨,面對許多同學沒有大量服務器,又想參與MYSQL集群實戰過程中,提升技能,這篇實操技能你值得擁有~

環境配置

正如文章主題,簡單明了,docker,會使用基本的docker命令即可,即使不會也沒有關系,溪源會帶著大家一步一步完成搭建。

  • 獲取MYSQL鏡像:docker命令
docker pull mysql:8.0.36
  • 本地服務器創建數據卷
/Users/docker/data/mysql/

對于docker實戰而言,少不了,主機目錄與容器數據卷映射之類的操作,所以可以將相關數據卷統一目錄管理;

  • 授權
chmod 777 /Users/docker/data/

授權所有用戶讀寫操作

容器創建

主服務器

創建MYSQL容器

docker run -d -p 3317:3306 --privileged=true \
-v /Users/docker/data/mysql/master/log:/var/log/mysql \
-v /Users/docker/data/mysql/master/data:/var/lib/mysql \
-v /Users/docker/data/mysql/master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql_master mysql:8.0.36
  • 命令說明:
**docker run**: Docker 命令,用于運行一個新的容器。**-d:** 以分離模式(detached mode)運行容器。容器將會在后臺運行,你不會看到容器的輸出。**-p 3317:3306:** 將主機的端口 3317 映射到容器的端口 3306。MySQL 默認監聽 3306 端口,通過這種映射,你可以通過主機的 3317 端口訪問 MySQL。**--privileged=true**:給予容器額外的權限。這通常用于需要訪問主機的硬件設備或執行某些受限操作的容器。在大多數情況下,這不是必要的,并且使用時應謹慎。**-v /Users/docker/data/mysql/master/log:/var/log/mysql**:
將主機目錄 /Users/docker/data/mysql/master/log 映射到容器的 /var/log/mysql 目錄。這樣,MySQL 的日志文件將會保存在主機上,即使容器刪除,日志文件也會保留。**-v /Users/docker/data/mysql/master/data:/var/lib/mysql**:
將主機目錄 /Users/docker/data/mysql/master/data 映射到容器的 /var/lib/mysql 目錄。MySQL 的數據文件將會保存在主機上,確保數據持久化。**-v /Users/docker/data/mysql/master/conf:/etc/mysql/conf.d**:
將主機目錄 /Users/docker/data/mysql/master/conf 映射到容器的 /etc/mysql/conf.d 目錄。可以在該目錄中放置 MySQL 配置文件(如 my.cnf),以便自定義 MySQL 配置。**-e MYSQL_ROOT_PASSWORD=123456**:
設置環境變量 MYSQL_ROOT_PASSWORD,用于初始化 MySQL 的 root 用戶密碼為 123456。這是在容器首次啟動時設置 MySQL root 用戶密碼的簡便方法。
**--name mysql_master** :
指定容器的名稱為 mysql_master。這樣你可以通過名稱而不是容器 ID 來引用這個容器。**mysql:8.0.36:**
使用 mysql 鏡像,并指定版本為 8.0.36。這將從 Docker Hub 拉取指定版本的 MySQL 鏡像,并在容器中運行。

新增my.cnf文件

路徑:上面新建文件的路徑:**/Users/docker/data/mysql/master/conf **
vim my.cnf

[mysqld]
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir= /var/lib/mysql
secure-file-priv= NULL
## 設置server_id,同一局域網中需要唯一
server_id=101 
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql  
## 開啟二進制日志功能
log-bin=binlog
## 設置二進制日志使用內存大小(事務)
binlog_cache_size=1M  
## 設置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7  
## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
# 設置默認時區
default-time_zone='+8:00'

創建用戶并授權

  • 進入容器:
    docker exec -it mysql_master /bin/bash

  • 執行語句創建slave用戶以及設置密碼
    mysql> CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

  • 執行語句授權slave
    mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

  • 退出容器,輸入 exit;
    mysql> exit; bash-4.4# exit

  • 執行重啟主數據庫:
    docker restart mysql_master;

在這里插入圖片描述

  • 重啟完成后,再次進入容器
    docker exec -it mysql_master /bin/bash
    進入MYSQL命令行

  • 查看主庫狀態
    show master status;
    在這里插入圖片描述

特別說明,此處的position特別重要,后面配置從服務器需要用到

從服務器

創建MYSQL容器

docker run -d -p 3318:3306 --privileged=true \
-v /Users/docker/data/mysql/slave01/log:/var/log/mysql \
-v /Users/docker/data/mysql/slave01/data:/var/lib/mysql \
-v /Users/docker/data/mysql/slave01/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
--name mysql_slave01 mysql:8.0.36

新增my.cnf文件

[mysqld]
pid-file= /var/run/mysqld/mysqld.pid
socket= /var/run/mysqld/mysqld.sock
datadir= /var/lib/mysql
secure-file-priv= NULL
## 設置server_id,同一局域網中需要唯一
server_id=102
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql  
## 開啟二進制日志功能,設置二進制日志名,默認binlog
log-bin=binlog  
## 設置二進制日志使用內存大小(事務)
binlog_cache_size=1M  
## 設置使用的二進制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二進制日志過期清理時間。默認值為0,表示不自動清理。
expire_logs_days=7  
## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。
## 如:1062錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062  
## relay_log配置中繼日志
relay_log=mysql-relay-bin  
## log_slave_updates表示slave將復制事件寫進自己的二進制日志
log_slave_updates=1  
## slave設置為只讀(具有super權限的用戶除外)
read_only=1
# 設置默認時區
default-time_zone='+8:00'
binlog-ignore-db=infomation_schema,配置同步,則主服務器用戶會直接同步到從服務器

重啟MYSQL容器

命令:docker restart mysql_slave;

配置主從同步

  • 進入從服務器
    進入容器:docker exec -it mysql_slave01 /bin/bash
    登錄MYSQL

  • 執行以下語句,在從數據庫配置主從復制

change master to master_host='主庫主機ip地址', master_user='2.1在主庫創建的賬號', master_password='2.1在主庫創建的密碼', master_port=3307, master_log_file='binlog.000004', master_log_pos=157, master_connect_retry=30;


執行語句:
change master to master_host='XXXXXX', master_user='slave', master_password='123456', master_port=3307, master_log_file='binlog.000004', master_log_pos=157, master_connect_retry=30;參數說明:
master_host:主數據庫的IP地址;
master_port:主數據庫的運行端口;
master_user:在主數據庫創建的用于同步數據的用戶賬號;
master_password:在主數據庫創建的用于同步數據的用戶密碼;
master_log_file:指定從數據庫要復制數據的日志文件,通過查看主數據的狀態,獲取File參數;
master_log_pos:指定從數據庫從哪個位置開始復制數據,通過查看主數據的狀態,獲取Position參數;
master_connect_retry:連接失敗重試的時間間隔,單位為秒。
  • 查看主從同步狀態
    show slave status \G;
    在這里插入圖片描述
    說明:此時Slave_IO_Running與Slave_SQL_Running為 NO狀態。

  • 開啟主從同步
    start slave;
    在這里插入圖片描述
    說明:Slave_IO_Running與Slave_SQL_Running為 Yes狀態

驗證主從同步

  • 主服務器創建數據庫和表
mysql> create database tenant;
Query OK, 1 row affected (0.01 sec)mysql> use tenant;
Database changed
mysql> CREATE TABLE users (->     user_id INT AUTO_INCREMENT PRIMARY KEY, --  ID->     username VARCHAR(50) NOT NULL UNIQUE,    -- 50->     email VARCHAR(100) NOT NULL UNIQUE,      -- 100->     password VARCHAR(255) NOT NULL,          -- 255->     created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- ->     updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- -> );
Query OK, 0 rows affected (0.04 sec)mysql> show tables;
+------------------+
| Tables_in_tenant |
+------------------+
| users            |
+------------------+
1 row in set (0.00 sec)
  • 查看從庫是否完成同步
    在這里插入圖片描述

彩蛋

哈哈哈,,,此篇彩蛋主要擴展解決問題方案,開啟主從同步時,如何取消主從配置說明。溪源在配置主從配置過程IP地址錯誤,導致從庫無法連接,如圖:
在這里插入圖片描述
Error connecting to source 'slave@localhost:3317'. This was attempt 2/86400, with a delay of 30 seconds between attempts. Message: Can't connect to MySQL server on 'localhost:3317' (99)
執行以下命令:

  • 停止復制進程:
    STOP SLAVE;
  • 清除所有復制配置:
    RESET SLAVE ALL;

然后按照從庫,再重新配置主從同步,但是一定要注意查看一下主庫的狀態,判斷position位置是否變化。

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

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

相關文章

Golang實現根據文件后綴刪除文件和遞歸刪除文件

概述 這個功能會非常強大,因為在日常工作中,我通常會遇到需要批量刪除文件的場景,通過這個方法,再結合我的另一個 命令行開發框架,能夠很輕松的開發出這個功能。 代碼 package zdpgo_fileimport ("errors"…

LabVIEW與串口通訊在運行一段時間后出現數據接收中斷的問題

這些問題可能與硬件、軟件或通信協議有關。以下是詳細的原因分析和可能的解決方案: 一、硬件原因 串口線纜或接口問題: 由于長時間使用,串口線纜可能出現接觸不良或損壞。接口松動也可能導致通訊中斷。 解決方案:檢查并更換串口…

C語言基礎-內存申請和釋放

在C語言中,malloc 和 free 是用于動態內存分配和釋放的函數。而在C中,new 和 delete 提供了類似的功能,但它們之間有一些重要的區別。 1. malloc 和 free malloc malloc 函數用于在堆上動態地分配指定字節數的內存。它的原型在 stdlib.h 頭…

【Text2SQL 經典模型】X-SQL

論文:X-SQL: reinforce schema representation with context ???? Microsoft, arXiv:1908.08113 X-SQL 與 SQLova 類似,使用 BERT style 的 PLM 來獲得 representation,只是融合 NL question 和 table schema 的信息的方式不太一樣&#…

一種獲取java代碼結構的實現思路

一種獲取java代碼結構的實現思路 有時,我們需要獲取java文件里的代碼結構,即,只需要里面的class定義、方法聲明、屬性定義。不需要額外的方法實現 這里提供一下實現思路: 采用語法解析器Tree-sitter對java代碼進行解析,獲取里面的方法實現遍歷第一步獲取到的方法列表,在源…

Linux c開發線程鎖和條件變量使用

#include <pthread.h> #include <stdio.h> #include <unistd.h>pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond PTHREAD_COND_INITIALIZER;void* thread_function(void* arg) {printf("線程等待喚醒,鎖定互斥量...\n");…

代碼隨想錄算法訓練營第十七天 | 110. 平衡二叉樹、257. 二叉樹的所有路徑、404. 左葉子之和

[LeetCode] 110. 平衡二叉樹 [LeetCode] 110. 平衡二叉樹 文章解釋 [LeetCode] 110. 平衡二叉樹 視頻解釋 給定一個二叉樹&#xff0c;判斷它是否是 平衡二叉樹 示例 1&#xff1a; 輸入&#xff1a;root [3,9,20,null,null,15,7] 輸出&#xff1a;true示例 2&#xff1a; 輸…

HTTP 響應分割漏洞

HTTP 響應分割漏洞 1.漏洞概述2.漏洞案例 1.漏洞概述 HTTP 響應拆分發生在以下情況&#xff1a; 數據通過不受信任的來源&#xff08;最常見的是 HTTP 請求&#xff09;進入 Web 應用程序。該數據包含在發送給 Web 用戶的 HTTP 響應標頭中&#xff0c;且未經過惡意字符驗證。…

CSS常用的兩種定位方式

在CSS中&#xff0c;absolute 和 relative 是兩種常用的定位方式&#xff0c;分別通過 position 屬性進行設置。它們用于控制元素在頁面中的位置。理解這兩種定位方式對于布局和設計響應式頁面非常重要。 position: relative 定義 relative 定位是相對自身原始位置進行偏移。…

Python 魂斗羅的音效和動漫效果

一、實現游戲音效 音效是游戲中不可或缺的一部分&#xff0c;它可以為游戲增添氛圍和趣味性。在 Pygame 中&#xff0c;我們可以使用 pygame.mixer 模塊來播放音效。下面是一個簡單的示例代碼&#xff0c;演示如何在游戲中播放音效&#xff1a; import pygamepygame.mixer.init…

windows平臺vcpkg安裝

1. 克隆vcpkg倉庫 git clone https://github.com/microsoft/vcpkg 2.運行bootstrap-vcpkg.bat下載vcpkg.exe 3.運行驗證 4.使用VCPKG安裝OPENSSL 5.安裝成功

VC++學習(1)——環境準備,參考文檔等,初步入門VC++

目錄 引出環境準備&#xff0c;參考文檔第一講 初步入門鍵盤按下的消息鼠標左鍵按下報錯源碼新建一個工程 總結 引出 VC學習&#xff08;1&#xff09;——環境準備&#xff0c;參考文檔等&#xff0c;初步入門VC C是一門編程語言,他的語法標準和語言特性是全球統一的 VC是微…

計算機系統概述習題

選擇題 電子計算機問世至今&#xff0c;新型計算機不斷推陳出新&#xff0c;不管怎么更新&#xff0c;依然具有“存儲程序”的特點&#xff0c;最早提出這種概念的是(B) A. 巴貝奇 B. 馮*諾伊曼 C. 帕斯卡 D. 貝爾 B下列描述中___是正確的。 A. 控制器能理解&#xff0c;解釋…

中國主要城市房價指數數據集(2011-2024)

數據來源&#xff1a;東方財富網 時間跨度&#xff1a;2011年1月 - 2024年4月 數據范圍&#xff1a;中國主要城市 包含指標&#xff1a; 日期、城市 新建商品住宅價格指數-同比 新建商品住宅價格指數-環比 新建商品住宅價格指數-定基 二手住宅價格指數-環比 二手住宅價格指…

Visual Studio 調試及快捷鍵

文章目錄 原文連接環境一、調試器的基本使用1、更改執行流2、快速執行某一條代碼斷點設置條件斷點查看內存信息查看調用堆棧查看寄存器信息設置監視斷點調試二、快捷鍵一、窗口快捷鍵二、查找相關快捷鍵三、代碼快捷鍵原文連接 【教程】visual studio debug 技巧總結 環境 一…

OpenCASCADE Draw模塊TKDraw項目問題修改

1.問題 在調試Draw模塊代碼時&#xff0c;出現一個小問題&#xff0c;導致無法正常運行 如下&#xff1a; 2.代碼跟蹤 通過代碼跟蹤發現時一個數組越界問題&#xff0c;在此處添加了判斷處理&#xff0c;程序可以正常調試

Golang使用HTTP框架zdpgo_resty實現文件下載

核心代碼 代碼解析&#xff1a; client.SetOutputDirectory("Downloads") 設置下載目錄client.R().SetOutput("test.go").Get("http://127.0.0.1:3333/download 指定下載文件名并進行下載 // 設置輸出目錄路徑&#xff0c;如果目錄不存在&#xff…

數據結構順序表實現通訊錄

目錄 1. 前言&#xff1a; 2.通訊錄項目的創建 3. 通訊錄的實現 3.1 通訊錄的初始化 3.2 通訊錄的銷毀 3.3 通訊錄添加數據 3.4 通訊錄查找數據 3.5 通訊錄展示數據 3.6 通訊錄刪除數據 3.7 通訊錄修改數據 4. 通訊錄完整代碼 4.1 test.c 4.2 SeqList.h 4.3 SeqLis…

PostgreSQL學習筆記

PostgreSQL 基本概念和架構 PostgreSQL 是一個功能強大的開源對象關系數據庫管理系統&#xff08;ORDBMS&#xff09;&#xff0c;其設計目標是遵循 SQL 標準&#xff0c;并提供豐富的功能&#xff0c;如復雜查詢、外鍵、觸發器、視圖和事務處理。以下是 PostgreSQL 的基本概念…

數據結構(Java實現):ArrayList

目錄 1.ArrayList簡介2.ArrayList構造方法分析3.ArrayList的add方法以及擴容機制4.ArrayList常用方法5.ArrayList遍歷6.ArrayList的缺陷 1.ArrayList簡介 在集合框架中&#xff0c;ArrayList是一個普通的類&#xff0c;實現了List接口&#xff0c;具體框架圖如下&#xff1a; …