Docker部署PXC集群(Haproxy負載均衡、Keepalived高可用、XtraBackup數據備份)


 

常見問題

1.PXC(Percona XtraDB Cluster)集群基本搭建

1.1 PXC集群安裝

1.2創建網段

1.3創建5個數據卷

1.4創建5個PXC容器

2.解決SSL通信問題

2.1第一種方案(取消ssl認證)

2.2第二種方案(配置ssl證書)

2.3驗證集群

3.安裝Haproxy 實現高可用

3.1遇到的問題

3.2 haproxy安裝

3.3啟動pxc集群

3.4創建haproxy賬戶對MySQL數據庫進行心跳檢測

3.5使用haproxy登錄mysql

3.6驗證haproxy負載

4.利用Keepalived實現雙機熱備

4.1keepalived安裝

4.2按照上面的方式再創建一個haproxy節點

4.3實現外網訪問虛擬ip

4.4驗證

4.5使用navicat測試連接數據庫

5.數據備份

5.1冷備份

5.2熱備份

5.3XtraBackup

5.4全量備份和增量備份

5.5PXC全量備份

特別感謝

 

常見問題

環境的清理相關命令

本集群通過虛擬機搭建的 自己也嘗試了很多次 如果有些問題無法解決

可以嘗試清理環境 梳理清楚思路 重新搭建

以下是常用命令

#重啟docker服務
systemctl restart docker

#docker 根目錄
docker info | grep "Docker Root Dir"

# 刪除所有dangling數據卷(即無用的Volume,僵屍文件)
docker volume rm $(docker volume ls -qf dangling=true)

# 刪除所有dangling鏡像(即無tag的鏡像)
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

# 刪除所有關閉的容器
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

# 刪除關閉的容器、無用的數據卷和網絡
docker system prune

# 刪除更徹底,可以將沒有容器使用Docker鏡像都刪掉
docker system prune -a

# 查看日志
docker logs -f --tail 50 pxcnode01

集群搭起來后關閉某個節點起不來了 所有節點都關閉了

(1)查找grastate.dat 該文件主要描述GALERA保持的狀態信息

cd / #在根目錄下查找

find -name grastate.dat

(2)如果啟動節點1位主節點 就修改節點1的grastate.dat文件 然后再重新啟動所有子節點

vim /var/lib/docker/volumes/pxc-vm01/_data/grastate.dat

(3)啟動haproxy

docker start hpx01

docker start hpx02

(4)啟動Keepalived

service keepalived start

 

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

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

查看當前宿主機上的網絡配置 docker network ls

查看 docker network inspect hxjf-docker

1.3創建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 inspect pxc-vm01

1.4創建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第一種方案

2.1.1查看日志

查看日期發現其它pxcnode02 pxcnode03 pxcnode04 pxcnode05沒有起來

docker ps -a

docker logs -f pxcnode03

2.1.2重新配置pxcnode01

(1)刪掉第一個pxcnode01

docker stop pxcnode01

docker rm pxcnode01

docker ps -a

(2)重新啟動
這里增加了一個新的數據卷映射 -v conf01:/etc/mysql ,方便在宿主機修改配置。默認情況下映射到底宿主機目錄在 /var/lib/docker/volumes/ 目錄下
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
(3) 重新配置
修改配置文件 vim /var/lib/docker/volumes/conf01/_data/node.cnf  加上一句 pxc-encrypt-cluster-traffic=OFF
(4)重啟pxcnode01

docker restart pxcnode01

(5)重啟剩余節點

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 還是失敗

(6)配置從節點

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

(7)重啟從節點

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

(8)查看節點

啟動正常 docker ps -aq

 2.2第二種方案

(1)修改配置文件

5個節點都需要操作 首先需要保證目前5個節點已經運行起來 然后修改節點的配置文件

vim /var/lib/docker/volumes/conf01/_data/node.cnf
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
在 [mysqld] 節點下增加配置
ssl-ca=/etc/mysql/certs/ca.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem

在 [sst] 節點下增加配置

encrypt=4
ssl-ca=/etc/mysql/certs/ca.pem
ssl-cert=/etc/mysql/certs/server-cert.pem
ssl-key=/etc/mysql/certs/server-key.pem

(2)生成CA密鑰 服務證書 客戶端證書

