Sap IT notes

Ceph. Инсталляция вручную.


 

ceph_logo

В этой статье я опишу последовательность установки компонентов Ceph Storage Cluster (версия Hummer, 0.94) на CentOS 7.

Во время установки я пользовался документацией с сайта http://ceph.com/docs/ и еще парочки блогов, ссылки на которых я приведу в конце статьи.

Хочу также отметить, что установка Ceph руками поможет дать большее представление о настройке и принципах работы и взаимодействия компонентов между собой, но вряд ли будет использоваться при небоходимости развернуть кластер продуктивных масштабов. Тем не менее, понимание процесса установки поможет автоматизировать процесс с помощью всевозможных chief, puppet или собственных скриптов, не смотря на то, что есть вполне рабочая утилита ceph-deploy.


1. Настройка и установка пакетов.

2. Создание и настройка кластера CEPH.

3. Добавление и настройка OSD.

4. Пишем данные.

Итак, двигаясь по манулалу выполняем следующие пункты.

1. Настройка и установка пакетов.

Устанавливаем release.asc:

rpm --import 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc'

 

Добавляем репозиторий ceph:


[ceph]
name=Ceph packages for $basearch
baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/$basearch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc


[ceph-noarch]
name=Ceph noarch packages
baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/noarch
enabled=1
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc


[ceph-source]
name=Ceph source packages
baseurl=http://ceph.com/rpm-{ceph-release}/{distro}/SRPMS
enabled=0
priority=2
gpgcheck=1
type=rpm-md
gpgkey=https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc

***Поправляем в каждом разделе, чтобы priority=2, вместо {ceph-release} подставляем hammer, а {distro} меняем на el7.

 

Ставим EPEL репозиторий для нашей версии CentOS:

wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
rpm -ivh epel-release-7-5.noarch.rpm

Ставим yum-plugin-priorities:

yum install -y yum-plugin-priorities

Установка дополнительных пакетов:

yum install snappy leveldb gdisk python-argparse gperftools-libs

И, наконец, устанавливаем пакеты ceph:

yum install ceph

***Ceph очень чувствителен ко времени, поэтому настоятельно рекомендуется настроить NTP на всех серверах системы.

На верх

 

2. Создание и настройка кластера CEPH.

Основой кластера ceph являются серверы mon (monitor), с которых мы и начнем.

Создадим набросок файла конфигурации /etc/ceph/ceph.conf:

Предварительно сгенерируем уникальный идентификатор для нашего кластера с помощью простой команды uuidgen, его потребуется указать в конфигурационном файле, параметр fsid:

[global]
fsid = 4ab708b9-1f1c-416b-b5f2-d47000e4b2b7
public network = 10.77.10.20/24
cluster_network = 10.1.1.0/24
auth cluster required = cephx
auth service required = cephx
auth client required = cephx
mon_osd.full_ratio = .90
mon_osd.nearfull_ratio = .80
osd journal size = 1024
osd pool default size = 3
osd pool default min size = 2
osd pool default pg num = 128
osd pool default pgp num = 128
mon initial members = ceph01,ceph02,ceph03

[mon]
mon host = ceph01
mon addr = 10.77.10.20

[osd]
journal_dio = true
journal_aio = true
journal_block_align = true

[osd.0]
host = ceph01
public_addr = 10.77.10.20
cluster_addr = 10.1.1.2

Создаем keyring, secret key и пользователя admin (пользуемся страницей руководства):

Создание keyring для monitor серверов:
ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *'

Создание пользователя admin и генерация ключа для него:
ceph-authtool --create-keyring /etc/ceph/ceph.client.admin.keyring --gen-key \
-n client.admin --set-uid=0 --cap mon 'allow *' --cap osd 'allow *' --cap mds 'allow'

Импорт контента ceph.client.admin.keyring в ceph.mon.keyring:
ceph-authtool /tmp/ceph.mon.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring

Если их нет, то добавить прав на чтение (chmod 644) для файлов ceph.conf и ceph.client.admin.keyring

Создаем карту для серверов мониторинга (monmap):

Команда:
monmaptool --create --add {hostname} {ip-address} --fsid {uuid} /tmp/monmap

где {hostname} – это короткое имя хоста (hostname -s), {ip-address} – IP адрес нашего мониторинг сервера, с которого начинается настройка и {uuid} – идетификатор кластера (fsid). Изменяем их в соответствие с нашими потребностями.

Пример:
monmaptool --create --add ceph01 10.77.10.20 --fsid 4ab708b9-1f1c-416b-b5f2-d47000e4b2b7 /tmp/monmap

Создаем директорию для данных сервера monitor:

Команда:
mkdir /var/lib/ceph/mon/{cluster-name}-{hostname}

где {cluster-name} имя нашего кластера (в нашем примере просто ceph), а про {hostname} написано выше.

Пример:
mkdir /var/lib/ceph/mon/ceph-ceph01

