360 私有云平台 MySQL 自动化实现剖析

《360 私有云平台 MySQL 自动化实现剖析》要点:
本文介绍了360 私有云平台 MySQL 自动化实现剖析,希望对您有用。如果有疑问,可以联系我们。

MySQL

HULK 私有云平台 MySQL 服务剖析 — MySQL 自动化在 HULK 中的实现,这次的分享题目是:HULK 私有云平台 MySQL 服务剖析 — MySQL 自动化在 HULK 中的实现.本次分享主要从下面几个方面来介绍:

  1. HULK 私有云平台介绍
  2. 现有 MySQL 服务规模
  3. MySQL 服务常用功能展示
  4. 各功能模块设计实现思路
  5. 新的计划

现状 & 服务规模

说起 HULK 私有云平台大家有参加过之前我们同事分享的应该听过,360HULK 私有云平台是奇虎 360 公司内部专属私有云平台,平台涉及云计算、数据库、大数据、监控等众多技术领域.今天要分享的 MySQL 服务就是 HULK 数据库服务中的一种.

私有云

这个是 HULK 用户端的首页,而其中数据库服务又集合了 MySQL、Redis、Mongodb、Greenplum、ElasticSearch 等,今天的主角是 MySQL,MySQL 作为基础服务是 DBA 服务体系中的基石,在 HULK 云平台中,MySQL 实例数已经突破 9000+,日访问量超过 200 亿,单份数据量也已经超过了 270TB.

不知道大家跟业务或者 DBA 沟通需求通过什么途径,当年我们没有搞自动化之前,需求沟通占用很大一部分工作时间,并且资源管理、服务部署等都是体力活,往往业务从需求沟通到实例部署完成,都是小时计的,而现在,我们可以做到分钟级,下面是在使用 HULK 平台自动化前后的对比.

DBA

实现全部自动化后,业务可以随时随地自助的提交数据库申请,不受时间和外部其他因素困扰,并能快速的投入使用,极大的提高了开发效率.

各功能模块设计实现思路

下面会根据业务在 HULK 上从申请到最终下线,贯串整个流程来演示和分析下各个模块的功能和设计思路.

HULK

创建实例  

先看下创建实例,目前我们实例创建做到了全自动,业务之需根据自己业务情况选择对应的套餐、部署 IDC 以及访问数据库的机器列表,即可提交任务,任务提交后自动化完成,时间视部署 IDC 情况在 30 秒到 1 分钟之间.这个是实例申请页面,业务提交完申请,只需要查看工单状态,完成后具体的数据库连接信息会邮件发送.我们底层的任务系统用的自研的 QCMD,后面有机会的话也会在这里和大家分享,本次不做过多介绍.

360 私有云平台 MySQL 自动化实现剖析

而要做到这样的全自动,就需要从资源分析控制上入手,怎么合理的分配资源,且能高效的利用,是重点要考虑的问题,下面是我们在做自动化中遇到和解决的几个技术点:

自动化

借鉴各个公有云的模式,我们分析了业务的各种需求类型,同时对比我们内部的数据库资源,将数据库实例归类划分为套餐,不同的套餐对应不同的数据库资源,每台服务器也有自己对应的资源总数,实例新建、扩容、下线等都会相应增删不同比例的资源.这样每台服务器理论分配的数据库实例和对应消耗的资源是可控的.

同时,我们对服务器实际消耗的资源进行动态统计分析,并对健康状态进行打分,这样进一步来控制服务器的资源使用.

自动关联监控系统比不可少,第一时间将数据库实例纳入监控体系,并且在管理员维护操作的时候可以灵活启停监控.

对机器资源统计方面我们重点监测下面 7 个点,有一个监测点的值超过了对应阈值则处于不同的状态,在创建实例自动选择机器的时候,将会按照不同的逻辑选择.

360 私有云平台 MySQL 自动化实现剖析

数据库架构 & 高可用

实例创建完成,下图是我们默认的数据库架构图,以双 IDC 为例,用 Atlas 作为中间层,提供读写分离,Atlas 已经开源具体可以参考:https://github.com/Qihoo360/Atlas . 在 Atlas 之上用 LVS 做了一次隔离和负载均衡,其中为了高可用,每个机房的服务节点都是部署多个,避免单点故障.

架构

