[Ceph] Implement pool quotas on pools as they are created/managed
This patch set implements pool quotas on each pool in the Ceph cluster by obtaining the total capacity of the cluster in bytes, multiplying that by the defined percentage of total data expected to reside in each pool and by the cluster quota, and setting a byte quota on each pool that is equal to its expected percentage of the total cluster quota. Change-Id: I1686822a74c984e99e9347f55b98219c47decec1
This commit is contained in:
parent
eefcf33f61
commit
d74b579f1d
@ -120,23 +120,30 @@ function manage_pool () {
|
|||||||
TOTAL_DATA_PERCENT=$4
|
TOTAL_DATA_PERCENT=$4
|
||||||
TARGET_PG_PER_OSD=$5
|
TARGET_PG_PER_OSD=$5
|
||||||
POOL_CRUSH_RULE=$6
|
POOL_CRUSH_RULE=$6
|
||||||
POOL_PROTECTION=$7
|
TARGET_QUOTA=$7
|
||||||
|
POOL_PROTECTION=$8
|
||||||
|
CLUSTER_CAPACITY=$9
|
||||||
TOTAL_OSDS={{.Values.conf.pool.target.osd}}
|
TOTAL_OSDS={{.Values.conf.pool.target.osd}}
|
||||||
POOL_PLACEMENT_GROUPS=$(/tmp/pool-calc.py ${POOL_REPLICATION} ${TOTAL_OSDS} ${TOTAL_DATA_PERCENT} ${TARGET_PG_PER_OSD})
|
POOL_PLACEMENT_GROUPS=$(/tmp/pool-calc.py ${POOL_REPLICATION} ${TOTAL_OSDS} ${TOTAL_DATA_PERCENT} ${TARGET_PG_PER_OSD})
|
||||||
create_pool "${POOL_APPLICATION}" "${POOL_NAME}" "${POOL_REPLICATION}" "${POOL_PLACEMENT_GROUPS}" "${POOL_CRUSH_RULE}" "${POOL_PROTECTION}"
|
create_pool "${POOL_APPLICATION}" "${POOL_NAME}" "${POOL_REPLICATION}" "${POOL_PLACEMENT_GROUPS}" "${POOL_CRUSH_RULE}" "${POOL_PROTECTION}"
|
||||||
|
POOL_REPLICAS=$(ceph --cluster "${CLUSTER}" osd pool get "${POOL_NAME}" size | awk '{print $2}')
|
||||||
|
POOL_QUOTA=$(python -c "print int($CLUSTER_CAPACITY * $TOTAL_DATA_PERCENT * $TARGET_QUOTA / $POOL_REPLICAS / 100 / 100)")
|
||||||
|
ceph --cluster "${CLUSTER}" osd pool set-quota "${POOL_NAME}" max_bytes $POOL_QUOTA
|
||||||
}
|
}
|
||||||
|
|
||||||
reweight_osds
|
reweight_osds
|
||||||
|
|
||||||
{{ $targetPGperOSD := .Values.conf.pool.target.pg_per_osd }}
|
{{ $targetPGperOSD := .Values.conf.pool.target.pg_per_osd }}
|
||||||
{{ $crushRuleDefault := .Values.conf.pool.default.crush_rule }}
|
{{ $crushRuleDefault := .Values.conf.pool.default.crush_rule }}
|
||||||
|
{{ $targetQuota := .Values.conf.pool.target.quota | default 100 }}
|
||||||
{{ $targetProtection := .Values.conf.pool.target.protected | default "false" | quote | lower }}
|
{{ $targetProtection := .Values.conf.pool.target.protected | default "false" | quote | lower }}
|
||||||
|
cluster_capacity=$(ceph --cluster "${CLUSTER}" df | head -n3 | tail -n1 | awk '{print $1 substr($2, 1, 1)}' | numfmt --from=iec)
|
||||||
{{- range $pool := .Values.conf.pool.spec -}}
|
{{- range $pool := .Values.conf.pool.spec -}}
|
||||||
{{- with $pool }}
|
{{- with $pool }}
|
||||||
{{- if .crush_rule }}
|
{{- if .crush_rule }}
|
||||||
manage_pool {{ .application }} {{ .name }} {{ .replication }} {{ .percent_total_data }} {{ $targetPGperOSD }} {{ .crush_rule }} {{ $targetProtection }}
|
manage_pool {{ .application }} {{ .name }} {{ .replication }} {{ .percent_total_data }} {{ $targetPGperOSD }} {{ .crush_rule }} {{ $targetQuota }} {{ $targetProtection }} ${cluster_capacity}
|
||||||
{{ else }}
|
{{ else }}
|
||||||
manage_pool {{ .application }} {{ .name }} {{ .replication }} {{ .percent_total_data }} {{ $targetPGperOSD }} {{ $crushRuleDefault }} {{ $targetProtection }}
|
manage_pool {{ .application }} {{ .name }} {{ .replication }} {{ .percent_total_data }} {{ $targetPGperOSD }} {{ $crushRuleDefault }} {{ $targetQuota }} {{ $targetProtection }} ${cluster_capacity}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
@ -217,6 +217,10 @@ conf:
|
|||||||
osd: 5
|
osd: 5
|
||||||
pg_per_osd: 100
|
pg_per_osd: 100
|
||||||
protected: true
|
protected: true
|
||||||
|
#NOTE(st053q): target quota should be set to the overall cluster full percentage
|
||||||
|
# to be tolerated as a quota (percent full to allow in order to tolerate some
|
||||||
|
# level of failure)
|
||||||
|
quota: 100
|
||||||
default:
|
default:
|
||||||
# NOTE(supamatt): Accepted values are taken from `crush_rules` list.
|
# NOTE(supamatt): Accepted values are taken from `crush_rules` list.
|
||||||
crush_rule: replicated_rule
|
crush_rule: replicated_rule
|
||||||
|
Loading…
Reference in New Issue
Block a user