



从入口层(CDN)---> 到安全层(WAF) ---> 最后到达应用层 (ECS集群);
Docker Swarm打通了ECS集群中的每台服务器,在每台ECS宿主机安装Docker engine并部署了公司需要的应用服务和数据库(Nginx、PHP、Redis、MySQL等);
MySQL容器通过宿主机的本地(目录)挂载到容器中实现数据持久化;
业务项目以PHP为主,PHP也是运行在容器中,通过PhP指定的配置文件连接到MySQL容器中。
version: "3"
services:
ussbao:
# replace username/repo:tag with your name and image details
image: 隐藏此镜像信息
deploy:
replicas: 1
restart_policy:
condition: on-failure
environment:
MYSQL_ROOT_PASSWORD: 隐藏此信息
volumes:
- "/data//mysql/db1/:/var/lib/mysql/"
- "/etc/localtime:/etc/localtime"
- "/etc/timezone:/etc/timezone"
networks:
default:
external:
name: 隐藏此信息

根据业务量规划开通RDS实例,创建数据库和用户;
提前做好RDS白名单,添加允许访问RDS的IP地址;
mysqldump备份Docker中的MySQL;
把备份好的.sql文件导入到RDS中;
修改PHP项目的数据库配置文件;
清空PHP项目的缓存文件或目录;
测试验证;
RDS定时备份;
#!/bin/bash
数据库IP
dbserver='*******'
数据库用户名
dbuser='ganbing'
数据库密码
dbpasswd='************'
备份数据库,多个库用空格隔开
dbname='db1 db2 db3'
备份时间
backtime=`date +%Y%m%d%H%M`
out_time=`date +%Y%m%d%H%M%S`
备份输出路径
backpath='/data/backup/mysql/'
logpath=''/data/backup/logs/'
echo "################## ${backtime} #############################"
echo "开始备份"
日志记录头部
echo "" >> ${logpath}/${dbname}_back.log
echo "-------------------------------------------------" >> ${logpath}/${dbname}_back.log
echo "备份时间为${backtime},备份数据库 ${dbname} 开始" >> ${logpath}/${dbname}_back.log
正式备份数据库
for DB in $dbname; do
source=`/usr/bin/mysqldump -h ${dbserver} -u ${dbuser} -p${dbpasswd} ${DB} > ${backpath}/${DB}-${out_time}.sql` 2>> ${backpath}/mysqlback.log;
#备份成功以下操作
if [ "$?" == 0 ];then
cd $backpath
#为节约硬盘空间,将数据库压缩
tar zcf ${DB}-${backtime}.tar.gz ${DB}-${backtime}.sql > /dev/null
#删除原始文件,只留压缩后文件
rm -f ${DB}-${backtime}.sql
#删除15天前备份,也就是只保存15天内的备份
find $backpath -name "*.tar.gz" -type f -mtime +15 -exec rm -rf {} \; > /dev/null 2>&1
echo "数据库 ${dbname} 备份成功!!" >> ${logpath}/${dbname}_back.log
else
#备份失败则进行以下操作
echo "数据库 ${dbname} 备份失败!!" >> ${logpath}/${dbname}_back.log
fi
done
echo "完成备份"
echo "################## ${backtime} #############################"

















在经常查询而不经常增删改操作的字段加索引。
order by与group by后应直接使用字段,而且字段应该是索引字段。 一个表上的索引不应该超过6个。
索引字段的长度固定,且长度较短。
索引字段重复不能过多,如果某个字段为主键,那么这个字段不用设为索引。
在过滤性高的字段上加索引。
使用like关键字时,前置%会导致索引失效。
使用null值会被自动从索引中排除,索引一般不会建立在有空值的列上。
使用or关键字时,or左右字段如果存在一个没有索引,有索引字段也会失效。
使用!=操作符时,将放弃使用索引。因为范围不确定,使用索引效率不高,会被引擎自动改为全表扫描。
不要在索引字段进行运算。
在使用复合索引时,最左前缀原则,查询时必须使用索引的第一个字段,否则索引失效;并且应尽量让字段顺序与索引顺序一致。
避免隐式转换,定义的数据类型与传入的数据类型保持一致。

此次故障虽然是表没有索引造成的,但是笔者是有责任的,没有挨个表检查一下表的结构;
通过此次故障也可以看出来开发在设计表的真的要非常的重视,注意细节;
还有就是之前在容器中运行的MySQL也时不时的出现CPU瓶颈(比如CPU使用率偶尔会达到80%以上),笔者应该就要提前发现这些问题,彻底排查找出问题所在原因在进行迁库的操作。
转载自:Docker