当单个 Atlas 故障的时候,LVS 检测到异常会直接下线,而当单个从库故障的时候,Atlas 检测到也会下线. 这样在 Atlas 和从库单点故障的时候整个集群还能正常工作,并且不影响业务使用.但是,当主库挂掉的时候,就改我们的故障自动切换 Failover 出场了.

下图是我们主库宕机时的切换流程,我们的故障切换服务 MySQL Failover 实时监控集群状态,当发现主库宕机后,会根据选主逻辑选出新主库、补全数据、重做主从结构然后修改 Atlas 的配置,到此整个切换流程完成,MySQL Failover 重新进入监控状态.正常情况整个故障切换耗时 15s 左右.

流程

建表改表  

说完数据库结构和故障切换,按照正常操作流程业务们该建表、改表、授权、查看监控等操作了,其中授权监控这里就不多赘述了.因为我们平台默认给业务方只有对数据的增删改查权限,所以建表改表需要业务来 HULK 平台操作,针对建表,我们根据运维经验和踩坑实践,总结了 16 个检查项,这里贴出来和大家分享下.

建表语句需要符合一定标准,否则将建表失败,具体审核标准如下:

  1. 表结构是否合法;
  2. 表名、列明长度超过 16;
  3. 必须有 unsigned;
  4. 必须为 innodb;
  5. int bigint (10) 不能小于 10;
  6. varchar 长度小于 3000;
  7. text 字段个数不能大于 3;
  8. 主键必须为 int 类型;
  9. 索引不能有重复;
  10. 索引个数不能大于 5 个(包括主键);
  11. 索引字段必须为 not null,并且有 default 值(除自增键外);
  12. SQL 是否使用到索引;
  13. 审核的 SQL 不要包含非审核的表;
  14. SQL 中不能有 *;
  15. 自增字段必须为 int 或者 bigint;
  16. 请不要使用 MySQL 预留字(Reserved Words);

下面这个是测试建表的示例.

360 私有云平台 MySQL 自动化实现剖析

改表我们用的是 pt-osc(pt-online-schema-change),不过我们最近也在研究 gh-ost https://github.com/github/gh-ost,对 gh-ost 感兴趣的咱们也可以下来交流.

测试环境  

为了方便业务测试,我们在平台上提供了测试环境,并且将测试环境和线上环境打通,业务可以直接将库表结构在线上和测试之间互导.方便业务测试和上线操作.

360 私有云平台 MySQL 自动化实现剖析

优化建议  

优化建议我们平台上目前统计了三类:慢日志、未使用索引、char 字段,其中慢日志收集了执行超过 0.5s 的 sql 以天为单位汇总后使用 pt-query-digest 分析,并将结果展示在 HULK 平台.

未使用索引我们使用了 MySQL5.6 中 PS 库的 table_io_waits_summary_by_index_usage 表的信息,汇总分析出没有被使用到的索引,重复索引会浪费存储空间,同时对数据更新性能也有影响,在一些场景下,还会对查询优化器造成干扰,可谓百害而无一利.

我们另一个优化建议就是 char 字段优化了,好多业务在建表的时候喜欢用 char 类型,但是 char 是固定长度,申请多少就占多少空间,当存入的字符串长度不够的时候会用空格补齐,这样在非定长的字符串存储中 char 会浪费大量的存储空间,所以我们对线上的所有字段定期进行分析汇总,扫描出使用长度远小于申请长度的表和字段,以报表的方式展示给业务,方便业务及时优化,我们建议直接将 char 改为 varchar,除非存储的是定长的比如 md5 之类的字符串,否则全部建议用 varchar.varchar 是可变长度的,实际使用多少就分配多少,额外再用 1-2 字节存储长度,并且超过指定长度还可以继续写入.

数据恢复  

大家关心的数据恢复来了,不知道大家有没有这个经历:不小心误操作了需要恢复数据,但是联系 DBA、沟通需求、DBA 数据恢复、业务数据确认、替换上线,这整个流程走下来可能影响已经扩大,况且有可能数据恢复的需求在半夜,这个流程可能又延长很多.出于这种场景的考虑,我们将数据恢复也做成了自动化的任务,业务可以自助随时提交恢复任务,避免沟通确认各个环节浪费宝贵的数据恢复时间.数据可以恢复到 7 天以内任意时间点.看操作流程截图:

360 私有云平台 MySQL 自动化实现剖析

360 私有云平台 MySQL 自动化实现剖析

360 私有云平台 MySQL 自动化实现剖析

