在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