Docker搭建MySQL的PXC方案集羣

搭建5個MySQL節點

  1. 拉取鏡像到本地
docker pull percona/percona‐xtradb‐cluster
  1. 鏡像名稱太長不方便使用,進行一下改名,改名後刪除原來的鏡像
docker tag percona/percona‐xtradb‐cluster pxc
docker rmi percona/percona‐xtradb‐cluster
  1. 創建內網網段net1
創建網段:docker network create --subnet=172.18.0.0/24 net1
查詢網段信息: docker inspect net1
刪除網段:docker network rm net1
  1. 創建docker數據卷
創建:docker volume create --name v1
查看數據卷信息:docker inspect v1
刪除:docker volume rm v1

 重複操作創建v1-v5共5個數據卷
 
創建備份數據卷:docker volume create --name backup
  1. 創建容器
    • node1啓動後一段時間再啓動其他節點沒如果node1沒初始化完成就啓動其他節點就會報錯
    • node如果啓動幾秒就掛掉了,刪除對應的數據卷之後再重新創建數據卷再啓動
    • 參數說明:
      • -d 後臺運行
      • -p 3307:3306 將容器內的3306端口映射到宿主機3307端口
      • -e 初始化MySQL的基本參數
      • -v 映射宿主機數據卷和容器目錄
      • –name 指定容器名
      • –net 指定容器的網關
      • –ip 指定容器的IP,如果不指定會自動生成
#創建第1個MySQL節點
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
#創建第2個MySQL節點
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
#創建第3個MySQL節點
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
#創建第4個MySQL節點
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
#創建第5個MySQL節點
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
  1. 外部嘗試連接5個MySQL節點,通過navicat進行連接
    • ip爲宿主機公網IP
    • 端口爲只設置到暴露到公網的端口
    • 用戶名root
    • 密碼abc123456

在這裏插入圖片描述
在這裏插入圖片描述

使用Haproxy實現負載均衡

MySQL各個節點之間通過TCP/IP協議進行交互,而使用較爲廣泛的負載均衡中間件nginx(適用於HTTP)就不太適合了,適用於TCP/IP協議的負載均衡中間件有Haproxy和LVS。這裏採用Haproxy來實現負載均衡

  1. 安裝Haproxy

拉取鏡像到本地

 docker pull haproxy

在宿主機創建haproxy.cfg的配置文件,放置在自定義目錄,如/root/docker/haproxy/

global
    #工作目錄
    chroot /usr/local/etc/haproxy
    #日誌文件,使用rsyslog服務中local5日誌設備(/var/log/local5),等級info
    log 127.0.0.1 local5 info
    #守護進程運行
    daemon


defaults
    log    global
    mode    http
    #日誌格式
    option    httplog
    #日誌中不記錄負載均衡的心跳檢測記錄
    option    dontlognull
    #連接超時(毫秒)
    timeout connect 5000
    #客戶端超時(毫秒)
    timeout client  50000
    #服務器超時(毫秒)
    timeout server  50000


#監控界面    
listen  admin_stats
    #監控界面的訪問的IP和端口
    bind  0.0.0.0:8888
    #訪問協議
    mode        http
    #URI相對地址
    stats uri   /dbs
    #統計報告格式
    stats realm     Global\ statistics
    #登陸帳戶信息
    stats auth  admin:abc123456
#數據庫負載均衡
listen  proxy-mysql
    #訪問的IP和端口
    bind  0.0.0.0:3306  
    #網絡協議
    mode  tcp
    #負載均衡算法(輪詢算法)
    #輪詢算法:roundrobin
    #權重算法:static-rr
    #最少連接算法:leastconn
    #請求源IP算法:source
    balance  roundrobin
    #日誌格式
    option  tcplog
    #在MySQL中創建一個沒有權限的haproxy用戶,密碼爲空。Haproxy使用這個賬戶對MySQL數據庫心跳檢測
    option  mysql-check user haproxy
    server  MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000
    server  MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive檢測死鏈
    option  tcpka  
  1. 啓動第一個Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy

參數說明

  • 4001:8888 :將haproxy暴露在8888的監控端口映射到宿主機
  • 4002:3306:將haproxy的3306端口映射到宿主機4002端口
  • 將haproxy的/usr/local/etc/haproxy目錄映射到宿主機的/root/docker/haproxy目錄,用於設置配置文件
  • haproxy取名爲h1
  • 使用網段net1
  • 手動設置一個ip爲172.18.0.7
  1. 啓動第一個Haproxy
    以界面交互方式進入容器:
