Docker搭建pxc

2021-11-09 10:14:25 浏览数 (2)

一.PXC集群介绍

pxc是基于Galera,可以实现多节点间的数据同步以及不需要读写分离可以随时访问任一节点,保证数据库的强一致性(无延迟)以及高可用,但牺牲了部分性能

优点:真正的多主,强一致性,热备高可用,不需要处理主从故障转移

二.实验操作

1.关闭selinux,开放firewalld端口:4444(全量传输,sst用于其他worker的同步),4567(集群通信的端口),4568(增量传输)

vim /etc/selinux/config#将selinux设置为disable

firewall-cmd --zone=public --add-port=4444/tcp --permanent

firewall-cmd --zone=public --add-port=4567/tco --permanent

firewall-cmd --zone=public --add-port=4568/tcp --permanent

direwann-cmd --zone=public --add-port=9001/tcp --permanent

2.时间同步(配置NTP服务)

rpm -qa | grep ntp

yum install -y ntp

ntpdate 210.72.145.44(中国国家授时中心)

date

3.下载percona/percona-xtradb-cluster

docker pull percona/percona-xtradb-cluster

docker tag percona/percona-xtradb-cluster pxc

docker rm percona/percona-xtradb-cluster

4.创建swarm集群

  • 第一个创建的是pxc集群的master,需要初始化pxc集群
  • pxc集群是不需要进行读写分离配置的,任意一个节点写入都是能强一致的同步到其他节点

pxc

  • docker swarm init#将生成的docker swarm join...:2377复制到其他主机会显示AS A WORKER
  • swarm集群常用命令:docker node ls#查看swarm集群
  • docker node rm#移除swarm的某一节点
  • docker swarm leave -f 强制解散swarm集群

5.创建net网络

创建一个docker网络给pxc集群,后期也方便不同的pxc集群进行区分维护

docker network create -d overlay -attachable swarm-mysql

6.创建pxc主节点

docker run -d -p 9001:3306 #将容器的3306端口映射到宿主机

-e MYSQL_ROOT_PASSWORD=123456 #设置mysql的root账号和密码

-e XTRADB_ROOT_PASSWORD=123456

-e CLUSTER_NAME=pxc1 #给集群取名pxc1

-v v1:/var/lib/mysql --priviliges #将容器的mysql目录与宿主机数据卷v1挂载

-name=pnv1 --net=swarm-mysql

pxc

注:数据卷v1可以提前创建docker volume create 卷名 --创建

docker volume ls --查看

docker volume inspect 卷名 --查看数据卷详情

待主节点创建成功后,可以docker ps 查看容器工作状态

等待1分钟左右使用Navicat客户端工具进行连接

7.创建pxc其他worker节点

docker run -d -p 9001:3306 #将容器的3306端口映射到宿主机

-e MYSQL_ROOT_PASSWORD=123456 #设置mysql的root账号和密码

-e XTRADB_ROOT_PASSWORD=123456

-e CLUSTER_NAME=pxc1 #给集群取名pxc1

-e CLUSTER_JOIN=pnv1 加入集群p剩下的worker可以按照上面的格式,进行部分修改,没添加一个worker后需要等待它连接成功再进行下一个worker的创建,

否则容易出现闪退

8.查看挂载情况

  • 可以使用docker network inspect swarm-mysql #查看overlay虚拟网络上各节点的挂载情况
  • 可以进入任意节点数据库访问以pnv2为例docker exec -it pnv2 bash
  • mysql -uroot -p'123456'
  • show status like 'wsrep%';
  • 可以看到"wsrep_incoming_addresses"的值对应的就是我们的节点ip

9.pxc集群测试

在任意节点数据库或Nacicat新增数据库test,刷新其他节点数据库能看到数据库test同步,即为成功

10.数据库备份

因为pxc集群是强一致性,无延时同步,所以对数据库进行备份可以登入任意节点进行备份

docker exec -it pnv1 bash

进入容器内mysqldumo -uroot -p 数据库名 > /var/lib/mysql/backup.sql

/var/lib/mysql挂载在宿主机v1卷,所以可以同步看到backup

脚本备份

#!/bin/bash

mysql_container="mysql"

mysql_user="root"

mysql_password="****"

dbname='test'

backtime=`date %Y%m%d%H%M`

logpath='/var/lib/mysql/backlog'

datapath='/var/lib/mysql/backdata'

if [ ! -d "$logpath" ]; then

mkdir -p "$logpath"

fi

if [ ! -d "$datapath" ]; then

mkdir -p "$datapath"

fi

echo ‘”备份时间为${backtime},备份数据库表 ${dbname} 开始” >> ${logpath}/mysql.log

for table in $dbname;

do

source=`docker exec -i ${mysql_container} mysqldump -u${mysql_user} -p${mysql_password} --single-transaction ${table}> ${datapath}/${backtime}.sql` 2>> ${logpath}/mysql.log;

if [ "$?" != 0 ] ; then

echo “数据库表 ${dbname} 备份失败!!” >> ${logpath}/mysql.log

else

cd $datapath

tar jcf ${table}${backtime}.tar.bz2 ${backtime}.sql > /dev/null

rm -f ${datapath}/${backtime}.sql

find $datapath -name "*.tar.bz2" -type f -mtime 90 -exec rm -rf {} ; > /dev/null 2>&1

echo “数据库表 ${dbname} 备份成功!!” >> ${logpath}/mysql.log

fi

done

设置crontab定时任务

crontab -e

00 00 * * * sh /脚本路径/backup.sh

crontab -l 查看现有任务

1 人点赞