溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MacOS如何使用Docker創建MySQL主從數據庫

發布時間:2021-12-28 10:37:59 來源:億速云 閱讀:161 作者:小新 欄目:開發技術
# MacOS如何使用Docker創建MySQL主從數據庫

## 前言

在當今數據驅動的時代,數據庫的高可用性和數據冗余變得尤為重要。MySQL作為最流行的開源關系型數據庫之一,其主從復制(Master-Slave Replication)功能是實現數據備份、負載均衡和讀寫分離的關鍵技術。本文將詳細介紹如何在MacOS系統上使用Docker容器技術快速搭建MySQL主從數據庫環境。

## 環境準備

### 系統要求
- MacOS 10.15或更高版本
- 已安裝Docker Desktop for Mac
- 建議內存4GB以上(Docker默認分配2GB)
- 終端工具(iTerm2或系統自帶終端)

### Docker環境檢查
在開始前,請確認Docker已正確安裝:

```bash
docker --version
# 輸出示例: Docker version 20.10.17, build 100c701

docker-compose --version
# 輸出示例: docker-compose version 2.6.0

基礎概念解析

MySQL主從復制原理

主從復制的工作流程: 1. 主庫(Master)將數據變更記錄到二進制日志(binlog) 2. 從庫(Slave)的I/O線程請求主庫的binlog 3. 主庫的binlog dump線程發送日志內容 4. 從庫將日志寫入中繼日志(relay log) 5. 從庫的SQL線程重放中繼日志中的事件

Docker網絡配置

我們將使用Docker的bridge網絡模式,確保容器間可以互相通信:

docker network create mysql-replication-net

主數據庫配置

1. 啟動MySQL主庫容器

docker run -d \
  --name mysql-master \
  --network mysql-replication-net \
  -e MYSQL_ROOT_PASSWORD=masterpass \
  -v $(pwd)/master-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0 \
  --server-id=1 \
  --log-bin=mysql-bin \
  --binlog-format=ROW \
  --gtid-mode=ON \
  --enforce-gtid-consistency=ON

參數說明: - --server-id: 必須唯一,主庫設為1 - --log-bin: 啟用二進制日志 - gtid-mode: 使用全局事務ID簡化復制

2. 配置主庫復制賬號

進入主庫容器:

docker exec -it mysql-master mysql -uroot -pmasterpass

執行SQL命令:

CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'replpass';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

-- 查看主庫狀態,記錄File和Position值
SHOW MASTER STATUS;

示例輸出:

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      835 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

從數據庫配置

1. 啟動MySQL從庫容器

docker run -d \
  --name mysql-slave \
  --network mysql-replication-net \
  -e MYSQL_ROOT_PASSWORD=slavepass \
  -v $(pwd)/slave-data:/var/lib/mysql \
  -p 3307:3306 \
  mysql:8.0 \
  --server-id=2 \
  --log-bin=mysql-bin \
  --binlog-format=ROW \
  --gtid-mode=ON \
  --enforce-gtid-consistency=ON \
  --skip-slave-start

注意: - --server-id必須與主庫不同 - --skip-slave-start防止自動啟動復制

2. 配置從庫連接主庫

進入從庫容器:

docker exec -it mysql-slave mysql -uroot -pslavepass

執行配置命令(使用之前記錄的master信息):

CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='repl',
MASTER_PASSWORD='replpass',
MASTER_AUTO_POSITION=1;

START SLAVE;

-- 查看從庫狀態
SHOW SLAVE STATUS\G

關鍵檢查項: - Slave_IO_Running: Yes - Slave_SQL_Running: Yes - Seconds_Behind_Master: 0

使用Docker Compose簡化部署

創建docker-compose.yml文件:

version: '3.8'

services:
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: masterpass
    volumes:
      - ./master-data:/var/lib/mysql
    ports:
      - "3306:3306"
    command: 
      - --server-id=1
      - --log-bin=mysql-bin
      - --binlog-format=ROW
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
    networks:
      - mysql-net

  mysql-slave:
    image: mysql:8.0
    container_name: mysql-slave
    environment:
      MYSQL_ROOT_PASSWORD: slavepass
    volumes:
      - ./slave-data:/var/lib/mysql
    ports:
      - "3307:3306"
    command:
      - --server-id=2
      - --log-bin=mysql-bin
      - --binlog-format=ROW
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
      - --skip-slave-start
    depends_on:
      - mysql-master
    networks:
      - mysql-net

networks:
  mysql-net:
    driver: bridge

啟動服務:

docker-compose up -d

測試主從復制

1. 在主庫創建測試數據

docker exec -it mysql-master mysql -uroot -pmasterpass
CREATE DATABASE replication_test;
USE replication_test;
CREATE TABLE users (id INT AUTO_INCREMENT, name VARCHAR(255), PRIMARY KEY(id));
INSERT INTO users(name) VALUES ('Alice'), ('Bob');

2. 在從庫驗證數據

docker exec -it mysql-slave mysql -uroot -pslavepass
SELECT * FROM replication_test.users;

應能看到與主庫相同的數據。

高級配置

半同步復制

提高數據一致性,確保至少一個從庫接收到數據:

在主庫配置:

INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 3000;

在從庫配置:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;

多線程復制

提高從庫應用速度:

STOP SLAVE;
SET GLOBAL slave_parallel_workers = 4;
START SLAVE;

監控與維護

常用監控命令

主庫:

SHOW MASTER STATUS;
SHOW PROCESSLIST;

從庫:

SHOW SLAVE STATUS\G
SHOW SLAVE HOSTS;

故障處理

常見問題及解決方案:

  1. 復制中斷

    STOP SLAVE;
    SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
    START SLAVE;
    
  2. 數據不一致: 使用pt-table-checksumpt-table-sync工具

  3. 網絡中斷: 自動重試機制,檢查master_retry_count參數

性能優化建議

  1. 主庫配置

    sync_binlog=1
    innodb_flush_log_at_trx_commit=1
    
  2. 從庫配置

    read_only=ON
    skip-slave-start=ON
    log_slave_updates=ON  # 如需級聯復制
    
  3. 硬件建議

    • 主庫使用SSD存儲
    • 為Docker分配足夠內存(建議4GB+)

常見問題解答

Q1: 如何添加新的從庫? A: 流程類似,確保: - 唯一server-id - 使用主庫備份初始化數據 - 正確配置復制參數

Q2: 主從數據不一致怎么辦? A: 可以: 1. 使用pt-table-sync修復 2. 重建從庫(通過主庫快照)

Q3: 如何升級MySQL版本? A: 建議流程: 1. 升級從庫并驗證 2. 切換從庫為主庫 3. 升級原主庫

結語

通過Docker在MacOS上搭建MySQL主從復制環境,我們實現了: - 快速部署和隔離的數據庫環境 - 數據冗余和高可用性基礎 - 方便的測試和開發環境

這種方案特別適合開發測試場景,如需生產環境使用,建議考慮: - 使用持久化存儲卷 - 配置監控告警系統 - 實施定期備份策略

附錄

常用命令速查表

功能 命令
查看容器狀態 docker ps -a
查看主庫binlog SHOW BINARY LOGS;
停止復制 STOP SLAVE;
重置從庫 RESET SLAVE ALL;
導出主庫數據 mysqldump --all-databases --master-data > backup.sql

參考資源

”`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女