主要是基於Rancher搭建MySQL5.7 的主從複製的雙機模式
應用-> 用戶 -> 選擇對應的應用 ->添加服務圖中鏡像名稱:mysql:5.7.23html
這個就同 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會根據該配置的規則,以爲該容器啓動的時候會在哪一個主機上面運行。
這個標籤就是在添加主機的時候配置,添加主機完成以後也能夠添加標籤調度規則:
若是配置的標籤,也就是鍵值對只在一臺主機上出現,那麼該容器就是隻在該主機上運行,可是若是這個標籤在多臺主機上出現,那麼該容器就會隨機選一臺主機運行。mysql
在添加 MySQL的從節點的時候,有兩個地方須要修改
該配置主要是將內部端口進行轉換,掩護真正開發的接口
defaults mode tcp retries 2 #兩次鏈接失敗就認爲是服務器不可用,也能夠經過後面設置 option redispatch #當serverId對應的服務器掛掉後,強制定向到其餘健康的服務器 option abortonclose #當服務器負載很高的時候,自動結束掉當前隊列處理比較久的連接 maxconn 4096 #默認的最大鏈接數 timeout client 0 timeout server 0
ok! 等待 該負載均衡啓動成功!
一直依賴都有人將主從複製和讀寫分離是混淆的。可是在我看來MySQL讀寫分離跟主從複製根本就是兩回事。
主從複製 redis
首先主從複製一種數據冗餘的技術,簡單來講是用數據備份的。體現爲一個數據庫節點將數據以異步同步的形式同步到另外數據庫節點的技術。首先這是一種異步的方式進行同步的,這種異步同步數據也不是每時每刻進行的,因此這種方式的數據同步是保證了數據實時一致性。sql
讀寫分離 docker
而讀寫分離,簡單來理解就是將針對一個數據庫的讀寫操做分離出來,某個數據庫只進行讀操做、某個數據庫進行寫操做,而在主從複製是能夠應用到讀寫分離中來的。
由於爲了保證數據庫的數據的完整性,寫操做時只能在主庫進行的,而讀操做時能夠在主庫和從庫進行的。可是不少人更可能是主庫讀、從庫寫這樣子進行操做的。shell
大概過程以下圖所示:數據庫
上面我瞎說一堆理論,哪如何配置這樣的主從複製的環境呢?
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纔算是成功的!
其餘錯誤狀況解決
從SHOW SLAVE STATUS
的結果Last_IO_Error
查看緣由
通常都是如下幾個緣由:
一、IP或者端口寫錯,致使網絡不通
二、帳號密碼寫錯啦
三、File、Position寫錯解決:
一、先 stop slave;
二、修改 change master to ...
三、start slave;
若是出現這個問題,先stop slave
在而後查看一下 mysql 後臺日誌,方法:docker logs <container id>
在日誌中找到 上面那個錯誤信息:
解決方法就是:在 從庫中找到 mysql.slave_master_info 這張表,清空該表
而後執行 reset slave; 就能夠啦。而後從新開始 change master ...
可是記得從新查看一些 master 的File、Position
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 連接成功, 嘗試在從庫中添加數據,報如下錯誤!
![]()