Apache CassandraのRPMパッケージを作成する


デプロイや構成管理を容易にするため、Cassandraに必要なモジュール群、設定をRPMパッケージ化します。

## 環境整備

### cassandra開発環境

まず、[Apache Cassandraの開発環境を構築する]()を実施してください。
今回の作業は、上のページでセットアップされたCentOS7上で実施されるのを想定しています。

### ant-junit

`rpmbuild`時に必要になるため、`ant-junit`をインストールします。
まずはダウンロード

```
$ curl -O http://mirror.centos.org/centos/7/os/x86_64/Packages/ant-junit-1.9.4-2.el7.noarch.rpm
```

インストール

```
$ rpm -ivh ant-junit-1.9.4-2.el7.noarch.rpm
```

### rpmbuild

RPMパッケージ作成に必要な`rpmbuild`をインストールします。

* `sudo yum install rpm-build`
* `sudo yum groupinstall 'Development tools'`

## パッケージ作成

git cloneした cassandraのディレクトリに移動します。

```
[shoshii@cassandra-1 cassandra]$ ls
CASSANDRA-14092.txt  NOTICE.txt  build-shaded-dtest-jar.sh  data                         ide     relocate-dependencies.pom
CHANGES.txt          README.asc  build.properties.default   debian                       lib     src
CONTRIBUTING.md      TESTING.md  build.xml                  doc                          logs    test
LICENSE.txt          bin         cassandra.iml              eclipse_compiler.properties  pylib   tools
NEWS.txt             build       conf                       examples                     redhat
[shoshii@cassandra-1 cassandra]$ 

```

`redhat/README.md`を参考に、パッケージを作成します。

```
$ ant artifacts -Drelease=true
```

```
$ mkdir -p build/rpmbuild/{BUILD,RPMS,SPECS,SRPMS}
$ rpmbuild --define="version 4.0.1" \
    --define="revision $(date +"%Y%m%d")git$(git rev-parse --short HEAD)%{?dist}" \
    --define "_topdir $(pwd)/build/rpmbuild" \
    --define "_sourcedir $(pwd)/build" \
    -ba redhat/cassandra.spec
```

注：`version 4.0.1`の箇所は、チェックアウトしたブランチにより変えてください

```
[shoshii@cassandra-1 cassandra]$ ls -l build/rpmbuild/RPMS/noarch/
合計 43896
-rw-rw-r-- 1 shoshii shoshii 44940000  7月 15 07:12 cassandra-4.0.1-20210715git51f16a3.el7.noarch.rpm
-rw-rw-r-- 1 shoshii shoshii     6444  7月 15 07:12 cassandra-tools-4.0.1-20210715git51f16a3.el7.noarch.rpm
```

`cassandra`と`cassandra-tools`の２つのRPMパッケージが生成されたのがわかります。

### `rat-check`のエラーが出る場合

