手记

Docker前后端分离实战之搭建MYSQL集群

这门慕课实战对想了解Docker的人很有帮助。感谢神思者l大佬


renren-fast

后台:SpringBoot+SSM+Shiro+swagger(API调试)+Redis+JWT(单点登录)

Linux回顾

  • 查看、启动、关闭、重启防火墙 firewall-cmd -state -start -stop -restart
  • 端口管理
  • firewall-cmd -permanent --add-port=8080-8085/tcp
  • firewall-cmd -reload
  • firewall-cmd -permanent-remove-port=8080-8085/tcp
  • firewall-cmd --list-ports 查看端口
  • firewall-cmd–permanent–list-services 查看使用网络的程序

Docker创建的所有虚拟实例共用同一个Linux内核,对硬件占用较小,属于轻量级虚拟机

导入导出镜像

单节点缺点

  • 大型互联网程序用户群体庞大,所以架构必须要特殊设计
  • 单节点的数据库无法满足性能上的要求
  • 单节点的数据库没有冗余设计,无法满足高可用

Mysql集群方案

PXC (Percona XtraDB Cluster)

建议PXC使用PerconaServer(MySQL改进版,性能提升很大)

  • PXC同步复制,事务在所有集群节点要么同时提交,要么不提交
  • Replication采用异步复制,无法保证数据的一致性

安装PXC镜像

创建内部网络

创建Docker卷

业务数据保存在宿主机中

docker volume rm v1

train

下载(略) docker tag 镜像名 命名

创建内部网络

出于安全考虑,需要给PXC集群实例创建Docker内部网络
docker内置网段172.17.0.*

docker network create --subnet=10.0.75.1/24 net1 创建网段
docker inspect net1 
docker network rm net1

创建PXC容器

只需要向PXC镜像传入运行参数就能创建出PXC容器
注意:要等待前一个docker镜像中的mysql初始化(数据库初始化比较耗时),如果第一个没有初始化成功,就提前创建了第二个数据库,第二个数据库就会闪退

第一个节点
 docker run -d -p 4406:3306 -v v1:/f/skillTrain -e MYSQL ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 --privileged --name=node1 --net=net1 --ip 10.0.75.2 pxc
第二个节点
docker run -d -p 4407:3306 -v v2:/f/skillTrain -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1        --privileged --name=node2 --net=net1 --ip 10.0.75.2 pxc
第三个节点
docker run -d -p 4408:3306 -v v3:/f/skillTrain -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 10.0.75.3 pxc
第四个节点
docker run -d -p 4409:3306 -v v4:/f/skillTrain -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 10.0.75.4 pxc
第五个节点
docker run -d -p 4409:3306 -v v5:/f/skillTrain -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 10.0.75.5 pxc

P.S 搞这里由于马虎报错了,docker logs -f containerId 查看错误日志

负载均衡


docker pull haproxy
宿主机
touch /home/soft/haproxy.cfg 配置文件
docker run -it -d -p 4001:8888-p 40003306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name  haproxy--privileged --net=net1 haproxy
进入容器(配置文件)
haproxy -f /usr/local/etc/haproxy/haproxy.cfg
mysql创建账号
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';

  • 文件映射应该不用讲了把
  • 然后4001是用来可视化监控集群的

高可用(使用Keepalived实现双击热备)

单节点Haproxy不具备高可用,必须要有冗余设计


docekr exec -it 容器名  exit是退出容器界面
yum install keepalived
Keepalived的配置文件是/etc/keepalived/keepalived.conf
最后一步 service keepalived start

  • interface 网卡设备
  • virtual_router_id 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须一致。标识可以是0~255
  • priority MASTER权重要高于BACKUP数字越大优先级越高
  • advert_int MASTER与BACKUP节点间同步检查的时间间隔,单位为妙。主备之间必须一致
  • authentication 主从服务器验证方式,主备必须使用相同的密码才能正常通信
  • virtual_ipaddress 虚拟IP地址。可以设置多个虚拟IP地址 每行一个

热备份数据

mysqldump属于冷备份

  • 冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
  • 冷备份是最简单最安全的一种备份方式
  • 大型网站无法做到关闭业务备份数据,所以冷备份不是最佳选择
  • 冷备份是关闭数据库时候的备份方式,通常做法是拷贝数据文件
  • 冷备份是最简单最安全的一种备份方式
  • 大型网站无法做到关闭业务备份数据,所以冷备份不是最佳选择
  • 热备份是在系统运行的状态下备份数据,也是难度最大的备份
  • MySQL常见的热备份有LVM和XtraBackup两种方案
  • 建议使用XtraBackup热备MySQL
    • XtraBackup备份过程不锁表、快速可靠
    • XtraBackup备份过程不会打断正在执行的事务
    • XtraBackup能够基于压缩等功能节约磁盘空间和流量
  • LVM备份需要锁表,只能读

  • 全量备份是备份全部数据。备份过程时间长,占用空间大
  • 增量备份是只备份变化的那部分数据。


  1. 创建数据卷
docker volume create backup
  1. 然后映射backup数据卷,因为是先删除之前的节点,这个时候要关联node2节点
 docker run -d -p 4406:3306 -v v1:/f/skillTrain -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v backup:/f/data -e CLUSTER_JOIN=node2 --privileged --name=node1 --net=net1 --ip 10.0.75.2 pxc

  1. PXC容器中安装XtraBackup,并执行备份
dcoer exec -it node1 bash
apt-get update
apt-get install percona-xtrabackup-24
innobackupex --user=root --password=abc123456 /data/backup/full
查看数据卷在哪
docker inspect backup

  1. 数据库可以热备份,但是不能热还原,只能冷回复。为了避免恢复过程中的数据同步,我们采用空白的MySQL还原数据,然后再建立PXC集群
  2. 还原数据前要将未提交的事务回滚,还原数据之后重启MySQL
rm -rf /var/lib/mysql/*
innobackupex --user=root --password=abc123456 --apply-back /data/backup/full/2018/04-15105-09-07/ 回滚
innobackupex --user=root --password=abc123456 --copy-back /data/backup/full/2018/04-15105-09-07/ 还原

17人推荐
随时随地看视频
慕课网APP

热门评论

大佬,使用docker run -it -d --name j1 -v j1:/dodo --net=host node 创建使用宿主机的容器,并在容器中启动服务,为什么我这一直用宿主机的ip加服务的端口访问不到容器中的服务呢?

很棒,我也刚做完所有流程,不过没你总结得这么好。收藏啦哈哈

厉害


查看全部评论