반응형

01. 개요


Ceph에서 "Erasure Code"를 설정하는 방법에 대해서 설명합니다. 기본 설정인 "Replication 3"와 비교하면 데이터를 보호하는 방법이 다르며, 성능에서도 차이를 보입니다. "Erasure Code"를 선택하는 주요 이유는 용량이며, 설정여하에 따라서 "Replication 3" 대비 배이상의 용량을 확보할 수 있지만, OSD 노드 성능에 영향을 더 많이 받는 편입니다. 특히 "Cluster network"의 트래픽이 "Replication" 대비 많이 상승하므로 운용상 주의가 필요합니다.




02. 환경설정 - Erasure-Code에 사용될 Pool과 Profile


CephFS는 이전 글에서 생성한 Pool 정보를 그대로 활용하며, 앞으로 생성할 Erasure-Code의 Pool과 Profile은 아래 내용을 사용하겠습니다.


Erasure-Code Pool Name : cephfs_data_ec

Erasure-Code Profile Name : cephfs_profile_ec


CephFS Name : cephfs

CephFS Data Pool Name : cephfs_data

CephFS MetaData Pool Name : cephfs_metadata




03. 환경설정 - EC Profile 생성


[cephuser@node7 ~]$ sudo ceph osd erasure-code-profile set cephfs_profile_ec


[cephuser@node7 ~]$ sudo ceph osd erasure-code-profile ls

cephfs_profile_ec

default


[cephuser@node7 ~]$ sudo ceph osd erasure-code-profile get cephfs_profile_ec

crush-device-class=

crush-failure-domain=host

crush-root=default

jerasure-per-chunk-alignment=false

k=2

m=1

plugin=jerasure

technique=reed_sol_van

w=8




04. 환경설정 - EC Profile 수정


"Erasure-Code" 풀을 생성하기 전에 프로파일의 세부사항을 수정합니다. OSD 노드 4대에서 1대가 고장나도, 나머지 3대의 OSD 노드로 서비스가 지속되도록 구성하고자 합니다. 장애 단위는 OSD 노드 이므로 "crush-failure-domain"을 "host"로 설정하며, 장애 보상을 위해 "k=3 / m=1"로 설정합니다. 


[cephuser@node7 ~]$ sudo ceph osd erasure-code-profile set cephfs_profile_ec k=3 m=1 --force


[cephuser@node7 ~]$ sudo ceph osd erasure-code-profile get cephfs_profile_ec

crush-device-class=

crush-failure-domain=host

crush-root=default

jerasure-per-chunk-alignment=false

k=3

m=1

plugin=jerasure

technique=reed_sol_van

w=8




05. 설치 - EC Pool 생성 및 오버라이트 설정


[cephuser@node7 ~]$ sudo ceph osd pool create cephfs_data_ec 20 20 erasure cephfs_profile_ec

pool 'cephfs_data_ec' created


[cephuser@node7 ~]$ sudo ceph osd pool set cephfs_data_ec allow_ec_overwrites true

set pool x allow_ec_overwrites to true


[cephuser@node7 ~]$ sudo ceph osd pool ls

cephfs_data

cephfs_metadata

cephfs_data_ec




06. 설치 - EC Pool 추가 


[cephuser@node7 ~]$ sudo ceph osd pool application enable cephfs_data_ec cephfs

enabled application 'cephfs' on pool 'cephfs_data'


[cephuser@node7 ~]$ sudo ceph fs add_data_pool cephfs cephfs_data_ec

added data pool 5 to fsmap


[cephuser@node7 ~]$ sudo ceph fs ls

name: cephfs, metadata pool:cephfs_metadata, data pools:[cephfs_data cephfs_data_ec]


[cephuser@node7 ~]$ sudo mount -t ceph node6:/ /mnt/ceph -o name=admin,secret=AQCN1iVcZnf7NxAAZc7ftTBB4KEwPaMLn7yfLw==


[cephuser@node7 ~]$ mkdir /mnt/ceph/EC


[cephuser@node7 ~]$ sudo yum -y install attr


