데이터의 읽기/쓰기/수정 등의 작업으로 "Cluster network"에서 "Public network"와 준하거나 그 이상의 트래픽이 발생할 수 있습니다. 특히 Erasure Code로 구성하여 운용할 경우 "Cluster network"에서 발생 트래픽이 좀 더 많습니다(대략 30~50%↑). 안전하게 Ceph를 운용하기 위해서는 "Cluster network", "Public network"를 분리하는 것과 10G 환경으로 구성하는 것을 추천합니다.
06. 환경설정 - firewall & selinux
내/외부 서비스망이 잘 분리되어 굳이 파이어월 설정이 필요하지 안으면 아래와 같이 비활성화 시키고 다음 단계로 진행합니다. "Admin" 노드를 제외한 6대를 차례대로 비활성화 시킵니다. selinux 변경 값(비활성화)을 적용하기 위해서 OS를 재기동합니다.
[root@node1 ~]# systemctl stop firewalld
[root@node1 ~]# systemctl disable firewalld
[root@node1 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node1 ~]# reboot
...
...
...
[root@node6 ~]# systemctl stop firewalld
[root@node6 ~]# systemctl disable firewalld
[root@node6 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node6 ~]# reboot
그리나, 파이어월 설정이 필요한 경우는 "03. 노드 정보"를 참조, 포트를 아래와 같이 설정합니다. 파이어월 설정에서 사용하는 존은 기본설정인 "Public Zone" 입니다. selinux 변경 값(비활성화)을 적용하기 위해서 OS를 재기동합니다.
[root@node1 ~]# firewall-cmd --get-active-zone
public
interfaces: enp0s8 enp0s9
[root@node1 ~]# firewall-cmd --permanent --zone=public --add-port=6800-7300/tcp
[root@node1 ~]# firewall-cmd --reload
[root@node1 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node1 ~]# reboot
(after reboot)
[root@node1 ~]# firewall-cmd --permanent --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 6800-7300/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@node2 ~]# firewall-cmd --get-active-zone
public
interfaces: enp0s8 enp0s9
[root@node2 ~]# firewall-cmd --permanent --zone=public --add-port=6800-7300/tcp
[root@node2 ~]# firewall-cmd --reload
[root@node2 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node2 ~]# reboot
(after reboot)
[root@node2 ~]# firewall-cmd --permanent --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 6800-7300/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@node3 ~]# firewall-cmd --get-active-zone
public
interfaces: enp0s8 enp0s9
[root@node3 ~]# firewall-cmd --permanent --zone=public --add-port=6800-7300/tcp
[root@node3 ~]# firewall-cmd --reload
[root@node3 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node3 ~]# reboot
(after reboot)
[root@node3 ~]# firewall-cmd --permanent --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 6800-7300/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@node4 ~]# firewall-cmd --get-active-zone
public
interfaces: enp0s8 enp0s9
[root@node4 ~]# firewall-cmd --permanent --zone=public --add-port=6800-7300/tcp
[root@node4 ~]# firewall-cmd --reload
[root@node4 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node4 ~]# reboot
(after reboot)
[root@node4 ~]# firewall-cmd --permanent --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 6800-7300/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@node5 ~]# firewall-cmd --get-active-zone
public
interfaces: enp0s8
[root@node5 ~]# firewall-cmd --permanent --zone=public --add-port=6800/tcp
[root@node5 ~]# firewall-cmd --reload
[root@node5 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node5 ~]# reboot
(after reboot)
[root@node5 ~]# firewall-cmd --permanent --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 6800/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@node6 ~]# firewall-cmd --get-active-zone
public
interfaces: enp0s8
[root@node6 ~]# firewall-cmd --permanent --zone=public --add-port=6789/tcp
[root@node6 ~]# firewall-cmd --permanent --zone=public --add-port=6800-7300/tcp
[root@node6 ~]# firewall-cmd --reload
[root@node6 ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config;
[root@node6 ~]# reboot
(after reboot)
[root@node6 ~]# firewall-cmd --permanent --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client ssh
ports: 6789/tcp 6800-7300/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
07. 환경설정 - 호스트 파일
아래와 같이 각 노드의 "/etc/hosts" 파일에 호스트 정보를 추가합니다.
[root@node1 ~]# echo -e "
192.168.57.111 node1
192.168.57.112 node2
192.168.57.113 node3
192.168.57.114 node4
192.168.57.115 node5
192.168.57.116 node6
192.168.57.117 node7" >> /etc/hosts
...
...
...
[root@node7 ~]# echo -e "
192.168.57.111 node1
192.168.57.112 node2
192.168.57.113 node3
192.168.57.114 node4
192.168.57.115 node5
192.168.57.116 node6
192.168.57.117 node7" >> /etc/hosts
CentOS 7은 서비스(데몬) 명이 ceph-mds@node1과 같은 형식으로 보여주므로, OS의 호스트네임과 "/etc/hosts" 파일의 호스트 정보를 동일하게 설정하는 것이 추후 서비스 제어에 혼동이 없습니다.
08. 환경설정 - Yum repository 추가
Admin와 Deploy 노드를 같은 서버로 사용하므로, 아래와 같이 "node7"에 "Yum repository" 정보를 추가합니다.
[root@node7 ~]# cat << EOM > /etc/yum.repos.d/ceph.repo
[ceph]
name=Ceph packages for $basearch
baseurl=https://download.ceph.com/rpm-luminous/el7/x86_64
enabled=1
priority=1
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-noarch]
name=Ceph noarch packages
baseurl=https://download.ceph.com/rpm-luminous/el7/noarch
enabled=1
priority=1
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
[ceph-source]
name=Ceph source packages
baseurl=https://download.ceph.com/rpm-luminous/el7/SRPMS
enabled=0
priority=1
gpgcheck=1
gpgkey=https://download.ceph.com/keys/release.asc
EOM
09. 환경설정 - Ceph Account 생성
아래와 같이 Ceph의 각 노드에 설치 패키지 배포와 원격설정의 지원에 사용할 계정(cephuser)을 생성합니다.
[root@node1 ~]# useradd -d /home/cephuser -m cephuser
[root@node1 ~]# passwd cephuser
Changing password for user cephuser.
New password: **********
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: **********
passwd: all authentication tokens updated successfully.
[root@node1 ~]# echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser
[root@node1 ~]# chmod 0440 /etc/sudoers.d/cephuser
...
...
...
[root@node7 ~]# useradd -d /home/cephuser -m cephuser
[root@node7 ~]# passwd cephuser
Changing password for user cephuser.
New password: **********
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: **********
passwd: all authentication tokens updated successfully.
[root@node7 ~]# echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser
[root@node7 ~]# chmod 0440 /etc/sudoers.d/cephuser
10. 환경설정 - ssh key 생성
"node7"에서 각 노드("node1~node6")로 터널링을 설정하기 위해 필요한 "ssh key"를 생성합니다.
[root@node7 ~]# su - cephuser
[cephuser@node7 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/cephuser/.ssh/id_rsa):
Created directory '/home/cephuser/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/cephuser/.ssh/id_rsa.
Your public key has been saved in /home/cephuser/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EuaR9T8v1d6AHQKetsn6iHzjUhBSiRIHuMzv/8L02w4 cephuser@node7
The key's randomart image is:
+---[RSA 2048]----+
| .oo.o... . |
|. ..o oo o o |
|o. . .=. = . . |
|.o o.o o + + o |
| . o.S + + + .|
| . . ... + o.|
| . o .E. . . o|
| . +.o=o . |
| ..=*=+. |
+----[SHA256]-----+
11. 환경설정 - SSH 접속 환경설정
아래와 같이 ssh 접속에 필요한 내용을 파일로 저장해 놓으면, ssh 접속을 좀 더 편리하게 사용할 수 있습니다. 디폴트 포트를 사용중이라면 아래 내용 중에서 "Port 22"를 삭제하여도 무방합니다.
[cephuser@node7 ~]$ cat << EOM > ~/.ssh/config
Host node1
Hostname node1
User cephuser
Port 22
Host node2
Hostname node2
User cephuser
Port 22
Host node3
Hostname node3
User cephuser
Port 22
Host node4
Hostname node4
User cephuser
Port 22
Host node5
Hostname node5
User cephuser
Port 22
Host node6
Hostname node6
User cephuser
Port 22
Host node7
Hostname node7
User cephuser
Port 22
EOM
[cephuser@node7 ~]$ chmod 0400 ~/.ssh/config
12. 환경설정 - ssh key 배포
[cephuser@node7 ~]$ for node in {node1,node2,node3,node4,node5,node6,node7}; do
> ssh-copy-id cephuser@$node;
> done
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/cephuser/.ssh/id_rsa.pub"
The authenticity of host 'node1 (192.168.57.111)' can't be established.
ECDSA key fingerprint is SHA256:yvfIoFrGc4CdhZN4umX1FwnkBLVH4Yrw/lSPS7WG/Io.
ECDSA key fingerprint is MD5:a6:81:4f:d5:87:fd:68:f3:19:f7:6e:54:be:f2:88:a6.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
cephuser@node1's password: **********
Number of key(s) added: 1
...
...
...
13. 환경설정 - CEPH Deploy 준비
"ceph-deploy"를 설치하고, 설치할 ceph 버전을 "mimic"에서 "luminous"로 변경해 줍니다. ("mimic"으로 설치할 경우 "08. 환경설정 - Yum repository 추가"에서 "luminous"를 "mimic"으로 변경해 주세요)
[cephuser@node7 ~]$ for node in {node1,node2,node3,node4,node5,node6,node7}; do
> ssh $node sudo yum -y update;
> done
[cephuser@node7 ~]$ sudo yum -y install ntp ntpdate ntp-doc python-setuptools
[cephuser@node7 ~]$ sudo yum -y install ceph-deploy
[cephuser@node7 ~]$ sudo sed -i "s/args.release = 'mimic'/args.release = 'luminous'/g" /usr/lib/python2.7/site-packages/ceph_deploy/install.py
[cephuser@node7 ~]$ sudo cat -n /usr/lib/python2.7/site-packages/ceph_deploy/install.py | grep "args.release = "
[cephuser@node7 ~]$ mkdir ceph-deploy; cd ceph-deploy
[cephuser@node7 ceph-deploy]$
14. 설치 - 초기 MON 노드 지정
[cephuser@node7 ceph-deploy]$ ceph-deploy new node6
15. 설치 - "public network"와 "cluster network"를 지정
[cephuser@node7 ceph-deploy]$ echo "public network = 192.168.57.0/24" >> ./ceph.conf
[cephuser@node7 ceph-deploy]$ echo "cluster network = 192.168.58.0/24" >> ./ceph.conf
16. 설치 - 각 노드에 ceph를 배포(설치)
[cephuser@node7 ceph-deploy]$ ceph-deploy install node1 node2 node3 node4 node5 node6 node7
17. 설치 - MON 노드 배치와 각종 키 설정
[cephuser@node7 ceph-deploy]$ ceph-deploy mon create-initial
18. 설치 - ceph.client.admin.keyring 배포
[cephuser@node7 ceph-deploy]$ ceph-deploy admin node1 node2 node3 node4 node5 node6 node7
19. 설치 - MGR 노드를 생성
[cephuser@node7 ceph-deploy]$ ceph-deploy mgr create node6
20. 설치 - OSD 노드에 OSD를 생성
스토리지 백엔드는 기본값인 "bluestore"로 설치됩니다.
[cephuser@node7 ceph-deploy]$ for node in {node1,node2,node3,node4}; do
> ceph-deploy osd create --data /dev/sdb $node;
> ceph-deploy osd create --data /dev/sdc $node;
> ceph-deploy osd create --data /dev/sdd $node;
> ceph-deploy osd create --data /dev/sde $node;
> ceph-deploy osd create --data /dev/sdf $node;
> done
위와 같이 OSD를 생성하면 Storage backend가 기본값인 Bluestore(기본값)로 설치됩니다.
21. 설치 - MDS 노드를 생성
[cephuser@node7 ceph-deploy]$ ceph-deploy mds create node5
22. 설치 - 클러스터 상태 확인
[cephuser@node7 ceph-deploy]$ sudo ceph -s
cluster:
id: 23ed16ce-2501-4714-a13f-73686b94d8e2
health: HEALTH_OK
services:
mon: 1 daemons, quorum node6
mgr: node6(active)
osd: 20 osds: 20 up, 20 in
data:
pools: 0 pools, 0 pgs
objects: 0 objects, 0B
usage: 20.2GiB used, 180GiB / 200GiB avail
pgs:
23. 설치 - Pool 생성
"cephfs_data"라는 이름의 실제 데이터가 저장되는 풀과 "ceph_metadata"라는 이름의 메타데이터가 저장되는 풀을 생성합니다. 다음으로 "333"이라는 숫자는 "pg_num"이며, 생성하는 풀에 "Placement Group"을 지정한 숫자만큼 할당하겠다는 의미입니다.
"333"이라는 숫자를 계산하는 방법은 아래와 같습니다. (전체적인 내용은 Ceph document를 참고합니다)
전체 PG = (OSD(HDD) 숫자) x 100 / 리플리케이션 레벨
(예제) OSD(HDD) : 20ea, Replication : 3
>> 20 x 100 / 3 = 666 (소수 값은 제외)
(위 예제는 OSD당 할당되는 PG수를 100전후로 설정하는 것을 목표로 합니다)
[cephuser@node7 ceph-deploy]$ sudo ceph osd pool create cephfs_data 333
pool 'cephfs_data' created
[cephuser@node7 ceph-deploy]$ sudo ceph osd pool create cephfs_metadata 333
pool 'cephfs_metadata' created
※ PG(Placement Group)에 대해서 알아보기
PG는 Ceph에서 중요한 개념이므로 간단히 설명하겠습니다. Ceph에 마운트한 Client(보통은 서버겠죠)에서 파일을 저장(업로드)하면, 파일은 오브젝트 단위로 쪼개져서 풀에 저장됩니다. 오브젝트가 풀에 저장되는 과정을 조금 자세히 들여다보면, 아래 그림과 같이 실제 데이터는 오브젝트 단위로 쪼개져서 각각의 OSD(HDD)에 할당된 PG에 저장되며, 이러한 이유로 Ceph에서는 PG 관리(생성 및 리웨이트)가 중요합니다.
24. 설치 - FS(Filesystem) 생성
[cephuser@node7 ceph-deploy]$ sudo ceph fs new cephfs cephfs_metadata cephfs_data
new fs with metadata pool 2 and data pool 1
25. 설치 - 클러스터와 생성된 FS 상태 확인, 각 OSD에 할당된 PG 숫자 확인
[cephuser@node7 ceph-deploy]$ sudo ceph -s
cluster:
id: 23ed16ce-2501-4714-a13f-73686b94d8e2
health: HEALTH_OK
services:
mon: 1 daemons, quorum node6
mgr: node6(active)
mds: cephfs-1/1/1 up {0=node5=up:active}
osd: 20 osds: 20 up, 20 in
data:
pools: 2 pools, 666 pgs
objects: 21 objects, 2.19KiB
usage: 20.2GiB used, 180GiB / 200GiB avail
pgs: 666 active+clean
[cephuser@node7 ceph-deploy]$ sudo ceph osd df
ID CLASS WEIGHT REWEIGHT SIZE USE AVAIL %USE VAR PGS
0 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 103
1 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 104
2 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 100
3 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 94
4 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 102
5 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 107
6 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 89
7 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 101
8 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 91
9 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 94
10 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 108
11 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 98
12 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 112
13 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 117
14 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 92
15 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 86
16 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 88
17 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 115
18 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 101
19 hdd 0.00980 1.00000 10.0GiB 1.01GiB 8.99GiB 10.11 1.00 96
TOTAL 200GiB 20.2GiB 180GiB 10.11
MIN/MAX VAR: 1.00/1.00 STDDEV: 0