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备份需要锁表,只能读
- 全量备份是备份全部数据。备份过程时间长,占用空间大
- 增量备份是只备份变化的那部分数据。
- 创建数据卷
docker volume create backup
- 然后映射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
- 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
- 数据库可以热备份,但是不能热还原,只能冷回复。为了避免恢复过程中的数据同步,我们采用空白的MySQL还原数据,然后再建立PXC集群
- 还原数据前要将未提交的事务回滚,还原数据之后重启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/ 还原
热门评论
大佬,使用docker run -it -d --name j1 -v j1:/dodo --net=host node 创建使用宿主机的容器,并在容器中启动服务,为什么我这一直用宿主机的ip加服务的端口访问不到容器中的服务呢?
很棒,我也刚做完所有流程,不过没你总结得这么好。收藏啦哈哈
厉害