[cephuser@node7 ~]$ sudo setfattr -n ceph.dir.layout -v pool=cephfs_data_ec /mnt/ceph/EC


[cephuser@node7 ~]$ df -h

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   18G  1.7G   16G  10% /

devtmpfs                 989M     0  989M   0% /dev

tmpfs                   1000M     0 1000M   0% /dev/shm

tmpfs                   1000M  8.5M  992M   1% /run

tmpfs                   1000M     0 1000M   0% /sys/fs/cgroup

/dev/sda1                497M  198M  299M  40% /boot

tmpfs                    200M     0  200M   0% /run/user/0

192.168.57.116:/         200G   21G  180G  11% /mnt/ceph




07. 설치 - EC Pool에 오브젝트 및 실제 파일 저장 테스트


오브젝트를 임의로 생성하여 "EC Pool"에 저장해 보면, 앞서 프로파일에서 설정한 것과 같이 OSD 노드 4대에 분산 저장되는 것을 볼 수 있습니다. 


[cephuser@node7 ~]$ echo "EC Test" > testfile


[cephuser@node7 ~]$ sudo rados -p cephfs_data_ec put object.1 testfile


[cephuser@node7 ~]$ sudo rados -p cephfs_data_ec ls

object.1


[cephuser@node7 ~]$ ceph osd map cephfs_data_ec object.1

osdmap e130 pool 'cephfs_data_ec' (3) object 'object.1' -> pg 3.f560f2ec (3.c) -> up ([5,3,17,12], p5) acting ([5,3,17,12], p5)


[cephuser@node7 ~]$ ceph osd tree

ID CLASS WEIGHT  TYPE NAME      STATUS REWEIGHT PRI-AFF

-1       0.19592 root default

-3       0.04898     host node1

 0   hdd 0.00980         osd.0      up  1.00000 1.00000

 1   hdd 0.00980         osd.1      up  1.00000 1.00000

 2   hdd 0.00980         osd.2      up  1.00000 1.00000

 3   hdd 0.00980         osd.3      up  1.00000 1.00000

 4   hdd 0.00980         osd.4      up  1.00000 1.00000

-5       0.04898     host node2

 5   hdd 0.00980         osd.5      up  1.00000 1.00000

 6   hdd 0.00980         osd.6      up  1.00000 1.00000

 7   hdd 0.00980         osd.7      up  1.00000 1.00000

 8   hdd 0.00980         osd.8      up  1.00000 1.00000

 9   hdd 0.00980         osd.9      up  1.00000 1.00000

-7       0.04898     host node3

10   hdd 0.00980         osd.10     up  1.00000 1.00000

11   hdd 0.00980         osd.11     up  1.00000 1.00000

12   hdd 0.00980         osd.12     up  1.00000 1.00000

13   hdd 0.00980         osd.13     up  1.00000 1.00000

14   hdd 0.00980         osd.14     up  1.00000 1.00000

-9       0.04898     host node4

15   hdd 0.00980         osd.15     up  1.00000 1.00000

16   hdd 0.00980         osd.16     up  1.00000 1.00000

17   hdd 0.00980         osd.17     up  1.00000 1.00000

18   hdd 0.00980         osd.18     up  1.00000 1.00000

19   hdd 0.00980         osd.19     up  1.00000 1.00000


[cephuser@node7 ~]$ sudo rados df

POOL_NAME       USED    OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD    WR_OPS WR

cephfs_data          0B       0      0      0                  0       0        0      0    0B      0    0B

cephfs_data_ec       8B       1      0      4                  0       0        0      0    0B      1  1KiB

cephfs_metadata 16.4KiB      21      0     63                  0       0        0     74 85KiB     78 50KiB


total_objects    22

total_used       20.3GiB

total_avail      180GiB

total_space      200GiB


[cephuser@node7 ~]$ cd /mnt/ceph/EC


[cephuser@node7 EC]$ echo "abcdefghijk" > test.txt && ls -al

total 1

drwxrwxr-x 1 cephuser cephuser  1 Jan  9 10:50 .

