Часто в практике используется 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/