目錄
- 一 主從復制概念
- 二 主從復制的優勢
- 三 Docker容器實現Mysql主從復制
- 3.1 創建主服務器容器
- 3.2 新建主配置文件 my.cnf
- 3.3 重啟master容器實例
- 3.4 進入mysql-master容器
- 3.5 在主服務器中創建用戶并授權
- 3.6 創建從服務器容器
- 3.7 新建主配置文件 my.cnf
- 3.8 重啟slave容器實例
- 3.9 在主數據庫中查看主從同步狀態
- 3.10 進入mysql-slave容器
- 3.11 在從數據庫中配置主從復制
- 3.12 在從數據庫中查看主從同步狀態
- 3.13 在從數據庫中開啟主從同步
- 3.14 查看從數據庫狀態是否同步
- 3.15 主從復制測試
- 總結
一 主從復制概念
在數據庫中主從復制“表示有一個主數據庫,多個從數據庫,即,主數據庫對外提供讀寫功能,從數據庫對外提供讀的功能。
Mysql默認采用異步復制方式,這樣從節點不用一直訪問主服務器來更新自己的數據,數據的更新可以實時在遠端進行。
二 主從復制的優勢
- 高可用,可用于故障切換,如果主庫掛了,則可以切到從庫
- 讀寫分離,減少主庫壓力,從而提高性能,主庫負責寫,從庫負責讀
- 可備份數據,避免影響業務
三 Docker容器實現Mysql主從復制
下面開始進入實戰環節,一步步的教大家如何搭建主從數據庫,小伙伴趕快練習一下吧。
3.1 創建主服務器容器
主服務器端口號為3307
docker run -p 3307:3306 --name mysql-master \ -v /Users/zengzhaoxia/mydata/mysql-master/log:/var/log/mysql \ -v /Users/zengzhaoxia/mydata/mysql-master/data:/var/lib/mysql \ -v /Users/zengzhaoxia/mydata/mysql-master/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7
創建完成之后,別忘記再 docker ps一下,確保是否創建成功
補充:如果MYSQL_ROOT_PASSWORD的密碼設置為root,當登錄數據庫時可能會報和權限相關的錯誤,所以,不妨將密碼改為數字試試,比如123456。
3.2 新建主配置文件 my.cnf
進入/mydata/mysql-master/conf目錄下新建my.cnf,my.cnf 內容如下:
[mysqld] ## 設置server_id,同一局域網中需要唯一 server_id=101 ##指定不需要同步的數據庫名稱 binlog-ignore-db=mysql ##開啟二進制日志功能 log-bin=mall-mysql-bin ## 設置二進制日志使用內存大小(事務) binlog_cache_size=1M ## 設置使用的二進制日志格式(mixed,statement,row) binlog_format=mixed ## 二進制日志過期清理時間,默認值為0,表示不自動清理 expire_logs_days=7 ## 跳過主從復制中遇到的所有錯誤或指定類型的錯誤,避免slave端復制中斷。 ## 如:1062 錯誤是指一些主鍵重復,1032錯誤是因為主從數據庫數據不一致 slave_skip_errors=1062
切記切記,此處一定是 [mysqld],不要寫成了[mysql]。
3.3 重啟master容器實例
因為第二步修改了配置文件,所以需要重啟docker容器
docker restart mysql-master docker ps
3.4 進入mysql-master容器
進入mysql-master容器,并登錄數據庫,可以看到當前有哪些默認的數據庫。
docker exec -it mysql-master /bin/bash mysql -uroot -p show databases;
3.5 在主服務器中創建用戶并授權
##1. 建立用戶 mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; ##2. 授權 mysql>GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';
3.6 創建從服務器容器
從服務器容器的端口號為:3308
docker run -p 3308:3306 --name mysql-slave \ -v /Users/zengzhaoxia/mydata/mysql-slave/log:/var/log/mysql \ -v /Users/zengzhaoxia/mydata/mysql-slave/data:/var/lib/mysql \ -v /Users/zengzhaoxia/mydata/mysql-slave/conf:/etc/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -d mysql:5.7
創建完成之后,別忘記再 docker ps
一下,確保是否創建成功
3.7 新建主配置文件 my.cnf
進入/mydata/mysql-slave/conf目錄下新建my.cnf,my.cnf內容如下:
[mysqld] ## 設置server_id,同一局域網中需要唯一 server_id=102 ##指定不需要同步的數據庫名稱 binlog-ignore-db=mysql ##開啟二進制日志功能,以備slave作為其他數據庫實例的master時使用 log-bin=mall-slave1-bin ## 設置二進制日志使用內存大小(事務) 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=mall-mysql-relay-bin ## log_slave_updates表示slave將復制事件寫進自己的二進制日志 log_slave_updates=1 ## slave 設置為只讀(具有super權限的用戶除外) read_only=1
3.8 重啟slave容器實例
因為修改了配置,所以需要重啟 slave 實例
docker restart mysql-slave docker ps
3.9 在主數據庫中查看主從同步狀態
在主服務器中輸入如下命令:
mysql> show master status;
3.10 進入mysql-slave容器
docker exec -it mysql-slave /bin/bash
3.11 在從數據庫中配置主從復制
change master to master_host='100.100.32.185',master_user='slave',master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000002',master_log_pos=617,master_connect_retry=30;
其中,
字段 | 含義 |
---|---|
master_host | 主數據庫的IP地址 |
master_port | 主數據庫的運行端口 |
master_user | 在主數據庫創建的用于同步數據的用戶賬號 |
master_password | 在主數據庫創建的用于同步數據的用戶密碼 |
master_log_file | 指定從數據庫要復制數據的日志文件,通過查看主數據的狀態,獲取file參數 |
master_log_pos | 指定從數據庫從哪個位置開始復制數據,通過查看主數據的狀態,獲取Position參數 |
master_connect_retry | 連接失敗重試的時間間隔,單位為秒 |
3.12 在從數據庫中查看主從同步狀態
mysql> show slave status \G; ## 加入 \G表示 豎排以鍵值對的形式顯示,主要觀察Slave_IO_Running和Slave_SQL_Running
3.13 在從數據庫中開啟主從同步
在從數據庫中操作,表示從數據庫同意接收數據
start slave;
3.14 查看從數據庫狀態是否同步
show slave status \G;
3.15 主從復制測試
驗證主要分為兩步,第一步在主數據庫中創建數據,第二步在從數據庫中查看數據。
1. 在主數據庫中新建數據庫db01,并在db01中新建表t1,并插入數據 create database db01; use db01; create table t1(id int,name varchar(20)); insert into t1 values(1,'zeng'); 2. 在從數據庫中查詢 show databases;//會看到db01數據庫 use db01; select * from t1;