Container Service for Kubernetes (ACK) を使用すると、アプリケーションを変更することなく、不揮発性メモリ (NVM) ボリュームをブロックストレージまたはファイルシステムとして使用できます。 これにより、NVMリソースの使用が容易になり、標準SSDと比較して読み書き性能が2〜10倍向上します。 このトピックでは、ACKクラスターでNVMボリュームを使用して、低レイテンシで高速な読み取りと一時ストレージへの書き込みを必要とするデータ集約型ワークロードおよびシナリオの要件を満たす方法について説明します。
シナリオ1: 低レイテンシで高速な一時ストレージ
次のシナリオでは、低レイテンシで高速な一時ストレージが必要です。
継続的な統合と継続的な配信での一時保存 (CD/CD)
小さなファイルのトラバーサル
高スループットロギング
サーバーレスシナリオでの一時ファイルの読み取りと書き込み
FIOを使用した読み取りおよび書き込みパフォーマンスのテスト
このトピックでは、読み書きのパフォーマンスをテストするために、AEP PMEM-LVMとSSDに基づいて2つの永続ボリュームクレーム (PVC) を作成します。
次のYAMLファイルをデプロイして、PMEM-LVMとSSDに基づいて2つのPVCを作成します。
YAMLテンプレートのPVC PMEM-LVM型
allowVolumeExpansion: true apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: csi-pmem-lvm mountOptions: - dax parameters: lvmType: striping nodeAffinity: "true" volumeType: PMEM provisioner: localplugin.csi.alibabacloud.com reclaimPolicy: Delete volumeBindingMode: WaitForFirstConsumer --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pmem-lvm-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: csi-pmem-lvmSSDタイプのPVCのYAMLテンプレート
apiVersion: v1 kind: PersistentVolumeClaim メタデータ: 名前: ssd-pvc spec: accessModes: - ReadWriteOnce resources: requests: ストレージ: 100Gi storageClassName: alicloud-disk-topology次のYAMLファイルをデプロイして、ボリュームをポッドにマウントし、FIOテストを実行します。
アプリケーションを作成し、PMEM-LVMタイプのPVCマウントと実行FIOテスト
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-pmem-lvm labels: app: pmem-lvm spec: selector: matchLabels: app: pmem-lvm template: metadata: labels: app: pmem-lvm spec: containers: - name: fio-test image: registry.cn-hangzhou.aliyuncs.com/eric-dev/sysbench:fio command: ["sh", "-c"] args: ["sleep 10000"] volumeMounts: - name: pmem mountPath: "/data" volumes: - name: pmem persistentVolumeClaim: claimName: pmem-lvm-pvcSSDタイプのPVCがマウントされたアプリケーションを作成し、FIOテストを実行
apiVersion: apps/v1 kind: 配置 メタデータ: 名前: deployment-ssd ラベル: アプリ: ssd spec: セレクタ: matchLabels: アプリ: ssd template: metadata: labels: アプリ: ssd 仕様: containers: -名前: fio-test 画像: registry.cn-hangzhou.aliyuncs.com/eric-dev/sysbench:fio コマンド: ["sh", "-c"] args: ["睡眠10000"] volumeMounts: -name: ssd mountPath: "/data" volumes: -name: ssd persistentVolumeClaim: claimName: ssd-pvckubectl execコマンドを使用してコンテナ内でFIOテストを実行し、PMEM-LVMボリュームの書き込みパフォーマンスをテストします。mount | grep csi cd /data fio -filename=./testfile -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k期待される出力:
write: IOPS=92.0k, BW=363MiB/s (381MB/s)(8812MiB/24262msec) lat (nsec): min=2054, max=95278, avg=10544.00, stdev=1697.17kubectl execコマンドを使用してコンテナ内でFIOテストを実行し、SSDボリュームの書き込みパフォーマンスをテストします。cd /data fio -filename=./testfile -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=10G -numjobs=50 -runtime=180 -group_reporting -name=rand_100write_4k期待される出力:
lat (usec): min=20, max=7168, avg=24.76, stdev=13.97 write: IOPS=37.3k, BW=146MiB/s (153MB/s)(8744MiB/60001msec)
出力は、AEPデバイスの読み取りおよび書き込みパフォーマンスがSSDデバイスのパフォーマンスよりも2〜3倍高いことを示しています。
ボリュームタイプ
IOPS
スループット
PMEM-LVM
92000
381 MB/s
SSD
37000
153 MB/s
シナリオ2: データ集中型ワークロード
このトピックでは、SSDボリュームがマウントされているMySQLインスタンスと、NVMボリュームがマウントされているMySQLインスタンスが作成されます。 次に、MySQLインスタンスの書き込みパフォーマンスがテストされます。
SSDボリュームがマウントされたMySQLインスタンスの作成
SSDボリュームを作成します。
次のコマンドを実行して、Alibaba Cloudが提供するContainer Storage Interface (CSI) ドライバーを使用してSSDボリュームを作成します。
kubectl apply -f disk-mysql.yaml次のテンプレートに、disk-mysql.yamlファイルの例を示します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: disk-mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: alicloud-disk-topology次のコマンドを実行してSSDボリュームを照会します。
kubectl get pvc disk-mysql期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE disk-mysql Bound d-*** 100Gi RWO alicloud-disk-topology 10h
SSDボリュームがマウントされたMySQLインスタンスを作成します。
次のコマンドを実行して、MySQLインスタンスを作成します。
kubectl apply -f mysql-normal-ssd.yaml次のテンプレートに、mysql-normal-ssd.yamlファイルの例を示します。
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: mysql-normal labels: app: wordpress spec: selector: matchLabels: app: wordpress tier: mysql strategy: type: Recreate template: metadata: labels: app: wordpress tier: mysql spec: hostNetwork: true containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql mountPath: /var/lib/mysql volumes: - name: mysql persistentVolumeClaim: claimName: disk-mysql --- apiVersion: v1 kind: Secret metadata: name: mysql-pass type: Opaque data: username: YWRt**** password: YWRt****次のコマンドを実行して、MySQLインスタンスを実行するポッドを照会します。
kubectl get pod | grep mysql-normal期待される出力:
NAME READY STATUS RESTARTS AGE mysql-normal-**** 1/1 Running 0 10h
NVMボリュームがマウントされたMySQLインスタンスの作成
PMEM-LVMボリュームを作成します。
次のコマンドを実行して、Alibaba Cloudが提供するCSIドライバーを使用してPMEM-LVMボリュームを作成します。
kubectl apply -f csi-pmem-lvm.yaml次のテンプレートに、csi-pmem-lvm.yamlファイルの例を示します。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pmem-mysql spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: csi-pmem-lvm次のコマンドを実行して、PMEM-LVMボリュームを照会します。
kubectl get pvc pmem-mysql期待される出力:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE pmem-mysql Bound d-**** 100Gi RWO csi-pmem-lvm 10h
PMEM-LVMボリュームがマウントされたMySQLインスタンスを作成します。
次のコマンドを実行して、PMEM-LVMボリュームがマウントされたMySQLインスタンスを作成します。
kubectl apply -f mysql-normal-pmem.yaml次のテンプレートに、mysql-normal-pmem.yamlファイルの例を示します。
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: mysql-normal labels: app: wordpress spec: selector: matchLabels: app: wordpress tier: mysql strategy: type: Recreate template: metadata: labels: app: wordpress tier: mysql spec: hostNetwork: true nodeName: <NODE name of worker node> containers: - image: mysql:5.6 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 3306 name: mysql volumeMounts: - name: mysql mountPath: /var/lib/mysql volumes: - name: mysql persistentVolumeClaim: claimName: pmem-mysql --- apiVersion: v1 kind: Secret metadata: name: mysql-pass type: Opaque data: username: YWRt**** password: YWRt****次のコマンドを実行して、MySQLインスタンスを実行するポッドを照会します。
kubectl get pod | grep mysql-normal期待される出力:
NAME READY STATUS RESTARTS AGE mysql-normal-**** 1/1 Running 0 10h
MySQLインスタンスの書き込みパフォーマンスのテスト
ポッドで次のコマンドを実行して、MySQLインスタンスの書き込みパフォーマンスをテストします。
sysbench /root/sysbench/point_select.lua run --db-driver=mysql --report-interval=1
--mysql-table-engine=innodb --oltp-table-size=10000 --oltp-tables-count=32 --oltp-test-mode=complex
--time=100 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=admin
--mysql-db=sbtest --oltp-read-only=on --oltp-simple-ranges=0 --oltp-sum-ranges=0
--oltp-order-ranges=0 --oltp-distinct-ranges=0 --oltp-dist-type=uniform --warmup-time=300
--max-time=30 --max-requests=0 --percentile=99 --num-threads=150テスト結果
ボリュームタイプ | IOPSの挿入 |
SSD | 49812 |
PMEM-LVM | 122156 |
結果は、NVMボリュームがマウントされたMySQLインスタンスの書き込みパフォーマンスが、SSDボリュームがマウントされたMySQLインスタンスの書き込みパフォーマンスの2.5倍であることを示しています。