docker安裝(PXC)mysql集群

安裝PXC

PXC 模式,沒(méi)有主從之分,每個(gè)數(shù)據(jù)庫(kù)都可以進(jìn)行讀寫(xiě),數(shù)據(jù)可以保持強(qiáng)一致性,執(zhí)行時(shí)間較慢,由于一般是強(qiáng)一致性,所以一般用于存儲(chǔ)重要的信息,例如金融。

  1. 安裝pxc鏡像
    進(jìn)入docker官網(wǎng)找到pxc鏡像傳送門(mén)復(fù)制安裝pxc進(jìn)行的指令docker pull percona/percona-xtradb-cluster
  2. 執(zhí)行該指令,等待linux安裝完畢。安裝完畢后使用docker images檢查是否已經(jīng)安裝
[root@localhost ~]# docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
docker.io/percona/percona-xtradb-cluster   latest              70b3670450ef        3 months ago        408 MB
  1. 由于系統(tǒng)自帶的PXC名字過(guò)長(zhǎng),我們可以將他的名字進(jìn)行修改,方便使用
[root@localhost ~]# docker tag docker.io/percona/percona-xtradb-cluster pxc
[root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster
Untagged: docker.io/percona/percona-xtradb-cluster:latest
Untagged: docker.io/percona/percona-xtradb-cluster@sha256:78460483e99c093d2910d3667d928ed8c2165165554482058875bccafa4ccf0b
[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
pxc                 latest              70b3670450ef        3 months ago        408 MB
  1. 每個(gè)PXC節(jié)點(diǎn)內(nèi)部包含一個(gè)mysql實(shí)例,如果需要?jiǎng)?chuàng)建包含5個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)的數(shù)據(jù)庫(kù)集群,那么要?jiǎng)?chuàng)建5個(gè)pxc節(jié)點(diǎn)。出于安全考慮,需要給PXC集群實(shí)例創(chuàng)建一個(gè)Docker內(nèi)部網(wǎng)絡(luò)。
    1. 創(chuàng)建一個(gè)網(wǎng)段docker network create