drwxr-xr-x 1 cephuser cephuser  1 Jan  9 10:48 ..

-rw-rw-r-- 1 cephuser cephuser 12 Jan  9 10:50 test.txt


[cephuser@node7 EC]$ sudo rados df

POOL_NAME       USED    OBJECTS CLONES COPIES MISSING_ON_PRIMARY UNFOUND DEGRADED RD_OPS RD    WR_OPS WR

cephfs_data          0B       0      0      0                  0       0        0      0    0B      0    0B

cephfs_data_ec       8B       2      0      8                  0       0        0      0    0B      1  1KiB

cephfs_metadata 29.1KiB      22      0     66                  0       0        0     75 86KiB     85 68KiB


total_objects    24

total_used       20.3GiB

total_avail      180GiB

total_space      200GiB


읽어 주셔서 감사합니다.

반응형

'Storage > CEPH' 카테고리의 다른 글

CEPH - 설치1 (Filesystem)  (1) 2018.10.29
반응형

01. 개요


Ceph로 "Block Storage"와 "Filesystem", "Object Storage" 등을 구성하는 방법에 대해서 설명합니다.




02. 노드 구성


Ceph는 주요 노드인 "MDS(Metadata Server)", "MON(Monitor)", "OSD(Object Storage Daemon)"과 Dashboard를 제공하는 "MGR(Manager)" 노드로 구성됩니다. 추가로 관리 및 배포를 담당하는 Admin(or Deploy) 노드를 별도 구성할 수 있습니다. "MGR" 노드를 별도 구성할 필요가 없다면 "MON" 노드와 같은 서버에 구성할 수 있습니다만, "MGR" 노드를 별도 구성하고 Cacti와 같은 NMS 툴을 같이 운용하면 "MGR" 노드의 Dashboard가 제공하는 부족한 부분을 보완할 수도 있습니다.




03. 구성 노드를 표현한 간단한 다이어그램


아래 그림은 "Ceph document"에 공개되어 있는 자료에 약간의 내용을 첨가하였습니다. 주요한 내용은 "Block Storage"와 "Filesystem", "Object Storage"에 사용되는 클라이언트와 "MDS/MON/OSD" 노드간의 관계입니다.





04. 설치 환경


SRV : VM (VirtualBox)

OS : CentOS 7

CEPH : Luminous 12.2.10

Node : MDS(1ea), MGR+MON(1ea), OSD(4ea), Admin(1ea)




05. 노드 정보


 Node

 Port

 Hostname

 Public network

 Cluster network

 Descriptions

 OSD

 6800:7300

 node1

 192.168.57.111 

 192.168.58.111

 OSD x 4ea

 node2

 192.168.57.112

 192.168.58.112

 OSD x 4ea

 node3

 192.168.57.113

 192.168.58.113

 OSD x 4ea

 node4

 192.168.57.114

 192.168.58.114

 OSD x 4ea

 MDS 6800

 node5

 192.168.57.115

 - -

 MON

 MGR

 6789
 6800:7300

 node6

 192.168.57.116

 - -

 Admin

 Client

 -

 -

 node7

 192.168.57.117

 -

 Admin and Deploy

데이터의 읽기/쓰기/수정 등의 작업으로 "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




26. 마운트


"node7"에서 생성한 FS를 마운트해 보겠습니다. FS를 마운트하기위해서는 패키지(ceph-common)가 설치되어 있어야 하며, 앞선 설치 과정에서 "node7"에도 해당 패키지를 설치하였으므로, 바로 마운트 테스트를 해보겠습니다.


마운트하기 전에 현재 마운트 상태와 해당 패키지가 설치되어 있는지 확인합니다.


[cephuser@node7 ceph-deploy]$ df -h

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   18G  1.7G   16G  10% /

devtmpfs                 989M     0  989M   0% /dev

tmpfs                   1000M     0 1000M   0% /dev/shm

tmpfs                   1000M  8.5M  992M   1% /run

