Ceph(Octopus)の構築(設定編 Crush Map)


##__はじめに__
この記事では、タイトルのとおり現時点(2021.01)で最新である__ceph(octopus)__の構築を目的としています。
また、自分で構築した手順の備忘録を兼ねているので、細かいところで間違いなどあるかもしれません。

基本的には公式のDOCUMENTATIONが必要なことを全て網羅しているので一読しておくことをお勧めします。
Linuxの知識もある程度必要になるので他サイトや書籍などで事前に基本は押さえておくとよいでしょう。

準備編等は関連記事を参照してください。

##__関連記事__
[Ceph(Octopus)の構築(準備編 ハードウェア)](https://qiita.com/iriya_v00v/items/651eff2955d5ad7eadf6)
[Ceph(Octopus)の構築(準備編 ソフトウェア)](https://qiita.com/iriya_v00v/items/e3268fe75423ba0304b3)
[Ceph(Octopus)の構築(設定編 共通)](https://qiita.com/iriya_v00v/items/d7d9e439cf4159acae2c)
[Ceph(Octopus)の構築(設定編 ブートストラップ)](https://qiita.com/iriya_v00v/items/d7bcf4dfa6324bacd91a)
[Ceph(Octopus)の構築(設定編 mon/mgr/osd)](https://qiita.com/iriya_v00v/items/75eefdefb7ec61d24812)
[Ceph(Octopus)の構築(設定編 cephFS/mds)](https://qiita.com/iriya_v00v/items/931838d6d56e568bd6d8)
Ceph(Octopus)の構築(設定編 Crush Map) この記事

##__Crush Mapの編集__
cephの基本的な動作ですが、デフォルトではレプリケーションが「3」に設定されています。格納されたデータをオブジェクト単位に分割し、そのオブジェクトを合計3つのOSDへ配置するということになります。
Crush Mapがデフォルトのままだと、全てのOSDからランダムに3つが選択されてしまいます。3つとも同一のL2SW配下にあるOSDが選ばれてしまうとL2SWの故障でデータへのアクセスができなくなってしまいます。
今回はL2SWを3つに分けており、障害時にできるだけ止まらないようにするため、OSDを3グループに分けるよう編集を行います。
現状はDashboardの[Cluster]>[CRUSH map]を見ると全てのOSDが一列であることが確認できると思います。
なお、レプリケーション数は3のままとします。

Crush Mapの取り出し(バイナリデータ)

```
cephadm shell
　　ceph osd getcrushmap -o /tmp/crush
```

Crush Mapの変換(バイナリからテキストへ)

```
cephadm shell
　　crushtool -d /tmp/crush -o /tmp/crush.txt
```

Crush Mapの変換(テキストからバイナリへ)

```
cephadm shell
　　crushtool -c /tmp/crush.txt -o /tmp/crush.new
```

Crush Mapのアップロード

```
cephadm shell
　　ceph osd setcrushmap -i /tmp/crush.new
```

Crush Mapの反映

```
cephadm shell
　　ceph -w
```


##__Crush Mapのサンプル__


```:Crush_Map(変更後)
# begin crush map
tunable choose_local_tries 0
tunable choose_local_fallback_tries 0
tunable choose_total_tries 50
tunable chooseleaf_descend_once 1
tunable chooseleaf_vary_r 1
tunable chooseleaf_stable 1
tunable straw_calc_version 1
tunable allowed_bucket_algs 54

# devices
device 0 osd.0 class hdd
device 1 osd.1 class hdd
device 2 osd.2 class hdd
device 3 osd.3 class hdd
device 4 osd.4 class hdd
device 5 osd.5 class hdd
device 6 osd.6 class hdd
device 7 osd.7 class hdd
device 8 osd.8 class hdd
device 9 osd.9 class hdd
device 10 osd.10 class hdd
device 11 osd.11 class hdd
device 12 osd.12 class hdd
device 13 osd.13 class hdd
device 14 osd.14 class hdd

# types
type 0 osd
type 1 host
type 2 chassis
type 3 rack
type 4 row
type 5 pdu
type 6 pod
type 7 room
type 8 datacenter
type 9 zone
type 10 region
type 11 root

# buckets
host ceph-mon01 {
	id -3		# do not change unnecessarily
	id -4 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.0 weight 1.000
}
host ceph-mds01 {
	id -5		# do not change unnecessarily
	id -6 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.1 weight 1.000
}
host ceph-osd01 {
	id -7		# do not change unnecessarily
	id -8 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.2 weight 1.000
}
host ceph-osd02 {
	id -9		# do not change unnecessarily
	id -10 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.3 weight 1.000
}
host ceph-mon11 {
	id -11		# do not change unnecessarily
	id -12 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.4 weight 1.000
}
host ceph-mds11 {
	id -13		# do not change unnecessarily
	id -14 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.5 weight 1.000
}
host ceph-osd11 {
	id -15		# do not change unnecessarily
	id -16 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.6 weight 1.000
}
host ceph-osd12 {
	id -17		# do not change unnecessarily
	id -18 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.7 weight 1.000
}
host ceph-osd13 {
	id -19		# do not change unnecessarily
	id -20 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.8 weight 1.000
}
host ceph-mon21 {
	id -21		# do not change unnecessarily
	id -22 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.9 weight 1.000
}
host ceph-mds21 {
	id -23		# do not change unnecessarily
	id -24 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.10 weight 1.000
}
host ceph-osd21 {
	id -25		# do not change unnecessarily
	id -26 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.11 weight 1.000
}
host ceph-osd22 {
	id -27		# do not change unnecessarily
	id -28 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.12 weight 1.000
}
host ceph-osd23 {
	id -29		# do not change unnecessarily
	id -30 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.13 weight 1.000
}
host ceph-osd03 {
	id -31		# do not change unnecessarily
	id -32 class hdd		# do not change unnecessarily
	# weight 1.000
	alg straw2
	hash 0	# rjenkins1
	item osd.14 weight 1.000
}

#メルキオール
rack Melchior {
	id -33
	id -34 class hdd
	# weight 5.000
	alg straw2
	hash 0	# rjenkins1
	item ceph-mon01 weight 1.000
	item ceph-mds01 weight 1.000
	item ceph-osd01 weight 1.000
	item ceph-osd02 weight 1.000
	item ceph-osd03 weight 1.000
}
#バルタザール
rack Balthasar {
	id -35
	id -36 class hdd
	# weight 5.000
	alg straw2
	hash 0	# rjenkins1
	item ceph-mon11 weight 1.000
	item ceph-mds11 weight 1.000
	item ceph-osd11 weight 1.000
	item ceph-osd12 weight 1.000
	item ceph-osd13 weight 1.000
}
#カスパー
rack Casper {
	id -37
	id -38 class hdd
	# weight 5.000
	alg straw2
	hash 0	# rjenkins1
	item ceph-mon21 weight 1.000
	item ceph-mds21 weight 1.000
	item ceph-osd21 weight 1.000
	item ceph-osd22 weight 1.000
	item ceph-osd23 weight 1.000
}

root default {
	id -1		# do not change unnecessarily
	id -2 class hdd		# do not change unnecessarily
	# weight 15.000
	alg straw2
	hash 0	# rjenkins1
	item Melchior weight 5.000
	item Balthasar weight 5.000
	item Casper weight 5.000
}

# rules
rule replicated_rule {
	id 0
	type replicated
	min_size 1
	max_size 10
	step take default
	step choose firstn 0 type rack
	step chooseleaf firstn 1 type host
	step emit
}

# end crush map
```

##__dashboardの確認__
OSDがrack単位でグループ化され、階層構造になっていることが確認できます。上記Crush Mapを適用すると、各グループから1つずつOSDを選ぶようになります。Placement Groupを確認しても、各グループから必ず1つずつ選択されていることが分かります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033108/ae6f77d2-b75b-81c4-7a36-ecf1056cc9c2.png)


##__おわりに__
もう少し詳しく書く予定です・・・