在RHEL系列Linux上搭建Cassandra2集群

在RHEL系Linux上构建Cassandra2集群。

我想在Cassandra 2系列上进行集群基准测试,所以我将其安装在RHEL系列的Linux上。在此之后的操作是从sudo su -切换到root用户来进行的。

1. 安装JNA

根据安装指南,它写着要安装Oracle Java7的最新版jre和JNA(>=3.2.7),所以我会安装这些软件。

由于我想使用yum来管理安装包,所以我希望能够快速地通过yum安装它们,但是……

在我的环境(CentOS6.4)中,当我尝试进行yum install jna时,会安装jna的3.2.4版本,所以我决定在yum的软件仓库中添加fedora16的仓库并使用该rpm软件包。

[fedora16]
name = Fedora16
baseurl =http://ftp.riken.jp/Linux/fedora/releases/16/Everything/$basearch/os/
enabled = 1
gpgcheck = 1
% rpm --import http://ftp.riken.jp/Linux/fedora/releases/16/Everything/x86_64/os/RPM-GPG-KEY-fedora

安装jna。这样openjdk-1.7.0也会被安装。

% yum -y install jna

2. 安装Java

Cassandra可以在OpenJDK上运行,但是建议使用Oracle Java,因此我们也会安装Oracle Java。
我们将从Oracle的下载网站上下载jdk-7u51-linux-x64.rpm。

% yum -y install jdk-7u51-linux-x64.rpm

# /usr/javaにインストールされるので、
% ll /usr/java
合計 4
lrwxrwxrwx 1 root root   16  3月  7 11:25 2014 default -> /usr/java/latest
drwxr-xr-x 8 root root 4096  3月  7 11:25 2014 jdk1.7.0_51
lrwxrwxrwx 1 root root   21  3月  7 11:25 2014 latest -> /usr/java/jdk1.7.0_51

# rootの.XXrcにJAVA_HOMEを設定しておきます。
% echo "export JAVA_HOME=/usr/java/latest" >> /root/.zshrc

然而,如果保持这样的状态,安装jna时默认的java将是被一起安装的openjdk。

% java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (rhel-2.4.4.1.el6_5-x86_64 u51-b02)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

让我们在Alternatives中切换到使用Oracle Java。

#                      実行するリンク グループ 実行するコマンドのパス      優先順位
% alternatives --install /usr/bin/java java /usr/java/latest/bin/java 17051

# Oracle Javaを選択します
% alternatives --config java

2 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
*+ 1           /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
   2           /usr/java/latest/bin/java

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:2

% java -version
java version "1.7.0_51"
Java(TM) SE Runtime Environment (build 1.7.0_51-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode)

因为我打算使用Java的性能分析工具等,所以我安装了JDK而不是JRE。

3. 添加DataStax yum仓库

将DataStax仓库添加到/etc/yum.repos.d/目录下。

[datastax]
name = DataStax Repo for Apache Cassandra
baseurl = http://rpm.datastax.com/community
enabled = 1
gpgcheck = 0

4. 安装cassandra 2.0

使用yum进行安装。

% yum -y install cassandra20

我可以毫无困扰地进来(*^^)v。

5. Cassandra的文件目录结构

安装Cassandra后,将创建以下目录和配置文件。

/etc/cassandra/ ・・・設定ファイル

/etc/cassandra/conf/cassandra-env.sh ・・・JVMヒープ等の設定

/etc/cassandra/conf/cassandra.yaml ・・・メインの設定ファイル

/etc/cassandra/conf/log4j-server.properties ・・・ログ関連の設定

/var/lib/cassandra ・・・データ、キャッシュ、コミットログディレクトリ

6. 试试启动

% /etc/init.d/cassandra start

我想試試看用cqlsh連接。