tmpfs                   1000M     0 1000M   0% /sys/fs/cgroup

/dev/sda1                497M  198M  299M  40% /boot

tmpfs                    200M     0  200M   0% /run/user/0


[cephuser@node7 ceph-deploy]$ rpm -qa | grep ceph-common

ceph-common-12.2.10-0.el7.x86_64


마운트할 폴더를 생성합니다.


[cephuser@node7 ceph-deploy]$ sudo mkdir /mnt/ceph


마운트에 필요한 보안키 정보를 확인합니다.


[cephuser@node7 ceph-deploy]$ cat ceph.client.admin.keyring

[client.admin]

        key = AQCN1iVcZnf7NxAAZc7ftTBB4KEwPaMLn7yfLw==


이어서 마운트합니다.


[cephuser@node7 ceph-deploy]$ sudo mount -t ceph node6:/ /mnt/ceph -o name=admin,secret=AQCN1iVcZnf7NxAAZc7ftTBB4KEwPaMLn7yfLw==


[cephuser@node7 ceph-deploy]$ df -h

Filesystem               Size  Used Avail Use% Mounted on

/dev/mapper/centos-root   18G  1.7G   16G  10% /

devtmpfs                 989M     0  989M   0% /dev

tmpfs                   1000M     0 1000M   0% /dev/shm

tmpfs                   1000M  8.5M  992M   1% /run

tmpfs                   1000M     0 1000M   0% /sys/fs/cgroup

/dev/sda1                497M  198M  299M  40% /boot

tmpfs                    200M     0  200M   0% /run/user/0

192.168.57.116:/          57G     0   57G   0% /mnt/ceph


마운트된 폴더의 퍼미션을 조정후, 마운트된 폴더로 이동하여 실제 폴더와 파일을 생성해 봅니다.


[cephuser@node7 ceph-deploy]$ sudo chown cephuser.cephuser /mnt/ceph


[cephuser@node7 ceph-deploy]$ ls -al /mnt

total 4

drwxr-xr-x.  3 root     root       17 Jan  8 10:31 .

dr-xr-xr-x. 17 root     root     4096 Jul 19 09:02 ..

drwxr-xr-x   1 cephuser cephuser    0 Dec 28 16:59 ceph


[cephuser@node7 ceph-deploy]$ cd /mnt/ceph


[cephuser@node7 ceph]$ mkdir test

[cephuser@node7 ceph]$ touch test.txt


[cephuser@node7 ceph]$ ls -al

total 0

drwxr-xr-x  1 cephuser cephuser  2 Jan  8 10:41 .

drwxr-xr-x. 3 root     root     17 Jan  8 10:31 ..

drwxrwxr-x  1 cephuser cephuser  0 Jan  8 10:37 test

-rw-rw-r--  1 cephuser cephuser  0 Jan  8 10:41 test.txt


부팅이후에도 자동으로 마운트하려면, 현장상황에 맞추어 "/etc/fstab" 마운트 설정을 추가합니다. 


[cephuser@node7 ceph]$ cat /etc/fstab


#

# /etc/fstab

# Created by anaconda on Wed Jul 18 16:14:20 2018

#

# Accessible filesystems, by reference, are maintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

#

/dev/mapper/centos-root                         /               xfs     defaults 0 0

UUID=a974c27c-1544-4de0-bb0b-75feddc30301       /boot           xfs     defaults 0 0

/dev/mapper/centos-swap                         swap            swap    defaults 0 0

node6:/                                         /mnt/ceph       ceph    name=admin,secret=AQCN1iVcZnf7NxAAZc7ftTBB4KEwPaMLn7yfLw==,noatime,_netdev 0 2


테스트에서는 MON 노드를 1대만 설정하였습니다만 현장에서는 서비스 안정성을 고려하여 3/5/7 순으로, MDS도 다중으로 운용합니다.


읽어 주셔서 감사합니다.

반응형

'Storage > CEPH' 카테고리의 다른 글

CEPH - 설치2 (Filesystem, Erasure Code)  (0) 2018.11.19

+ Recent posts