业务之需选择需要恢复的库表,选择时间提交任务即可,视数据量大小耗费时间不一,普通的几 G 的数据表,一般分钟级就能恢复,恢复后会生成临时实例,业务去临时实例确认数据无误后就可以一键替换线上,完成数据恢复申请.

数据备份

前面大家也了解了自动数据恢复,数据恢复依赖于完善的数据备份.我们的备份系统各模块构成如下图:

数据备份

备份系统特点

多维度备份

全量备份 + 增量备份(binlog),每天都会进行全量备份,同时实时进行 binlog 备份.

合理的保留策略

4,2,1 策略,即保留最近 4 天每天的全量备份,最近 2 周,最近 2 月,最近 1 年的全量备份binlog 保留最近 60 天.

 自动更新备份策略

策略根据当天状态动态刷新,根据从库状态(我们在从库备份),存储状态,网络状态等动态跟新备份策略.

 失败检测预警

备份失败自动归类,集中处理.备份失败检测模块会将失败任务汇总,报表展示.

 过期自动清理

存储管理模块会根据保留策略,清理过期的备份数据.

我们备份系统是基于 Percona XtraBackup 实现的,不过根据我们的使用场景,做了一些改进与提升:

 分库分表独立备份压缩

我们备份过程中按表为单位单独备份打包压缩,以便于支持单 / 多表快速恢复

改造支持单 / 多表恢复

为了快速恢复我们修改部分备份功能,可以支持数据恢复的时候值拷贝需要恢复的数据表和 MySQL 元数据信息,极大节省数据拷贝、解压以及数据恢复时主从数据同步时间.想象下这种场景:源数据库有 1T 数据,现在需要快速恢复一张 1G 的数据表,如果不支持单表恢复,则需要拷贝 1T 的数据并解压,这恢复时间起码好几个小时,但是支持单表恢复后,拷贝和解压的数据量只有几 G,分钟级就可以恢复.

支持数据加密和加密传输

增加了数据加密模块和加密传输模块

 增加多种恢复模式

支持时间点,binlog_pos,sql 等多种恢复模式

从 DBA 和运维角度出发,还可以做一些事情来避免机器级别的故障:

  1. 关注远控报错,有问题及时迁移实例报修
  2. 监控系统日志,提前发现故障机器.有一些硬件故障不会导致立即宕机,单是个定时炸弹,这些信息会被记录到系统日志,如 message,mcelog 中,对这些日志增加监控,可以提前发现有故障隐患的机器,提前迁移数据库实例,避免宕机影响服务.
  3. 控制机器过比率,发现现在厂商对过保故障控制的特别到位,一过保,机器故障率里面飙升,所以我们也对机器的过保情况进行了统计,避免重点业务部署在已过保的机器上.

新的计划

360 私有云平台 MySQL 自动化实现剖析

日常操作自动化之后,业务开发效率提高同时 DBA 也可以省去之前大量的重复劳动,可以有更多的精力来提高服务质量以及研究写新的技术.以上就是我们 HULK 平台 MySQL 服务的一些设计思路和实践经验.

QA 环节

Q1:未来计划的数据库的迁库操作是怎样的?是不是开发人员可以很简单地进行操作?

A1:数据迁移是想实现从自建的或者非标准的数据源将数据迁移到我们标准的平台上来,并且尽量不影响源数据库的使用.计划是做成一个通用服务,业务人员之需填写数据源和目的的相关配置即可.

Q2: 能详细说明一下 dts 实现当时么,尤其对于大数据库?

A2: DTS 还在开发中,后面有机会和大家交流.

Q3: 请问你们有做 SQL 操作日志审计吗,是如何扑获 MySQL 执行的所有 sql 语句的?

A3: 我们全量的 SQL 日志是通过 Atlas 收集汇总的,上面也有放 Atlas 的 github 连接,感兴趣的同学可以去看看.

Q4:辛苦了!测试环境和线上环境的打通是怎样做到的,Docker 吗?

A4: 我们这边在 HULK 平台上通过业务的方式来关联服务,同一个业务可以在自己的线上环境和测试环境之间做迁移,DBA 这边直接通过管理账号后台打通权限.

Q5: 请问数据库实例是安装在哪里呢,一台物理机如何部署多个 mysql 实例?

A5: 数据库实例是部署在物理机上的,一台物理机部署多个 MySQL 实例,可以配置多个配置文件,设置不同的数据目录即可.

