• cassandra 如何写数据以及放置副本


    application发送数据到server
    这里写图片描述

    1. application 发送请求到server
    2. 根据设置的load balance 规则从cluster中挑选一个coordinator,一般使用轮询即可。cluster 中的cassandra node 不仅作为数据库的储存节点,同样作为request 请求处理的server。所以保证每个节点处理的request 一样的balance算法即可
    3. 然后根据插入数据的主键hash value,来将第一份数据写入到对应节点中
    4. 然后根据replicator,write consistency,replication strategy ,来写副本
      eg.replicator=3,write consistency=2,replication strategy=simple strategy
      则表示成功写入到2个节点中,application的写操作才算成功。
      simple strategy 表明副本是放在第一个node 节点环位置的下一个节点

    Note-很重要的一点
    通过上面描述,发现可以根据hash value 来确定一条数据存放在哪个节点上,然后根据replication的参数设置,我们可以确定数据副本存放在哪个节点上。那么对于read 操作,我们就可以根据条件的hash value 来找到存放数据的第一个节点,然后根据数据副本来找其他replicate 数据。

    上面认识是错误的
    首先,考虑下如果我们添加node到cluster中,假如数据存放的第一个node hash 受到影响,数据要移除到新加入的node,这个操作很容易实现,那么按照我们上面的认识,其他的副本数据如何处理呢?
    data的存放的第一个节点变化了,然后再根据replicate stragtegy,已经找不到其他副本了。
    此外,cassandra 的node是无主机模式,没有主从节点,每份数据都是一样的,但是按照上面的说法,数据的存放的第一个节点重要性又高于其他节点。

    综上,上述认识错误
    正确的认识
    cassandra 将数据成功写入后,会有一个map 表,来维护数据存放在哪些节点上

    nodetool getendpoint keyspace table partitionkey 

    这条命令可以查询到数据存放在哪些node上面
    看了下cassandra的源码,这些数据应该存放在org.apache.cassandra.db:type=StorageService中

    写数据
    这里写图片描述

    1. 写数据到commit log
    2. 写数据到memtable


      数据写入到这两个数据结构中,以及replicate 数目达到write consistency数目后,一次写操作就完成了,
      写数据是内存操作,所以cassandra 写入速度很快。

    3. 将数据从memtable中冲刷到sstable中
      sstable中的数据是不可更改的

  • 相关阅读:
    jQuery之五:CheckBox控制
    WinServer2003 设置之:xp风格
    ASP.net: cookie
    ASP.NET之:URL重写(转载)
    jQuery 之二:Ajax加载Json数据
    jQuery 之一:对象插件
    Asp.net:Form
    jQuery之四:Table过滤
    jQuery之三:Tab控制
    Opera 9.01 Build 8543
  • 原文地址:https://www.cnblogs.com/stoneFang/p/6715302.html
Copyright © 2020-2023  润新知