mkdir -p /etc/mysql/certs  #創建目錄 如果有不需要創建

cd /etc/mysql/certs           #到此目錄下生成相關文件

以下紅色標識的命令需要輸入Common Name 且輸入名稱不能相同 否咋證書不可使用 

openssl genrsa 2048 > ca-key.pem

openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem (輸入common1)

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem (輸入common2)

openssl rsa -in server-key.pem -out server-key.pem

openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem(輸入common3)

openssl rsa -in client-key.pem -out client-key.pem

openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

[root@localhost certs]# openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus
............+++
..............................................................+++
e is 65537 (0x10001)
[root@localhost certs]# openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:como^H^C
[root@localhost certs]# openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:common1
Email Address []:
[root@localhost certs]# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Generating a 2048 bit RSA private key
.......................................................+++
...............................................................................................+++
writing new private key to 'server-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:common2
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost certs]# openssl rsa -in server-key.pem -out server-key.pem
writing RSA key
[root@localhost certs]# openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=common2
Getting CA Private Key
[root@localhost certs]# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Generating a 2048 bit RSA private key
.............................................+++
..........+++
writing new private key to 'client-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:common3
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@localhost certs]# 
[root@localhost certs]# openssl rsa -in client-key.pem -out client-key.pem
writing RSA key
[root@localhost certs]# openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd/CN=common3
Getting CA Private Key
[root@localhost certs]# 
[root@localhost certs]# openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
View Code

(3)將證書拷貝到容器目錄下

查看node.cnf權限

 cd /var/lib/docker/volumes/conf01/_data/
 ll -allh

修改certs文件夾權限 否則pxc將沒有權限讀取

cd /etc/mysql 

chown -R 1001:1001 ./certs

ll -allh

將相關證書拷到容器內 每個容器都需要拷貝
docker cp certs/ pxcnode01:/etc/mysql/
docker cp certs/ pxcnode02:/etc/mysql/
docker cp certs/ pxcnode03:/etc/mysql/
docker cp certs/ pxcnode04:/etc/mysql/
docker cp certs/ pxcnode05:/etc/mysql/

查看證書是否成功拷貝到容器內

docker exec -it pxcnode01 /bin/bash

(4)重啟容器

關閉5個節點

docker stop pxcnode01
docker stop pxcnode02
docker stop pxcnode03
docker stop pxcnode04
docker stop pxcnode05
啟動節點pxcnode01(主節點)
vim /var/lib/docker/volumes/pxc-vm01/_data/grastate.dat
將0修改位1
docker start pxcnode01
docker start pxcnode02
docker start pxcnode03
docker start pxcnode04
docker start pxcnode05
docker ps -a

 2.3驗證集群

啟動集群

進入pxcnode01

docker exec -it pxcnode01 /bin/bash
mysql -uroot -proot

創建數據庫 hxkf

create database hxjf;

show databases;

向數據庫hxjf新增一個表 並插入一條數據

use hxjg;

create table user_info (id int,name varchar(20) , age int );

ALTER TABLE `hxjf`.`user_info` CHANGE COLUMN `id` `id` INT NOT NULL ,ADD PRIMARY KEY (`id`);

insert into user_info (id,name,age) values(1,'',20);

進入pxcnode02 查看數據是否同步過來

docker exec -it pxcnode02 /bin/bash
mysql -uroot -p root

show databases;

#數據庫已經同步過來了

mysql> use hxjf;

mysql> show tables;

mysql> select * from user_info;

#表和數據也已經同步過來了

 

 

3.安裝Haproxy 實現高可用

3.1遇到的問題 (這只是問題 並是不安裝過程 只是記錄 安裝從3.2開始)

如果在haproxy的配飾文件指定工作目錄,docker就運行不起來

docker查看日志錯誤如下

網上說只要創建對應的目錄即可,但是我查了很多資料都沒有成功

於是我就只能注釋配置文件 haproxy就可以運行了 暫時不知道為什么 如果有知道的感謝指出

3.2 haproxy安裝

3.2.1查詢鏡像

docker search haproxy 

3.2.2拉取鏡像

docker pull haproxy

3.2.3查詢本地鏡像

docker images

3.2.4修改配置文件

