Настройка дискового кластера Ceph

Thank you for reading this post, don't forget to subscribe!

Ceph —

рас­пре­де­лен­ное кла­стер­ное хра­ни­ли­ще дан­ных. Соби­ра­ет­ся из несколь­ких сер­ве­ров; обла­да­ет таки­ми пре­иму­ще­ства­ми, как мас­шта­би­ру­е­мость, отка­зо­устой­чи­вость, высо­кая ско­рость, бес­плат­ность, тон­кая настрой­ка, под­держ­ка раз­лич­но­го обо­ру­до­ва­ния и опе­ра­ци­он­ных систем. Будет полез­на в слу­ча­ях, когда нуж­но собрать боль­шой, недо­ро­гой и лишен­ный узких мест дис­ко­вый мас­сив. Явля­ет­ся достой­ной аль­тер­на­ти­вой систе­мам хра­не­ния данных.

Ceph раз­ра­бо­тан для систем на базе Linux и BSD. Уста­нов­ку мож­но выпол­нить из допол­ни­тель­но­го репо­зи­то­рия или собрав из исход­ни­ка, кото­рый мож­но ска­чать на офи­ци­аль­ном сай­те.

Дру­гая похо­жая реа­ли­за­ция рас­пре­де­лен­ной фай­ло­вой систе­мы — GlusterFS. В отли­чие от Ceph, рабо­та­ет поверх фай­ло­вых систем (extX, XFS, reiserfs, …), исполь­зуя тех­но­ло­гию FUSE. GlusterFS не раз­ма­зы­ва­ет фай­лы по сер­ве­рам, хра­ня их целиком.

 

____________________

Подготовка системы

Обновление пакетов

Обно­вим уста­нов­лен­ные паке­ты на сер­ве­ре сле­ду­ю­щей командой:

yum update

Синхронизация времени

Для кор­рект­ной рабо­ты Ceph тре­бу­ет­ся, что­бы на нодах кла­сте­ра было оди­на­ко­вое вре­мя, поэто­му на всех сер­ве­рах настра­и­ва­ем син­хро­ни­за­цию последнего.

Для это­го сна­ча­ла уста­но­вим ntp сле­ду­ю­щей командой:

yum install ntp

После зада­ем вре­мен­ную зону:

cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime

* в дан­ном при­ме­ре мос­ков­ское время.

Теперь откры­ва­ем на редак­ти­ро­ва­ние cron:

crontab -e

И добав­ля­ем сле­ду­ю­щую строку:

0 0 * * * /sbin/ntpdate ru.pool.ntp.org

* в дан­ной настрой­ке cron каж­дую ночь в 00:00 будет выпол­нять­ся син­хро­ни­за­ция вре­ме­ни с сер­ве­ром ru.pool.ntp.org

Что­бы не ждать ночи, разо­во акту­а­ли­зи­ру­ем время:

ntpdate ru.pool.ntp.org

Что­бы вре­мя не сби­ва­лось после пере­за­груз­ки, настро­им аппа­рат­ное время:

hwclock --systohc

Отключение SELinux

Реко­мен­ду­ет­ся отклю­чить допол­ни­тель­ную систе­му без­опас­но­сти SELinux.

Настройка брандмауэра

Для кор­рект­ной рабо­ты мони­то­ра Ceph тре­бу­ет­ся открыть порт 6789. Это дела­ет­ся сле­ду­ю­щей командой:

Так­же, для сер­ве­ров хра­не­ния откры­ва­ем пор­ты 6800-7100:

* в нашем при­ме­ре мони­то­ры ceph и хра­ни­ли­ща будут уста­нав­ли­вать­ся на одни и те же сер­ве­ра, поэто­му выше­опи­сан­ные коман­ды вво­дим на всех нодах.

 

Создание пользователей

На всех сер­ве­рах кла­сте­ра созда­ем поль­зо­ва­те­ля сле­ду­ю­щей командой:

useradd ceph -m

И зада­ем ему пароль (жела­тель­но, сложный):

passwd ceph

У создан­ной учет­ной запи­си долж­ны быть при­ви­ле­гии супер­поль­зо­ва­те­ля. Для это­го созда­ем сле­ду­ю­щий файл:

vi /etc/sudoers.d/ceph

И добав­ля­ем в него следующее:

ceph ALL = (root) NOPASSWD:ALL
Defaults:ceph !requiretty

* в дан­ном при­ме­ре учет­ной запи­си ceph предо­став­ле­ны пра­ва супер­поль­зо­ва­те­ля без необ­хо­ди­мо­сти повтор­но­го вво­да пароля.

Зада­ем сле­ду­ю­щие пра­ва на создан­ный файл:

chmod 0440 /etc/sudoers.d/ceph

Настройка распознования имен

Если мы рабо­та­ем в сре­де без DNS, узлы кла­сте­ра не смо­гут обра­щать­ся друг к дру­гу по име­ни, поэто­му необ­хо­ди­мо открыть на редак­ти­ро­ва­ние сле­ду­ю­щий файл:

vi /etc/hosts

и доба­вить сле­ду­ю­щие строки:

192.168.0.10 server1
192.168.0.11 server2
192.168.0.12 server3

* где 192.168.0.10 (11, 12) — IP-адре­са сер­ве­ров в моей тесто­вой сре­де; server1, 2, 3 — име­на этих серверов.

Установка Ceph

Под­клю­ча­ем­ся к сер­ве­ру CentOS 7, с кото­ро­го будем уста­нав­ли­вать Ceph. Это может быть одна из нод кла­сте­ра или отдель­ный ком­пью­тер. Все после­ду­ю­щие коман­ды выпол­ня­ем с него.

Установка Ceph-deploy