% cqlsh
Connected to Test Cluster at localhost:9160.
[cqlsh 4.1.1 | Cassandra 2.0.5 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh>

一般来说可以连接。

7. 组成集群

为了构建Cassandra集群,首先需要停止Cassandra。
※我已经在3台机器上搭建了集群。

% /etc/init.d/cassandra stop

在/etc/cassandra/conf/cassandra.yaml中编辑以下内容:
* listen_address(监听地址)
* rpc_address(RPC地址)
* seeds(种子节点)
* auto_bootstrap(非初始节点)

首先,需要编辑第一个服务器的cassandra.yaml文件。

# listen_addressをlocalhostから、他のサーバと通信可能なホスト名もしくはIPアドレスに変更します。
#listen_address: localhost
listen_address: node1.example.jp
# または、listen_address: 192.168.0.101

# rpc_addressもlocalhostから、他のサーバと通信可能なホスト名もしくはIPアドレスに変更します。
#rpc_address: localhost
rpc_address: node1.example.jp
# または、rpc_address: 192.168.0.101

seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
        #- seeds: "127.0.0.1"
        - seeds: "node1.example.jp"
        # または - seeds: "192.168.0.101"

保存后,将重新启动Cassandra。
确保监听在7000端口。

% /etc/init.d/cassandra start
% lsof -i :7000
COMMAND   PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    27179 cassandra   47r  IPv4 103830      0t0  TCP node1:afs3-fileserver (LISTEN)

我也会编辑其他服务器的cassandra.yaml文件。

# 2台めもlisten_addressをlocalhostから、他のサーバと通信可能なホスト名もしくはIPアドレスに変更します。
#listen_address: localhost
listen_address: node2.example.jp
# または、listen_address: 192.168.0.102

# rpc_addressもlocalhostから、他のサーバと通信可能なホスト名もしくはIPアドレスに変更します。
#rpc_address: localhost
rpc_address: node2.example.jp
# または、rpc_address: 192.168.0.102

seed_provider:
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
    parameters:
        #- seeds: "127.0.0.1"
        - seeds: "node1.example.jp"
        # ↑ここは1台めのアドレスを指定したままでだいじょうぶです。
        # または - seeds: "192.168.0.101"

保存后,将重新启动Cassandra。第三台机器也一样。
在这里,如果在第一台机器上运行lsof命令,…

% lsof -i :7000
COMMAND   PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    27179 cassandra   47r  IPv4 103830      0t0  TCP node1:afs3-fileserver (LISTEN)
java    27179 cassandra  114u  IPv4 110100      0t0  TCP node1:afs3-fileserver->192.168.0.102:60440 (ESTABLISHED)
java    27179 cassandra  115u  IPv4 110072      0t0  TCP node1:afs3-fileserver->192.168.0.102:60439 (ESTABLISHED)
java    27179 cassandra  116u  IPv4 110099      0t0  TCP node1:60887->192.168.0.102:afs3-fileserver (ESTABLISHED)
java    27179 cassandra  117u  IPv4 110535      0t0  TCP node1:51776->192.168.0.103:afs3-fileserver (ESTABLISHED)
java    27179 cassandra  118u  IPv4 110536      0t0  TCP node1:afs3-fileserver->192.168.0.103:60988 (ESTABLISHED)

可以确认与第二台和第三台机器连接。

我們將使用Cassandra附帶的nodetool來確認狀態。

% nodetool -h localhost status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address      Load       Tokens  Owns (effective)  Host ID                               Rack
UN  192.168.0.102  94.26 KB   256     62.5%             c1cbd878-4537-4ff1-97be-a77934f855bf  rack1
UN  192.168.0.103  106.04 KB  256     72.8%             34b9978b-02c1-40dd-8d79-db5f9467136e  rack1
UN  192.168.0.101  94.31 KB   256     64.7%             7ddbd35e-89c3-4b79-87ce-a96a86761734  rack1

创建keyspace和表来验证数据是否集群化。

% csqlsh node1.example.jp
cqlsh> create keyspace test with replication = {'class':'SimpleStrategy', 'replication_factor':2 };
cqlsh> use test;
cqlsh:test> create table z ( id int PRIMARY KEY, value text );
cqlsh:test> insert into z ( id , value ) values ( 1, 'abc' );
cqlsh:test> insert into z ( id , value ) values ( 2, 'def' );

我在testkeyspace中创建了一个名为z的表,并插入了数据。现在我将尝试从其他机器上使用SELECT查询来访问它。

% csqlsh node2.example.jp
cqlsh> use test;
cqlsh:test> select * from z;

 id | value
----+-------
  1 |   abc
  2 |   def

(2 rows)

数据会以这种方式返回(*^^)v