0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Apache Cassandra

Posted at

はじめに

動作確認する必要ができたので構築してみました。

環境

3 台の CentOS マシンを使用します。

ホスト名 IP アドレス
kwcassandra01 10.1.0.145 Seed Node
kwcassandra02 10.1.0.146
kwcassandra03 10.1.0.147

OS は CentOS 7.8 です。

# cat /etc/*release
CentOS Linux release 7.8.2003 (Core)
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

CentOS Linux release 7.8.2003 (Core)
CentOS Linux release 7.8.2003 (Core)
#

SELinux は無効化しています。

# getenforce
Disabled
#

Firewall も無効化しています。Firewall 環境では 7000、7001、7199 および 9042 を空けとく必要があります ( https://cassandra.apache.org/doc/latest/faq/index.html?highlight=port )。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
# 

インストール

https://cassandra.apache.org/download/ に書かれている手順をベースにインストールします。

Cassandra のリポジトリを登録します。

# vi /etc/yum.repos.d/cassandra.repo
# cat /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
#

yum コマンドでインストールします。

# yum install -y cassandra

...色々出力されますが省略...

Complete!
# 

構成

Cassandra の構成ファイル /etc/cassandra/conf/cassandra.yaml を編集します。
今回は以下のパラメータを編集しています。

cluster_name : Cassandra クラスタの名前を指定します。デフォルトの値 (Test Cluster) でも起動します。

# The name of the cluster. This is mainly used to prevent machines in
# one logical cluster from joining another.
cluster_name: 'Cluster'

seed_provider (seeds) : Seed Node を指定します。今回は kwcassandra01 (10.1.0.145) を Seed Node としています。

# any class that implements the SeedProvider interface and has a
# constructor that takes a Map<String, String> of parameters will do.
seed_provider:
    # Addresses of hosts that are deemed contact points.
    # Cassandra nodes use this list of hosts to find each other and learn
    # the topology of the ring.  You must change this if you are running
    # multiple nodes!
    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
      parameters:
          # seeds is actually a comma-delimited list of addresses.
          # Ex: "<ip1>,<ip2>,<ip3>"
          - seeds: "10.1.0.145"

listen_address : 他のホストから接続を受け付ける IP アドレスを指定します。各ホストの IP アドレスを指定します。

# Address or interface to bind to and tell other Cassandra nodes to connect to.
# You _must_ change this if you want multiple nodes to be able to communicate!
#
# Set listen_address OR listen_interface, not both.
#
# Leaving it blank leaves it up to InetAddress.getLocalHost(). This
# will always do the Right Thing _if_ the node is properly configured
# (hostname, name resolution, etc), and the Right Thing is to use the
# address associated with the hostname (it might not be).
#
# Setting listen_address to 0.0.0.0 is always wrong.
#
listen_address: 10.1.0.145

rpc_address : クライアントからの接続を受け付ける IP アドレスを指定します。各ホストの IP アドレスを指定します。

# The address or interface to bind the Thrift RPC service and native transport
# server to.
#
# Set rpc_address OR rpc_interface, not both.
#
# Leaving rpc_address blank has the same effect as on listen_address
# (i.e. it will be based on the configured hostname of the node).
#
# Note that unlike listen_address, you can specify 0.0.0.0, but you must also
# set broadcast_rpc_address to a value other than 0.0.0.0.
#
# For security reasons, you should not expose this port to the internet.  Firewall it if needed.
rpc_address: 10.1.0.145

incremental_backup : 増分バックアップを有効化します。必須ではありません。有効化しない場合はフル バックアップのみが実行可能です。

# Set to true to have Cassandra create a hard link to each sstable
# flushed or streamed locally in a backups/ subdirectory of the
# keyspace data.  Removing these links is the operator's
# responsibility.
incremental_backups: true

起動

systemctl コマンドを実行して Cassandra のサービスを起動します。

# systemctl start cassandra
#

nodetool コマンドを実行して、すべてのサービスが正常に起動しているか確認します。

# nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address     Load       Tokens       Owns (effective)  Host ID                               Rack
UN  10.1.0.145  75.68 KiB  256          66.0%             d030d3bf-28ff-494b-ad9a-098495b2a84c  rack1
UN  10.1.0.147  101.44 KiB  256          67.6%             64faef28-0eb8-45aa-8b3e-7b2e3e959de4  rack1
UN  10.1.0.146  114.46 KiB  256          66.4%             ca3ec0ca-0519-4d28-9871-fc30b6fd270d  rack1

#

行の先頭が UN となっていれば、起動しています。

接続

cqlsh コマンドを使用して、Cassandra に接続します。

# cqlsh 10.1.0.145
Connected to Cluster at 10.1.0.145:9042.
[cqlsh 5.0.1 | Cassandra 3.11.9 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>

キースペース (ksp01) を作成します。

cqlsh> create keyspace ksp01 with replication = { 'class': 'SimpleStrategy', 'replication_factor': 2};
cqlsh>

作成したキースペースに移動します。

cqlsh> use ksp01;
cqlsh:ksp01>

表 (table01) を作成します。INSERT 文を発行した時間がわかるようにするため、timeuuid 型の列を使用しています。

cqlsh:ksp01> create table table01 (uid timeuuid PRIMARY KEY, data text);
cqlsh:ksp01>

表にデータを登録して、問い合わせしてみます。

cqlsh:ksp01> insert into table01 (uid, data) values (now(), 'text');
cqlsh:ksp01> select * from table01;

 uid                                  | data
--------------------------------------+------
 a9f05740-2fa2-11eb-88be-9f196c07d178 | text

(1 rows)
cqlsh:ksp01>

timeuuid 列の値は toDate 関数や toTimestampe 関数と組み合わせることで実際の時間を表示することができます。

cqlsh:ksp01> select toDate(uid), data from table01;

 system.todate(uid) | data
--------------------+------
         2020-11-26 | text

(1 rows)
cqlsh:ksp01> select toTimestamp(uid), data from table01;

 system.totimestamp(uid)         | data
---------------------------------+------
 2020-11-26 04:48:44.724000+0000 | text

(1 rows)
cqlsh:ksp01>

以下のようなシェルを回し続けて継続して INSERT 文投げ続けることもできそうです。

# while true
> do
> date
> cqlsh --keyspace=ksp01 --execute="insert into table01 (uid, data) values (now(), '`date | md5sum`')" 10.1.0.145
> sleep 1
> done
Thu Nov 26 14:40:35 JST 2020
Thu Nov 26 14:40:37 JST 2020
Thu Nov 26 14:40:38 JST 2020
Thu Nov 26 14:40:40 JST 2020

挿入された結果を取得。

cqlsh:ksp01> select * from table01;

 uid                                  | data
--------------------------------------+-------------------------------------
 e94ba780-2fa9-11eb-a190-4bea79caaa22 | 2349c6ab9e14f6de1b19be4df6ef0ee6  -
 ec13ef40-2fa9-11eb-a190-4bea79caaa22 | 14b26f81b5f0d7b810b45a29c3270bac  -
 f0b69c50-2fa9-11eb-a190-4bea79caaa22 | 330a3f469914f700b6fe6d1a2a970a46  -
 ecffaed0-2fa9-11eb-a190-4bea79caaa22 | efd473dea0d087c35552afd2f18c576b  -
 f379b3f0-2fa9-11eb-a190-4bea79caaa22 | f930c22b74de27cf7ed32f8131a2024c  -
 eb291a10-2fa9-11eb-a190-4bea79caaa22 | 651a5ce2f8c48e5dbb0fa55aae25423d  -
 eed706e0-2fa9-11eb-a190-4bea79caaa22 | 9fe91349dd809ca47b1d6325e2c3ee95  -
 f1a0fc50-2fa9-11eb-a190-4bea79caaa22 | 9e78984bd8f58e9b243d5ff782bfc764  -
 edec0aa0-2fa9-11eb-a190-4bea79caaa22 | 94342192d22205fbd90f97ec72bc459d  -
 efc9f260-2fa9-11eb-a190-4bea79caaa22 | 301e773477cbe7b44c35abdbae718868  -
 ea3cbe40-2fa9-11eb-a190-4bea79caaa22 | 78dfcacdc5f327e8cbea7a1caf4fb47e  -
 f45d5d30-2fa9-11eb-a190-4bea79caaa22 | e7d19e8ec07986eebfa655bf72fb8cf4  -
 e85fe7f0-2fa9-11eb-a190-4bea79caaa22 | c78c2bc33cbe585692a4ed882fd75e5d  -
 f28d7f30-2fa9-11eb-a190-4bea79caaa22 | fdb39fd95a52482ac07ea2f69e0789a9  -

(14 rows)
cqlsh:ksp01>

ORDER BY 使うにはいろいろと条件があるらしいので、最後に INSERT された時間は以下の CQL 文で取得できそうです。

cqlsh:ksp01> select max(toTimestamp(uid)) from table01;

 system.max(system.totimestamp(uid))
-------------------------------------
     2020-11-26 05:40:56.067000+0000

(1 rows)

Warnings :
Aggregation query used without partition key

cqlsh:ksp01>
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?