1. 程式人生 > >mysql高可用-基於docker容器下的pxc叢集方案

mysql高可用-基於docker容器下的pxc叢集方案

mysql單機效能測試

mysqlslap -h192.168.1.16 -uroot -p123456 -P3306 --concurrency=5000 --iterations=1 --auto-generate-sql --auto-generate-sql-load-type=mixed --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=5000 --debug-info

關於這個測試命令呢,我簡單講一下幾個關鍵引數

--concurrency=5000 表示啟動5000個執行緒連線資料庫

--iterations=1 測試執行次數

--number-of-queries=5000 總的執行次數

這個mysqlslap是mysql自帶的測試工具,大家可以試一下。

我分別在物理機和虛擬機器上做了兩次測試,物理機在10000的測試下出現了大量的失敗資訊,虛擬機器5000的測試就導致mysql服務掛掉了,已經無法自動回覆!大家可以自行測試,說道這裡,大家肯定不會忘記大學校園網選課或者查成績的時候,基本上都是登入不上去,實際上也驗證了這個問題。

docker 基礎

關於docker的介紹,我這裡不做重點,大家自行查閱相關資料。

docker 安裝也有很多種方式,包括docker映象加速器,我推薦使用阿里雲相關產品,不要問我為什麼,因為我用的很爽!

  1. 先更新軟體包

    yum -y update
  2. 安裝Docker虛擬機器

    yum install -y docker
  3. 執行、重啟、關閉Docker虛擬機器

    service docker start
    service docker start
    service docker stop
  4. 搜尋映象

    docker search 映象名稱
  5. 下載映象

    docker pull 映象名稱
  6. 檢視映象

    docker images
  7. 刪除映象

    docker rmi 映象名稱
  8. 執行容器

    docker run 啟動引數  映象名稱
  9. 檢視容器列表

    docker ps -a
  10. 停止、掛起、恢復容器

    docker stop 容器ID
    docker pause 容器ID
    docker unpase 容器ID
  11. 檢視容器資訊

    docker inspect 容器ID
  12. 刪除容器

    docker rm 容器ID
  13. 資料卷管理

    docker volume create 資料卷名稱  #建立資料卷
    docker volume rm 資料卷名稱  #刪除資料卷
    docker volume inspect 資料卷名稱  #檢視資料卷
  14. 網路管理

    docker network ls 檢視網路資訊
    docker network create --subnet=網段 網路名稱
    docker network rm 網路名稱

看過上面這些docker 命令,接下來我們就正式開始吧,對了你還需要一臺linux伺服器,這裡我使用的vmware虛擬機器

使用的centos 7.4的映象系統。

在虛擬機器中安裝好docker,練習過上述命名後,我們開始進入下面主要部分。

安裝PXC叢集

  1. 安裝PXC映象

    docker pull percona/percona-xtradb-cluster
  2. 為PXC映象改名

    docker tag percona/percona-xtradb-cluster pxc
  3. 建立net1網段

    docker network create --subnet=172.18.0.0/16 net1
  4. 建立5個數據卷

    docker volume create --name v1
    docker volume create --name v2
    docker volume create --name v3
    docker volume create --name v4
    docker volume create --name v5
  5. 建立備份資料卷(用於熱備份資料)

    docker volume create --name backup
  6. 建立5節點的PXC叢集

    注意,每個MySQL容器建立之後,因為要執行PXC的初始化和加入叢集等工作,耐心等待1分鐘左右再用客戶端連線MySQL。另外,必須第1個MySQL節點啟動成功,用MySQL客戶端能連線上之後,再去建立其他MySQL節點。

    #建立第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

至此我們的5節點pxc叢集已經搭建完成,大家可以通過navicat等mysql客戶端工具連線。測試在任何一個數據庫節點建立或修改資料,其它節點均會自動同步資料。

5節點pxc叢集已經搭建完畢,實際上我們可以連線任何一個節點操作資料庫,其它節點均會同步該節點資料。

但上述叢集仍然存在問題,假如我們連線的那個節點掛掉了,那麼叢集就不可以用了,因此

僅僅完成以上叢集還是遠遠不夠的,實際後臺應用仍然無法達到高效能高可用的目的。

Haproxy實現負載均衡

關於負載均衡,相信大家都不陌生,例如web應用使用的nginx,這裡我選擇的是老牌的haproxy,至於原因,請大家自行查閱資料。

  1. 安裝Haproxy映象

    docker pull haproxy
  2. 宿主機上編寫Haproxy配置檔案

    vi /home/soft/haproxy.cfg

    配置檔案如下:

    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  
  3. 建立兩個Haproxy容器

    #建立第1個Haproxy負載均衡伺服器
    docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy
    #進入h1容器,啟動Haproxy
    docker exec -it h1 bash
    haproxy -f /usr/local/etc/haproxy/haproxy.cfg
    #建立第2個Haproxy負載均衡伺服器
    docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
    #進入h2容器,啟動Haproxy
    docker exec -it h2 bash
    haproxy -f /usr/local/etc/haproxy/haproxy.cfg

