すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:NVMボリュームを直接メモリとしてマウントしたRedisインスタンスをデプロイする

最終更新日:Nov 22, 2024

Container Service for Kubernetes (ACK) では、永続メモリ (PMEM) デバイスへの直接アクセスにより、高スループットと低レイテンシが実現します。 このトピックでは、ダイナミックランダムアクセスメモリ (DRAM) とPMEMを使用して、大容量のメモリを必要とするインメモリRedisインスタンスをデプロイする方法について説明します。

背景情報

大容量のメモリを必要とするインメモリRedisインスタンスをデプロイする場合は、NVM (不揮発性メモリ) ボリュームをダイレクトメモリとしてマウントできます。 このソリューションは、次の利点を提供します。

  • NVMボリュームは、宣言的な方法でアクセスされる。 これは、NVMリソースの使用を単純化する。

  • 同じメモリ容量で、コストを30% 50% 削減できます。

  • アプリケーションの変更は最小限に抑えられます。

Redisは、直接メモリとしてNVMデバイスを使用し、MMAP関数を呼び出してPMEMの連続アドレス空間をマッピングします。この場合、特定のRedisバージョンが必要です。 次の例は、Redisインスタンスのイメージをクエリする方法を示しています。

DRAMを使用したインメモリRedisインスタンスのデプロイ

DRAMは高速アクセス性能を提供するが、電源がオフになるとデータを失う。 DRAMは、コストが高いため、大規模なシナリオには適用されません。

  1. Redisインスタンスをデプロイするには、次の手順を実行します。

    1. 次のサンプルテンプレートを使用してredis-normal.yamlファイルを作成します。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: redis-normal
        labels:
          app: redis-normal
      spec:
        selector:
          matchLabels:
            app: redis-normal
        template:
          metadata:
            labels:
              app: redis-normal
          spec:
            containers:
            - name: redis
              image: registry.cn-hangzhou.aliyuncs.com/plugins/redis:v1-normal
              imagePullPolicy: Always
              resources:
                requests:
                  memory: 30Gi
                limits:
                  memory: 30Gi
    2. 次のコマンドを実行して、Redisインスタンスをデプロイします。

      kubectl apply -f redis-normal.yaml
  2. 次のコマンドを実行して、Redisインスタンスを実行するポッドを照会します。

    kubectl get pod | grep redis-normal

    期待される出力:

    redis-normal-***         1/1     Running   0          4d8h
  3. 次のコマンドを実行して、Redisインスタンスの書き込みパフォーマンスをテストします。

    LD_PRELOAD=/usr/local/lib/libmemkind.so redis-benchmark -d 102400 -t set -n 1000000 -r 1000000

    期待される出力:

    1000000 requests completed in 13.03 seconds
    76751.86 requests per second

    上記の出力は、DRAMとともにデプロイされたインメモリRedisインスタンスが1秒あたり約76,751のリクエストを処理できることを示しています。

PMEMを使用したインメモリRedisインスタンスのデプロイ

PMEMは不揮発性記憶装置を提供し、アクセス方法および速度の点でDRAMに類似している。

  1. 次のコマンドを実行して、インメモリRedisインスタンスをデプロイします。

    kubectl apply -f redis-normal.yaml

    次のテンプレートに、redis-normal.yamlファイルの例を示します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pmem-pvc-direct
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 60Gi
      storageClassName: csi-pmem-direct
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: redis-pmem-direct
      labels:
        app: redis-pmem-direct
    spec:
      selector:
        matchLabels:
          app: redis-pmem-direct
      template:
        metadata:
          labels:
            app: redis-pmem-direct
        spec:
          containers:
          - name: nginx
            image: registry.cn-hangzhou.aliyuncs.com/plugins/redis:v1-pmem
            imagePullPolicy: Always
            volumeMounts:
              - name: pmem-pvc
                mountPath: "/mnt/pmem"
          volumes:
            - name: pmem-pvc
              persistentVolumeClaim:
                claimName: pmem-pvc-direct
  2. 次のコマンドを実行して、Redisインスタンスを実行するポッドを照会します。

    kubectl get pod | grep redis-pmem-direct

    期待される出力:

    redis-pmem-direct-5b469546db-5tk2j   1/1     Running   0          4d9h
  3. 次のコマンドを実行して、Redisインスタンスの書き込みパフォーマンスをテストします。

    LD_PRELOAD=/usr/local/lib/libmemkind.so redis-benchmark -d 10240 -t set -n 1000000 -r 1000000

    期待される出力:

    1000000 requests completed in 19.89 seconds
    50266.41 requests per second

    上記の出力は、PMEMとともにデプロイされたインメモリRedisインスタンスが1秒あたり約50,266のリクエストを処理できることを示しています。

    DRAMでデプロイされたインメモリRedisインスタンスと比較して、PMEMでデプロイされたインメモリRedisインスタンスは、書き込みパフォーマンスを34% 削減しますが、同じ読み取りパフォーマンスを提供し、コストを50% 削減します。 ECS. ebmre6p.26xlargeなどのNVMデバイスを備えたecs (Elastic Compute Service) インスタンスタイプは、1.5テラバイトのMEMメモリを提供します。これは、一般的なインメモリデータベースの5倍の容量です。