Q6:每天 100 多万的订单在 mysql 库上如何做,如分片,分库如果分片,分多少合适?

A6: 这个得根据实际情况来分析,现在硬件性能提升很快,不分片也能抗很大的请求,具体分片需要根据实际的数据量、访问量、瞬间并发量、机器性能等等来设计.

Q7:“其中数据库服务又集合了 MySQL、Redis、Mongodb、Greenplum、ElasticSearch 等”,请问能否介绍下各类数据库的应用情况?

A7: Redis 前面有过分享,大家可以找找历史文章或者找美女环环;MongoDB 后面我们准备也有一起分享,先留点悬念.

Q8:如何设置主从数据库?系统升级中包括 schema chang,如何保证不宕机

A8: 主从配置这个资料挺多,我就不在这里赘述了,系统升级这个我分享前面有介绍我们的故障切换,可以重温下 [呲牙].

Q9: 老师请教一下:我们公司的私有云只提供虚拟机,虚拟机里装 mysql 这种方式可行否?

A9:虚拟机里装 MySQL 也是 OK 的,不过需要注意的是同一宿主机的虚拟机可能会竞争公共资源等等.

Q10:老师好,多实例跑在一起,如何控制资源分配,如果某一实例资源消耗过高,影响其他实例?请教下怎么做同一个主机室上不同实例的硬件资源调的调配?

A10: 资源隔离大家可以了解下 cgroup,磁盘配额可以使用 xfs_quota,网络流量可以使用 TC.资源一般不限制,但为了避免资源争用带来的问题我们对多种硬件资源的使用进行了监控,一旦某硬件资源即将用尽则判定可能出现争用问题,此时通过资源限制即可快速对对应实例进行限制,避免发生问题.

Q11:老师好,水平分库是否可以做到动态扩 / 缩容?具体怎么实现的?

A11: DTS+ 内部版本 Atlas 可以做到,实现方式暂时不能公开,后续成熟可开源

作者介绍

刘臻,360WEB 平台部 DBA,负责公司私有云平台 HULK 数据库相关服务建设和数据库服务环境基础运维.

文章来自微信公众号:高效开发运维

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