到這裡,大家肯定會問,為什麼建立兩個haproxy呀,怎麼用的啊,別急,讓我慢慢講。請看下面!

keepalived實現雙機熱備

  1. Haproxy容器內安裝Keepalived,設定虛擬IP

    #進入h1容器
    docker exec -it h1 bash
    #更新軟體包
    apt-get update
    #安裝VIM
    apt-get install vim
    #安裝Keepalived
    apt-get install keepalived
    #編輯Keepalived配置檔案(參考下方配置檔案)
    vim /etc/keepalived/keepalived.conf
    #啟動Keepalived
    service keepalived start
    #宿主機執行ping命令
    ping 172.18.0.201

    配置檔案內容如下:

    vrrp_instance  VI_1 {
        state  MASTER
        interface  eth0
        virtual_router_id  51
        priority  100
        advert_int  1
        authentication {
            auth_type  PASS
            auth_pass  123456
        }
        virtual_ipaddress {
            172.18.0.201
        }
    }
    #進入h2容器
    docker exec -it h2 bash
    #更新軟體包
    apt-get update
    #安裝VIM
    apt-get install vim
    #安裝Keepalived
    apt-get install keepalived
    #編輯Keepalived配置檔案
    vim /etc/keepalived/keepalived.conf
    #啟動Keepalived
    service keepalived start
    #宿主機執行ping命令
    ping 172.18.0.201

    配置檔案內容如下:

    vrrp_instance  VI_1 {
        state  MASTER
        interface  eth0
        virtual_router_id  51
        priority  100
        advert_int  1
        authentication {
            auth_type  PASS
            auth_pass  123456
        }
        virtual_ipaddress {
            172.18.0.201
        }
    }
  2. 宿主機安裝Keepalived,實現雙擊熱備

    #宿主機執行安裝Keepalived
    yum -y install keepalived
    #修改Keepalived配置檔案
    vi /etc/keepalived/keepalived.conf
    #啟動Keepalived
    service keepalived start

    Keepalived配置檔案如下:

    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.99.150
        }
    }
    virtual_server 192.168.99.150 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 192.168.99.150 3306 {
        delay_loop 3
        lb_algo rr 
        lb_kind NAT
        persistence_timeout 50
        protocol TCP
        real_server 172.18.0.201 3306 {
            weight 1
        }
    }

終於搞定了!到這裡,一個5節點的pxc叢集已經實現了真正意義上的高可用。任何一個數據庫節點掛掉,沒有問題,業務任然可以訪問其他資料庫,一個haproxy掛掉,也沒問題,還有另一個提供負載均衡。

結束!

等等,說好的高效能,高可用呢,高效能去哪裡了?補充說明,pxc叢集只能保證節點之間資料同步,而且保證資料一致性,也就是說node1節點中有2000萬條資料,其它節點同樣有這麼多資料,說以高效能無法保證,pxc叢集的效能取決於叢集中效能最差的節點,而不是最好的節點。有沒有既有高效能,又有高可用的解決方案呢?我說有!在哪裡?。。。。

好睏啊,凌晨1點了,睡覺吧,後續我會介紹如何結合mycat達到高效能的目的,以及後端、前端專案的高可用方案。

晚安!

這裡有個很重要的事情忘記講了,pxc叢集停掉之後,直接通過docker start node1 或者任何一個節點是啟動不了的,原因是叢集之前的同步機制造成的,啟動任何一個節點,該節點都會去其它節點同步資料,其它節點仍處於宕機狀態,所以該節點啟動失敗,這也是pxc叢集的強一致性的表現,解決方式是,刪除所有節點docker rm node1 node2 node3 node4 node 5

和資料卷中的grastate.dat檔案

rm -rf /var/lib/docker/volumes/v1/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v2/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v3/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v4/_data/grastate.dat

rm -rf /var/lib/docker/volumes/v5/_data/grastate.dat

重新執行叢集建立的命令即可,因為資料都在資料卷中,所有放心,叢集重新啟動都資料仍然都在.。

 對於初學者操作可能不熟練,容易出錯,因此我把docker下載安裝(用的阿里雲的docker-ce),映象加速(阿里雲的 映象加速),網路配置,映象下載,建立資料卷,建立pxc5個節點的命令整理好了指令碼,初學者只需要在centos虛擬機器內執行./deploy-pxc-create.sh指令碼即可等待整個docker環境和後續叢集搭建完畢,直接用mysql客戶端連線使用,測試,十分方便。首次將指令碼檔案放到虛擬機器內,先授權 chmod 777 deploy-pxc-create.sh 之後執行指令碼即可。無需自己安裝docker環境。

-----------來源:CSDN 原文:https://blog.csdn.net/u013218587/article/details/80863054?utm_source=copy