michael1983
作者michael1983联盟成员·2019-02-14 16:07
技术总监·某证券

Cassandra集群部署

字数 3303阅读 868评论 0赞 2

Cassandra集群部署

规划正式生产环境中的Cassandra集群部署时,首先必须考虑计划存储的数据量,以及前端主要应用系统常态情况及极值情况下的负载(读/写)压力。

硬件选择:

    对任何应用系统而言,合理的硬件资源选择往往意味着在内存、CPU、硬盘、网络这4项基础资源中通盘考虑并获取一个最佳的配置平衡。

内存:

    Cassandra节点拥有越多的内存,集群的读取性能越优秀。更多的内存允许更大的缓存大小,同时也能减少磁盘I / O读。更多的内存也允许设置更大的内存表(memtables)来存储最近的读取的数据,这将有效减少在一次读过程中扫描及读取的文件(索引文件、 SSTable文件等)。在正式生产环境中单节点采用8GB~16GB是普遍现象,建议最低不低于4GB内存,目前有部分生产集群采用32GB或更高的内 存配置。理想的内存配置往往取决于频繁读取中的数据流大小。

CPU:

    在实际应用Cassandra集群的系统中,“写频繁”的应用往往在达到内存的处理极限之前其CPU已经不堪重负了。Cassandra的高并发特性决定 了其将直接受益于更多的处理器数量。目前,拥有8个CPU内核的节点通常能提供最好的性价比。而在虚拟服务平台上,我们可以考虑使用云服务提供商,他们往 往拥有密度更高的处理器单元,能提供更强大的处理能力。(比如纽约时报就租用亚马逊的云服务平台来处理所有历史报纸的扫描件的解析存储工作)。

硬盘:

    选择硬盘的两个重要依据是:容量(有多少数据要存储)及I/O(读写吞吐率)。存储方面的优化将有效减少昂贵的SATA硬盘数量,并能够通过扩展节点来增强集群的存储能力及I/O性能(当然这往往也意味着更多的内存投入)。
    固态硬盘(SSDs)也是Cassandra集群的一个有效替代选择。基于SSDs,并配合Cassandra的“顺序流”的写模式将能极大降低对写入效率的不良影响。
    Cassandra通过两个操作将数据持久化到硬盘中:它首先先将“写入数据”附加到内存中的Commit Log中,并周期性的将内存中的数据顺序刷新到硬盘,写入SSTable(列簇数据的存储文件)中。强烈推荐为CommitLog和SSTables文件 采用不同的磁盘存储。CommitLog并不需要太多的存储空间,但其能有有效平衡你的写入负载压力。数据目录不仅要满足存储持久数据的要求,同时也要有 足够的吞吐率以满足可以意料到的数据“读取”压力、数据“写入”和压缩的I/O需求。
    Cassandra在运行后台的数据压缩及数据修复操作时,硬盘利用率往往会临时增长到实际数据目录容积的2倍多。因此,建议在每个节点中实际使用的容量不要超过磁盘最大容量的50%。
    同时考虑磁盘故障影响及数据冗余需求,有两个合适的搭配方式:

• 存储采用RAID0,通过Cassandra的数据备份机制来解决硬盘故障的影响。一旦某个节点的磁盘出现故障,我们可以通过Cassandra的修复操作来自动找回失去的数据。
• 存储采用RAID10,这样可以通过纯粹硬件上的水平扩展来解决单个磁盘的故障,这样可以关闭Cassandra的自动备份操作。

    如果在磁盘存储方面由足够的投资,推荐采用RAID10,这样可以减少Cassandra副本备份策略所带来的额外存储操作,减少网络负载。反之,则推荐采用RAID0。

网络:

    Cassandra是一个分布式数据存储平台,它基于网络来处理读/写请求,同时通过网络来进行节点间的数据备份。Cassandra对副本数据的选择策略是,同机架上节点的优先于不同机架上的节点。同个数据中心的节点优于不同数据中心的节点。
    Cassandra使用如下端口,在实际生产环境中如果存在防火墙,必须确保同一集群中的节点可以通过这些端口互相访问。

