目錄
- 環境配置
- 容器創建
- 主服務器
- 創建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位置是否變化。