CentOS7 快速搭建基於Rancher 1.6 的容器自動化資源調度平臺(二) MySQL主從複製

概要

主要是基於Rancher搭建MySQL5.7 的主從複製的雙機模式

添加服務 -MySQL57-master

應用-> 用戶 -> 選擇對應的應用 ->添加服務

圖中鏡像名稱:mysql:5.7.23

clipboard.png

對該服務添加一些信息

這個就同 Docker 啓動 一個容器一樣,有些需要指定 端口、卷、或者變量
配置環境變量

clipboard.png

圖中變量
MYSQL_ROOT_PASSWORD=123456
TZ=Asia/Shanghai
映射卷

clipboard.png

路勁映射爲:
/d01/test/mysql/db:/var/lib/mysql
/d01/test/mysql/conf:/etc/mysql/conf.d
/d01/test/mysql/backup:/backup
配置調度規則
所謂調度規則就是Rancher會根據該配置的規則,覺得該容器啓動的時候會在哪個主機上面運行。
這個標籤就是在添加主機的時候配置,添加主機完成之後也可以添加標籤

調度規則:
如果配置的標籤,也就是鍵值對只在一臺主機上出現,那麼該容器就是隻在該主機上運行,但是如果這個標籤在多臺主機上出現,那麼該容器就會隨機選一臺主機運行。

clipboard.png

啓動成功

clipboard.png

添加Salve節點 - MySQL57-salve

在添加 MySQL的從節點的時候,有兩個地方需要修改
  • 服務名稱
  • 調度規則: 不能讓所有的mysql都是同一臺主機上面運行

配置圖例如下:

clipboard.png

clipboard.png

配置負載均衡規則

該配置主要是將內部端口進行轉換,掩護真正開發的接口

添加負載均衡

clipboard.png

開始配置負載均衡的內容

clipboard.png

clipboard.png

defaults
    mode tcp
    retries 2               #兩次連接失敗就認爲是服務器不可用,也可以通過後面設置
    option redispatch       #當serverId對應的服務器掛掉後,強制定向到其他健康的服務器
    option abortonclose     #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的鏈接
    maxconn 4096            #默認的最大連接數
    timeout client          0
    timeout server          0
將調度規則配置到安裝rancher的主機上

clipboard.png

ok! 等待 該負載均衡啓動成功!
使用Navicat 測試數據庫連接

clipboard.png

配置MySQL主從複製

MySQL主從複製和讀寫分離的區別

一直依賴都有人將主從複製和讀寫分離是混淆的。但是在我看來MySQL讀寫分離跟主從複製根本就是兩回事。

主從複製

首先主從複製一種數據冗餘的技術,簡單來說是用數據備份的。體現爲一個數據庫節點將數據以異步同步的形式同步到另外數據庫節點的技術。首先這是一種異步的方式進行同步的,這種異步同步數據也不是每時每刻進行的,所以這種方式的數據同步是保證了數據實時一致性。

讀寫分離

而讀寫分離,簡單來理解就是將針對一個數據庫的讀寫操作分離出來,某個數據庫只進行讀操作、某個數據庫進行寫操作,而在主從複製是可以應用到讀寫分離中來的。
因爲爲了保證數據庫的數據的完整性,寫操作時只能在主庫進行的,而讀操作時可以在主庫和從庫進行的。但是很多人更多是主庫讀、從庫寫這樣子進行操作的。

大概過程如下圖所示:

clipboard.png

上面我瞎說一堆理論,哪如何配置這樣的主從複製的環境呢?

搭建MySQL主從複製

MySQL 的主從複製是通過配置文件來配置實現,是MySQL官方支持,不需要什麼中間插件。所以得找到MySQL的配置文件的位置。這個位置得從啓動MySQL服務的配置的 卷 中查看,如果沒有配置的話,得進去容器內部進行配置。

clipboard.png

所以得進入容器內部進行操作,但是這個就比較麻煩,先進入容器內部看看再說
怎麼進入容器內部呢?

二話不說,先來個docker --help

clipboard.png

這個命令的意思應該就是針對一個運行的容器執行命令,具體如何操作?
docker exec --help

clipboard.png

具體操作如下
clipboard.png

但是我們在查看mysql 這個my.cnf 這個配置配置文件的時候,是包含了/etc/mysql/conf.d/ 這個目錄中的配置文件的,然後在路徑映射中,我們配置了這個路徑映射的,所以我們直接在本地配置就好啦。
clipboard.png

開始配置

在本地主機找到上面的映射路徑,創建一個配置文件 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

但是如果您添加上了上面的配置仍然沒有生效的話,怎麼辦?

clipboard.png

查看容器啓動時候的日誌

# 命令如下:
docker logs <container id>

然後你可能看到的日誌如下:

clipboard.png

大概意思就是說: 在配置文件xx的第幾行中發現有配置項的前面沒有分組
那直接添加分組就好啦,具體是哪個分組呢?百度一個標準my.cnf配置文件結構即可。在這裏我直接告訴說啦
這個分組數mysqld

也就是直接在配置文件前面添加 [mysqld] 即可

最終配置文件示意圖如下:

clipboard.png

ok! 重啓容器!查看是否配置成功:

clipboard.png

以上是配置文件方面的配置工作,如果這個配置好,算是成功了一大半啦!

配置從服務器同步主服務器

這一步的工作是在連接好 mysql 執行的命令
可以在Navicat中執行。

以下操作分爲以下幾個步驟:

第一步:查看主服務器狀態

-- 在主服務器中執行以下命令
show master status;

結果:
clipboard.png

記住 FilePosition 這個兩個值

第二步:給從服務器分配數據同步的賬號並授權

-- 分配賬號密碼爲 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的值

clipboard.png

第四步:開始同步

start slave;

第五步:查看同步狀態

SHOW SLAVE STATUS;

clipboard.png

只有這兩個都是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>
在日誌中找到 上面那個錯誤信息:

clipboard.png

解決方法就是:在 從庫中找到 mysql.slave_master_info 這張表,清空該表
然後執行 reset slave; 就可以啦。

然後重新開始 change master ...
但是記得重新查看一些 master 的File、Position

MYSQL 主從複製驗證

  • 在主庫中創建一張 t_user

clipboard.png

  • 添加一條記錄

clipboard.png

  • 在從庫中查詢

clipboard.png

在從庫中開啓 只讀模式

注意:這個只讀模式針對的是 root 之外的用戶
  • 查看從庫的只讀狀態
show variables like 'read_only';

clipboard.png

  • 配置只讀

clipboard.png

  • 創建非 root 賬號

參考鏈接 - mysql新建用戶,修改權限

-- 在 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鏈接可能會出現 權限不夠
clipboard.png

解決方法: 刪除該用戶,重新創建一個外網支持的賬號

-- 刪除 hunter
drop user 'hunter'@'localhost';

create user "hunter"@"%" identified by "123456";

grant select,delete,update,insert,create on test.* to 'hunter'@'%';

flush privileges;
使用 Navicat 鏈接成功, 嘗試在從庫中添加數據,報以下錯誤!
clipboard.png

OK! 大功告成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章