かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その18 )( Docker で Redis の環境を構築する(単体サーバ構成)+Spring Actuator の Endpoint の Basic 認証ではセッション情報を生成しないようにする )

概要

記事一覧はこちらです。

Spring Boot 1.5.x の Web アプリを 2.0.x へバージョンアップする ( その17 )( Spock を 1.1-groovy-2.4 → 1.2-groovy-2.5 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Redis の環境を Windows バイナリ(Redis-x64-3.0.504.msi)をインストールして構成した Redis Sentinel 環境から Docker の Redis による Cluster 環境へ変更します。
    • 今回は単体の Redis サーバ環境を構築し、次回 Cluster 環境を構築する予定です。
    • Redis は 5.0.1 を使用します。

参照したサイト・書籍

  1. redis
    https://hub.docker.com/_/redis/

  2. redis/5.0/Dockerfile
    https://github.com/docker-library/redis/blob/a5d019077b46494751482512c200c4df34463dc6/5.0/Dockerfile

    • Redis の Dockerfile です。
  3. RedisをCentOS7にインストールしてみた
    http://www.denet.ad.jp/technology/2017/11/redis-centos7.html

  4. Calling redis-cli in docker-compose setup
    https://stackoverflow.com/questions/33304388/calling-redis-cli-in-docker-compose-setup

  5. Redis 5.0 Update解説
    https://qiita.com/maruloop/items/207654bfd0ed2a453300

  6. Prometheus Redis
    https://grafana.com/dashboards/763

  7. oliver006/redis_exporter
    https://github.com/oliver006/redis_exporter

  8. prometheus_exporters
    https://supermarket.chef.io/cookbooks/prometheus_exporters/versions/0.6.0

目次

  1. 単体の Redis サーバの環境を構築する
  2. ksbysample-webapp-lending から接続する + redis-cli で確認する
  3. Spring Actuator の Endpoint の Basic 認証ではセッション情報を生成しないようにする
  4. Redis のメトリックスを Prometheus + Grafana で表示してみる

手順

単体の Redis サーバの環境を構築する

docker-compose.yml に redis の設定を追加します。

  redis:
    image: redis:5.0.1
    container_name: redis
    ports:
    - "6379:6379"

docker-compose up -d コマンドを実行して起動します。

f:id:ksby:20181124082012p:plain

IntelliJ IDEA の Docker Plugin からログを見てみると WARNING が2つ出力されていました。開発環境で問題になるような設定ではなさそうなので、このままにします。

f:id:ksby:20181124082207p:plain

  • WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
  • WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

ksbysample-webapp-lending から接続する + redis-cli で確認する

src/main/resources/application-develop.properties を以下のように変更します。

spring.redis.host=localhost
spring.redis.port=6379
  • 以下の設定を削除します。
  • 以下の設定を追加します。
    • spring.redis.host=localhost
    • spring.redis.port=6379

Tomcat を起動します。Spring Actuator の health check を見ると redis が認識されています。

f:id:ksby:20181124134806p:plain

ブラウザから http://localhost:8080/ のログイン画面にアクセスしてログインを試みると、問題なくログインできました。

redis-cli で redis のデータを確認してみます。docker exec -it redis redis-cli を実行すると redis-cli が起動して Docker 内の redis サーバにアクセスできるので keys * コマンドを実行してみます。

f:id:ksby:20181124135200p:plain

redis 起動後にログイン画面に1回アクセスして1回ログインしただけにしてはデータが多いですね。。。 おそらく犯人は "spring:session:index:org.springframework.session.FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME:actuator" でしょう。Spring Actuator の Endpoint に設定した Basic 認証でログインした時にセッション情報が作成されていることが原因のようです。

Spring Actuator の Endpoint の Basic 認証ではセッション情報を生成しないようにする

src/main/java/ksbysample/webapp/lending/config/WebSecurityConfig.java の以下の点を変更します。

    @Configuration
    @Order(1)
    public static class ActuatorWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                    // Spring Actuator の Endpoint のみ Basic認証を設定する
                    .requestMatcher(EndpointRequest.toAnyEndpoint())
                    .authorizeRequests()
                    .anyRequest().hasRole("ENDPOINT_ADMIN")
                    .and()
                    .httpBasic()
                    // Spring Actuator の Endpoint の Basic認証の時は認証するだけでサーバ側にセッションを作成しない
                    // これにより Spring Session のセッション情報保存先である Redis 上にデータが作成されなくなる
                    .and()
                    .sessionManagement()
                    .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        }

    }
  • http.requestMatcher(EndpointRequest.toAnyEndpoint()).sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); を追加します。

確認します。Tomcat を1度停止した後、redis-cli で flushdb コマンドを実行して redis のデータをクリアします。

f:id:ksby:20181124181235p:plain

Tomcat を起動 → http://localhost:8080/actuator/prometheus にアクセスした後、redis 上にデータが作成されていないことを確認します。

f:id:ksby:20181124181430p:plain

f:id:ksby:20181124181535p:plain

http://localhost:8080/ のログイン画面にアクセスしてログインした後、今度は redis 上にデータが作成されていることを確認します。

f:id:ksby:20181124181826p:plain f:id:ksby:20181124181859p:plain

f:id:ksby:20181124182000p:plain

参考までに、今回実装した箇所をコメントアウトしてから http://localhost:8080/actuator/prometheus にアクセス → redis-cli で keys * を繰り返すと redis 上のデータが増えていくことが確認できます。

f:id:ksby:20181124182346p:plain

Redis のメトリックスを Prometheus + Grafana で表示してみる

Redis のメトリックスを Grafana で表示させる Dashboard があるのか調べてみたところ Prometheus Redis を見つけました。これを利用して表示させてみます。

Redis → Prometheus への exporter は oliver006/redis_exporter を Docker で起動して利用します。docker-compose.yml に redis_exporter の設定を追加します。

  redis_exporter:
    image: oliver006/redis_exporter:latest
    container_name: redis_exporter
    ports:
    - "9121:9121"
    environment:
    - REDIS_ADDR=redis://172.23.136.33:6379

docker/prometheus/prometheus.yml に redis_exporter からメトリックスを収集する設定を追加します。

scrape_configs:
..........

- job_name: 'redis_exporter'
  static_configs:
  - targets: ['172.23.136.33:9121']

docker-compose downdocker-compose up -d コマンドを実行します。

f:id:ksby:20181125124846p:plain

Grafana に Prometheus RedisDashboard を追加します。http://localhost:3000/ にアクセスした後、画面左側のメニューから「Create」-「Import」を選択します。

f:id:ksby:20181125125404p:plain

「Import」画面が表示されますので 763 の ID を入力します。

f:id:ksby:20181125125624p:plain

「prom」で「spring-actuator」を選択した後、「Import」ボタンをクリックします。

f:id:ksby:20181125125844p:plain

Prometheus RedisDashboard が表示されます(画面右上の表示間隔の設定を Last 24 hours Refresh every 30sLast 30 minutes Refresh every 5s に変更しています)。

f:id:ksby:20181125130159p:plain f:id:ksby:20181125130253p:plain

履歴

2018/11/25
初版発行。
2018/11/26
* .httpBasic().sessionManagement().and() で繋げる記述に変更しました。