在ACK環境下,通過直接存取PMEM(Persistent Memory)裝置,可以實現高吞吐和低時延。本文主要介紹如何在大容量記憶體情境下通過DRAM及PMEM方式部署記憶體資料庫Redis。
背景資訊
在大容量記憶體情境下,使用非易失性儲存卷的直接記憶體存取(Direct Memory)方式部署記憶體資料庫Redis的優勢:
通過聲明化的方式訪問非易失性儲存卷,降低非易失性儲存卷的使用複雜度。
在同樣容量記憶體情況下,可節省30%~50%的成本。
最小化應用修改。
Redis以直接記憶體存取方式,使用非易失性存放裝置調用MMAP對PMEM的連續地址空間進行映射。此情境下需使用特定Redis版本,可參考本文樣本擷取Redis鏡像。
通過DRAM部署Redis記憶體資料庫
記憶體(DRAM)可以提供優異的訪問效能,但掉電時資料容易丟失且價格昂貴,不適合大容量記憶體使用量。
部署Redis服務。
使用以下樣本模板建立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執行以下命令部署Redis服務。
kubectl apply -f redis-normal.yaml
執行以下命令查看Redis服務。
kubectl get pod | grep redis-normal預期輸出:
redis-normal-*** 1/1 Running 0 4d8h執行以下命令測試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的使用方式和速度。
執行以下命令部署Redis記憶體資料庫。
kubectl apply -f redis-normal.yamlredis-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執行以下命令查看部署的Redis。
kubectl get pod | grep redis-pmem-direct預期輸出:
redis-pmem-direct-5b469546db-5tk2j 1/1 Running 0 4d9h執行以下命令測試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倍。