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

 

posted @ 2021-07-14 19:24  peng_boke  阅读(897)  评论(5编辑  收藏  举报