2019年3月3日日曜日

3台構成のApache Cassandraを試してみる(CentOS7)

とても久しぶりにCassandraを試したのでメモします。以前試したのは、HadoopやHBaseの記事を書いた10年近い昔のことでした。(残念ながら当時Cassadraの記事は書いてませんが。)

概要

・3台のLinux環境(CentOS7)で、Apache Cassandraを試してみます。
・クライアントソフトから、SQL風にデータを置いてみたり
・node.jsのプログラムからデータを使ってみたりします。

(参考)
Apache Cassandraのサイト: http://cassandra.apache.org/doc/latest/
NTTPC社のブログ: https://www.nttpc.co.jp/technology/cassandra.html

必要なもの

・CentOS7のLinux環境4台 (最小インストールの標準的な設定で試しています)
・インターネット接続
・Apache Cassandraが配布するCassandraパッケージ(リポジトリ)
・(Javaも必要ですが、自動で(=依存関係で)OpenJDKが入ります)

構成

3台のCassandraクラスターです。ここでは、
・10.0.0.1
・10.0.0.2
・10.0.0.3
とします。IPアドレスのみで構成しホスト名は利用しません。
3台に違いはありませんが、seedを10.0.0.0.1としました。

1. インストール: 3台共通


作業は、
・リポジトリ追加
・yumでパッケージインストール
・設定ファイルを一つ(3つの値)変更
です。

Linux環境にて、rootで作業します。

1-0. 準備


1-0-1. Firewall設定

・Firewallで、tcpの7000,7001,7199,9042の利用を許可する設定


firewall-cmd --zone=public --add-port=7000/tcp --add-port=7001/tcp --add-port=7199/tcp  --add-port=9042/tcp --permanent

firewall-cmd --reload

・確認
firewall-cmd --list-all --permanent

以下が追加されていることを確認。
  ports: 7000/tcp 7001/tcp 7199/tcp 9042/tcp

1-0-2. SELinux設定

軟弱なことにOFFにします。
(参考: http://cassandra.apache.org/doc/4.0/faq/#selinux )

ファイル/etc/selinux/config を以下の一行を編集
SELINUX=disabled
(または、SELINUX=permissive)

とりあえずの作業のために、
setenforce 0

1-1. Apache Cassandraのリポジトリ追加

cat << EOF > /etc/yum.repos.d/cassandra.repo
[cassandra]
name=Apache Cassandra
baseurl=https://www.apache.org/dist/cassandra/redhat/311x/
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://www.apache.org/dist/cassandra/KEYS
EOF


1-2. インストール

yum install cassandra

1-3. 設定ファイル変更


1ファイルで3箇所(or 4箇所)を変更するだけ。
vi /etc/cassandra/conf/cassandra.yaml

1-3-1. seeds設定

「- seeds: "127.0.0.1" 」を
10.0.0.0.1では「- seeds: "10.0.0.0.1" 」
10.0.0.0.2では「- seeds: "10.0.0.0.1,10.0.0.0.2" 」
10.0.0.0.3では「- seeds: "10.0.0.0.1,10.0.0.0.3" 」


1-3-2. listen_address設定

「listen_address: localhost」を、
10.0.0.0.1では「listen_address: "10.0.0.0.1"」
10.0.0.0.2では「listen_address: "10.0.0.0.2"」
10.0.0.0.3では「listen_address: "10.0.0.0.3"」


1-3-3. rpc_address設定

「rpc_address: localhost」を、
10.0.0.0.1では「rpc_address: "10.0.0.0.1"」
10.0.0.0.2では「rpc_address: "10.0.0.0.2"」
10.0.0.0.3では「rpc_address: "10.0.0.0.3"」


1-3-4. cluster_nameの設定 (おまけ: 変更しなくても大丈夫ですが、お好みで。)

すべてのサーバで同じ「cluster_name: 'Railway Data Cluster'」

1-4. cassandraサービスの起動と自動起動設定


service cassandra start
chkconfig cassandra on


1-5. 確認


[root@host1 ~]# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.0.0.1  335.18 KiB  256          69.1%             04128023-9ef2-411b-92f8-528278cf54bb  rack1
UN  10.0.0.2  294.92 KiB  256          64.6%             de517d21-a465-4737-9f35-4ac44884a835  rack1
UN  10.0.0.3  229.48 KiB  256          66.3%             ce3013a9-4eab-4c42-812b-e64afcfe05de  rack1


期待するIPアドレスの3行の表示が出て、3行の頭が「UN」であること。

2. cqlshクライアントでSQL風の命令でデータ操作してみる。


3台のうちのいずれかの上のcqlshクライアントアプリから、3台のいずれかへ接続

cqlsh 10.0.0.1
(10.0.0.2でも10.0.0.3でもOK)

操作例
[root@host1 ~]# cqlsh 192.168.100.101
Connected to Railway Data Cluster at 192.168.100.101:9042.
[cqlsh 5.0.1 | Cassandra 3.11.4 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>


・railwayというkeyspaceを作成
CREATE KEYSPACE IF NOT EXISTS railway WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 2 };

・railwayというkeyspaceを指定
USE railway;

・yamanotelineというtableを作成
CREATE TABLE yamanoteline ( stationname text PRIMARY KEY, location text, jreast int, subway int, other int);

・yamanotelineというtableにデータを3行入れてみる
INSERT INTO yamanoteline ( stationname, location, jreast, subway, other ) VALUES ('Shinagawa', 'Minato', 3, 0, 2);
INSERT INTO yamanoteline ( stationname, location, jreast, subway, other ) VALUES ('Osaki', 'Shinagawa', 2, 0, 1);
INSERT INTO yamanoteline ( stationname, location, jreast, subway, other ) VALUES ('Gotanda', 'Shinagawa', 0, 1, 1);


・yamanotelineというtableのデータを閲覧する
SELECT * FROM yamanoteline;

操作例
cqlsh> use railway;
cqlsh:railway> select * from yamanoteline;

 stationname | jreast | location  | other | subway
-------------+--------+-----------+-------+--------
     Gotanda |      0 | Shinagawa |     1 |      1
       Osaki |      2 | Shinagawa |     1 |      0
   Shinagawa |      3 |    Minato |     2 |      0

(3 rows)
cqlsh:railway>


3. node.jsからcassandraクラスタに格納したデータを利用してみる。


クラスタへ接続できる適当なLinuxサーバにて(もちろん3台のうちのどれかでもOK)

3-1. node.jsをインストール


yum install -y epel-release
yum install -y nodejs npm


3-2. node.js用のcassandra接続ライブラリをインストール


npm install cassandra-driver

3-3. node.jsでcassandraを操作する簡単なプログラムを作って動かしてみる。


プログラム例: nodecas.js

const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['192.168.100.101', '192.168.100.102'], keyspace: 'railway', localDataCenter: 'datacenter1' });

client.execute('SELECT stationname, jreast, subway FROM yamanoteline WHERE stationname = ?', [ 'Shinagawa' ])
  .then(result => console.log('station=%s, jreast=%s, subway=%s', result.rows[0].stationname, result.rows[0].jreast, result.rows[0].subway))
  .then(() => client.shutdown());


実行例
[root@host0 ~]# node nodecas.js
station=Shinagawa, jreast=3, subway=0
[root@host0 ~]# 



以上

0 件のコメント:

コメントを投稿