クラウドの普及に伴い、ビッグデータやキーバリュー型データの格納など、ますます活用の機会が広がりつつあるNoSQLデータベース。 第3回は代表的なNoSQLプロダクトであるAmazon DynamoDBやApache Cassandra、Amazon ElastiCacheへアクセスするSpringアプリケーションを開発する方法について、わかりやすく解説します。
本連載では、以下の様なステップで進めています。
前回 【第N回】NoSQL-Spring Data Cassandraを用いたアプリケーション(1) では、AP型データベースである、Apache CassandraデータベースへアクセスするSpringアプリケーションを構築しました。 今回からはCP型データベースであるRedis及びAWSのマネージドサービスであるAmazon ElastiCache(Redis)の概要を説明し、実際にアプリケーションを構築していきます。
Amazon ElastiCacheは、スケールアウト時のセッション状態や共通業務データなどを共有キャッシュすることにフォーカスしたサービスです。 種類としてMemcachedとRedisをオプションとして選択でき、以下のような観点で使い分けを行います。
Memcached | Redis | |
アクセス | マルチスレッド | シングルスレッド |
データ構造・タイプ | シンプル | 文字列からリスト・ハッシュ等複雑なデータ型をサポート |
永続性 | なし | あり |
マルチAZとフェイルオーバー | なし | あり |
その他の特徴 | 水平スケール可能 | スケールアウトは更新がマスターノードに集中するため不可(リードレプリカは可) |
特にRedisは前回 CAP定理を基づくデータベースの分類 でも紹介した通り、CP型の特徴を持つキーバリュー型データストアであり、 シャーディングなどの高速化目的のキャッシュやスケールアウトしたアプリケーションでのセッションデータ共有で利用されます。今回は以下の図のように、Amazon ElastiCache(Redis)およびSpring Session、Spring Data Resisを使って、 ECSコンテナ上の複数のアプリケーション間でセッション情報を共有し、スケールアウト可能なステートフルアプリケーションを作成してみましょう。
ElastiCacheはエンドポイントを持ち、任意の場所からアクセスできますが、通常セキュリティグループによりアクセス制御されます。 そのため、相応のメモリが必要になるのですが、ローカル環境でシングルノードのRedisを構築すると開発時は便利なので、ここでは、 Dockerを用いてゲストOSとして、CentOS7上にRedisを実行してみます。ホストOSとなる端末はMacOS、Windowsどちらでもかまいませんが、 Dockerを事前にインストールしてください。以降はDockerがインストールされた環境を前提に進めていきます。
適当な任意のフォルダにDockerfileと言う名前で以下のファイルを作成してください。
# Dockerfile for redis server
# (A)
FROM docker.io/centos:latest
# (B)
MAINTAINER debugroom
# (C)
RUN yum -y install epel-release
# (D)
RUN yum install -y redis
# (E)
RUN sed -i s/bind\ 127\.0\.0\.1/\#bind\ 127\.0\.0\.1/g /etc/redis.conf
# (F)
RUN sed -i s/protected\-mode\ yes/protected\-mode\ no/g /etc/redis.conf
# (G)
RUN systemctl enable redis.service
# (H)
EXPOSE 6379
項番 | コマンド |
説明 | |
FROM docker.io/centos:latest | |
コンテナイメージのベースとなるOSイメージを指定します。 | |
MAINTAINER debugroom | |
メンテナンスしている組織や個人の名称を指定します。省略可能です。 | |
RUN yum -y install epel-release | |
OSにEPEL(Extra Packages for Enterprise Linux)リポジトリを追加します。 | |
RUN yum install -y redis | |
Redisをインストールします。 | |
RUN sed -i s/bind127.0.0.1/#bind127.0.0.1/g /etc/redis.conf | |
コンテナ外からのアクセスを許可するために、ループバックアドレス以外も許可するよう/etc/redis.conf設定ファイルを変更します。 | |
RUN sed -i s/protected-modeyes/protected-modeno/g /etc/redis.conf | |
コンテナ外からのアクセスを許可するために、プロテクトモードをオフにするよう/etc/redis.conf設定ファイルを変更します。 | |
RUN systemctl enable redis.service | |
コンテナ実行時にRedisのサービスを起動するよう設定します。 | |
EXPOSE 6379 | |
Redisで使用する6379ポートを解放します。 |
上記のファイルを作成後、コマンドラインからDockerイメージを作成するコマンドを実行します。docker buildコマンドでイメージ名やタグを指定して、元になるDockerfileがあるディレクトリを指定してください。 ここでは、DockerHub上でのxxxxxxレポジトリにsample-redis-localというイメージをlatestタグをつけて実行しています。最後にDockerfileがあるカレントディレクトリを指定しています。
docker build -t xxxxxx/sample-redis-local:latest .
Dockerイメージが作成されたら、コマンドラインからDockerコンテナをdocker runコマンドで実行してください。なお、実行するコンテナ内でsystemctlサービスを実行するために、--privilegedオプションを付与する必要があります。 実行コンテナ名称(redis-serverとします)と、コンテナイメージ名、コンテナの起動時は/sbin/initを実行し、systemdを起動する形でコンテナを実行します。
docker run -d --privileged -p 6379:6379 --name redis-server xxxxxxx/sample-redis-local /sbin/init
これで、Redisの環境が構築できました。次回はこのローカル環境のRedisにアクセスするSpringアプリケーションを実装してみます。
川畑 光平(KAWABATA Kohei)
某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。
Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。
2019 APN AWS Top Engineers & Ambassadors 選出。
本連載記事の内容に対するご意見・ご質問は Facebook まで。