vim /home/nscoffee/docker/haproxy/haproxy.cfg

 1 global
 2     #工作目錄
 3     chroot /usr/local/etc/haproxy
 4     #日志文件,使用rsyslog服務中local5日志設備(/var/log/local5),等級info
 5     log 127.0.0.1 local5 info
 6     #守護進程運行
 7     daemon
 8 defaults
 9     log global
10     mode    http
11     #日志格式
12     option  httplog
13     #日志中不記錄負載均衡的心跳檢測記錄
14     option  dontlognull
15     #連接超時(毫秒)
16     timeout connect 5000
17     #客戶端超時(毫秒)
18     timeout client  50000
19     #服務器超時(毫秒)
20     timeout server  50000
21 #監控界面   
22 listen  admin_stats
23     #監控界面的訪問的IP和端口
24     bind  0.0.0.0:8888
25     #訪問協議
26     mode        http
27     #URI相對地址
28     stats uri   /dbs
29     #統計報告格式
30     stats realm     Global\ statistics
31     #登陸帳戶信息
32     stats auth  admin:admin
33 #數據庫負載均衡
34 listen  proxy-mysql
35     #訪問的IP和端口
36     bind  0.0.0.0:3306
37     #網絡協議
38     mode  tcp
39     #負載均衡算法(輪詢算法)
40     #輪詢算法:roundrobin
41     #權重算法:static-rr
42     #最少連接算法:leastconn
43     #請求源IP算法:source 
44     balance  roundrobin
45     #日志格式
46     option  tcplog
47    
48     option  mysql-check user root
49     server  MySQL_1 172.188.0.81:3306 check weight 1 maxconn 2000  
50     server  MySQL_2 172.188.0.82:3306 check weight 1 maxconn 2000  
51     server  MySQL_3 172.188.0.83:3306 check weight 1 maxconn 2000 
52     server  MySQL_4 172.188.0.84:3306 check weight 1 maxconn 2000
53     server  MySQL_5 172.188.0.85:3306 check weight 1 maxconn 2000
54     #使用keepalive檢測死鏈
55     option  tcpka
View Code

3.2.5運行容器

docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/nscoffee/docker/haproxy:/usr/local/etc/haproxy --name hpx01 --privileged --net=hxjf-docker --ip 172.188.0.8 haproxy

docker ps -a

3.3啟動pxc集群

3.3.1查看hpx01日志 集群沒有啟動

docker logs hpx01

3.3.2啟動集群(如果集群沒有down掉 就不用重新集群)

修改配置文件為1

vim /var/lib/docker/volumes/pxc-vm01/_data/grastate.dat

docker start pxcnode01

docker start pxcnode02

docker start pxcnode03

docker start pxcnode04

docker start pxcnode05

docker ps -a

3.4創建haproxy賬戶對MySQL數據庫進行心跳檢測

3.4.1登錄mysql

docker exec -it pxcnode01 /bin/bash

mysql -u root -proot

3.4.2修改配置文件

vim /home/nscoffee/docker/haproxy/haproxy.cfg

3.4.3進入haproxy登錄界面

http://192.168.188.180:4001/dbs

3.5使用haproxy登錄mysql

docker exec -it pxcnode01 /bin/bash
mysql -uroot -h192.168.188.180 -P4002 -proot

3.6驗證haproxy負載

3.6.1 查看所有容器

docker ps -a

3.6.2關閉pxcnode4

docker stop pxcnode4

3.6.3 使用haproxy的登錄mysql

docker exec -it pxcnode01 /bin/bash

mysql -uroot -h192.168.188.180 -P4002 -proot

use hxjf;

select * from user_info;

 

4.利用Keepalived實現雙機熱備

目前haproxy為單點服務,如果haproxy宕機,造成整個集群不可用,所以需要對haproxy節點進行集群部署

提高haproxy節點的高可用

核心原理

(1)keepalived: vrrp協議的軟件實現,原生設計目的為了高可用ipvs服務

功能介紹:

基於vrrp協議實現同一個ip地址在多台機器間的流轉

為獲得ip地址(vip)的機器生成ipvs規則(預先在配置文件中配置好)

為ipvs集群中的各節點做健康檢查

