1. 程式人生 > 其它 >Docker部署Mysq叢集

Docker部署Mysq叢集

1.PXC(Percona XtraDB Cluster)

速度慢 但能保證強一致性 適用於儲存價值較高的資料

資料同步是雙向的 在任一節點寫入資料 都會同步到其他所有節點 在任何節點上都能同時讀寫

採用同步複製 向任一節點寫入資料 只有所有節點都同步成功後 才會向客戶端返回成功。事務在所有節點要麼同時提交,要麼不提交

1.1 PXC叢集安裝

(1)安裝 docker pull percona/percona-xtradb-cluster

(2)重新命名 docker tag percona/percona-xtradb-cluster:latest pxc

(3)刪除源映象標籤docker rmi percona/percona-xtradb-cluster

docker images

(3)建立網段 docker network create --subnet=172.188.0.0/24hxjf-docker (如果有重複可以刪除 docker network rm 名稱)

檢視當前宿主機上的網路配置docker network ls

檢視docker network inspecthxjf-docker

(4)建立5個數據卷

docker volume create --name pxc-vm01
docker volume create --name pxc-vm02
docker volume create --name pxc-vm03
docker volume create --name pxc-vm04
docker volume create --name pxc-vm05

檢視docker inspectpxc-vm01

(5)建立5個PXC容器

# 第一個節點
(1)建立容器

docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v pxc-vm01:/var/lib/mysql -v backup:/data --privileged --name=pxcnode01 --net=hxjf-docker --ip 172.188.0.81 pxc

(2)驗證

docker ps -a

docker exec -it pxcnode01 bash

mysql -u root -proot (這裡我後來重新docker run MYSQL_ROOT_PASSWORD引數修改123456登入也不行 只能用root登入)

#以下二三四五節點 多了個-e CLUSTER_JOIN=pxcnode01

# 第二個節點

docker run -d -p 3302:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm02:/var/lib/mysql -v backup:/data --privileged --name=pxcnode02 --net=hxjf-docker --ip 172.188.0.82 pxc

# 第三個節點

docker run -d -p 3303:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm03:/var/lib/mysql -v backup:/data --privileged --name=pxcnode03 --net=hxjf-docker --ip 172.188.0.83 pxc

# 第四個節點
docker run -d -p 3304:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm04:/var/lib/mysql -v backup:/data --privileged --name=pxcnode04 --net=hxjf-docker --ip 172.188.0.84 pxc

# 第五個節點
docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm05:/var/lib/mysql -v backup:/data --privileged --name=pxcnode05 --net=hxjf-docker --ip 172.188.0.85 pxc

# 檢視 docker ps -a


2.解決SSL通訊問題

2.1第一種方案

(1)重新配置pxcnode01

檢視日期發現其它pxcnode02 pxcnode03 pxcnode04 pxcnode05沒有起來

docker ps -a

docker logs -f pxcnode03

刪掉第一個pxcnode01 重新配置

docker stop pxcnode01

docker rm pxcnode01

docker ps -a

(2) 配置

這裡增加了一個新的資料卷對映 -v conf01:/etc/mysql ,方便在宿主機修改配置。預設情況下對映到底宿主機目錄在 /var/lib/docker/volumes/ 目錄下

(3)docker run -d -p 3301:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -v pxc-vm01:/var/lib/mysql -v backup:/data -v conf01:/etc/mysql --privileged=true --name=pxcnode01 --net=hxjf-docker --ip 172.188.0.81 pxc

(4)修改配置檔案 vim /var/lib/docker/volumes/conf01/_data/node.cnf
[mysqld]

default_authentication_plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/tmp/mysql.sock
skip-host-cache
core-file
# 關閉ssl通訊
pxc-encrypt-cluster-traffic=OFF

#server_id=0

(5)重啟pxcnode01

(6)重啟剩餘節點

docker rm pxcnode02

docker rm pxcnode03

docker rm pxcnode04

docker rm pxcnode05

docker ps -a

#pxcnode02

docker run -d -p 3302:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm02:/var/lib/mysql -v backup:/data -v conf02:/etc/mysql --privileged --name=pxcnode02 --net=hxjf-docker --ip 172.188.0.82 pxc

#pxcnode03

docker run -d -p 3303:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm03:/var/lib/mysql -v backup:/data -v conf03:/etc/mysql --privileged --name=pxcnode03 --net=hxjf-docker --ip 172.188.0.83 pxc

#pxcnode04

docker run -d -p 3304:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm04:/var/lib/mysql -v backup:/data -v conf04:/etc/mysql --privileged --name=pxcnode04 --net=hxjf-docker --ip 172.188.0.84 pxc

#pxcnode05

docker run -d -p 3305:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC-CLUSTER -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=pxcnode01 -v pxc-vm05:/var/lib/mysql -v backup:/data -v conf05:/etc/mysql --privileged --name=pxcnode05 --net=hxjf-docker --ip 172.188.0.85 pxc

#檢視容器 docker ps -a 還是失敗

(7)配置從節點

vim /var/lib/docker/volumes/conf02/_data/node.cnf vim /var/lib/docker/volumes/conf03/_data/node.cnf vim /var/lib/docker/volumes/conf04/_data/node.cnf vim /var/lib/docker/volumes/conf05/_data/node.cnf 如下圖所示 每個節點都加一句pxc-encrypt-cluster-traffic=OFF

(8)重啟節點

docker start pxcnode02
docker start pxcnode03
docker start pxcnode04
docker start pxcnode05

(9)檢視節點

啟動正常 docker ps -aq

2.資料庫的負載均衡

將所有請求傳送給單一節點 其負載過高 效能很低 其他節點卻很空閒

使用Haproxy做負載均衡 可以將請求均勻地傳送給每個節點 單節點負載低 效能好

2.1安裝Haproxy

(1)docker pull haproxy

(2)建立配置檔案

mkdir -p /home/soft/haproxy/
touch /home/soft/haproxy/haproxy.cfg
vim /home/soft/haproxy/haproxy.cfg

# 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: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.188.0.2:3306 check weight 1 maxconn 2000  
    server  MySQL_2 172.188.0.3:3306 check weight 1 maxconn 2000  
    server  MySQL_3 172.188.0.4:3306 check weight 1 maxconn 2000 
    server  MySQL_4 172.188.0.5:3306 check weight 1 maxconn 2000
    server  MySQL_5 172.188.0.6:3306 check weight 1 maxconn 2000
    #使用keepalive檢測死鏈
    option  tcpka

(3)