【第19回】NoSQL(6)-AmazonElasiCacheの概要及びローカル環境でのRedisServer構築


クラウドの普及に伴い、ビッグデータやキーバリュー型データの格納など、ますます活用の機会が広がりつつあるNoSQLデータベース。 第3回は代表的なNoSQLプロダクトであるAmazon DynamoDBやApache Cassandra、Amazon ElastiCacheへアクセスするSpringアプリケーションを開発する方法について、わかりやすく解説します。

本連載では、以下の様なステップで進めています。


  1. NoSQLデータベースの特徴とデータ特性
    • CAP定理を元にしたデータベースの分類とデータ特性
    • AP型データベースAmazon DynamoDBとApache Cassandraの特徴
  2. Amazon DynamoDBへアクセスするSpringアプリケーション
    • Amazon DynamoDBの概要及び構築と認証情報の作成
    • Spring Data DynamoDBを用いたアプリケーション(1)
    • Spring Data DynamoDBを用いたアプリケーション(2)
  3. Apache CassandraへアクセスするSpringアプリケーション
    • Apache Cassandraの概要及びローカル環境構築
    • Spring Data Cassandraを用いたアプリケーション(1)
    • Spring Data Cassandraを用いたアプリケーション(2)
  4. Amazon ElastiCacheへアクセスするSpringアプリケーション
    • AmazonElasiCacheの概要及びローカル環境でのRedisServer構築
    • Spring SessionとSpring Data Redisを用いたアプリケーション(1)
    • Spring SessionとSpring Data Redisを用いたアプリケーション(2)
    • Amazon ElastiCacheの設定
    • セッション共有するECSアプリケーションの構築(1)
    • セッション共有するECSアプリケーションの構築(2)


前回 【第N回】NoSQL-Spring Data Cassandraを用いたアプリケーション(1) では、AP型データベースである、Apache CassandraデータベースへアクセスするSpringアプリケーションを構築しました。 今回からはCP型データベースであるRedis及びAWSのマネージドサービスであるAmazon ElastiCache(Redis)の概要を説明し、実際にアプリケーションを構築していきます。


Amazon ElastiCacheの概要


Amazon ElastiCacheは、スケールアウト時のセッション状態や共通業務データなどを共有キャッシュすることにフォーカスしたサービスです。 種類としてMemcachedとRedisをオプションとして選択でき、以下のような観点で使い分けを行います。

ElastiCache(MemcachedとRedis)の共有キャッシュとして違い
  Memcached Redis
アクセス マルチスレッド シングルスレッド
データ構造・タイプ シンプル 文字列からリスト・ハッシュ等複雑なデータ型をサポート
永続性 なし あり
マルチAZとフェイルオーバー なし あり
その他の特徴 水平スケール可能 スケールアウトは更新がマスターノードに集中するため不可(リードレプリカは可)

特にRedisは前回 CAP定理を基づくデータベースの分類 でも紹介した通り、CP型の特徴を持つキーバリュー型データストアであり、 シャーディングなどの高速化目的のキャッシュやスケールアウトしたアプリケーションでのセッションデータ共有で利用されます。今回は以下の図のように、Amazon ElastiCache(Redis)およびSpring Session、Spring Data Resisを使って、 ECSコンテナ上の複数のアプリケーション間でセッション情報を共有し、スケールアウト可能なステートフルアプリケーションを作成してみましょう。


../_images/architecture-elasticache.png


ローカル環境におけるRedisの構築


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


ローカル環境にあるCentOS7Dockerコンテナ上で、シングルノードRedisを構築するDockerfileの実行コマンド
項番 コマンド
  説明
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)

../_images/pic_image011.jpg

某システムインテグレータにて、金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。

Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。

2019 APN AWS Top Engineers & Ambassadors 選出。

本連載記事の内容に対するご意見・ご質問は Facebook まで。