`rpmbuild` 時、以下のような `rat-check` エラーが出ることがあります。Cassandraが利用しているソフトウェアのライセンスチェックの際、本来チェックすべきでないファイルをチェックしてしまっているようです。
[関連JIRA](https://issues.apache.org/jira/browse/CASSANDRA-16558)

```
rat-check:

BUILD FAILED
/home/shoshii/qiita/cassandra-docker/cassandra/build/rpmbuild/BUILD/apache-cassandra-4.0.1-src/.build/build-rat.xml:79: Some files have missing or incorrect license information. Check RAT report in /home/shoshii/qiita/cassandra-docker/cassandra/build/rpmbuild/BUILD/apache-cassandra-4.0.1-src/build/rat.txt for more details! \n Unapproved licenses:

  /home/shoshii/qiita/cassandra-docker/cassandra/build/rpmbuild/BUILD/apache-cassandra-4.0.1-src/.circleci/config-2_1.yml.high_res.patch
  /home/shoshii/qiita/cassandra-docker/cassandra/build/rpmbuild/BUILD/apache-cassandra-4.0.1-src/.circleci/config-2_1.yml.mid_res.patch
  /home/shoshii/qiita/cassandra-docker/cassandra/build/rpmbuild/BUILD/apache-cassandra-4.0.1-src/.jenkins/Jenkinsfile
  /home/shoshii/qiita/cassandra-docker/cassandra/build/rpmbuild/BUILD/apache-cassandra-4.0.1-src/CASSANDRA-14092.txt

Total time: 7 seconds

```

暫定対処として、以下のように `.build/build-rat.xml` にエラー元となるファイル群を除外する設定を入れました。
ご自身の環境でも同様のエラーが出た場合、このような対処で凌ぐことはできます。

```
diff --git a/.build/build-rat.xml b/.build/build-rat.xml
index ce4e6f4..4c50c90 100644
--- a/.build/build-rat.xml
+++ b/.build/build-rat.xml
@@ -67,7 +67,14 @@
                  <exclude name="**/tools/cqlstress-example.yaml"/>
                  <exclude name="**/tools/cqlstress-insanity-example.yaml"/>
                  <exclude name="**/tools/cqlstress-lwt-example.yaml"/>
-                 <!-- NOTICE files -->
+                 <exclude name="**/.idea/**/*"/>
+                 <exclude name="**/.circleci/**/*"/>
+                 <exclude name="**/.jenkins/**/*"/>
+                 <exclude name="CASSANDRA-14092.txt"/>
+                 <exclude name="CHANGES.txt"/>
+                 <exclude name="README.asc"/>
+                 <exclude name="build.properties.default"/>
+                <!-- NOTICE files -->
                  <exclude NAME="**/NOTICE.md"/>
                  <!-- LICENSE files -->
                  <exclude NAME="**/LICENSE.md"/>

```

## インストールと実行

`rpm -ivh`でインストールします。

```
[shoshii@cassandra-1 cassandra]$ sudo rpm -ivh build/rpmbuild/RPMS/noarch/cassandra-4.0.1-20210715git51f16a3.el7.noarch.rpm 
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:cassandra-4.0.1-20210715git51f16a################################# [100%]
[shoshii@cassandra-1 cassandra]$ 
```

`sudo -u cassandra cassandra`で実行します。

```
[shoshii@cassandra-1 cassandra]$ sudo -u cassandra cassandra
[shoshii@cassandra-1 cassandra]$ CompilerOracle: dontinline org/apache/cassandra/db/Columns$Serializer.deserializeLargeSubset (Lorg/apache/cassandra/io/util/DataInputPlus;Lorg/apache/cassandra/db/Columns;I)Lorg/apache/cassandra/db/Columns;
...略
INFO  [main] 2021-07-15 09:16:24,045 StorageService.java:2737 - Node localhost/127.0.0.1:7000 state jump to NORMAL
```

起動ログの最後に、`state jump to NORMAL` と出ているので、起動には成功しているようです。

`cqlsh`で起動したCassandraに接続してみます。

```
[shoshii@cassandra-1 cassandra]$ bin/cqlsh
Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.0.0 | Cassandra 4.0.1 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.
cqlsh> 
```

接続できました。

## cassandra-toolsのインストールと実行

Cassandraクラスタの稼働には直接必要ではありませんが、運用上便利なツールが利用できるようになるため、`cassandra-tools` をインストールします。

```
[shoshii@cassandra-1 cassandra]$ sudo rpm -ivh build/rpmbuild/RPMS/noarch/cassandra-tools-4.0.1-20210715git51f16a3.el7.noarch.rpm
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:cassandra-tools-4.0.1-20210715git################################# [100%]
[shoshii@cassandra-1 cassandra]$ 
```

`nodetool status` という、クラスタ状態を確認するコマンドを使ってみます。

```
[shoshii@cassandra-1 cassandra]$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load       Tokens  Owns (effective)  Host ID                               Rack 
UN  127.0.0.1  69.05 KiB  16      100.0%            b2334131-34e5-45a4-bd89-35efcc73b2ed  rack1

[shoshii@cassandra-1 cassandra]$ 
```

CassandraノードのステータスやAddress、担当しているデータ量などが表示されています。
上の表示ではステータス（一番左の列）が `UN` となっています。これは、Up Normal の略であり、Cassandraが正常に起動し処理を受け付けることが可能な状態であることを意味します。

# 参考

参考にさせていただいたページです。

* [【簡単に解説】RPMパッケージを作成する方法](https://eng-entrance.com/linux-package-rpm-create)

以上です。