(2)虛擬ip:在linux系統中,一個網卡中可以定義多個ip,多個ip可以分配給不同的應用使用, 這些ip被稱為虛擬ip,keepalived利用了這個特性,多台機器去獲取同一個ip,獲取到的將ip綁定到綁定網卡,接受外部流量,沒有搶到的則作為備份服務器。並進行心跳檢測,一旦檢測到主服務宕機,則搶占ip地址。

為什么要采用雙機熱備

單節點Haproxy不具備高可用,必須要有冗余設計

雙機就是兩個請求處理程序,比如兩個haproxy,當一個掛掉的時候,另外 一個可以頂上。熱備我理解就是keepalive。在haproxy 容器中安裝keepalive。

利用Keepalived實現雙機熱備

在Docker中啟動兩個Haproxy容器,每個容器中還需要安裝Keepalived程序(以下簡稱KA)

兩個KA會爭搶虛擬IP,一個搶到后,另一個沒搶到就會等待,搶到的作為主服務器,沒搶到的作為備用服務器

兩個KA之間會進行心跳檢測,如果備用服務器沒有受到主服務器的心跳響應,說明主服務器發生故障,那么備用服務器就可以爭搶虛擬IP,繼續工作

我們向虛擬IP發送數據庫請求,一個Haproxy掛掉,可以有另一個接替工作

4.1keepalived安裝

4.1.1使用root權限登錄hpx01

docker exec -u 0 -it hpx01 /bin/bash

apt-get update

apt-get install keepalived

 

4.1.2在容器中安裝vim

apt-get install vim

apt-get update

apt-get install vim

找到安裝vim配置文件

vim /usr/share/vim/vim81/defaults.vim

 

找到並修改

set mouse-=a

4.1.3修改配置文件

vim /etc/keepalived/keepalived.conf

 1 vrrp_instance VI_1 {
 2 state MASTER # Keepalived的身份(MASTER主服務要搶占IP,BACKUP備服務器不會搶占IP)。
 3 interface eth0 # docker網卡設備,虛擬IP所在
 4 virtual_router_id 51 # 虛擬路由標識,MASTER和BACKUP的虛擬路由標識必須一致。從0~255
 5 priority 100 # MASTER權重要高於BACKUP數字越大優先級越高
 6 advert_int 1 # MASTER和BACKUP節點同步檢查的時間間隔,單位為秒,主備之間必須一致
 7 authentication { # 主從服務器驗證方式。主備必須使用相同的密碼才能正常通信
 8 auth_type PASS
 9 auth_pass 123456
10 }
11 virtual_ipaddress { # 虛擬IP。可以設置多個虛擬IP地址,每行一個
12 172.188.0.201
13 }
14 }
View Code

4.1.4啟動Keepalived

service keepalived start

4.1.5宿主機ping虛擬ip 172.188.0.201

4.2按照上面的方式再創建一個haproxy節點

4.2.1創建並運行容器

docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/nscoffee/docker/haproxy:/usr/local/etc/haproxy --name hpx02 --privileged --net=hxjf-docker --ip 172.188.0.9 haproxy

docker exec -u 0 -it hpx02 /bin/bash

4.2.2 配置文件(如果需要安裝配置vim見4.1.2)

 1 vrrp_instance  VI_1 {
 2     state  MASTER  # Keepalived的身份(MASTER主服務要搶占IP,BACKUP備服務器不會搶占IP)。
 3     interface  eth0    # docker網卡設備,虛擬IP所在
 4     virtual_router_id  51  # 虛擬路由標識,MASTER和BACKUP的虛擬路由標識必須一致。從0~255
 5     priority  100  # MASTER權重要高於BACKUP數字越大優先級越高
 6     advert_int  1  # MASTER和BACKUP節點同步檢查的時間間隔,單位為秒,主備之間必須一致
 7     authentication {  # 主從服務器驗證方式。主備必須使用相同的密碼才能正常通信
 8         auth_type  PASS
 9         auth_pass  123456
10     }
11     virtual_ipaddress {  # 虛擬IP。可以設置多個虛擬IP地址,每行一個
12         172.188.0.201
13     }
14 }
View Code

4.2.3啟動

service keepalived start

4.3實現外網訪問虛擬ip

4.3.1查看當前局域網IP分配情況

yum install nmap -y

nmap -sP 192.168.1.0/24

 

4.3.2安裝keepalived

vim /etc/keepalived/keepalived.conf