docker exec -it h1 bash

加上配置文件啓動

haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 啓動第二個Haproxy容器
docker run -it -d -p 4003:8888 -p 4004:3306 -v /root/docker/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
  1. 啓動第一個Haproxy
    以界面交互方式進入容器:
docker exec -it h2 bash

加上配置文件啓動

haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 配置連接賬號

先任意登錄一個MySQL節點
在MySQL中創建一個沒有權限的haproxy用戶,密碼爲空。
Haproxy使用這個賬戶對MySQL數據庫心跳檢測

CREATE USER 'haproxy' @'%' IDENTIFIED BY '';
  1. 訪問Haproxy監控
    url可以是任意一個節點的監控端口
公網ip:4001/dbs
公網ip:4003/dbs

訪問界面如圖所示
在這裏插入圖片描述
使用的時候就可以直接向haproxy節點發起請求,haproxy只是對請求進行轉發,並不會進行存儲
用navicat連接一個節點方便使用
在這裏插入圖片描述

Keepalived實現高可用方案

PXC集羣的目的是保證單節點MySQL故障時的高可用
引入Haproxy做負載均衡後,所有的請求都需要Haproxy進行轉發
如果Haproxy宕機了,同樣不能做到集羣高可用
所以需要對Haproxy也進行高可用配置

方案如下
在這裏插入圖片描述
現在已經配置好了數據庫集羣和兩個節點的Haproxy
還需要在兩個Haproxy上各配置一個Keepalived
然後在宿主機上配置一個Keepalived用於爲外提供服務

  1. 在haproxy上安裝keepalived(haproxy鏡像使用的是unbuntu,所以以下操作使用apt-get)

進入haproxy

docker exec -it h1 bash

更新apt-get

apt-get update

下載keepalived

apt-get install keepalived

修改keepalived配置文件

因爲keepalived鏡像裝載ubuntu上,如果直接修改還需要裝vim等工具,所以可以在宿主機寫好了複製進來或者設置目錄映射

編寫keepalived.conf文件

vrrp_instance  VI_1 {
    state  MASTER    #keepalived的身份:MASTER主服務,會搶佔虛擬ip;BACKUP備用服務
    interface  eth0  #網卡配置較:etho是docker虛擬機的網卡,宿主機能訪問但是局域網不能訪問,宿主機的keepalived上將網卡映射到局域網
    virtual_router_id  51   #id:0-255間隨便取
    priority  100    #權重,根據硬件配置調整數字
    advert_int  1    # 心跳檢測的時間間隔  1s
    authentication {   #心跳檢測需要開放的密碼
        auth_type  PASS
        auth_pass  123456
    } 
    virtual_ipaddress {  #eth0開放的虛擬ip
        172.18.0.201
    }
}

採用宿主機寫好再複製的操作:

docker cp 宿主機文件路徑  鏡像名稱:鏡像中文件存放路徑
docker cp /root/keepalived.conf h1:/etc/keepalived/

啓動keepalived

service keepalived start

返回宿主機測試是否啓動成功

ping 172.18.0.201

同理修改h2中的配置,其中所有的配置包括ip設置都一模一樣

  1. 宿主機安裝keepalived
yum ‐y install keepalived

修改配置文件

vi /etc/keepalived/keepalived.conf

配置文件如下
其中:

  • 172.26.0.288表示本地網關下的任意一個IP
  • 查看本地網關可以通過:ip addr / ifconfig / ip a 查看
  • 172.18.0.201表示Haproxy的IP
  • 8888是Haproxy監控的端口
  • 3306是MySQL的端口
	virtual_server 172.26.0.228 8888 {
        delay_loop 3
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP


        real_server 172.18.0.201 8888 {
            weight 1
        }
    }


    virtual_server 172.26.0.228 3306 {
        delay_loop 3
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP


        real_server 172.18.0.201 3306 {
            weight 1
        }
    }

啓動keepalived

service keepalived start

啓動完成之後可以通過ping自定義的IP來查看是否連接成功

ping 172.26.0.228
  1. 數據熱備份

進入node1

docker exec ‐it node1 bash 

更新apt-get

apt‐get update 

安裝熱備份工具

apt‐get install percona‐xtrabackup‐24

進行全量熱備份

innobackupex ‐‐user=root ‐‐password=abc123456 /data/backup/full
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章