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
1700509246
13.1.3 读写都多
1700509247
1700509248
对于“读写都多”的场景,除了在单台计算机上使用诸如RAID10这样的技术进行数据条带化(Striping)以外,还可以利用集群读写分散的特性,或者使集群中各台主机的读写时间错峰的特性(如图13-3所示)。
1700509249
1700509250
1700509251
1700509252
1700509253
图13-3 读写都多
1700509254
1700509255
在这类场景中,使用Hadoop(HDFS)或者Ceph一类的集群存储系统当然可以,但一定要尽量避免将读写操作都放在某一台或几台计算机上,进而导致性能歪斜。我的建议是先看读出的特性。以Hadoop集群为例,如果读出时每次都扫描时间最晚的写入数据块,就有可能与写入进程同时访问相应的主机。这种情况下,建议使用与时间无关的哈希方法来写入不同的文件,从而保证将数据写入不同的DataNode节点。如果读出是半随机方式的,没有明显的时间偏好,写入时就可以不用太在意这一点,只要按时间顺序将一个文件写入Hadoop集群就可以了。
1700509256
1700509257
解决I/O征用的方法其实比较少,主要就是靠征用资源的时间和空间的分散化,这是最为根本的思路。
[
上一页 ]
[ :1.700509208e+09 ]
[
下一页 ]