全部產品
Search
文件中心

Container Service for Kubernetes:使用非易失性儲存卷的直接記憶體存取方式部署Redis資料庫

更新時間:Nov 20, 2024

在ACK環境下,通過直接存取PMEM(Persistent Memory)裝置,可以實現高吞吐和低時延。本文主要介紹如何在大容量記憶體情境下通過DRAM及PMEM方式部署記憶體資料庫Redis。

背景資訊

在大容量記憶體情境下,使用非易失性儲存卷的直接記憶體存取(Direct Memory)方式部署記憶體資料庫Redis的優勢:

  • 通過聲明化的方式訪問非易失性儲存卷,降低非易失性儲存卷的使用複雜度。

  • 在同樣容量記憶體情況下,可節省30%~50%的成本。

  • 最小化應用修改。

Redis以直接記憶體存取方式,使用非易失性存放裝置調用MMAP對PMEM的連續地址空間進行映射。此情境下需使用特定Redis版本,可參考本文樣本擷取Redis鏡像。

通過DRAM部署Redis記憶體資料庫

記憶體(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記憶體資料庫,每秒大約處理76751個請求。

通過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記憶體資料庫,每秒大約處理50266個請求。

    相比DRAM部署Redis記憶體資料庫的寫效能,PMEM部署的Redis記憶體資料庫的寫效能降低僅約34%,讀效能不受影響,但成本下降50%。同時使用非易失性儲存卷對機型ecs.ebmre6p.26xlarge 1.5TB的PMEM記憶體空間,相比於普通記憶體資料庫容量提升了4倍。