1700509197
数据科学家养成手册 第13章 数据存储
1700509198
1700509199
当一台服务器收到由其他服务器传来的日志数据时,一般有两种处理方式:一种是在内存中直接处理,进行流计算,计算完毕后将计算结果保存或者输出到指定位置,原始日志数据直接丢弃;另一种是直接写入持久化存储介质(例如文件、数据库等),以备后续的查询和统计分析等。还有一些场景会将两种方式结合使用,既做流处理用于快速反馈数据,也把日志进行持久化归档处理。
1700509200
1700509201
流处理不属于数据存储的范畴,这里就不多讨论了。我们只需要理解这样一个概念:这种处理就是在内存中留一个池空间,当数据从网络高速写入这个内存池空间的时候,可以根据需要把这个池空间当成磁盘上的文件进行相应的统计计算,然后设置清空策略(可以采用滑动窗口策略,也可以进行固定时长清空)。
1700509202
1700509203
将数据保存到磁盘上是非常讲究的,需要考虑的问题也比较多。对一台服务器来说,当它收到数据准备写入磁盘的时候,会面临很多选择——没错,还是各种矛盾的权衡。
1700509204
1700509205
1700509206
1700509207
1700509209
数据科学家养成手册 13.1 读写不对等
1700509210
1700509211
一台服务器的硬件资源确定后,对于存储就有这样一个问题需要考虑——读写场景是什么?
1700509212
1700509213
“读写都少”的情况基本不用考虑对矛盾的权衡,因为此时的磁盘I/O资源非常充分。而在“读多写少”、“读少写多”、“读写都多”这3种场景中,还是要考虑资源怎么分配才能最大化地满足业务需要。
1700509214
1700509215
另外,读写操作涉及的范围是什么形态(I/O模型)也很重要。就拿读来说,读得频繁而每次只读取少量数据是一种情况,即“小I/O频繁读”;读得不频繁而每次需要读取大量数据是另一种情况,即“大I/O低频读”。更有甚者,读得频繁且每次都读取大量数据,这种场合下往往都会使总吞吐量超过磁盘I/O的吞吐上限,处理原则通常是先设法将这个业务分散到多台物理机上,也就是化简这种情况,使之变成前两种情况中的一种再做考虑。遇到任何一种情况都无须惊慌,因为对这些情况都有成熟的解决方案。
1700509216
1700509217
凡是最后要存储在磁盘上的数据,都要使用文件系统作为落地方式。即使是像Oracle裸设备或者Oracle ASM(1)这种不使用Linux系统作为文件分配表的系统,也不过是Oracle自己接管了磁盘,自己编写文件分配算法而已。以CentOS为例,CentOS 6使用ext4作为默认文件系统,CentOS 7则改用XFS作为默认文件分配系统。对于文件系统的选择,我们一般关注读写吞吐速度、可靠性、可扩展性这3点。
1700509218
1700509219
对于磁盘I/O已经确定的情况(传统的机械硬盘取决于磁盘自身接口带宽、主板SATA或SAS总线带宽及磁盘转速等因素),改进吞吐能力的空间通常很小。
1700509220
1700509222
13.1.1 读多写少
1700509223
1700509224
“读多写少”是一种在互联网领域很常见的读写模型(如图13-1所示)。在微博、新闻等网站都会有这样的模式:一个进程向磁盘上的某个地方写了一段数据,无论数据载体是数据库还是文件,此后高频次的访问都会扫描磁盘的这块地方。
1700509225
1700509226
1700509227
1700509228
1700509229
图13-1 读多写少
1700509230
1700509231
这种情况下,通常考虑直接把读I/O的部分分摊到多个读I/O单元中去。例如,MySQL的读写分离就是一种典型的应对“读多写少”的方式,先在主库中写一份数据,再同步到N个从库。这样,再从从库中读取数据时,吞吐能力就变成了原来的N倍。这种方式在其他类似的场景中同样适用。
1700509232
1700509234
13.1.2 读少写多
1700509235
1700509236
“读少写多”是一种在数据收集过程中比较容易见到的场景(如图13-2所示)。
1700509237
1700509238
1700509239
1700509240
1700509241
图13-2 读少写多
1700509242
1700509243
当多个数据点向一个数据载体写入数据时,伴随着相对较少的数据读取。对于较高的写并发,同样建议把写并发的I/O分散到不同的主机或者磁盘上,这种情况下使用Hadoop或者Ceph一类的集群均可。在Hadoop集群中,同样建议将较小的数据积累成较大的数据块(例如数百MB的数据块)再写入,这样做效率比较高。因为每次写操作都要对NameNode这个热节点进行访问,所以还是要尽可能减少这种访问带来的单点压力。
1700509244
[
上一页 ]
[ :1.700509196e+09 ]
[
下一页 ]