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中的数据是不可更改的

  • 相关阅读:
    eventkeyboardmouse
    代理 IP
    网关 192.168.2.1 114.114.114.114 dns查询
    http ssl
    SSDP 抓包
    抓包登录信息提交
    危险的input 微博的过去
    firstChild.nodeValue
    浏览器控制台
    haproxy 中的http请求和https请求
  • 原文地址:https://www.cnblogs.com/stoneFang/p/6715302.html
Copyright © 2011-2022 走看看