端口号 描述
7000 Cassandra内部节点间的通信端口
9160 Thrift客户端访问端口
7199 JMX的监控端口(早期版本是8080)

容量规划

    本节所介绍的方法可以作为在Cassandra集群中进行数据容积估算的参考。为了更好的估算,我们首先要对我们在Cassandra中所操作的数据有一 个客观全面的了解。同时我们也需要知道我们准备在cassandra中如何构建数据的存储模型(列簇的划分、行集、每行多少列,等等…)

可用磁盘容量计算

    计算你的Cassandra集群节点们能管理多大的数据量,同时计算每个节点的可用磁盘容量,并将所有节点的容量进行叠加。要谨记,在实际生产集群 中,Commit Log和实际数据目录(datadirectories)务必被存储在不同的磁盘上。以下公式可以用于存储最小可用容量的估算。
    让我们首先计算我们的磁盘的原始容量:
              原始容积 =硬盘大小*硬盘数量
    算上硬盘格式化所需的文件系统开销及我们所使用的磁盘阵列的层级模式,比如,假设我们使用的是RAID10模式,则容积计算公式如下:
     (原始容积* 0.9) / 2 = 数据可用的磁盘空间



    在日常操作中,Cassandra进行数据压缩和修复操作都需要消耗一定的磁盘空间,为了平衡性能要求和集群稳定性,强烈推荐你给你的磁盘空间留出一定的余地,仅使用少于50%的可用磁盘空间,时刻记住这一点,我们可以采用如下公式计算实际使用的空间:
    数据可用的磁盘空间* 0.5 = 实际使用的磁盘空间

用户数据规模计算

    和所有的存储系统类似,原始数据一旦进入Cassandra中存储,由于存储开销的影响,其存储容积往往要大于原始数据大小。一般来说,入库后将膨胀到原 始大小的两倍。具体膨胀多少还依赖于系统所使用的字符集及,以下内容可以用于磁盘存储数据的估算(内存临时数据的容量计算不在本节讨论范围中)。
   列开销 - 每一个列在Cassandra中占用15个字节的开销。因为列簇(Column Family)中的每一行都可以拥有大量不同的列及不同的列名,每一列的元数据都需要被存储起来。对于counter columns及被设置了生命周期的columns,还需要额外的8字节的定义开销(共23字节的额外开销)。因此计算一个正常列的开销的公式如下:
    column总长度 = column名称长度 + column值长度 + 15字节


   行开销 - 和列类似,每一行也需要占用23字节的开销。
    主键索引开销- 每个列簇同样包含一个行集的主键索引,在我们拥有大量“窄行”的情况下,主键索引尤其重要(不用遍历整个数据集),采用以下公式可以大概估算主键索引所占用的空间:
    主键索引 = 行总数 * (32 + 主键大小的均值)


    复制开销– 备份策略中的复制数因子在磁盘容量使用方面扮演了一个重要角色。如果复制数因子为1,则系统没有额外的复制开销(集群中只有一份数据),一旦复制数因子大于1,可以用如下公式计算复制开销:
    复制开销 = 总数据大小 * (复制数因子 - 1)

节点配置选择的合理选择

    规划Cassandra集群配置的一个主要工作就是理解并合理设置各个节点的配置参数。本小节将解释针对单节点、多节点、多数据中心而言,在集群中可以采用哪些部署配置。

本节所提及的配置属性均可在cassandra.yaml 这个配置文件中找到,每个集群节点均必须在启动前进行正确的配置。
存储设定:

    缺省情况下,每个节点的数据存储路径被设置为/var/lib/cassandra。在实际生产集群部署中,, 我们必须修改commitlog_directory和data_file_directories这两个参数所指定的路径,以保证日志文件目录和数据文件目录在不同的磁盘存储中。

Gossip设定:

    Gossip设置用来指定集群中节点的通信模式及节点如何被集群所识别。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广