- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经阅读了很多关于 Cassandra 的文章和很多问题/答案,但我仍然无法弄清楚 Cassandra 在读取数据时如何决定转到哪个节点。
首先,关于假想簇的一些假设:
以下是我根据我读过的各种 Datastax 文章和其他博客文章对写入工作方式的理解:
数据写入 commit_log 和 memtable,然后传播 4 次(RF = 5)。
然后选择环中的 4 个下一个节点并将数据保存在其中。
到目前为止,一切顺利。
现在的问题是,当客户端向集群发送读取请求(例如 CL = 3)时,Cassandra 如何知道它需要联系哪些节点(最坏情况下是 10 个节点中的 5 个)才能获取此请求数据?当然它不会发送到所有 10 个节点,因为那样效率很低。
我是否正确假设 Cassandra 会再次对(请求的)主键进行 MD5 哈希并根据该哈希选择节点,然后走环?
另外,网络拓扑案例是如何工作的?如果我有多个数据中心,Cassandra 如何知道每个 DC/机架中的哪些节点包含数据?据我了解,只有第一个节点是明显的(因为主键的哈希已明确导致该节点)。
抱歉,如果问题不是很清楚,如果您需要有关我的问题的更多详细信息,请添加评论。
非常感谢,
最佳答案
Client sends the data to a random node
看起来可能是这样,但实际上驱动程序有一种非随机的方式来选择与之通信的节点。该节点称为“协调器节点”,通常是根据具有最小(最近)“网络距离”来选择的。客户端请求实际上可以发送到任何节点,并且首先它们将被发送到您的驱动程序知道的节点。但是一旦它连接并了解集群的拓扑,它可能会变成一个“更接近”的协调器。
集群中的节点使用 Gossip Protocol 相互交换拓扑信息。 。 gossiper 每秒运行一次,并确保所有节点都保持最新的数据 Snitch您已配置。告密者跟踪每个节点所属的数据中心和机架。
这样,协调器节点也拥有有关哪些节点负责每个 token 范围的数据。您可以通过从命令行运行nodetool Ring
来查看此信息。尽管如果您使用的是虚拟节点,那么确定起来会比较困难,因为所有 256 个(默认)虚拟节点上的数据都会在屏幕上快速闪烁。
假设我有一个表,用于按船员的名字跟踪船员,并假设我想查找 Malcolm Reynolds。运行此查询:
SELECT token(firstname),firstname, id, lastname
FROM usersbyfirstname WHERE firstname='Mal';
...返回此行:
token(firstname) | firstname | id | lastname
----------------------+-----------+----+-----------
4016264465811926804 | Mal | 2 | Reynolds
通过运行nodetool环
我可以看到哪个节点负责这个 token :
192.168.1.22 rack1 Up Normal 348.31 KB 3976595151390728557
192.168.1.22 rack1 Up Normal 348.31 KB 4142666302960897745
或者更简单,我可以使用 nodetool getendpoints
来查看此数据:
$ nodetool getendpoints stackoverflow usersbyfirstname Mal
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
192.168.1.22
有关更多信息,请查看上面链接的一些项目,或尝试运行 nodetool gossipinfo
。
关于cassandra - cassandra如何找到包含数据的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669991/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!