概要
主要是基於Rancher搭建MySQL5.7 的主從複製的雙機模式
添加服務 -MySQL57-master
應用-> 用戶 -> 選擇對應的應用 ->添加服務圖中鏡像名稱:mysql:5.7.23
對該服務添加一些信息
這個就同 Docker 啓動 一個容器一樣,有些需要指定 端口、卷、或者變量
配置環境變量
圖中變量
MYSQL_ROOT_PASSWORD=123456
TZ=Asia/Shanghai
映射卷
路勁映射爲:
/d01/test/mysql/db:/var/lib/mysql
/d01/test/mysql/conf:/etc/mysql/conf.d
/d01/test/mysql/backup:/backup
配置調度規則
所謂調度規則就是Rancher會根據該配置的規則,覺得該容器啓動的時候會在哪個主機上面運行。
這個標籤就是在添加主機的時候配置,添加主機完成之後也可以添加標籤調度規則:
如果配置的標籤,也就是鍵值對只在一臺主機上出現,那麼該容器就是隻在該主機上運行,但是如果這個標籤在多臺主機上出現,那麼該容器就會隨機選一臺主機運行。
啓動成功
添加Salve節點 - MySQL57-salve
在添加 MySQL的從節點的時候,有兩個地方需要修改
- 服務名稱
- 調度規則: 不能讓所有的mysql都是同一臺主機上面運行
配置圖例如下:
配置負載均衡規則
該配置主要是將內部端口進行轉換,掩護真正開發的接口
添加負載均衡
開始配置負載均衡的內容
defaults
mode tcp
retries 2 #兩次連接失敗就認爲是服務器不可用,也可以通過後面設置
option redispatch #當serverId對應的服務器掛掉後,強制定向到其他健康的服務器
option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
maxconn 4096 #默認的最大連接數
timeout client 0
timeout server 0
將調度規則配置到安裝rancher的主機上
ok! 等待 該負載均衡啓動成功!
使用Navicat 測試數據庫連接
配置MySQL主從複製
MySQL主從複製和讀寫分離的區別
一直依賴都有人將主從複製和讀寫分離是混淆的。但是在我看來MySQL讀寫分離跟主從複製根本就是兩回事。
主從複製
首先主從複製一種數據冗餘的技術,簡單來說是用數據備份的。體現爲一個數據庫節點將數據以異步同步的形式同步到另外數據庫節點的技術。首先這是一種異步的方式進行同步的,這種異步同步數據也不是每時每刻進行的,所以這種方式的數據同步是保證了數據實時一致性。
讀寫分離
而讀寫分離,簡單來理解就是將針對一個數據庫的讀寫操作分離出來,某個數據庫只進行讀操作、某個數據庫進行寫操作,而在主從複製是可以應用到讀寫分離中來的。
因爲爲了保證數據庫的數據的完整性,寫操作時只能在主庫進行的,而讀操作時可以在主庫和從庫進行的。但是很多人更多是主庫讀、從庫寫這樣子進行操作的。
大概過程如下圖所示:
上面我瞎說一堆理論,哪如何配置這樣的主從複製的環境呢?
搭建MySQL
主從複製
MySQL 的主從複製是通過配置文件來配置實現,是MySQL官方支持,不需要什麼中間插件。所以得找到MySQL的配置文件的位置。這個位置得從啓動MySQL服務的配置的 卷 中查看,如果沒有配置的話,得進去容器內部進行配置。
所以得進入容器內部進行操作,但是這個就比較麻煩,先進入容器內部看看再說
怎麼進入容器內部呢?二話不說,先來個docker --help
這個命令的意思應該就是針對一個運行的容器執行命令,具體如何操作?
docker exec --help
具體操作如下但是我們在查看mysql 這個my.cnf 這個配置配置文件的時候,是包含了/etc/mysql/conf.d/ 這個目錄中的配置文件的,然後在路徑映射中,我們配置了這個路徑映射的,所以我們直接在本地配置就好啦。
開始配置
在本地主機找到上面的映射路徑,創建一個配置文件 vi /d01/test/mysql/conf/mysql-local.cnf
配置以下內容
# 注意 /d01/test/mysql/conf/mysql-local.cnf 這個路勁按自己映射的路徑配置即可
# 這個路徑映射的是 容器的 /etc/mysql/conf.d/ 這路徑
# 這個是主數據庫的配置
server_id = 101
log-bin=mysql-bin
# 這個是從服務器的配置
server_id=104 ###從服務器server_id
log-bin=mysql-slave-bin
## relay_log配置中繼日誌
relay_log=edu-mysql-relay-bin
注意
如果你在本地配置的mysql配置沒有生效,記得將配置文件後綴改爲*.cnf
查看該幫助 MySQL !includedir not working
但是如果您添加上了上面的配置仍然沒有生效的話,怎麼辦?
查看容器啓動時候的日誌
# 命令如下:
docker logs <container id>
然後你可能看到的日誌如下:
大概意思就是說: 在配置文件xx的第幾行中發現有配置項的前面沒有分組
那直接添加分組就好啦,具體是哪個分組呢?百度一個標準my.cnf配置文件結構即可。在這裏我直接告訴說啦
這個分組數mysqld
也就是直接在配置文件前面添加 [mysqld] 即可
最終配置文件示意圖如下:
ok! 重啓容器!查看是否配置成功:
以上是配置文件方面的配置工作,如果這個配置好,算是成功了一大半啦!
配置從服務器同步主服務器
這一步的工作是在連接好 mysql 執行的命令
可以在Navicat中執行。
以下操作分爲以下幾個步驟:
第一步:查看主服務器狀態
-- 在主服務器中執行以下命令
show master status;
結果:
記住File
、Position
這個兩個值
第二步:給從服務器分配數據同步的賬號並授權
-- 分配賬號密碼爲 slave/123456
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
第三步: 在從服務器中創建同步的連接
change master to master_host='192.168.182.103', master_port=18083, master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=968;
-- 注意上面幾個參數:
master_host : 主服務器的ip
master_port : 主數據庫對外開放的端口 也就是在上面負載均衡中配置
master_user : 主服務器配置的賬號
master_password : 密碼
master_log_file: 這個就是上面要記錄的那個 File 的值
master_log_pos: 這個是Position的值
第四步:開始同步
start slave;
第五步:查看同步狀態
SHOW SLAVE STATUS;
只有這兩個都是Yes纔算是成功的!
其他錯誤情況解決
- Slave IO Running 的值一直是 Connecting 狀態
從SHOW SLAVE STATUS
的結果Last_IO_Error
查看原因
一般都是以下幾個原因:
1、IP或者端口寫錯,導致網絡不通
2、賬號密碼寫錯啦
3、File、Position寫錯解決:
1、先 stop slave;
2、修改 change master to ...
3、start slave;
- 報錯: Slave failed to initialize relay log info structure from the repository
如果出現這個問題,先stop slave
在然後查看一下 mysql 後臺日誌,方法:docker logs <container id>
在日誌中找到 上面那個錯誤信息:
解決方法就是:在 從庫中找到 mysql.slave_master_info 這張表,清空該表
然後執行 reset slave; 就可以啦。然後重新開始 change master ...
但是記得重新查看一些 master 的File、Position
MYSQL 主從複製驗證
- 在主庫中創建一張
t_user
表
- 添加一條記錄
- 在從庫中查詢
在從庫中開啓 只讀模式
注意:這個只讀模式針對的是 root
之外的用戶
- 查看從庫的只讀狀態
show variables like 'read_only';
- 配置只讀
- 創建非
root
賬號
-- 在 root 賬號下創建
-- 格式:create user "username"@"host" identified by "password";
-- 授權: grant select on test.* to 'user1'@'localhost'; /*給予查詢權限*/
-- 刷新權限 : flush privileges;
--創建一個 hunter/123456 的賬戶
create user "hunter"@"localhost" identified by "123456";
-- 給hunter分配 test 數據庫下 select,delete,update,insert,create 的權限
grant select,delete,update,insert,create on test.* to 'hunter'@'localhost';
-- 刷新權限
flush privileges;
如果是@localhost
的話,在外面使用Navicat鏈接可能會出現 權限不夠解決方法: 刪除該用戶,重新創建一個外網支持的賬號
-- 刪除 hunter
drop user 'hunter'@'localhost';
create user "hunter"@"%" identified by "123456";
grant select,delete,update,insert,create on test.* to 'hunter'@'%';
flush privileges;
使用 Navicat 鏈接成功, 嘗試在從庫中添加數據,報以下錯誤!