[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1
0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9
  1. 查看指定網(wǎng)段信息docker network inspect 網(wǎng)段名稱
[root@localhost ~]# docker network inspect net1
[
    {
        "Name": "net1",
        "Id": "0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9",
        "Created": "2019-06-10T09:34:11.010208053+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
  1. 移除指定網(wǎng)段docker network rm 網(wǎng)段名稱
  2. 創(chuàng)建docker卷docker volume create --name
    創(chuàng)建一個(gè)docker卷名字為v1,通過(guò)查看其詳細(xì)信息,發(fā)現(xiàn)該卷在宿主機(jī)的映射地址為/var/lib/docker/volumes/v1/_data
[root@localhost ~]# docker volume create v1
v1
[root@localhost ~]# docker inspect v1
[
    {
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/v1/_data",
        "Name": "v1",
        "Options": {},
        "Scope": "local"
    }
]
  1. 創(chuàng)建PXC容器


    image.png

    -d :代表創(chuàng)建的容器在后臺(tái)運(yùn)行
    -p : 端口映射 宿主機(jī)端口:容器端口
    -v :路徑映射
    -e MYSQL_ROOT_PASSWORD=root 指定mysql的root賬號(hào)密碼為root
    -e CLUSTER_NAME=PXC 執(zhí)行名稱為PXC
    -e XTRABACKUP_PASSWORD=root 指定mysql數(shù)據(jù)同步時(shí)用的密碼為root
    --privileged 給最高的權(quán)限
    --name=node1 節(jié)點(diǎn)名稱node1
    --net=net1 使用的內(nèi)部網(wǎng)段
    --ip 172.18.0.2 分發(fā)的ip地址
    pxc 鏡像名稱pxc

[root@localhost ~]# docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root  -v v1:/var/lib/mysql  --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
96e7588f1e9f2f657217f7ede6c53b1c5e7c044b57b5ef3787df2e7c5e69b974
[root@localhost ~]# docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root  -v v2:/var/lib/mysql -e CLUSTER_JOIN=node1  --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
206452fddb60a03f44bd175c075b527781fbe7cc2d3eb805969ef1b48894fa76
[root@localhost ~]# docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root  -v v3:/var/lib/mysql -e CLUSTER_JOIN=node1  --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
0fc05938f19fd16c69999ce79e67983609308417a500407ae693900667f668dc
[root@localhost ~]# docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root  -v v4:/var/lib/mysql -e CLUSTER_JOIN=node1  --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
74e8fb3022e5077669dc05d519aa331e9c678b2943fdd61e331d93ab39548424
[root@localhost ~]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root  -v v5:/var/lib/mysql -e CLUSTER_JOIN=node1  --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
bc48ae76e854ef3ddd6ef0a6d412f00a6e3a826edecc8c56a572322e1b821b10

執(zhí)行docker ps進(jìn)行查看

[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                                   NAMES
14a0ba3c314e        pxc                 "/entrypoint.sh "   6 seconds ago        Up 5 seconds        4567-4568/tcp, 0.0.0.0:3309->3306/tcp   node4
bc48ae76e854        pxc                 "/entrypoint.sh "   About a minute ago   Up About a minute   4567-4568/tcp, 0.0.0.0:3310->3306/tcp   node5
0fc05938f19f        pxc                 "/entrypoint.sh "   2 minutes ago        Up 2 minutes        4567-4568/tcp, 0.0.0.0:3308->3306/tcp   node3
206452fddb60        pxc                 "/entrypoint.sh "   4 minutes ago        Up 4 minutes        4567-4568/tcp, 0.0.0.0:3307->3306/tcp   node2
96e7588f1e9f        pxc                 "/entrypoint.sh "   13 minutes ago       Up 12 minutes       0.0.0.0:3306->3306/tcp, 4567-4568/tcp   node1

通過(guò)navcat進(jìn)行連接,連接的ip即為宿主機(jī)的ip


image.png

數(shù)據(jù)負(fù)載均衡機(jī)制

image.png

負(fù)載均衡中間件對(duì)比


image.png

安裝Haproxy

  1. 拉取鏡像
docker pull haproxy
  1. 創(chuàng)建配置文件
[root@localhost ~]# mkdir /home/soft -p
[root@localhost ~]# touch /home/soft/haproxy.cfg

配置文件具體內(nèi)容可參考戳我

global
    #工作目錄
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/var/log/local5),等級(jí)info
    log 127.0.0.1 local5 info
    #守護(hù)進(jìn)程運(yùn)行
    daemon

defaults
    log global
    mode    http
    #日志格式
    option  httplog
    #日志中不記錄負(fù)載均衡的心跳記錄
    option  dontlognull
    #連接超時(shí)(毫秒)
    timeout connect 5000
    #客戶端超時(shí)(毫秒)
    timeout client  5000
    #服務(wù)器超時(shí)(毫秒)
    timeout server  5000
    
#監(jiān)控界面
listen  admin_stats
    #監(jiān)控界面訪問(wèn)ip和端口
    bind    0.0.0.0:8888
    #訪問(wèn)協(xié)議
    mode        http
    #URI相對(duì)地址
    stats   uri     /dbs
    #統(tǒng)計(jì)報(bào)告格式
    stats   realm   Gloal\ statistics
    #登錄賬戶信息 用于登錄監(jiān)控網(wǎng)站使用
    stats   auth    root:root
    
#數(shù)據(jù)庫(kù)負(fù)載均衡
listen  proxy-mysql
    #訪問(wèn)的IP和端口
    bind    0.0.0.0:3306
    #網(wǎng)絡(luò)協(xié)議
    mode    tcp
    #負(fù)載均衡算法(輪詢算法)
    #輪詢算法:roundrobin
    #權(quán)重算法:static-rr
    #最少連接算法:leastconn
    #請(qǐng)求源IP算法:source
    balance roundrobin
    
    #日志格式
    option  tcplog
    #在MySQL中創(chuàng)建一個(gè)沒(méi)有權(quán)限的haproxy用戶,密碼為空。
    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檢測(cè)死鏈
    option tcpka
image.png
  1. 創(chuàng)建Haproxy容器
[root@localhost ~]# docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/haproxy:/usr/local/etc/haproxy --name haproxy --privileged --net=net1 haproxy
  1. 進(jìn)入haproxy后臺(tái)docker exec,加載配置文件
[root@localhost haproxy]# docker exec -it  h1 bash 
root@4e53fd48e900:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 在node1節(jié)點(diǎn)上創(chuàng)建一個(gè)沒(méi)有密碼沒(méi)有權(quán)限的用戶用于做心跳檢測(cè)
create user 'haproxy'@'%' IDENTIFIED BY '';
  1. 確認(rèn)防火墻關(guān)閉或者端口4001是暴露的狀態(tài)的前提下客戶端訪問(wèn)ip:4001/dbs
    用戶名和密碼為在haproxy.cfg配置文件設(shè)置好的,查看配置文件即可。
    image.png
  2. 后臺(tái)關(guān)閉任意一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)進(jìn)行測(cè)試
[root@localhost ~]# docker stop node1
node1
image.png
  1. haproxy連接navcat客戶端
    像連接mysql客戶端一樣,
    ip為宿主機(jī)ip,端口為剛剛啟動(dòng)的時(shí)候映射的4002,密碼為數(shù)據(jù)庫(kù)的密碼。


    image.png

    haproxy本身并不會(huì)存儲(chǔ)數(shù)據(jù),他只會(huì)將發(fā)過(guò)來(lái)的請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)。值得注意的是單節(jié)點(diǎn)的haproxy是不具備高可用性的,所以必須要有冗余的設(shè)計(jì)。具體如下:

haproxy高可用

  1. Keepalived雙機(jī)熱備


    image.png

    設(shè)置一個(gè)虛擬ip,兩個(gè)keepalive同時(shí)進(jìn)行搶占該虛擬ip,搶到的為主服務(wù)器,沒(méi)有搶到的為從服務(wù)器,從服務(wù)器定期向主服務(wù)器發(fā)送心跳,如果檢測(cè)到主服務(wù)器宕機(jī),從服務(wù)便可以獲得虛擬ip成為主服務(wù)器。

  2. 總體架構(gòu)設(shè)計(jì)


    image.png

    前面已經(jīng)介紹過(guò)keepalived雙機(jī)熱備,不在贅述,最外面的那個(gè)keepalived作為跳板機(jī)使用。

  3. 安裝
  4. 在haproxy中安裝keepalived
sudo apt-get update
sudo apt-get install keepalived
  1. 更改keepalived配置文件
    路徑:/etc/keepalived/keepalived.conf
    內(nèi)容:
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
    }
}