Создаем файловую систему для mon сервера в его папке:

Команда:
ceph-mon [--cluster {cluster-name}] --mkfs -i {hostname} --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

Наш пример (имя кластера не обязательный параметр):
ceph-mon -i ceph01 --mkfs --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring

Теперь стартуем mon сервер на нашем узле:
[root@ceph01 tmp]# service ceph start mon
=== mon.ceph01 ===
Starting Ceph mon.ceph01 on ceph01...
Running as unit run-25539.service.
Starting ceph-create-keys on ceph01...

Cpeh использует алгоритм Paxos для достижения консенсуса в кластере, таким образом, чтобы собрать кворум, количество узлов в кластере должно быть нечетным – 1, 3, 5 и т.д. В нашем случае будет 3 mon сервера.
Для добавления двух других mon серверов пользуемся статьей.
***Для начала поправим конфиг ceph.conf, добавив туда новый(е) мониторы, затем распространим его по всем серверам-мониторам.
Изменения:
[mon]
mon host = ceph01,ceph02,ceph03
mon addr = 10.77.10.20,10.77.10.21,10.77.10.22

[mon.ceph01]
host = ceph01
mon addr = 10.77.10.20

[mon.ceph02]
host = ceph02
mon addr = 10.77.10.21

[mon.ceph03]
host = ceph03
mon addr = 10.77.10.22

Выполним для оставшихся двух mon серверов следующие действия:

1) mkdir /var/lib/ceph/mon/ceph-{hostname} – создадим директорию для файлов monitor сервера
2) Скопируем с ранее установленного сервера mon (так называемый initial сервер – первый) его кейринг файл (в нашем примере /tmp/ceph.mon.keyring) и карту /tmp/monmap, несмотря на то, что там может быть всего лишь один монитор. Также текущую монитор-карту можно получить командой на уже установленном сервере: ceph mon getmap -o /path/to/output-file
3) Создаем файловую систему для новго монитора: ceph-mon -i {hostname} --mkfs --monmap /tmp/monmap --keyring /tmp/ceph.mon.keyring
4) Стартуем сервис mon: service ceph start mon
5) Добавляем новый монитор в кластер (в примере фигурирует сервер ceph02):
[root@ceph01 tmp]# ceph mon add ceph02 10.77.10.22:6789
added mon.ceph02 at 10.77.10.22:6789/0
***если попробовать добавить уже добавленный узел, то возникнет ошибка: Error EEXIST: mon.ceph02 at 10.77.10.22:6789/0 already exists

Итак, monitor кластер создан и если все успешно запустилось, то мы можем посмотреть его статус:
[root@ceph01 tmp]# ceph -s
cluster 928269ea-de0f-457d-9623-69acd5d8fd2c
health HEALTH_WARN
too many PGs per OSD (490 > max 300)
monmap e3: 3 mons at {ceph01=10.77.10.20:6789/0,ceph02=10.77.10.21:6789/0,ceph03=10.77.10.22:6789/0}
election epoch 80, quorum 0,1,2 ceph01,ceph02,ceph03

На верх

 

3. Добавление и настройка OSD.

Ceph OSD – object storage deamon. Его называют рабочей лошадкой кластера, именно OSD занимается записью данных на диск, репликацией, восстановлением и ребалансировкой кластера. Минимум необходимо 2 OSD, в случае, если мы планируем делать всего 2 копии данных (по умолчанию 3, но этот параметр настраивается) Как правило 1 OSD = 1 диск.

Предварительно нам необходимо выполнить следующее:
1) отформатировать под OSD диски (рекомендуется xfs);
2) создать директории под каждый OSD: /var/lib/ceph/osd/ceph-, например /var/lib/ceph/osd/ceph-0 (так для всех OSD на каждом OSD сервере);
3) поправить файл /etc/fstab – внести информацию по дискам для OSD и подмонтировать наши OSD.
Пример:

UUID=b20d7a97-74c1-4a01-8e28-00c7f6af7126 /var/lib/ceph/osd/ceph-0 xfs defaults 0 1
UUID=45f8b67d-2f2c-49c9-9d85-d3f6d229a445 /var/lib/ceph/osd/ceph-1 xfs defaults 0 1
UUID=91f0ca43-527f-4ea5-bcd3-e71370c8a460 /var/lib/ceph/osd/ceph-2 xfs defaults 0 1

Так же не забываем подредактировать файл ceph.conf и добавить туда наши OSD, если это еще не сделано, например для OSD 0 добавим секцию:

[osd.0]
host = ceph01
public_addr = 10.77.10.20
cluster_addr = 10.1.1.2

И так для всех OSD, которые планируются в нашем кластере. В текущем примере будет 9 OSD – по 3 на каждый сервер. Поскольку инсталляция не продуктивная мы совмещаем Mon серверы и OSD серверы.

