孜孜不倦的程序员

Cassandra NoSQL 数据库,第 3 部分:群集

Ted Neward

 

Ted Neward最后一次,我研究了 Apache 桑德拉"开放源代码,分发,权力下放,弹性可扩展、 高可用、 容错、 tuneably 一致,亚马逊发电机和谷歌马力,其数据模型为基础及其分布设计的面向列的数据库"书中所述"卡桑德拉:权威指南"(O'Reilly 媒体,2010年)。要更精确,具有安装卡桑德拉 (在本系列的第一部分),我看着怎么给它从 Microsoft.NET Framework 中,做基本的读取和写入数据,那么位程序。没有什么壮观。

事实上,卡桑德拉的"壮观"的一部分包扎的群集,其固有能力给卡桑德拉轻松扩展。这意味着它可以出增长到"荒谬"的大小 — — 在大多数情况下很少对任何管理工作 — — 特别是对大多数关系数据库来存储相等面积所需的工作相比。作为一个例子,在华盛顿州雷德蒙德,本地科技公司(我住的地方),声称在近期启动 meetup 它是存储超过 50PB 卡桑德拉的数据。

甚至夸张和夸张,只是十分之一的允许 (5PB,或多于 5,000TB) 是相当庞大的数据区块。为公平起见,卡桑德拉的网站 (cassandra.apache.org) 指出,"大已知的桑德群集具有超过 300 tb 的数据中超过 400 的机器,"它仍然是很难做到与外框关系安装程序。

但所有存储的关键是在群集中,并同时获取群集在生产中设置的大小超出了本文的范围可能是,我们至少开始玩这个通过获取发展工作运行的多节点群集。它需要几个步骤,因此会遍历一次的一步。(顺便说一句,DataStax 已安装简易的桑德拉但作为附近,我可以说它缺乏能力设置一个框 ; 上的多节点群集 这就是对其唯一的缺点,我可以看到到目前为止。

安装概述

在本系列的第一篇文章 (msdn.microsoft.com/magazine/jj553519),经历了 (有时痛苦) 疼痛的设置卡桑德拉从.zip 文件和命令行:请确保已安装 Java 运行时和路径 ; 请确保已配置 JAVA_HOME 环境变量 ; 解压卡桑德拉分布到一个目录 ; 然后启动从"bin"目录获取服务器启动并运行"cassandra.bat"文件。

在时,它可能看起来实在不合时宜,这样做,但这样做安装来自两个积极的事情。首先,您如何安装 Java 编写的服务器中获得一些经验 (和,原来是非常有用的技能,给予多少不同 NoSQL 实现都写在 Java)。第二,您需要"欺骗"在相当低的水平,要获取单个框上运行多次的卡桑德拉的设置。

您将看到,可扩展性的卡桑德拉的概念来自于"环"的服务器:运行几个框,每个存储的总数据集的一部分的卡桑德拉服务的多个实例。然后,新数据写入到环、 卡桑德拉"花边新闻"(这就是它实际技术术语) 环将数据放在适当的地方内环中的不同节点之间。在辖区戒指,卡桑德拉将均匀平衡的节点之间的数据。卡桑德拉有不同的策略,用于节点之间写出的数据的它总是可以编写自定义的新战略 (假设你舒适编写 Java),但我现在要坚持使用默认设置以使事情更容易。

一环统治他们所有......

通常情况下,设置卡桑德拉的群集的最简单方法是有多台机器和显然方法之一的单一便携式计算机上设置多个虚拟机实例同时运行。但是可以获取臃肿 amp 建立与硬件要求很快,尤其是如果你是那些无所不能的开发人员之一关闭便携式计算机 (比如我)。

因此,获得多个节点的第二个方法是有卡桑德拉多次运行相同框,将数据存储在多个位置和不同的套接字端口上侦听。这意味着潜入卡桑德拉的配置文件以设置两个 (或多个) 不同的配置设置,以及启动每个。

卡桑德拉假设卡桑德拉 1.1 安装 (写这篇文章的最新版本),在 /conf 目录中存储所有她的配置信息。在该目录中,特别是我需要编辑有两个文件:log4j server.properties 和 cassandra.yaml。此外需要找出节点的数据和日志都要去,所以我会先去,只需创建两个子目录下卡桑德拉安装目录。假设您安装在 C:\Prg\apache-cassandra-1.1.0 卡桑德拉 (像我一样),然后您要创建两个新目录下,一个用于您要创建的每个节点:C:\Prg\apache-cassandra-1.1.0\node1 和 \node2。

在这两个目录,将复制卡桑德拉 /conf 目录中,这将使那些您需要的两个文件的内容。你还想复制该 cassandra.bat 文件从 /bin,因为这就是第三和最后更改将需要以告诉卡桑德拉在她需要运行的配置文件将会发生。

这不是 Java 的东西好玩吗?

第一个文件、 log4j-server.properties,是轮转 logs 诊断日志记录开放源码项目的配置文件。(Java 使用".properties"文件很像 Windows 使用的日子的".ini"文件。你在这里的主要兴趣是确保卡桑德拉的每个节点一个诊断日志文件写入不同的地方,比其他节点。就个人而言,我想要的那些 \node1 和 \node2 的目录,所以我想要找到内轮转 logs server.properties,读起来就像这一行的每个节点的所有数据:

log4j.appender.R.File=/var/log/cassandra/system.log

然后我想要将它更改为阅读的东西更多 Windows-ish 和更多的 \node1-ish,像这样:

log4j.appender.R.File=C:/Prg/apache-cassandra-1.1.0/node1/log/system.log

日志目录没有存在卡桑德拉开始之前 — — 如果它不存在,她将创建它。 顺便说一句,请确保斜杠向前是斜杠在这里只是相信我这一个 ; 它会工作。 (Java 确认他们是否他们向前或向后斜杠,但属性文件语法使用落后斜线作为转义字符序列,有点像他们如何在 C# 字符串中)。

第二,你需要破解打开"cassandra.yaml"文件,以使下一组更改。 ".Yaml"语法"尚未另一种标记语言,"和 — — 是的你猜到了吧 — — 这是另一个.ini 风格配置语法。 从来没有标准化在这方面,所以它是经常可以看到所有的几种不同的配置样式的 Java 联合在一起 (如卡桑德拉) 单个项目中。

具体来说,您需要更改在这里 ; 设置几个 这些分散在整个文件 (其中,顺便说一句,散落着吨的评论,这样他们就真的有点不言自明,如果你读通过它所有):

cluster_name: 'Test Cluster'
data_file_directories:
  - /var/lib/cassandra/data
commitlog_directory: /var/lib/cassandra/commitlog
saved_caches_directory: /var/lib/cassandra/saved_caches
listen_address: localhost
rpc_address: localhost

"Cluster_name"是可选的但它不是一件坏事来更改无论如何,也许到东西如"MyCluster"或"大群集 O 乐趣。"其余的设置,不过,需要更改。 "目录"条目需要分别指向的 \node1 和 \node2 的目录。

一环寻找他们所有......

最后两个设置需要更改为不同的原因。 卡桑德拉,请记住,本能地想要运行的机器,每一项服务,以便她假定它是确定,只是将 TCP/IP 套接字绑定到"localhost。"但是,如果您有两个或更多的服务运行在同一服务器上,这不会工作。 所以你需要告诉她,即使它们可能具有不同的值绑定到相同的框中,将有效地解决的地址。 幸运的是,您可以执行此操作通过显式地将放 127.0.0.1 的节点 1,127.0.0.2 节点 2 等等。

(您可能会问为什么这工程 ; 及 答案是超出了这篇文章的范围,但任何好的 TCP/IP 参考应该能够解释它。 如果你不相信,请尝试"ping 127.0.0.1"和"ping 127.0.0.2"盒上。 双方应解决就好。 如果你不喜欢指定这些值,您可以始终指定他们名称"主机"文件中的 C:\Windows\System32\drivers\etc 目录中。)

卡桑德拉需要出此网络配置是原因的因为她原因的去"发现"的第一次连接到一个"种子"节点,然后将其他节点环中告诉该实例的戒指。 这是她用来传达重要信息圆环的八卦议定书 》 的所有部分。 如果我们被设置在环可以运行在不同的机器,卡桑德拉将需要设置点到正在运行的节点,但在这种情况下的"种子"配置 — — 因为我们正在运行在同一台 — — 127.0.0.1 默认工作只是正常。

之后的所有更改,在 \node1 的 cassandra.yaml 文件应如下所示:

cluster_name: 'Test Cluster'
data_file_directories:
  - C:/Prg/apache-cassandra-1.1.0/node1/data
commitlog_directory: C:/Prg/apache-cassandra-1.1.0/node1/commitlog
saved_caches_directory: C:/Prg/apache-cassandra-1.1.0/node1/saved_caches
listen_address: localhost
rpc_address: localhost
For \node2, the file should look like this:
cluster_name: 'Test Cluster'
data_file_directories:
  - C:/Prg/apache-cassandra-1.1.0/node2/data
commitlog_directory: C:/Prg/apache-cassandra-1.1.0/node2/commitlog
saved_caches_directory: C:/Prg/apache-cassandra-1.1.0/node2/saved_caches
listen_address: 127.0.0.2
rpc_address: 127.0.0.2

最后,卡桑德拉需要告诉她那里要找出配置文件,与通常她这是通过看沿 Java 类路径 (这是隐约类似于大会决议机制在.NET Framework 中,但有关半十多个基元,直言不讳) 启动时。 她还想要公开一些管理和监测到 JMX (Java 等效于 PerfMon 或 Windows 管理规范) 通过 TCP/IP 端口的信息,这两种服务不能使用相同的端口。 因此,最后的更改必须向 cassandra.bat:

REM 确保任何用户定义的类路径变量不用于启动时

设置 CLASSPATH="%CASSANDRA_HOME%\node1"

在 \node2 cassandra.bat:

REM 确保任何用户定义的类路径变量不用于启动时

设置 CLASSPATH="%CASSANDRA_HOME%\node2"

和 \node2 中的以下行:

-Dcom.sun.management.jmxremote.port=7299^

在原始的端口将读取"7199。"

我说过,这不是 Java 的东西好玩吗?

…并在黑暗中将它们绑定

但所有的配置东西一旦走,乐趣开始。 消防 (一个有 JAVA_HOME 和 CASSANDRA_HOME 环境变量指向的 JDK 和卡桑德拉根安装目录,请记住) 的命令提示符窗口,并更改目录,你已经被淋出的 \node1 目录。 关闭"卡桑德拉-f"提示符下,和手表的诊断信息滚动的火。 这第一个实例,并且假设所有的配置设置都好 (没有打字错误),您应看到文字滚动的结束与"听力为节约客户......"

现在,在第二个命令提示符窗口中,导航到 \node2,做同样的事情。 这一次,因为它引发了,您还会看到在几分钟 \node1 窗口中会出现一些活动 — — 发生的事情是后 \node2 实例起床和运行,它将连接到 \node1 实例 ("种子") 和两个实质上配置对方,开始一道环中。 尤其是,寻找这两条线"加入:等待环和架构信息"和"节点 /127.0.0.1 是现在群集的一部分的"到出现在 \node2 窗口和"节点 /127.0.0.2 现在是群集的一部分"和"InetAddress /127.0.0.2 是现在了"\node1 窗口中。

但是,如果你错过了看这些邮件,卡桑德拉您存储区中,有更多的惊喜。 在第三个命令提示符窗口中,转到原卡桑德拉 \bin 目录和发射"nodetool 环 –h 127.0.0.1,",您应看到类似图 1

Two Cassandra Instances, Each Owning 50 Percent of the Data
图 1 两卡桑德拉的情况下,每个拥有 50%的数据

这真是激动人心的事情,因为你可以看到从拥有的列,卡桑德拉的两个实例已想出的每一个对您来说应该自己 50%的数据,而无需任何额外的配置工作。 甜 !

最重要的是,如果您从以前的文章中运行的代码,数据将分散到没有任何额外的更改群集。

它是一种补充,不能代替

像一些其它数据库工具这列已探讨 (MongoDB 和 SQLite)、 卡桑德拉不应该被视为批发取代的关系数据库中,但随着辅助性的技术,可以使用任一地区功能的设置的位置关系数据库只是不合适 (缓存或存储高度非结构化的数据集来看来,例如)或作为一个混合系统,结合关系数据库。 例如,公司可能在关系数据库中存储一组"固定"的数据元素,包括作为一个关系的列卡桑德拉的关键,以检索剩余、 非结构化数据。 关系数据库然后可以保持结构化和关系 (服从大多数或所有正常形式规则),但总体系统仍会有灵活的存储用户似乎总是想要添加到系统作为它不同年龄的未预料到的附加数据元素。

另一个示例,请考虑 Web 页命中数据,这总是会键控,关闭页面本身,但会轻松地跟踪数百万或数十亿的数据元素。 网址缩短服务 (如 bit.ly) 将是微不足道的在这里,因为最小化的 URL 路径 (在 http://bit.ly/foobar 中的"foobar"部分) 将密钥,并击中数据统计 — — 以及可选的说明和甚至重定向的 URL 的定期快照 — — 将作卡桑德拉。 等等。

卡桑德拉不会很快,接管数据中心,也不应该。 但当使用智能化,它是一个强大的新工具,在工具箱中,和开发商将是愚蠢的忽略它。 有很多需要探讨卡桑德拉,但是时候让木马女转并移动到其他的事情。

祝您工作愉快!

Ted Neward 是 Neudesic LLC. 的体系结构顾问。他曾写过 100 多篇文章,独自撰写或与人合著过十几本书,包括《Professional F# 2.0》(Wrox,2010 年)。他是 MVP F # 和 Java 的著名的专家,并在世界各地的 Java 和.NET 会议上演讲。他征求意见,并定期指导 — — 与他联系。 ted@tedneward.comTed.Neward@neudesic.com 如果您想他来与您的团队一起工作。在他博客 blogs.tedneward.com 和后面可以在 Twitter 上 twitter.com/tedneward

衷心感谢以下技术专家对本文的审阅:凯利莫斯