2019-11-26 不同场景如何快速选择数据库(整理)

干货|爱奇艺数据库实践:不同场景如何快速选择数据库
https://mp.weixin.qq.com/s/6OF3NjiFcM4tlkXSFccvtA

2019-11-26 不同场景如何快速选择数据库(整理)_第1张图片

爱奇艺使用的数据库类型

1.MySQL, 互联网业务必备系统;
2.TiDB,爱奇艺的 TiDB 实践会有另外的具体介绍;
3.Redis, KV 数据库,互联网公司标配;
4.Couchbase,这个在爱奇艺用的比较多,但国内互联网公司用的比较少,接下来的部分会详细说明;
5.其他,比如 MongoDB、图数据库、自研 KV 数据库 HiKV 等;
6.大数据分析相关系统,比如 Hive、Impala 等等。
可以看到爱奇艺的数据库种类是很多的,这可能会造成业务开发不太清楚在他的业务场景下,应该选用哪种数据库系统。所以,我们先对这些数据库按照接口(SQL,NoSQL)和面向的业务场景(OLTP, OLAP)这两个维度进行一个简单的分类。
OLTP是支持 SQL 的这样一类系统,例如 MySQL,一般支持事务不同的隔离级别, QPS 要求比较高,延时比较低,主要用于交易信息和关键数据的存储,比如订单、VIP 信息等。
NoSQL 数据库,是一类针对特殊场景做优化的系统,schema 一般比较简单,吞吐量较高、延迟较低,一般用作缓存或者 KV 数据库。
OLAP 大数据分析系统,包括 Clickhouse、Impala 等,一般支持 SQL、不支持事务,扩展性比较好,可以通过加机器增加数据的存储量,响应延迟较长。
还有一类数据库是比较中立的,在数据量比较小的时候性能比较好,在数据量较大或复杂查询的时候性能也不差,一般通过不同的存储引擎和查询引擎来满足不同的业务需求,我们把它叫做 HTAP,TiDB 就是这样一种数据库。

MySQL在爱奇艺的使用

适配 DDL 和 DML 工具到内部系统,gh-ostt 和 oak-online-alter-table 在数据量大的时候会造成 master-slave 延时,所以我们在使用工具的时候也增加了延时上的考虑,实时探测 Master-Slave 库之间延时的情况,如果延时较大会暂停工具的使用,恢复到正常水平再继续。
MySQL 高可用。Master-slave 加上半同步这种高可用方式不太完善,所以参照了 MHA 并进行改动,采用 master + agent 的方式。Agent 在每一个物理机上部署,可以监控这个物理机上的所有实例的状态,周期性地向 master 发送心跳,Master 会实时监测各个 Agent 的状态。如果 MySQL 故障,会启动 Binlog 补偿机制,并切换访问域名完成 failover。考虑到数据库跨机房跨地区部署的情况,MHA 的 master 也做了高可用设计,众多 master 会通过 raft 组成一个 raft group,类似 TiDB 的 PD 模块。目前 MySQL failover 策略支持三种方式:同机房、同地域跨机房以及跨地域。
提高 MySQL 扩展能力,以提供更大容量的数据存储。扩展方式有 SDK,例如开源的 ShardingSphere,在爱奇艺的使用也比较广泛。另外就是 Proxy,开源的就更多了。但是 SDK 和 Proxy 使用的问题是支持的 SQL 语句简单,扩容难度大,依赖较多且运维复杂,所以部分业务已经迁移至 TiDB。
审计。我们在 MySQL 上做了一个插件获取全量 SQL 操作,后端打到 Kafka,下游再接入包括 Clickhouse 等目标端进行 SQL 统计分析。除此之外还有安全策略,包括主动探索是否有 SQL 注入及是否存在拖库情况等,并触发对应的告警。MySQL 审计插件最大的问题是如何降低对 MySQL 性能的影响,对此我们进行了一些测试,发现使用 General Log 对性能损耗较大,有 10%~20% 的降低。于是我们通过接口来获取 MySQL 插件里的监控项,再把监控项放到 buffer 里边,用两级的 RingBuffer 来保证数据的写入不会有锁资源竞争。在这个插件里再启动一个线程,从 RingBuffer 里读取数据并把数据打包写到 FIFO 管道里。我们在每台 MySQL 的物理机里再启动一个 Agent,从管道里阻塞地读取数据发至 Kafka。优化后我们再次进行压测,在每台机器上有 15 万的更新、删除或插入操作下不会丢失数据,性能损耗一般情况下小于 2%。
分级存储。MySQL 里会存一些过程性的数据,即只需要读写最近一段时间存入的数据,过段时间这些数据就不需要了,需要进行定时清理。分级存储就是在 MySQL 之上又用了其他存储方式,例如 TiDB 或其他 TokuDB,两者之间可以进行数据自动搬迁和自动归档,同时前端通过 SDK + Proxy 来做统一的访问入口。这样一来,业务的开发同学只需要将数据存入 MySQL 里,读取时可能从后端接入的任意数据库读出。这种方式目前只是过渡使用,之后会根据 TiDB 的特性进行逐步迁移。

你可能感兴趣的:(2019-11-26 不同场景如何快速选择数据库(整理))