Ana*_*yag 1 openstack-swift database-replication cassandra infinispan hazelcast
是否有任何云存储系统(即Cassandra,Hazelcast,Openstack Swift),我们可以在哪里更改所选对象的复制因子?比方说,我们已经在系统中发现了热点对象,因此我们可以将复制因子作为解决方案来增加?谢谢
在Cassandra中,复制因子基于键空间来控制.因此,首先通过指定密钥空间在每个数据中心中应具有的复制因子来定义密钥空间.然后在键空间内创建数据库表,并根据它们定义的键空间复制这些表.然后使用主键将对象存储在表中的行中.
您可以使用"alter keyspace"CQL命令随时更改键空间的复制因子.要更新群集以使用新的复制因子,您将为每个节点运行"nodetool repair"(大多数安装无论如何都要定期运行以进行反熵).
然后,如果您使用Cassandra java驱动程序,则可以指定在访问群集时使用的负载平衡策略,例如循环法和令牌感知策略.因此,如果您拥有包含对象的表的多个副本,则可以将访问对象的负载设置为仅包含您正在访问的行的副本的节点上的循环.如果您使用读取一致性级别为ONE,则会扩展读取负载.
因此,粒度不是在对象级别,而是在表级别.如果将所有对象存储在一个表中,则更改复制因子将更改该表中的所有对象,而不仅仅是一个.您可以拥有具有不同复制因子的多个键空间,并在具有高RF的键空间中保留高需求对象,并在具有低RF的键空间中保持较少访问的对象.
另一种可以减少Cassandra中对象热点的方法是通过将其插入表的其他行来制作它的附加副本.通过复合分区键在节点上访问行,因此分区键的一个字段可以是"copy_number"值,当您去读取对象时,您随机设置copy_number值(从0到复制数量)您拥有的行)以便读取对象的负载可能会在每次读取时遇到不同的节点(因为行根据分区键在整个群集中进行散列).与更改整个表的复制因子相比,此方法可以在对象级别提供更多粒度,但需要花费更多编程工作来管理随机读取不同的行.