Docker 建立 PXC 高可用集羣並配置 Harpoxy 負載均衡

建立 PXC 集羣環境

拉取 percona-xtradb-cluster 鏡像

官方鏡像地址:https://hub.docker.com/r/percona/percona-xtradb-clusternode

docker pull percona/percona-xtradb-cluster

percona/percona-xtradb-cluster 太長,咱們換個名字叫作pxc,操做以下:mysql

docker tag percona/percona-xtradb-cluster pxc

並將開始拉去的鏡像刪除,操做以下:算法

docker rmi percona/percona-xtradb-cluster

建立docker網絡

出於安全考慮,將PXC集羣放置於docker內部網絡中。只需將宿主的端口與之映射並開放出來便可。sql

docker network create --subnet=172.18.0.0/24 net1

其中,--subnet=172.18.0.0/24自定義網段172.18.0.0,24是指24位子網掩碼 net1 網段名稱。docker

執行成功後,咱們能夠經過sudo docker inspect net1查看內部網絡信息。數據庫

建立docker卷

docker容器的運行規則:經過目錄映射的方法,將業務數據寫入到宿主機中。好處是若是容器故障,只需將容器刪除,從新啓用一個容器便可,這樣就不會丟失原來的數據。 因爲PXC較爲特殊,沒法直接使用映射目錄的方法作映射(使用後會閃退),故使用docker卷。 在命令行使用以下命令:安全

docker volume create --name v1
docker volume create --name v2
docker volume create --name v3

計劃建立3個數據庫節點,因此這裏對應建立3個數據卷。bash

建立第一個容器節點:

docker run -d -p 3306:3306 -v v1:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -e CLUSTER_NAME=PXC \
    -e XTRABACKUP_PASSWORD=123456 \
    --privileged \
    --name=node1 \
    --net=net1 \
    --ip 172.18.0.2 \
    pxc

-d 默認在後臺運行, -p 3306(宿主):3306(容器) 端口映射,將容器3306端口映射到宿主3306端口 -v 目錄映射,將第四步建立的v1映射到容器/var/lib/mysql -e MYSQL_ROOT_PASSROWD 建立的用戶實例的密碼,默認實例root -e CLUSTER_NAME 集羣名稱, -e XTRABACKUP_PASSWORD 數據庫之間同步使用的密碼 --privileged 權限.給予最高權限 --name 給容器容命名 --net 使用內部網段 --ip 內部網段分到的地址服務器

測試鏈接:

須要注意的是容器啓動的速度雖然很快,可是pxc初始化是須要一點時間的(大概兩分鐘左右),必須等第一個容器初始化完成後再啓動第二個pxc容器,否則會報錯。網絡

測試鏈接成功後就能夠啓動其餘pxc容器了

在啓動其餘容器的時候須要更改映射的宿主機端口、容器的名稱,還有指定 IP 地址。

建立第二個容器節點:

注意:在啓動其餘容器的時候須要更改映射的宿主機端口、容器的名稱,還有指定 IP 地址。

-e CLUSTER_JOIN=node1 用於鏈接第一個數據庫節點

docker run -d -p 3307:3306 -v v2:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=node1 \
--privileged \
--name=node2 \
--net=net1 \
--ip 172.18.0.3 \
pxc

建立第三個容器節點:

docker run -d -p 3308:3306 -v v3:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-e CLUSTER_NAME=PXC \
-e XTRABACKUP_PASSWORD=123456 \
-e CLUSTER_JOIN=node1 \
--privileged \
--name=node3 \
--net=net1 \
--ip 172.18.0.4 \
pxc

測試:

用數據庫鏈接工具鏈接三個數據庫,在node建立數據庫test

CREATE database test;

若是其餘數據庫都同步過來那就沒有問題了。

Harpoxy 負載均衡

建立 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:123456
#數據庫負載均衡
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_2 172.18.0.4:3306 check weight 1 maxconn 2000  
        #使用keepalive檢測死鏈
        option  tcpka

啓動 haproxy 容器

/Users/xinaogudu/hproxy 是我放置配置文件的目錄。

docker run -dit -p 4001:8888 -p 4002:3306 \
-v /Users/xinaogudu/hproxy:/usr/local/etc/haproxy \
--privileged \
--net=net1 \
--name h1 \
--ip 172.18.0.5 \
haproxy

進入 haproxy 容器指明配置文件

docker exec -it h1 bash
# 指定 haproxy 配置文件位置
haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg

在數據庫中建立一個沒有密碼的 haproxy 用戶用於心跳檢測。

create user 'haproxy'@'%' identified by '';

驗證

登陸 haproxy 監控:http://localhost:4001/dbs

用數據庫管理工具鏈接 haproxy 端口測試:

相關文章
相關標籤/搜索