1. 程式人生 > >基於docker搭建mysql主從+haproxy負載均衡

基於docker搭建mysql主從+haproxy負載均衡

    使用容器對於部署來說省了不少事情,容器也有利於自己做各種分散式的架構實驗。這裡說一下使用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配置日誌位置

  • 從節點
   1、配置同步日誌

   配置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負載均衡基本就這些內容了。只不過在生產環境是容器間通訊,需要進行額外的處理。這裡是同宿主機中的容器通訊,只需要用預設的網橋模式,或者自定義基於網橋的網路即可。