NOSQL Cassandra2.2 yum インストール & cql を試す！！

# Cassandra2.2 系をyumでインストールする、そして操作してみる

よくわからないでCassandraをインストールして利用してみます。


## java のインストール

```
rpm -ivh jdk-8u65-linux-x64.rpm
```


## Cassandra yumリポジトリファイルの設定

```
cat << '_EOT_' > /etc/yum.repos.d/datastax.repo 
[datastax] 
name = DataStax Repo for Apache Cassandra
baseurl = http://rpm.datastax.com/community
enabled = 1
gpgcheck = 0
_EOT_
```

## Cassandra のインストール

どこからどこまでがCassandraだかわからんけど。。こんな感じ

```
yum install dsc22
yum install cassandra22-tools
```


## Cassandra の開始

```
/etc/init.d/cassandra start
------------------------------------------------------------------------------

Starting Cassandra: OK
/etc/init.d/cassandra status                          
------------------------------------------------------------------------------
cassandra (pid  22545) を実行中...
```


## cqlshの起動

CassandraをSQLライクに操作するツールです。Hiveql みたいなもんかな？

```
cqlsh                                                 
------------------------------------------------------------------------------
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 2.2.3 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.
cqlsh> 
```


# cqlでの操作

## スキーマ（キースペースの作成）

とりあえず。深いことは考えない。MySQLでいうところのデータベースを作成すると同じだと思ってくれれば

```
cqlsh> 
cqlsh> create keyspace logs with replication = {'class' : 'SimpleStrategy',
 'replication_factor' : 1};
```

## キースペースが作成された確認する

MySQLでいうところの、show create database logs と同じと思っていただければと

```
cqlsh> 
describe keyspace logs ;
------------------------------------------------------------------------------
CREATE KEYSPACE logs WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;
```

## テーブルの作成

* MySQL

```
CREATE TABLE `customer_action_logs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `updated_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'UTC-DATE',
  `domain` varchar(128) DEFAULT NULL COMMENT 'ex: www.yourdomain.com',
  `uri` varchar(500) DEFAULT NULL,
  `member_id` int(11) DEFAULT '0' COMMENT 'ログイン前であれば、0',
  `user_agent` varchar(255) DEFAULT NULL,
  `referer` varchar(500) DEFAULT NULL,
  `session_id` varchar(200) DEFAULT NULL COMMENT 'セッションID',
  PRIMARY KEY (`id`),
  KEY `ix01_customer_action_logs` (`member_id`),
  KEY `ix02_customer_action_logs` (`updated_at`)
) ENGINE=InnoDB AUTO_INCREMENT=173735587 DEFAULT CHARSET=utf8 ;

```

* cql

```
Use logs ;
cqlsh:logs>

CREATE TABLE customer_action_logs (
  id uuid PRIMARY KEY,
  updated_at timestamp,
  domain varchar,
  uri varchar,
  member_id int,
  user_agent varchar,
  referer varchar,
  session_id varchar
) ; 
CREATE INDEX ix01_customer_action_logs ON customer_action_logs ( member_id );
CREATE INDEX ix02_customer_action_logs ON customer_action_logs ( updated_at );

```


## テーブルが作成できたか確認する

```
cqlsh:logs> describe table customer_action_logs ;

CREATE TABLE logs.customer_action_logs (
    id uuid PRIMARY KEY,
    domain text,
    member_id int,
    referer text,
    session_id text,
    updated_at timestamp,
    uri text,
    user_agent text
) WITH bloom_filter_fp_chance = 0.01
    AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';
CREATE INDEX ix01_customer_action_logs ON logs.customer_action_logs (member_id);
CREATE INDEX ix02_customer_action_logs ON logs.customer_action_logs (updated_at);

```


## INSERT してみる

日時の設定が悩みましたが、あとは、SQLのインサートと同じかな？あと、オートインクリメントは、UUID属性で作成しているので、どんな感じでユニークにしているかがポイント★

```
INSERT INTO customer_action_logs 
(
id,
domain,
member_id,
referer,
session_id,
updated_at,
uri,user_agent
) VALUES (
now(),
'qiita.com',
12345678,
'qiita.ref.com',
'session010101',
dateof(now()),
'/hit/items/3151208b7f01aaa1ea9d',
'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
) ;

INSERT INTO customer_action_logs 
(
id,
domain,
member_id,
referer,
session_id,
updated_at,
uri,user_agent
) VALUES (
now(),
'qiita.com',
121221122,
'qiita.ref.com',
'session010101',
dateof(now()),
'/hit/items/3151208b7f01aaa1ea9d',
'Mozilla/4.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
) ;
```

と、まあ、こんな感じで操作することができました。Cassandraは、クラスタリングで威力を発揮するものなので、単体でのインストールは意味ないのですが、NoSQLでSQLライクなことができるって便利だと思いませんか？ってことで次回気が向いたら、MariaDBと連携する部分を書いていこうかな？って思ってます。