zoukankan      html  css  js  c++  java
  • 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中的数据是不可更改的

  • 相关阅读:
    FreeCommander 学习手册
    String详解, String和CharSequence区别, StringBuilder和StringBuffer的区别 (String系列之1)
    StringBuffer 详解 (String系列之3)
    StringBuilder 详解 (String系列之2)
    java io系列26之 RandomAccessFile
    java io系列25之 PrintWriter (字符打印输出流)
    java io系列24之 BufferedWriter(字符缓冲输出流)
    java io系列23之 BufferedReader(字符缓冲输入流)
    java io系列22之 FileReader和FileWriter
    java io系列21之 InputStreamReader和OutputStreamWriter
  • 原文地址:https://www.cnblogs.com/stoneFang/p/6715302.html
Copyright © 2011-2022 走看看