(如果嫌配置不好找 可以把之前的刪掉 我這里刪掉了重新配置的 看個人rm /etc/keepalived/keepalived.conf)

 1 vrrp_instance VI_1 {
 2     state MASTER
 3 #這里是宿主機的網卡,可以通過ip a查看當前自己電腦上用的網卡名是哪個
 4     interface ens33
 5     virtual_router_id 100
 6     priority 100
 7     advert_int 1
 8     authentication {
 9         auth_type PASS
10         auth_pass 1111
11     }
12     virtual_ipaddress {
13 #這里是指定的一個宿主機上的虛擬ip,一定要和宿主機網卡在同一個網段,
14 #我的宿主機網卡ip是192.168.188.180,所以指定虛擬ip是160
15            192.168.188.160
16     }
17 }
18  
19 #接受監聽數據來源的端口,網頁入口使用
20 virtual_server 192.168.188.160 8888 {
21     delay_loop 3
22     lb_algo rr 
23     lb_kind NAT
24     persistence_timeout 50
25     protocol TCP
26 #把接受到的數據轉發給docker服務的網段及端口,由於是發給docker服務,所以和docker服務數據要一致
27     real_server 172.188.0.201 8888 {
28         weight 1
29     }
30 }
31  
32 #接受數據庫數據端口,宿主機數據庫端口是3306,所以這里也要和宿主機數據接受端口一致
33 virtual_server 192.168.188.160 3306 {
34     delay_loop 3
35     lb_algo rr 
36     lb_kind NAT
37     persistence_timeout 50
38     protocol TCP
39 #同理轉發數據庫給服務的端口和ip要求和docker服務中的數據一致
40     real_server 172.188.0.201 3306 {
41         weight 1
42     }
43 }
View Code

4.3.3啟動Keepalived

service keepalived start

#service keepalived status

#service keepalived stop

4.3.4暫停PXC集群的方法

vi /etc/sysctl.conf

#文件中添加net.ipv4.ip_forword=1這個配置

systemctl restart network

 4.4驗證

查看用戶名密碼 登錄監控界面

vim /home/nscoffee/docker/haproxy/haproxy.cfg

192.168.188.160:8888/dbs

 

4.5使用navicat測試連接數據庫

並且建庫都可同步

通過haproxy可以建立連接

 

 

 

直接連數據庫的端口號

 

 

 

5.數據備份

5.1冷備份

冷備份是關閉數據庫時候的備份方式,通常做法是拷貝數據文件

是簡單安全的一種備份方式,不能在數據庫運行時備份。

大型網站無法做到關閉業務備份數據,所以冷備份不是最佳選擇

5.2熱備份

熱備份是在系統運行狀態下備份數據

MySQL常見的熱備份有LVM和XtraBackup兩種方案

5.2.1LVM:linux的分區備份命令,可以備份任何數據庫;但是會對數據庫加鎖,只能讀取;而且命令復雜

5.2.2XtraBackup不需要鎖表,而且免費

5.3XtraBackup

XtraBackup是一款基於InnoDB的在線熱備工具,具有開源免費,支持在線熱備,占用磁盤空間小,能夠非常快速地備份與恢復mysql數據庫

備份過程中不鎖表,快速可靠

備份過程中不會打斷正在執行地事務

備份數據經過壓縮,占用磁盤空間小

5.4全量備份和增量備份

全量備份:備份全部數據。備份過程時間長,占用空間大。第一次備份要使用全量備份

增量備份: 只備份變化的那部分數據。備份的時間短,占用空間小。第二次以后使用增量備份

5.5PXC全量備份

docker exec -u 0 -it pxcnode01 /bin/bash

yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm

percona-release enable-only tools release

percona-release enable-only tools

(主要看pxc的mysql版本 我這里mysql版本是8.0 所以安裝8.0版本的percona-xtrabackup)
yum install -y percona-xtrabackup-80/yum install -y percona-xtrabackup-24

mkdir -p /data/backup/full

xtrabackup --backup -uroot -proot --target-dir=/data/backup/full

 

特別感謝

https://www.cnblogs.com/wanglei957/p/11819547.html

https://note.youdao.com/ynoteshare1/index.html?id=20f25c8660ff66ba598217c21093dfe2&type=note

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM