
Часто в практике используется NFS в качестве сетевого хранения данных. Это удобно иметь единтичные данные смотнтированные между несколькими серверами, до тех пор пока не начнут появляться требования к хранилищу с несколькими точками входа и в случаи падения ноды не терять возможность писать и читать данные. В данном материале рассмотрим установку и настройку CEPH на ubuntu, часть материала будет взята из официальной документации, но выдана в более копи-паст виде, т.к. многие банальные вещи в ней упушенны или описаны в виде «сделай сам».
Начнем со схемы. Схема будет бюджетная: 1 админ нода (ceph-deploy) — с которого идет управление всеми серверами и подключаемыми клиентами, 3 сервера с данными, на которых мы разместим: mon (мониторы), osd (блочное устройство для хранения данных), mds — хэш суммы. Каждый из трех серверов имеет системный диск (или raid не имеет значения), а также два примонтированных диска по 500 Gb дополнительно. И в качесте дополнения подключим к этой схеме 2 клиентских сервера, которые должны будут обращаться к единому каталогу.
Добавим репозиторий ceph на админ ноду и установим пакет ceph-deploy
| 
					 1 2 3  | 
						wget -q -O- 'https://download.ceph.com/keys/release.asc' | sudo apt-key add - echo deb https://download.ceph.com/debian/ $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/ceph.list  | 
					
Обновим пакеты, систему и установим ceph-deploy
| 
					 1 2 3  | 
						sudo apt update sudo apt upgrade sudo apt install ceph-deploy  | 
					
Парралельно приступаем к подготовке серверов с данными иклиентским серверов.
На 3-х наших нодах выполняем:
| 
					 1 2 3  | 
						sudo apt update sudo apt upgrade sudo apt install ntp python  | 
					
На всех севрерах нужен ssh, не забываем проверить его наличие или установить его
| 
					 1  | 
						sudo apt install openssh-server  | 
					
Задаем севрерам хостнеймы, в дальнейшем мы их будем использовать при управление ими с помощью ceph-deploy
| 
					 1  | 
						hostnamectl set-hostname ceph-admin  | 
					
Выполним reboot
| 
					 1  | 
						reboot  | 
					
Предпочитаю сделать собственный файл /etc/hosts у меня он имеет следующий вид:
| 
					 1 2 3 4 5 6  | 
						172.31.31.121 ceph-admin 172.31.37.222 ceph1 172.31.38.230 ceph2 172.31.38.138 ceph3 172.31.46.18  client1 172.31.39.27  client2  | 
					
Создаем польователя cephuser на всех серверах для доступа по ключам с админ ноды.
!!! Важно !!! Можно создавать пользователя с любым именем кроме имени ceph — это зарезервированное имя.
| 
					 1  | 
						useradd -d /home/cephuser -m cephuser  | 
					
Добавим пользователя в sudo без пароля
| 
					 1 2  | 
						echo "cephuser ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/cephuser sudo chmod 0440 /etc/sudoers.d/cephuser  | 
					
Сгенерируем ssh ключи на admin ноде для пользователя cephuser
| 
					 1 2  | 
						su - cephuser ssh-keygen  | 
					
