基於docker搭建mysql主從+haproxy負載均衡
阿新 • • 發佈:2019-02-18
使用容器對於部署來說省了不少事情,容器也有利於自己做各種分散式的架構實驗。這裡說一下使用docker搭建mysql主從以及通過haproxy做從庫的負載均衡。
一、mysql主從
- 主節點
1、建立使用者,授權
create user 'repl'@'172.22.16.%' identified by 'repl';
grant replication slave on *.* to 'repl'@'172.22.16.%' identified by 'repl';
2、開啟bin-log日誌
檢視bin-log日誌是否開啟
show variables like 'log_bin';
配置my.conf檔案
server-id=1
log-bin=/var/lib/mysql/mysql-bin
server-id每個節點不能相同,log-bin配置日誌位置
- 從節點
配置my.conf檔案
server-id=2
relay-log=/var/lib/mysql/relay-bin
relay-log-index=/var/lib/mysql/repl-bin.index
relay-log指定同步日誌位置,relay-log-index指定同步索引日誌位置
- 指定主節點
1、檢視主節點狀態
show master status
CHANGE MASTER TO MASTER_HOST='172.22.16.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=107;
其中MASTER_LOG_FILE,MASTER_LOG_POS是上一部查詢出來的結果
2、檢視從節點狀態
show slave status\G;
如果發現從節點配置沒有成功,可以重啟從節點mysql服務,重啟slave
stop slave;
start slave;
再呼叫CHANGE MASTER命令
- 舊資料遷移
1、匯出主節點資料
FLUSH TABLES WITH READ LOCK;
mysqldump -h172.22.16.2 -u root -p123456 --opt -R test > test.sql
UNLOCK TABLES;
2、建立從節點資料
如果沒有資料庫,建立資料庫,然後倒入資料
mysql -h172.22.16.3 -u root -p123456 test < test.sql
3、重新繫結主節點
SLAVE STOP;
RESET SLAVE;
CHANGE MASTER TO MASTER_HOST='172.22.16.2',MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=330;
start slave;
4、檢視從節點狀態
show slave status\G;
如果從節點沒有設定成功,參考之前的處理方式
二、在docker中執行mysql
- 從官方庫拉取mysql映象
docker pull mysql:5.5
- 修改官方映象
1、啟動基於官方映象的容器
docker run -p 3306:3306 映象名
2、進入docker容器
docker exec -it 容器id
3、修改自己的配置
4、提交容器生成新的映象
docker commit 容器id 映象名
- 建立基於網橋的自定義網路
docker network create --driver bridge --subnet 172.22.16.0/16 --gateway 172.22.16.1 my_net
subnet為子網,gateway為閘道器- 啟動基於修改過的映象的容器
docker run -p 3306:3306 --name mysql-node1 -it --network=自定義網路名 --ip 自定義網路ip -v /usr/local/mysql/node1/logs:/logs -v /usr/local/mysql/node1/config/my.cnf:/etc/mysql/my.cnf -v /usr/local/mysql/node1/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --privileged=true 映象名
注意:需要掛載日誌檔案,配置檔案和資料檔案
三、haproxy負載均衡
- 建立統一的mysql使用者名稱密碼,許可權
主節點執行如下命令,自動會在從節點執行同樣的命令
create user 'admin'@'172.22.16.%' identified by 'nmamtfnmamtf';
grant all on *.* to 'admin'@'172.22.16.%';
- 配置haproxy
建立haproxy.conf檔案
global
daemon #後臺方式執行
nbproc 1
pidfile /usr/local/haproxy/conf/haproxy.pid
defaults
mode tcp #預設的模式mode { tcp|http|health },tcp是4層,http是7層,health只會返回OK
retries 2 #兩次連線失敗就認為是伺服器不可用,也可以通過後面設定
option redispatch #當serverId對應的伺服器掛掉後,強制定向到其他健康的伺服器
option abortonclose #當伺服器負載很高的時候,自動結束掉當前佇列處理比較久的連結
maxconn 4096 #預設的最大連線數
timeout connect 5000ms #連線超時
timeout client 30000ms #客戶端超時
timeout server 30000ms #伺服器超時
#timeout check 2000 #=心跳檢測超時
log 127.0.0.1 local0 err #[err warning info debug]
########test1配置#################
listen test1 #這裡是配置負載均衡,test1是名字,可以任意
bind 0.0.0.0:33060 #這裡是監聽的IP地址和埠,埠號可以在0-65535之間,要避免埠衝突
mode tcp #連線的協議,這裡是tcp協議
#maxconn 4086
#log 127.0.0.1 local0 debug
server s1 172.22.16.3:3306 #負載的機器
server s2 172.22.16.4:3306 #負載的機器,負載的機器可以有多個,往下排列即可
四、在docker中執行haproxy
- 從官方拉取haproxy映象
docker pull haproxy:1.7
- 啟動基於官方映象的容器
docker run -p 33060:33060 --name haproxy -e LANG=en_US.UTF-8 --network=自定義網路名 --ip 自定義網路ip -v /usr/local/haproxy/conf/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg 映象名
需要掛載配置檔案
基於容器搭建mysql主從+haproxy負載均衡基本就這些內容了。只不過在生產環境是容器間通訊,需要進行額外的處理。這裡是同宿主機中的容器通訊,只需要用預設的網橋模式,或者自定義基於網橋的網路即可。