我正在Cassandra中创建一个密钥空间,我想提供不同的权限,如仅插入和更新,仅删除等。Cassandra提供了修改权限作为一个整体。但我找不到任何资源来说明如何才能做到这一点,以满足我的要求。到目前为止,例如,如果一个角色“职员”只能插入,我计划为“职员”提供MODIFY权限,并编写一个触发器来避免从该角色删除。这感觉就像是一个迂回的旅行。这是一个好的方式吗?可以用更好的或直接的方式来完成吗?
cbeh67ev1#
这是不可能实现的一个根本原因。Cassandra的一个著名之处在于它的写入效率非常高,即使是在慢速寻道的旋转磁盘上也是如此。这是通过使写入只写入连续的磁盘文件来实现的--而不需要先阅读数据的前一个版本。这样做的一个后果是,在Cassandra中,INSERT和UPDATE操作完全相同这两种操作都可以创建一个新项,或修改一个现有项,而Cassandra在写的时候也不知道是哪一个--它只能在很久以后才能弄清楚这一点,同时将旧数据和新数据压缩在一起。特别是这意味着您不能分别拥有添加新数据和修改现有数据的权限,因为在写入时,Cassandra无法确定是否存在预先存在的数据,而不牺牲性能。除了性能之外,在分布式设置中还存在正确性问题-如果两个客户端同时向同一行写入新数据,并且都只允许写入新数据而不允许覆盖旧数据,您希望发生什么情况?出于同样的原因,对行或分区的DELETE操作拥有单独的权限也是毫无意义的。问题是,用户也可以使用UPDATE或INSERT操作删除数据:我们可以将数据更新为空值,或者将其TTL(过期时间)更新为0,或者用其他数据覆盖该数据。因此,仅禁止实际的“DELETE”操作几乎不能防止任何事情。
1条答案
按热度按时间cbeh67ev1#
这是不可能实现的一个根本原因。Cassandra的一个著名之处在于它的写入效率非常高,即使是在慢速寻道的旋转磁盘上也是如此。这是通过使写入只写入连续的磁盘文件来实现的--而不需要先阅读数据的前一个版本。这样做的一个后果是,在Cassandra中,INSERT和UPDATE操作完全相同这两种操作都可以创建一个新项,或修改一个现有项,而Cassandra在写的时候也不知道是哪一个--它只能在很久以后才能弄清楚这一点,同时将旧数据和新数据压缩在一起。
特别是这意味着您不能分别拥有添加新数据和修改现有数据的权限,因为在写入时,Cassandra无法确定是否存在预先存在的数据,而不牺牲性能。除了性能之外,在分布式设置中还存在正确性问题-如果两个客户端同时向同一行写入新数据,并且都只允许写入新数据而不允许覆盖旧数据,您希望发生什么情况?
出于同样的原因,对行或分区的DELETE操作拥有单独的权限也是毫无意义的。问题是,用户也可以使用UPDATE或INSERT操作删除数据:我们可以将数据更新为空值,或者将其TTL(过期时间)更新为0,或者用其他数据覆盖该数据。因此,仅禁止实际的“DELETE”操作几乎不能防止任何事情。