起步 处理器架构,参考 x86是指intel的开发的一种32位指令集 intel和amd早期的cpu都支持这种指令集 AMD比Intel率先制造出了商用的兼容x86的CPU,AMD称之为AMD64 Intel选择了设计一种不兼容x86的全新64为指令集,称之为IA-64,后来支持AMD64的指令集,
pscp pscp -P 22 C:\work\test.txt root@192.168.1.5:/home/data pscp -P 22 root@192.168.1.5:/home/data/test.txt C://work// 检索 find / -name default.config
文件处理 ls -a # 显示所有文件 ls -l # 显示详细信息 ls -d # 显示路径 mkdir /目录名称 # 创建目录 cd /目录名称 # 切换目录 pwd # 显示当前路径 rmdir /目录名称 # 删除目录 cp -rp [目录名称] [目标目录] # 复制目录到目标目录 cp
准备一台电脑(我就用联想拯救者r7000演示) 参考博客制作启动盘 插上U盘,启动电脑,一直按F2 进入如下页面后,将U盘设置为第一启动项,点击exit,保存并退出 之后进入如下页面,选择第三项 进入如下页面,选择第四项 进入如下页面,选择第一项,选中后,先不要点Enter 按e键,将inst.st
认识 Linux系统是参考了UNIX系统作为模板开发的,但没有使用UNIX的代码;是UNIX的一种,但不是衍生版 在Linux内核的基础上开发是发行版 分区 逻辑分区永远从5开始 步骤 挂载:可理解为分配盘符,挂载点即是盘符名;不同之处:Linux中是以空目录名称作为盘符 Hda 第一块硬盘 Hda
文件处理命令 以 . 开头的文件是隐藏文件 以 - 开头表示这是一个文件 以 d 开头表示是一个目录 以 l 开头表示是一个软链接 第一个root是所有者,第二个root是所属组 ls -h 以文件默认大小后缀 显示 ls -i 查看i节点(唯一标识) 所有者:只能有一个,可变更 所属组:只能有一个
参考 01 02 03 前提环境 本地安装VirtualBox,并安装CentOS8,配置网络后,window系统上putty能连接到CentOS8服务器 配置步骤 右键服务器复制 启动复制后的服务器,查看ip和hostname发现和原来的服务器一样,需要修改 hostname # 查看主机名 vi
文件搜索命令 星号匹配任意字符,问号匹配任意单个字符 -iname 根据文件名查找且不区分大小写 -ok 命名会有一个询问的步骤 如果没有找到指定文件,可输入命令:updatedb 更新文件资料库;除tmp目录不在文件资料库收录范围之内 locate -i 文件名 # 检索时不区分大小写 which
安装环境 安装最新版的Virtual Box,点击安装 下载centos8镜像 创建虚拟机,可参考 选择下载到本地的镜像 设置启动顺序 点击启动 启动过程中报错:“FATAL:No bootable medium found!” 1.没有选择iso镜像 2.光驱没有排在第一位置 3.镜像只能选择x8
Linux严格区分大小写 所有内容文件形式保存,包括硬件 Linux不靠扩展名区分文件类型 挂载:将设备文件名和挂载点(盘符)连接的过程 Linux各个目录的作用 bin表示二进制 服务器注意事项 远程服务器不允许关机,只能重启 重启时应该关闭服务 不要在服务器访问高峰运行高负载命令 远程配置防火墙
IDE连接Linux,上传下载文件 参考1 参考2 连接Linux 上传下载文件 本地项目打包后上传 查看是否上传成功,右键下载 补充 后端项目开发完成后,需clean掉临时文件target文件夹,且只推送修改过的文件 前端项目开发的过程中,需要在每个子组件中使用scoped,确保每个子组件中的编码
起步 LTS与普通版本的区别 LTS版本的发布周期更长,更加稳定 安装jdk sudo mkdir /usr/lib/jvm # 在Ubuntu中创建目录 pscp D:\安装包\linux源码包\jdk-8u291-linux-x64.tar.gz chnq@192.168.0.102:/tmp
前言 最近在b站上看了兄弟连老师的Linux教程,非常适合入门:https://www.bilibili.com/video/BV1mW411i7Qf 看完后就自己来试着玩下,正好手上有台空闲的电脑就尝试不使用虚拟机的方式安装Linux系统 安装步骤 制作启动盘 下载ISO镜像,我这里下载的是Cen
新建虚拟电脑 设置内存和处理器 设置硬盘大小 完成 设置 查看光驱 设置启动顺序 点击启动 选择第1项 进入图形安装界面 选择安装位置,开始安装 设置root密码 重启 登录 查看本地文件夹 配置网络,点击设置 查看宿主机ip C:\Users\ychen λ ipconfig 无线局域网适配器 W
源码包安装需手动下载后安装 二进制包则在package目录下 rpm命令管理rpm包 若某个rpm包依赖于某个模块,需要到网站www.rpmfind.net查询该模块依赖的包,安装这个包后自动安装模块,之后就能安装rpm包了 安装升级时使用包全名 查询卸载时使用包名 虚拟机中的Linux系统安装rp
首先进入命令模式,再输入以下命令 命令模式用于输入命令 插入模式可对文件编写操作 编辑模式下的命令是在冒号后输入 :12, 15d # 删除指定范围的行,这里是删除12到15行 :n1,n2s/old/new/g ## 表示从n1行到n2行,old表示旧的字符串 vim使用小技巧:自定义快捷键,如快
使用源码包安装,需要自己指定安装位置,通常是 /usr/local/软件名/ linux中要想启动执行文件,应使用绝对路径 /绝对路径/rpm包名 start ## 执行方式一 service rpm包名 start ## 执行方式二 使用源码包安装后,由于自定义安装路径,就不能使用service命
网络命令 在收邮件的用户中,输入 mail 可查看邮件信息,输入序列号查看详细信息 在mail命令下,输入h 查看所有邮件的列表 输入:d 序列号 # 删除邮件 last # 统计所有用户登录或重启时间,用于日志查询 lastlog # 显示包括未登录用户的登录时间 lastlog -u 用户id
若要使用yum管理,必须能连接网络,首先配置网络IP 进入yum源文件中启动容器 使用yum源头安装rpm包不需要进入package路径,同时也不需要使用包全名,会有yum自动管理 安装软件组
简介 client即是本机安装的docker,相当于git Docker_host相当于centos系统 registry则是docker仓库,相当于GitHub 镜像用于创建docker容器,一个镜像可以创建多个docker容器 容器是由镜像创建的运行实例,(镜像相当于类,容器相当于类创建的对象)