Разольем ключ любым удобным способом. Я банальным копирование из файла (cat ./.ssh/id_rsa.pub) по причине отсутсвия аутентификации по паролю. Заходим на каждую ноду и выполняем
| 
					 1 2 3 4  | 
						su - cephuser mkdir .ssh nano .ssh/authorized_keys chmod 700 ~/.ssh && chmod 600 ~/.ssh/*  | 
					
Убедимся что firewall разрешено принимать соединения по порту 6789 и диапазону 6800:7300
| 
					 1 2 3  | 
						sudo iptables -A INPUT -i {iface} -p tcp -s {ip-address}/{netmask} --dport 6789 -j ACCEPT sudo iptables -A INPUT -i {iface} -m state --state NEW -m tcp -p tcp --dport 6800:7300 -j ACCEPT /sbin/service iptables save  | 
					
Возвращаемся на admin ноду и под пользователем cephuser продолжаем настройку
Создаем каталог, где будут храниться ключи и файлы конфигурации:
| 
					 1 2  | 
						mkdir my-cluster cd my-cluster  | 
					
Создание кластера
Инициализируем мониторы
| 
					 1  | 
						ceph-deploy new ceph1 ceph2 ceph3  | 
					

У нас создался файл ceph.conf в котором видны наши будующие ceph ноды:
| 
					 1  | 
						cat ceph.conf  | 
					
| 
					 1 2 3 4 5 6 7  | 
						[global] fsid = 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440 mon_initial_members = ceph1, ceph2, ceph3 mon_host = 172.31.37.222,172.31.38.230,172.31.38.138 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx  | 
					
Произведем установку необходимых CEPH пакетов на ceph ноды
| 
					 1  | 
						ceph-deploy install ceph1 ceph2 ceph3  | 
					
В результате в консоле мы увидим установку пакетов и зависимостей на наши будующие ноды, в завершении вывод будет выглядет следующим образом
_
Мы установлили версию 10.2.10.
Произведем деплой наших мониторов и разольем ключи
| 
					 1  | 
						ceph-deploy mon create-initial  | 
					

| 
					 1  | 
						ceph-deploy admin ceph1 ceph2 ceph3  | 
					

Присупим к подклчению наших устройст в кластер
На каждой ноде мыимеем примерно следующие устройства, на примере ceph1
| 
					 1 2 3 4 5  | 
						ceph1:~$ ls -la /dev/xvd* brw-rw---- 1 root disk 202,  0 Jan  4 14:38 /dev/xvda brw-rw---- 1 root disk 202,  1 Jan  4 14:38 /dev/xvda1 brw-rw---- 1 root disk 202, 80 Jan  4 14:38 /dev/xvdf brw-rw---- 1 root disk 202, 96 Jan  4 14:38 /dev/xvdg  | 
					
Наши диски по 500Gb вданом примере /dev/xvdf /dev/xvdg
Пройдем по всем нодам, и далее выполним команду c admin севрер, в которой перечислим все наши сервера и их будующие osd
| 
					 1  | 
						ceph-deploy osd create ceph1:/dev/xvdf ceph1:/dev/xvdg ceph2:/dev/xvdf ceph2:/dev/xvdg ceph3:/dev/xvdf ceph3:/dev/xvdg  | 
					
Успешное выполнение

С admin сервера мы можем проверить состояние нашего кластера, выполнив команду
| 
					 1  | 
						ssh ceph1 sudo ceph -s  | 
					
HEALTH_OK — нормальное состояние кластера

Для использования CephFS, который намнеобходим, нам необходимо создать также метаданные — mds
| 
					 1  | 
						ceph-deploy mds create ceph1 ceph2 ceph3  | 
					
Создание файловой системы — CEPH FS
Выполняеться на любом из 3-х наших серверов с данными
| 
					 1 2  | 
						cephuser@ceph1:~$ sudo ceph osd pool create cephfs_data 128 pool 'cephfs_data' created  | 
					
| 
					 1 2  | 
						cephuser@ceph1:~$ sudo ceph osd pool create cephfs_metadata 128 pool 'cephfs_metadata' created  | 
					
Создаем нашу FS и присваем ей произвольное имя:
ceph fs new <fs_name> cephfs_metadata cephfs_data
я присваиваю имя cephfs
| 
					 1 2  | 
						cephuser@ceph1:~$ sudo ceph fs new cephfs cephfs_metadata cephfs_data new fs with metadata pool 2 and data pool 1  | 
					
Настройка клиентов — CEPH FS (ceph-fuse)
Установим нужные пакеты на наши два клиента c admin ноды.
| 
					 1  | 
						ceph-deploy install client1 client2  | 
					
Необходимо скопировать ключи на наши агенты, с из серверов с данными (одна из 3-х нод) забираем ключик:
| 
					 1  | 
						sudo cat /etc/ceph/ceph.client.admin.keyring  | 
					
и помещаем его в файл на агенте:
| 
					 1  | 
						sudo nano /etc/ceph/ceph.client.admin.keyring  | 
					
результат
| 
					 1 2 3 4  | 
						cephuser@client1:~$ cat /etc/ceph/admin.secret [client.admin]     key = AQBtRk5aJgwJHhAA3c1a4ZUCOjd6Fy282c8eKQ==  | 
					
Создаем на нашем клиенте каталог куда будем монтироваться и
| 
					 1  | 
						sudo mkdir /opt/mycephfs  | 
					
устанавливаем пакет ceph-fuse
| 
					 1 2  | 
						sudo apt-get update sudo apt-get install ceph-fuse  | 
					
Подключаем к нашему клиенту наш ceph кластер, используем любой из IP адресов текущего монитора, например, который находиться на 2-м сервере (ceph2) — 172.31.38.230. При монтировании укажим путь к файлу с ключем
| 
					 1 2  | 
						cd /etc/ceph/ sudo ceph-fuse -k ./ceph.client.admin.keyring -m 172.31.38.230:6789 /opt/mycephfs  | 
					
Результат успешного монтирования видно в df -h
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						cephuser@client1:/etc/ceph$ df -h Filesystem      Size  Used Avail Use% Mounted on udev            488M     0  488M   0% /dev tmpfs           100M  4.4M   95M   5% /run /dev/xvda1      7.7G  1.9G  5.9G  25% / tmpfs           496M     0  496M   0% /dev/shm tmpfs           5.0M     0  5.0M   0% /run/lock tmpfs           496M     0  496M   0% /sys/fs/cgroup tmpfs           100M     0  100M   0% /run/user/1000 ceph-fuse       2.9T  212M  2.9T   1% /opt/mycephfs  | 
					
Добавим в /etc/fstab для автоматического монтирования при загрузке системы.
| 
					 1  | 
						id=admin,conf=/etc/ceph/ceph.conf /opt/mycephfs fuse.ceph defaults,_netdev 0 0  | 
					
Настройка клиентов — CEPH FS (Kernel Drive)
После месяца использования cephfs смотнтированного через fuse начали появляться ошибки связзанные с отпадающим ceph-fuse клиентом, в логах примерно следующая ситуация:
| 
					 1 2 3  | 
						-2> 2018-02-15 23:31:35.338662 7f1b9a4ed700 2 -- 138.201.254.23:0/2619645748 >> 5.9.93.202:6805/2436 pipe(0x563a5a602800 sd=2 :33344 s=2 pgs=263 cs=1 l=1 c=0x563a69178f00).reader couldn't read tag, (11) Resource temporarily unavailable -1> 2018-02-15 23:31:35.338672 7f1b9a4ed700 2 -- 138.201.254.23:0/2619645748 >> 5.9.93.202:6805/2436 pipe(0x563a5a602800 sd=2 :33344 s=2 pgs=263 cs=1 l=1 c=0x563a69178f00).fault (11) Resource temporarily unavailable 0> 2018-02-15 23:31:35.347840 7f1b8d188700 -1 *** Caught signal (Segmentation fault) ** in thread 7f1b8d188700 thread_name:ceph-fuse  | 
					
Было принято решение перейти на способ монтирования Kernel Drive
В данном способе нам надо подготовить отедльный файл с ключем, ключ получаем следующей командой:
| 
					 1 2  | 
						~#ceph-authtool --name client.admin /etc/ceph/ceph.client.admin.keyring --print-key AQCB+mVXXXXXXXXXXXXXXXU3fcjeidD0I0+4VQ==  | 
					
Вывод записываем в файл:
| 
					 1  | 
						nano /etc/ceph/ceph.keyring  | 
					
Далее правим /etc/fstab добавляем:
| 
					 1  | 
						192.168.1.2,192.168.1.3,192.168.1.4:/     /opt/ceph    ceph    name=admin,secretfile=/etc/ceph/ceph.keyring,noatime,_netdev    0       2  | 
					
где 192.168.1.2,192.168.1.3,192.168.1.4 — IP наших трех серверов mon
| 
					 1  | 
						mount -a  | 
					
Результат на графиках, как изменилась нагрузка на клиенте после изменения способа монтирования с ceph-fuse на kernel drive
Crash тесты
Сгенерируем несколько файлов, проверим что они есть на наших агентах
| 
					 1 2 3 4 5 6 7 8  | 
						sudo dd if=/dev/zero of=file4-100mb bs=1M count=100 100+0 records in  100+0 records out  104857600 bytes (105 MB, 100 MiB) copied, 0.17677 s, 593 MB/s sudo dd if=/dev/zero of=file4-10g bs=1M count=10000 10000+0 records in  10000+0 records out  10485760000 bytes (10 GB, 9.8 GiB) copied, 325.802 s, 32.2 MB/s  | 
					
client1
| 
					 1 2 3 4 5 6 7 8  | 
						cephuser@client1:/opt/mycephfs$ ls -lah  total 9.9G  drwxr-xr-x 1 root root    0 Jan  5 14:57 .  drwxr-xr-x 3 root root 4.0K Jan  5 13:06 ..  -rw-r--r-- 1 root root 100M Jan  5 14:57 file4-100mb  -rw-r--r-- 1 root root 9.8G Jan  5 15:03 file4-10g  -rw-r--r-- 1 root root    0 Jan  5 14:04 test2.file  -rw-r--r-- 1 root root    0 Jan  5 14:04 test.file  | 
					
client2
| 
					 1 2 3 4 5 6 7 8  | 
						cephuser@client2:/opt/mycephfs$ ls -lah  total 9.9G  drwxr-xr-x 1 root root    0 Jan  5 14:57 .  drwxr-xr-x 3 root root 4.0K Jan  5 14:03 ..  -rw-r--r-- 1 root root 100M Jan  5 14:57 file4-100mb  -rw-r--r-- 1 root root 9.8G Jan  5 15:03 file4-10g  -rw-r--r-- 1 root root    0 Jan  5 14:04 test2.file  -rw-r--r-- 1 root root    0 Jan  5 14:04 test.file  | 
					
Мы сгенерировали файлов на ~10Gb, посмотрим, что в нашем кластере
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						cephuser@ceph-admin:~$ ssh ceph1 sudo ceph -s     cluster 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440      health HEALTH_OK      monmap e1: 3 mons at {ceph1=172.31.37.222:6789/0,ceph2=172.31.38.230:6789/0,ceph3=172.31.38.138:6789/0}             election epoch 8, quorum 0,1,2 ceph1,ceph3,ceph2       fsmap e11: 1/1/1 up {0=ceph2=up:active}, 2 up:standby      osdmap e55: 6 osds: 6 up, 6 in             flags sortbitwise,require_jewel_osds       pgmap v493: 320 pgs, 3 pools, 10100 MB data, 2545 objects             30537 MB used, 2938 GB / 2968 GB avail                  320 active+clean  | 
					
Мы видим избыточность х3:
| 
					 1  | 
						30537 MB used, 2938 GB / 2968 GB avail  | 
					
Предлагаю «потерять» 1 сервер с данными и вместо него установить новый. Статус кластера после выключения изменился:
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  | 
						cephuser@ceph-admin:~$ ssh ceph1 sudo ceph -s     cluster 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440      health HEALTH_WARN             182 pgs degraded             182 pgs stuck degraded             320 pgs stuck unclean             182 pgs stuck undersized             182 pgs undersized             recovery 2290/7635 objects degraded (29.993%)             recovery 1184/7635 objects misplaced (15.508%)             1 mons down, quorum 0,2 ceph1,ceph2      monmap e1: 3 mons at {ceph1=172.31.37.222:6789/0,ceph2=172.31.38.230:6789/0,ceph3=172.31.38.138:6789/0}             election epoch 10, quorum 0,2 ceph1,ceph2       fsmap e12: 1/1/1 up {0=ceph2=up:active}, 1 up:standby      osdmap e61: 6 osds: 4 up, 4 in; 320 remapped pgs             flags sortbitwise,require_jewel_osds       pgmap v578: 320 pgs, 3 pools, 10100 MB data, 2545 objects             25057 MB used, 1954 GB / 1979 GB avail             2290/7635 objects degraded (29.993%)             1184/7635 objects misplaced (15.508%)                  182 active+undersized+degraded                   87 active+remapped                   51 active  | 
					
Выключением/удалением — моделируем полную потерю сервера ceph3. Вместо него необходимо ввести в кластер сервер ceph4 c аналогичной конфигурацией как и первые 3 сервера.
На сервере ceph4 прроделываем все с самого начала по аналогии ceph1-3 (см. выше).
Обновляем на /etc/hosts на наших нодах, добавляем в него ceph4.
| 
					 1  | 
						172.31.44.129 ceph4  | 
					
Переходим на севрер ceph-admin
| 
					 1 2  | 
						su - cephuser cd ~/my-cluster  | 
					
На новом сервере над надо добавить — mon, osd, mds — все что мы потеряли на ceph3 севрере.
Установим пакеты ceph
| 
					 1  | 
						ceph-deploy install ceph4  | 
					
Скопируем ключи/конфиги
| 
					 1  | 
						ceph-deploy admin ceph4  | 
					
Создаем на новом сервере osd
| 
					 1  | 
						ceph-deploy osd create ceph4:/dev/xvdf ceph4:/dev/xvdg  | 
					

Переопределяем наши мониторы
| 
					 1  | 
						ceph-deploy new ceph1 ceph2 ceph4  | 
					
перезаписываем иразливаем конфиги
| 
					 1  | 
						ceph-deploy --overwrite-conf mon create ceph1 ceph2 ceph4  | 
					
состояние кластера в текущий момент
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						root@ceph1:~# ceph -s     cluster 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440      health HEALTH_WARN             1 mons down, quorum 0,2,3 ceph1,ceph2,ceph4      monmap e2: 4 mons at {ceph1=172.31.37.222:6789/0,ceph2=172.31.38.230:6789/0,ceph3=172.31.38.138:6789/0,ceph4=172.31.44.129:6789/0}             election epoch 12, quorum 0,2,3 ceph1,ceph2,ceph4       fsmap e15: 1/1/1 up {0=ceph2=up:active}, 1 up:standby      osdmap e71: 8 osds: 6 up, 6 in             flags sortbitwise,require_jewel_osds       pgmap v830: 320 pgs, 3 pools, 10100 MB data, 2545 objects             30560 MB used, 2938 GB / 2968 GB avail                  320 active+clean  | 
					
конфиг на ceph нода сейчас выглядит так
| 
					 1 2 3 4 5 6 7 8  | 
						root@ceph1:~# cat /etc/ceph/ceph.conf  [global] fsid = 67e883e4-be18-4a53-994d-03ca59e20d56 mon_initial_members = ceph1, ceph2, ceph4 mon_host = 172.31.37.222,172.31.38.230,172.31.44.129 auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx  | 
					
у нас в наличие есть еще ceph3 mon которого уже нет в конфиге
удаляем его с одной из нод ceph
| 
					 1 2  | 
						root@ceph1:~# ceph mon remove ceph3 removing mon.ceph3 at 172.31.38.138:6789/0, there will be 3 monitors  | 
					
или же с admin ноды
| 
					 1  | 
						cephuser@ceph-admin:~/my-cluster$ ssh ceph1 sudo ceph mon remove ceph3  | 
					
состояние кластера в текущий момент
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						cephuser@ceph-admin:~/my-cluster$ ssh ceph1 sudo ceph -s     cluster 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440      health HEALTH_OK      monmap e3: 3 mons at {ceph1=172.31.37.222:6789/0,ceph2=172.31.38.230:6789/0,ceph4=172.31.44.129:6789/0}             election epoch 14, quorum 0,1,2 ceph1,ceph2,ceph4       fsmap e15: 1/1/1 up {0=ceph2=up:active}, 1 up:standby      osdmap e71: 8 osds: 6 up, 6 in             flags sortbitwise,require_jewel_osds       pgmap v841: 320 pgs, 3 pools, 10100 MB data, 2545 objects             30559 MB used, 2938 GB / 2968 GB avail                  320 active+clean  | 
					
Удаляем потерянные osd
| 
					 1  | 
						ceph osd tree  | 
					
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  | 
						root@ceph1:~# ceph osd tree ID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY  -1 3.86548 root default                                      -2 0.96637     host ceph1                                     0 0.48318         osd.0       up  1.00000          1.00000   1 0.48318         osd.1       up  1.00000          1.00000  -3 0.96637     host ceph2                                     2 0.48318         osd.2       up  1.00000          1.00000   3 0.48318         osd.3       up  1.00000          1.00000  -4 0.96637     host ceph3                                     4 0.48318         osd.4     down        0          1.00000   5 0.48318         osd.5     down        0          1.00000  -5 0.96637     host ceph4                                     6 0.48318         osd.6       up  1.00000          1.00000   7 0.48318         osd.7       up  1.00000          1.00000  | 
					
необходимо удалить osd.4 и osd.5
| 
					 1 2 3 4 5 6 7  | 
						ceph osd rm 4 ceph osd rm 5 ceph auth del osd.4 ceph auth del osd.5 ceph osd crush remove osd.4 ceph osd crush remove osd.5 ceph osd crush remove ceph3  | 
					
После этого кластер перестраиваеться
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33  | 
						root@ceph2:~# ceph -s                                                                                                                                                          cluster 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440                                                                                                                                health HEALTH_WARN                                                                                                                                                                35 pgs degraded             1 pgs recovering             34 pgs recovery_wait             12 pgs stuck unclean             recovery 1383/7635 objects degraded (18.114%)      monmap e3: 3 mons at {ceph1=172.31.37.222:6789/0,ceph2=172.31.38.230:6789/0,ceph4=172.31.44.129:6789/0}             election epoch 14, quorum 0,1,2 ceph1,ceph2,ceph4       fsmap e15: 1/1/1 up {0=ceph2=up:active}, 1 up:standby      osdmap e79: 6 osds: 6 up, 6 in             flags sortbitwise,require_jewel_osds       pgmap v923: 320 pgs, 3 pools, 10100 MB data, 2545 objects             30715 MB used, 2938 GB / 2968 GB avail             1383/7635 objects degraded (18.114%)                  285 active+clean                   34 active+recovery_wait+degraded                    1 active+recovering+degraded recovery io 83527 kB/s, 20 objects/s root@ceph2:~# ceph -s     cluster 5ea6d4ad-e9e2-458f-b237-1ff99b8ad440      health HEALTH_OK      monmap e3: 3 mons at {ceph1=172.31.37.222:6789/0,ceph2=172.31.38.230:6789/0,ceph4=172.31.44.129:6789/0}             election epoch 14, quorum 0,1,2 ceph1,ceph2,ceph4       fsmap e15: 1/1/1 up {0=ceph2=up:active}, 1 up:standby      osdmap e79: 6 osds: 6 up, 6 in             flags sortbitwise,require_jewel_osds       pgmap v981: 320 pgs, 3 pools, 10100 MB data, 2545 objects             30544 MB used, 2938 GB / 2968 GB avail                  320 active+clean  | 
					
Наше дерево после удаления osd находящихся на ceph3
| 
					 1 2 3 4 5 6 7 8 9 10 11 12  | 
						root@ceph1:~# ceph osd tree ID WEIGHT  TYPE NAME      UP/DOWN REWEIGHT PRIMARY-AFFINITY  -1 2.89911 root default                                      -2 0.96637     host ceph1                                     0 0.48318         osd.0       up  1.00000          1.00000   1 0.48318         osd.1       up  1.00000          1.00000  -3 0.96637     host ceph2                                     2 0.48318         osd.2       up  1.00000          1.00000   3 0.48318         osd.3       up  1.00000          1.00000  -5 0.96637     host ceph4                                     6 0.48318         osd.6       up  1.00000          1.00000   7 0.48318         osd.7       up  1.00000          1.00000  | 
					
Добавим mds на новый сервер ceph4
Удаление OSD в случаи необходимости замены HDD
Смотрим листинг OSD
| 
					 1  | 
						ceph osd tree  | 
					
Сопостовляем со списком всех смонтированных OSD
| 
					 1  | 
						mount -l | grep ceph  | 
					
Помечаем целевой osd как ‘out’
| 
					 1  | 
						ceph osd out osd.11  | 
					
Если получаем сообщение ‘osd.11 is already out’ — все ок.
Помечаем как ‘down’
| 
					 1  | 
						ceph osd down osd.11  | 
					
Удаляем
| 
					 1  | 
						ceph osd rm osd.11  | 
					
Если не удаляеться, пишет ‘Error EBUSY: osd.11 is still up; must be down before removal.’
Выполняем команду
| 
					 1  | 
						systemctl stop ceph-osd@11  | 
					
и повторяем процедуру удаления
| 
					 1  | 
						ceph osd rm osd.11  | 
					
Теперь в списке OSD он помечен как ‘DNE’
Удаляем из crush map
| 
					 1  | 
						ceph osd crush rm osd.11  | 
					
удаляем из авторизации для предотвращения проблемы ‘couldn’t add new osd with same number’
| 
					 1  | 
						ceph auth del osd.11  | 
					
удаляем из ceph-volume lvm
| 
					 1  | 
						ceph-volume lvm zap --destroy --osd-id 1  | 
					
Результат тистирования удалени и добавления в CEPH кластер mds ноды
В данный момент условно говоря 2 mds на ceph1 и ceph2
| 
					 1 2  | 
						root@ceph1:~# ceph mds stat e15: 1/1/1 up {0=ceph2=up:active}, 1 up:standby  | 
					
Добавляем mds на ceph4, результат:
| 
					 1 2  | 
						root@ceph1:~# ceph mds stat e16: 1/1/1 up {0=ceph2=up:active}, 2 up:standby  | 
					
Добавлен mds на ceph4, смотрим dump
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  | 
						root@ceph1:~# ceph mds dump dumped fsmap epoch 16 fs_name cephfs epoch   14 flags   0 created 2018-01-05 11:04:17.792572 modified        2018-01-05 11:04:17.792572 tableserver     0 root    0 session_timeout 60 session_autoclose       300 max_file_size   1099511627776 last_failure    0 last_failure_osd_epoch  0 compat  compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=file layout v2} max_mds 1 in      0 up      {0=14100} failed damaged stopped data_pools      1 metadata_pool   2 inline_data     disabled 14100:  172.31.38.230:6800/4067184302 'ceph2' mds.0.10 up:active seq 5748  | 
					
Выключаем ноду ceph2 и смотрим dump
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  | 
						root@ceph1:~# ceph mds dump dumped fsmap epoch 20 fs_name cephfs epoch 20 flags 0 created 2018-01-05 11:04:17.792572 modified 2018-01-05 11:04:17.792572 tableserver 0 root 0 session_timeout 60 session_autoclose 300 max_file_size 1099511627776 last_failure 0 last_failure_osd_epoch 82 compat compat={},rocompat={},incompat={1=base v0.20,2=client writeable ranges,3=default file layouts on dirs,4=dir inode in separate object,5=mds uses versioned encoding,6=dirfrag is stored in omap,8=file layout v2} max_mds 1 in 0 up {0=24167} failed damaged stopped data_pools 1 metadata_pool 2 inline_data disabled 24167: 172.31.44.129:6808/1309764262 'ceph4' mds.0.17 up:active seq 38  | 
					
а также заглянем в stat с текущим выключеным ceph2
| 
					 1 2  | 
						root@ceph1:~# ceph mds stat e20: 1/1/1 up {0=ceph4=up:active}, 1 up:standby  | 
					
Каков итог. mds всегда 1, все остальные находятся в статусе standby, если сервер с mds пропадает/выключаеться/удаляеться — то ceph более не считает его резервным или вообще какием-то запасным — просто выкидывает.
Рекомендации по тюнингу системных переменных — PID Count
В случае когда одна нода включае в себя более 20 OSD рекомендуеться увеличить значение переменно kernel.pid_max
Значение по-умолчанию — 32768
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						cat /proc/sys/kernel/pid_max Consider setting kernel.pid_max to a higher number of threads. The theoretical maximum is 4,194,303 threads. For example, you could add the following to the /etc/sysctl.conf file to set it to the maximum: kernel.pid_max = 4194303 To see the changes you made without a reboot, execute: sudo sysctl -p To verify the changes, execute: sudo sysctl -a | grep kernel.pid_max  | 
					
Отключить кеш для дисков OSD
| 
					 1  | 
						sudo hdparm -W 0 /<path-to>/<disk> 0  | 
					
Результат на графиках
Фактически до использования CEPHfs, NFS имел вот такой график:
На NFS сервере использовать софтварный 6-й рейд, когда происходили еженедельный системный проверки целостности массива — все приложения умирали, но как мы видим сняв часть нагрузки на CEPH мы получили живой NFS и рабочий CEPH для критичных данных.
Нагрузка на CEPH за ~20 дней:
Еще один график, на нем показана нагрузка, когда в CEPH шла загрузка файла размером 0.5 Tb
Ошибки, возможные при варианты вытаскивания OSD и неудачной попытке ребилда
| 
					 1 2 3 4 5 6 7 8 9  | 
						OBJECT_UNFOUND 4/1077514 objects unfound (0.000%)     pg 1.1 has 3 unfound objects     pg 1.e6 has 1 unfound objects PG_DEGRADED Degraded data redundancy: 7862/3232542 objects degraded (0.243%), 2 pgs degraded, 2 pgs undersized     pg 1.1 is stuck undersized for 9773.370860, current state active+recovery_wait+undersized+degraded+remapped, last acting [1,4]     pg 1.e6 is stuck undersized for 9773.369626, current state active+recovery_wait+undersized+degraded+remapped, last acting [0,3] REQUEST_STUCK 3 stuck requests are blocked > 4096 sec. Implicated osds 0,1     3 ops are blocked > 16777.2 sec     osds 0,1 have stuck requests > 16777.2 sec  | 
					
3 объекта потеряны, попробуем сделать им revert, если ничего не изменить — удаляем с вероятностью потери данных
| 
					 1 2 3  | 
						ceph health detail ceph pg 1.e6 mark_unfound_lost revert ceph pg 1.e6 mark_unfound_lost delete  | 
					
В моем случаи успешно прошел revert
у pg 1e.6 началась процедура восстановления, pg 1.1 стал в очередь
| 
					 1 2 3  | 
						PG_DEGRADED Degraded data redundancy: 4920/3198987 objects degraded (0.154%), 2 pgs degraded, 2 pgs undersized     pg 1.1 is stuck undersized for 11601.013681, current state active+recovery_wait+undersized+degraded+remapped, last acting [1,4]     pg 1.e6 is stuck undersized for 11601.012447, current state active+undersized+degraded+remapped+backfilling, last acting [0,3]  | 
					
По завершению наш health статус уже не такой страшный:
| 
					 1 2 3 4 5  | 
						# ceph health detail HEALTH_WARN 438979/3196845 objects misplaced (13.732%); Degraded data redundancy: 3951/3196845 objects degraded (0.124%), 1 pg degraded, 1 pg undersized OBJECT_MISPLACED 438979/3196845 objects misplaced (13.732%) PG_DEGRADED Degraded data redundancy: 3951/3196845 objects degraded (0.124%), 1 pg degraded, 1 pg undersized     pg 1.1 is stuck undersized for 11983.333518, current state active+recovery_wait+undersized+degraded+remapped, last acting [1,4]  | 
					
Ссылки на официальный мануал:
http://docs.ceph.com/docs/master/start/quick-start-preflight/
http://docs.ceph.com/docs/master/start/quick-ceph-deploy/
http://docs.ceph.com/docs/master/start/quick-cephfs/
http://docs.ceph.com/docs/master/cephfs/createfs/