Рас­про­стра­не­ние Ceph на все узлы кла­сте­ра про­ис­хо­дит при помо­щи Ceph-deploy. Что­бы его уста­но­вить, созда­ем сле­ду­ю­щий файл:

vi /etc/yum.repos.d/ceph.repo

и добав­ля­ем в него следующее:

[ceph-noarch]
name=Ceph noarch packages
baseurl=http://download.ceph.com/rpm-hammer/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc

* где Hammer — LTS вер­сия ceph; el7 — релиз CentOS 7. Эти зна­че­ния нуж­но заме­нить на дру­гие, если исполь­зу­е­мые вер­сии отли­ча­ют­ся. Релиз Linux CentOS мож­но посмот­реть коман­дой uname -r, а акту­аль­ную вер­сию Ceph по ссыл­ке http://docs.ceph.com/docs/jewel/releases/

Обнов­ля­ем спи­сок пакетов:

yum update

Теперь мож­но уста­но­вить ceph-admin сле­ду­ю­щей командой:

yum install ceph-deploy

Что­бы зара­нее обой­ти ошиб­ку «[ceph_deploy][ERROR ] RuntimeError: NoSectionError: No section: 'ceph'», пере­име­но­вы­ва­ем наш репо­зи­то­рий ceph:

mv /etc/yum.repos.d/ceph.repo /etc/yum.repos.d/ceph-deploy.repo

 

Настройка беспарольного подключения по SSH

Захо­дим в систе­му под учет­ной запи­сью ceph:

su - ceph

Гене­ри­ру­ем ключ сле­ду­ю­щей командой:

ssh-keygen

* систе­ма задаст несколь­ко вопро­сов отно­си­тель­но рас­по­ло­же­ния клю­ча — остав­ля­ем зна­че­ния по умол­ча­нию, нажи­мая Enter.

и рас­про­стра­ня­ем его на участ­ни­ков кластера:

ssh-copy-id ceph@server1

ssh-copy-id ceph@server2

ssh-copy-id ceph@server3

* где ceph — создан­ная ранее на всех узлах учет­ная запись; server1, 2, 3 — име­на сер­ве­ров в моей тесто­вой среде.
** после вво­да каж­дой коман­ды систе­ма запро­сит раз­ре­ше­ние при­нять сер­ти­фи­кат — отве­ча­ем yes. Так­же будет запро­шен пароль от ранее создан­ной запи­си ceph.

 

Установка Ceph и создание кластера на всех нодах

Созда­ем рабо­чий ката­лог сле­ду­ю­щей командой:

mkdir ceph-admin

и пере­хо­дим в него:

cd ceph-admin

Все после­ду­ю­щие коман­ды по управ­ле­нию кла­сте­ром сто­ит выпол­нять, нахо­дясь в нем.

Созда­ем новый кластер:

ceph-deploy new server1 server2 server3

* напом­ню, что server1,2,3 — назва­ния сер­ве­ров в моей тесто­вой среде.

Уста­нав­ли­ва­ем Ceph на все узлы кластера:

ceph-deploy install server1 server2 server3

Так как ceph-deploy не все­гда уста­нав­ли­ва­ет све­жую вер­сию ceph, обно­вим каж­дую ноду:

ssh ceph@server1 'sudo yum update -y'

ssh ceph@server2 'sudo yum update -y'

ssh ceph@server3 'sudo yum update -y'

 

Настройка кластера Ceph

Создание и запуск мониторов

Выпол­ним началь­ную настрой­ку сер­ве­ра мони­то­ра Ceph:

ceph-deploy mon create-initial

Подготовка дисков

Дис­ки, доступ­ные на сер­ве­ре мож­но посмот­реть сле­ду­ю­щей командой:

ceph-deploy disk list server1

Гото­вим дис­ки для исполь­зо­ва­ния их систе­мой Ceph:

ceph-deploy osd prepare server1:sdb server1:sdc server2:sdb server2:sdc server3:sdb server3:sdc

* в дан­ном при­ме­ре на каж­дом из сер­ве­ров есть по два дис­ка — sdb и sdc. Их мы и задей­стве­ум в каче­стве Ceph-хранилища.

И акти­ви­ру­ем их:

ceph-deploy osd activate server1:sdb1 server1:sdc1 server2:sdb1 server2:sdc1 server3:sdb1 server3:sdc1

* обра­ти­те вни­ма­ние, что при акти­ва­ции мы уже добав­ля­ем 1 к дис­кам, так как в про­цес­се под­го­тов­ки систе­ма созда­ет два раз­де­ла — 1 для дан­ных, 2 для журнала.

Проверка работоспособности

Для нача­ла раз­ре­шим чте­ние фай­ла ceph.client.admin.keyring:

sudo chmod +r /etc/ceph/ceph.client.admin.keyring

Смот­рим состо­я­ние дис­ков OSD:

ceph osd tree

Состо­я­ние дис­ков долж­но быть up, например:

ID WEIGHT  TYPE NAME        UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.01999 root default
-2 0.01999     host server1
0 0.00999         osd.0         up  1.00000          1.00000
1 0.00999         osd.1         up  1.00000          1.00000

 

Смот­рим состо­я­ние кластера:

ceph -s

Систе­ма долж­на пока­зать, при­мер­но следующее:

    cluster e67ce522-eb15-481e-8d8a-9448b5e31e04
health HEALTH_OK

Очень часто отоб­ра­жа­ет­ся пре­ду­пре­жде­ние clock skew detected. Это озна­ча­ет, что не на всех сер­ве­рах син­хро­ни­зи­ро­ва­но вре­мя. На всех сер­ве­рах выпол­ни­те команду

ntpdate ru.pool.ntp.org

и подо­жди­те око­ло 15 минут.