開発用にDocker ComposeでRedis Clusterを構築する

Composeの作成

Ubuntu24でインストール出来るRedisが7.0なのでバージョンを合わせています。開発用なのでレプリカは用意せず最小のマスター3台で構成します。

起動時にクラスタを初期化しています。

services:
  redis-init:
    container_name: redis-init
    image: redis:7.0
    depends_on:
      - redis-node-1
      - redis-node-2
      - redis-node-3
    entrypoint:
      [
        '/bin/sh',
        '-c',
        'sleep 5 && redis-cli --cluster create redis-node-1:7001 redis-node-2:7002 redis-node-3:7003 --cluster-replicas 0 --cluster-yes',
      ]
    networks:
      - redis-network

  redis-node-1:
    container_name: redis-node-1
    image: redis:7.0
    command:
      [
        'redis-server',
        '--port',
        '7001',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7001:7001'
    volumes:
      - redis-node-1-data:/data
      - ./scripts:/scripts:ro
    networks:
      - redis-network

  redis-node-2:
    container_name: redis-node-2
    image: redis:7.0
    command:
      [
        'redis-server',
        '--port',
        '7002',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7002:7002'
    volumes:
      - redis-node-2-data:/data
    networks:
      - redis-network

  redis-node-3:
    container_name: redis-node-3
    image: redis:7.0
    command:
      [
        'redis-server',
        '--port',
        '7003',
        '--cluster-enabled',
        'yes',
        '--cluster-config-file',
        'nodes.conf',
        '--cluster-node-timeout',
        '5000',
        '--appendonly',
        'yes',
      ]
    ports:
      - '7003:7003'
    volumes:
      - redis-node-3-data:/data
    networks:
      - redis-network

volumes:
  redis-node-1-data:
    driver: local
  redis-node-2-data:
    driver: local
  redis-node-3-data:
    driver: local

networks:
  redis-network:
    external: true
    driver: bridge

初回のみネットワークを作成します。

docker network create redis-network

以下のコマンドで起動します。

docker compose -f compose.redis.yml up -d

停止は-vオプションを付けてボリュームも消すようにします。

docker compose -f compose.redis.yml down -v

読み書きテスト

適当なコードを書いて確認します。

import Redis from 'ioredis';

async function testRedisCluster() {
    // Redisクラスターの設定
    const cluster = new Redis.Cluster([
        { host: '127.0.0.1', port: 7000 },
        { host: '127.0.0.1', port: 7001 },
        { host: '127.0.0.1', port: 7002 }
    ]);

    try {
        // 書き込みテスト
        await cluster.set('testKey', 'testValue');
        console.log('書き込み成功');

        // 読み込みテスト
        const value = await cluster.get('testKey');
        console.log('読み込み成功:', value);

        // 結果の確認
        if (value === 'testValue') {
            console.log('Redisクラスターの読み書きテスト成功');
        } else {
            console.error('Redisクラスターの読み書きテスト失敗');
        }
    } catch (error) {
        console.error('エラーが発生しました:', error);
    } finally {
        // クラスターのクローズ
        cluster.disconnect();
    }
}

// テストの実行
testRedisCluster();

export default testRedisCluster;

GUIツール Redis Insight

services:
  redis-insight:
    container_name: redis-insight
    image: redislabs/redisinsight:latest
    ports:
      - '8001:5540'
    volumes:
      - redis-insight-data:/db
    networks:
      - redis-network

volumes:
  redis-insight-data:
    driver: local

networks:
  redis-network:
    external: true
    driver: bridge

起動は以下です。

docker compose -f compose.redisinsight.yml up -d

http://localhost:8001/ にアクセスします。初回は利用規約が表示されます。

接続URLはコンテナ名:ポートです。

終了は以下です。

docker compose -f compose.redisinsight.yml down

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です