[配置文件說(shuō)明]

  • state MASTER 表明keepalived身份(MASTER為主服務(wù)器,BACKUP為從服務(wù)器),主服務(wù)器搶占虛擬IP,備用服務(wù)器不會(huì)搶占IP
  • interface eth0 網(wǎng)卡設(shè)備,用于保存虛擬IP地址,該網(wǎng)卡是docker的網(wǎng)卡,只有在宿主機(jī)可見(jiàn)。所以需要將該虛擬IP映射到其他可見(jiàn)的IP上
  • virtual_router_id 51 虛擬路由標(biāo)識(shí),MASTER和BACKUP的虛擬路由標(biāo)識(shí)必須保持一致,標(biāo)識(shí)可以是0~255
  • priority 100 權(quán)重,MASTER的權(quán)重要高于BACKUP數(shù)字越大優(yōu)先級(jí)越高。
  • advert_int 1 心跳檢測(cè)的時(shí)間間隔,主備之間必須一致。單位(秒)
  • authentication{
    auth_type PASS
    auth_pass 123456
    }
    心跳檢測(cè)使用的賬號(hào)和密碼
  • virtual_ipaddress{
    172.18.0.201
    }
    虛擬IP地址,可以設(shè)置多個(gè)虛擬IP地址,每行一個(gè)。
  1. 啟動(dòng)keepalived程序,在宿主機(jī)ping定義好的虛擬ip
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容