MySQL(14)---Docker搭建MySQL主從復制(一主一從)


Docker搭建MySQL主從復制(一主一從)

上一篇博客寫了MYSQL主從復制原理 : MySQL(13)---MYSQL主從復制原理

這篇我們來寫 Docker搭建MYSQL主從復制(一主一從)

一、Docker安裝MYSQL

說明 系統為阿里雲服務器,操作系統為CentOS7.6。MYSQL版本 8.0.22

1、安裝Docker

sudo apt-get update
sudo apt install docker.io

2、拉取MySQL的鏡像

# 沒有指定版本代表拉取最新版本 目前這里最新的是8.0.22。如果想指定版本可以docker pull mysql:5.7 代表下載5.7版本
docker pull mysql

運行完以上命令之后,鏡像就已經下載下來了,可以用 docker images 命令查看是否已經下載成功

3、第一次啟動MySQL

docker run -p 3306:3306 --name MYSQL8 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

參數說明

-p 3306:3306:  將容器內的3306端口映射到實體機3306端口
--name MYSQL8: 給這個容器取一個容器記住的名字
-e MYSQL_ROOT_PASSWORD=123456: docker的MySQL默認的root密碼是隨機的,這是改一下默認的root用戶密碼
-d mysql:latest: 在后台運行mysql:latest鏡像產生的容器

之后的第二次啟動直接用 docker start MYSQL8 即可。

4、連接navicat

新裝了MYSQL8.0后再用navicat連接就會報2059的錯誤。上網查了發現是8.0之后MYSQL更改了密碼的加密規則,只要在命令窗口把加密方法改回去即可。

1) 首先使用以下命令進入MySQL的Docker容器

# MYSQL8是上面啟動的時候 為該容器起的名稱
docker exec -it MYSQL8 bash

2)然后登錄MySQL

#這里的密碼就是上面設置的密碼
mysql -uroot -p123456

3)最后運行以下SQL即可

alter user 'root'@'%' identified by '123456' password expire never;
alter user 'root'@'%' identified with mysql_native_password by '123456';
flush privileges;

這樣就可以通過navicat工具連接當前數據庫了。這里順便看下當前MYSQL的版本,通過 select version();

明顯可以看到當前MYSQL的版本是 8.0.22

注意 我這邊Master庫和Slave庫不在同一個服務器,所以Slave安裝MYSQL的步驟和Master一樣就可以了。一定要記住Msater庫和Slave庫的MYSQL版本號要一致


二、配置Master和Slave

這里假設主從服務器的IP如下

1、配置Master

因為是通過Docker部署的MYSQL,所以要進入Docker內部修改MYSQL配置文件

# MYSQL8是上面啟動的時候 為該容器起的名稱
docker exec -it MYSQL8 bash

進入容器后,切換到 /etc/mysql 目錄下,使用vim命令編輯 my.cnf 文件。

注意 此時用vim 命令會報 vim: command not found,因此我們需要在Docker內部安裝vim工具。安裝步驟推薦一篇博客:vi: command not found

在my.cnf添加如下配置

## 同一局域網內注意要唯一
server-id=100  
## 開啟二進制日志功能,可以隨便取(關鍵)
log-bin=mysql-bin

添加完后保存,同時退出當前Docker容器。因為修改了配置文件,所以要重啟下該MYSQL,這里重啟下該Docker容器就好了。

#  MYSQL8是上面啟動的時候 為該容器起的名稱
docker restart MYSQL8

這個時候我們通過工具連接該MYSQL服務器,你可以通過navicat或者Sequel pro等等,連接登上后。

創建用戶並授權