Сгененрируем массив UUID для нужного количества OSD с помощью скриптика (по очереди на каждом сервере):


osduuids=();
for i in $(seq 0 2);
do
osduuids+=(`uuidgen`);
echo ${osduuids[i]};
done;

Создаем OSD с UUID, которые сгенерировали ранее (в нашем примере по 3 OSD на сервер, отсчет с нуля):


echo "OSD Creating...";
for i in $(seq 0 2);
do
ceph osd create ${osduuids[i]};
echo ${osduuids[i]};
done;

Номер ODS назначается автоматически при его создании, система автоматом назначает номера по порядку начиная с нуля.
***Указание UUID при создании OSD необязательно, если он не указан, то он генерируется автоматически, но когда я создавал OSD не указывая UID, я сталкивался с проблемами, в частности OSD не хотел стартовать. Не смотря на то, что я получал успешный ответ после старта OSD, фактически он оставался в статусе down.

Инициализаруем каталог данных OSD:


echo "OSD make FS...";
osdnum=0;
for i in $(seq 0 2);
do
echo "OSD_$osdnum refers to ${osduuids[${i}]}";
ceph-osd -i ${osdnum} --mkfs --mkkey --osd-uuid ${osduuids[${i}]};
((osdnum+=1));
done;

Переменная osdnum указывает на порядковый номер OSD, с которого начинается инициализация на конкретном сервере. Указанный пример для первого сервера, отсчет с 0. На втором сервера начнем с osdnum=3;. И т.д.

Регистрируем ключ аутентификации для OSD:


echo "OSD auth creating..."
osdnum=0;
for i in $(seq 0 2);
do
ceph auth add osd.${osdnum} osd 'allow *' mon 'allow profile osd' -i /var/lib/ceph/osd/ceph-${osdnum}/keyring;
((osdnum+=1));
done;

Не забываем про переменную osdnum.

Создание CRUSH карты.

Важным этапом является создание CRUSH карты. Именно CRUSH карта будет определять структуру вашего кластера и распределение копий по OSD.
Зачаток карты можно получить выгрузив бинарник:
ceph osd getcrushmap -o /tmp/crushmap
и преобразовав (декомпилировав) в текст:
crushtool -d /tmp/crushmap -o /tmp/de-crushmap, после чего можно редактировать с помощью обычного текстового редактора.
Отредактированный файл необходимо скомпилировать:
crushtool -c {decompiled-crush-map-filename} -o {compiled-crush-map-filename},
а затем его можно скормить кластеру:
ceph osd setcrushmap -i {compiled-crushmap-filename}.
Также мы можем редактировать CRUSH карту “на лету”.
Добавить хост в карту: ceph osd crush add-bucket ceph01 host;
Добавить хост в категорию root: ceph osd crush move ceph01 root=default;
Добавить в карту OSD к конкретному хосту: ceph osd crush add osd.0 0.02 host=ceph01.
Итоговую карту CRUSH для нашего примера можно посмотреть здесь.
А итоговый файл конфигурации клатера ceph.conf здесь.

Запуск OSD.

Команда ceph osd tree покажет нам дерево OSD:

[root@ceph01 ~]# ceph osd tree
ID WEIGHT TYPE NAME       UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 6.00000 root default
-2 2.00000     host ceph01
0 0.79999         osd.0      down  1.00000          1.00000
1 0.79999         osd.1      down  1.00000          1.00000

После того как все настроено и карта создана, мы можем запускать OSD:

[root@ceph01 ~]# service ceph start osd.0
=== osd.0 ===
create-or-move updated item name 'osd.0' weight 0.02 at location {host=ceph01,root=default} to crush map
Starting Ceph osd.0 on ceph01...
Running as unit run-21213.service.

Мы можем запустить все OSD на конкретном сервере командой:
service ceph start osd
При запуске OSD необходимо учитывать нашу CRUSH карту, PG (Placement Groups) не переходят в состояние active+clean(нормальное состояние кластера, в котором система готова писать данные) в том случае, когда запущено недостаточное количество OSD для создания заданного числа копий. В нашем случае данные защищаются тремя копиями, согласно нашей карте, система будет писать данные на OSD, находящиеся на разных хостах (мы сказали об этом системе, когда указали наши хосты в разделе root карты), таким образом, если у нас нет как минимум трех запущенных на трех разных хостах OSD, мы не получим нормального состояния кластера. В нашем случае мы можем запустить по одному OSD на каждом из серверов (всего, напомню, сервера у нас 3).
Вот так выглядит итоговое состояние кластера.

На верх

4. Пишем данные.

Скоро…

2 comments on “Ceph. Инсталляция вручную.

  1. Также, для функционирования Ceph, крайне желательна 10G сеть . В противном случае, вам не имеет смысла поднимать отдельный кэш-пул, так как скоростные характеристики вашей сети будут даже ниже, чем скорость записи на пул из одних только HDD.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

© 2015