一.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 查看现有任务