--為從庫服務器 設置用戶名和密碼(表明從服務器的ip必須為47.00.00.02,賬號為slave 密碼123456
CREATE USER 'slave'@'47.00.00.02' IDENTIFIED BY '123456'; 
grant replication slave, replication client on *.* to 'slave'@'47.00.00.02'; --設置權限
flush privileges;  --權限生效

至此,Master配置完成。

2、配置從庫

和上面一樣進入到 etc/mysql 路徑,使用vim命令編輯 my.cnf 文件:

## 設置server_id,注意要唯一 和master也不能一樣
server-id=101 
## 開啟二進制日志功能,以備Slave作為其它Slave的Master時使用
log-bin=mysql-slave-bin  
## 設置為只讀,該項如果不設置,表示slave可讀可寫
read_only = 1

配置完成后也需要重啟Docker容器。

#  MYSQL是上面啟動的時候 為該容器起的名稱
docker restart MYSQL8

3、開啟Master-Slave主從復制

上面兩步Master和Slave都配置成功了,而且Master也為Slave讀取Master數據專門設置了一個賬號,下面就來實現同步。

進入Master庫

查看Master狀態

--通過該命令可以查看master數據庫當前正在使用的二進制日志及當前執行二進制日志位置
show master status

記住File和Position,后面Slave庫會在這個文件這個位置進行同步數據。此時一定不要操作Master庫,否則將會引起Master狀態的變化,File和Position字段也將會進行變化。

進入Slave庫

執行SQL

change master to
master_host='47.00.00.01',
master_user='slave',
master_password='123456',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=156 ;

命令說明

master_host :Master庫的地址,指的是容器的獨立ip,可以通過:
master_port :Master的端口號,指的是容器的端口號(默認3306)
master_user :用於數據同步的用戶
master_password :用於同步的用戶的密碼
master_log_file :指定 Slave 從哪個日志文件開始復制數據,即上文中提到的 File 字段的值
master_log_pos :從哪個 Position 開始讀,即上文中提到的 Position 字段的值

使用start slave命令開啟主從復制過程

start slave;  -- 順便提供下其它命令 stop slave 停止slave。reset slave重啟slave。 reset master重啟master。

啟動之后我們來看下有沒有成功。

show slave status命令

從這張圖很明顯看出,對於Slave的兩個線程都成功了,那就說明整個MYSQL主從搭建成功了。如果有一個為NO,那就需要到后面看錯誤日志,是什么原因出錯了,解決下就好了。

Slave_IO_Running: 從服務器中I/O線程的運行狀態,YES為運行正常
Slave_SQL_Running: 從服務器中SQL線程的運行狀態,YES為運行正常

三、測試

這里簡單做一個測試

1、只在Mater 創建一張User表

現在 只在Mater 創建一張User表,如果現在Slave也同樣生成這張User表,那就說明成功了。

CREATE TABLE `user` (
  `id` bigint NOT NULL COMMENT '主鍵',
  `user_name` varchar(11) NOT NULL COMMENT '用戶名',
  `password` varchar(11) NOT NULL COMMENT '密碼',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='用戶表';

實際測試結果是成功的。

注意

這里如果我們先手動在Slave創建這張User表,然后再到Master創建User表那就出事情了。我們按照上面的步驟創建完后,去Slave通過 show slave status 查看

發現 SQL線程都變NO了。原因很簡單,錯誤日志也說明了(Error 'Table 'user' already exists')。因為你在Master創建User表的SQL會記錄到bin-log日志中,然后Slave

去讀取這個操作,然后寫入Slave中的時后發現這個SQL執行失敗,因為你Slave已經存在該User表,然后這整個主從復制就卡在這里了。這是個很嚴重的問題。

所以一旦搭建主從復制成功,只要在Master做更新事件(update、insert、delete),不要在從數據做,否則會出現數據不一致甚至同步失敗。

2、Master插入一條數據

INSERT INTO `user` (`id`, `user_name`, `password`, `create_time`)
VALUES
	(0, '張三', '123456', '2020-11-25 04:29:43');

再去Slave數據庫查看

發現從數據庫已經寫入成功了。

總結:在搭建的過程可能還有其它的問題出現 你只要在Slave服務器,通過show slave status,如果兩個IO是否為YES就代表是否成功,如果有為NO的,

后面有字段說明是什么原因導致的,你再根據相關錯誤信息去查詢下解決方案,那就可以了。


參考

1、Docker安裝MySQL8.0

2、MySQL主從同步機制和同步延時問題追查

3、Docker搭建MySQL主從復制



別人罵我胖,我會生氣,因為我心里承認了我胖。別人說我矮,我就會覺得好笑,因為我心里知道我不可能矮。這就是我們為什么會對別人的攻擊生氣。
攻我盾者,乃我內心之矛(33)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM