Глава 10. Ещё о Ceph

В данной главе мы обсудим следующие рецепты:

  • Эталонное тестирование кластера Ceph

  • Базовый уровень производительности дисков

  • Базовый уровень производительности сетевой среды

  • Показатели Ceph RADOS

  • RADOS load-gen

  • Эталонное тестирование блочного устройства Ceph

  • Эталонное тестирование Ceph RBD с применением FIO

  • Сокет администратора Ceph

  • Применение команды ceph tell

  • Ceph REST API

  • Профилирование памяти Ceph

  • Развёртывание Ceph с применением Ansible

  • Инструментарий ceph-objectstore

 Введение

В предыдущих главах мы рассматривали различные способы развёртывания, предоставления и администрирования Ceph. В этой главе мы изучим эталонное тестирование имеющегося кластера Ceph, что является необходимым для выполнения этапом перед перемещением решения в промышленное применение. Мы также обсудим расширенные методы администрирования и обнаружения неисправностей Ceph с применением разъёма администратора, REST API и инструментария ceph-objectstore. Наконец мы изучим профилирование памяти Ceph, а также развёртывание Ceph с применением Ansible, который является очень эффективным способом развёртывания Ceph.

 Эталонное тестирование кластера Ceph

Настоятельно рекомендуется перед размещением под рабочие нагрузки промышленного применения выполнить эталонное тестирование вашего кластера Ceph. Эталонное тестирование даст вам приблизительные результаты того, что ваш кластер будет предоставлять в процессе рабочих нагрузок по чтению, записи, латентности и т.д.

Перед выполнением действительного эталонного тестирования неплохо установить отправные точки для ожидаемой максимальной производительности измерив производительность присоединяемого к кластерному узлу оборудования, например, дисков и элементов сетевой среды.

 Базовый уровень производительности дисков

Тестирование базового уровня производительности дисков выполняется в два этапа. Вначале мы измеряем производительность отдельного диска, а после этого мы измерим производительность всех наших дисков, подключённых к одному узлу OSD при их работе одновременно.

[Замечание]Замечание

Для получения реалистичных результатов я выполняю эталонное тестирование описанное в данном рецепте не на самом развёрнутом кластере, а на физических аппаратных средствах. Мы также можем выполнить это тесты на вашем кластере Ceph, размещающемся на виртуальной машине, но мы можем не получить привлекательных результатов.

  Производительность отдельного диска на запись

Для получения производительности дисковых чтения и записи мы воспользуемся командой dd с oflag установленным в значение direct для достижения обхода дискового кэша с целью получения реалистичных результатов.

  Как это сделать...

  1. Прекратите кэширование.

    # echo 3 > /proc/sys/vm/drop_caches
    	   
  2. Используйте dd для записи файла с именем deleteme и размером 10ГБ заполненным нулями /dev/zero в качестве входного файла if в каталог, в который смонтирован OSD Ceph, т.е. /var/lib/ceph/osd/ceph-0/.

    # dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/deleteme bs=10G count=1 oflag=direct
    	   

В идеале вы должны повторить шаги 1 и 2 несколько раз и получить среднее значение. В нашем случае среднее значение для операций записи приближается к 319 МБ/с, как показано на следующем экранном снимке:

	[root@ceph-node1 ~]# dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/deleteme bs=10G count=1 oflag=direct 
	0+1 records in 
	0+1 records out 
	2147479552 bytes (2.1 GB) copied, 6.66535 s, 322 MB/s 
	[root@ceph-node1 ~]# 
	[root@ceph-node1 ~]# dd if=/dev/zero of=/var/lib/ceph/osd/ceph-0/deleteme bs=10G count=1 oflag=direct 
	0+1 records in 
	0+1 records out 
	2147479552 bytes (2.1 GB) copied, 7.09217 s, 303 MB/s 
	[root@ceph-node1 ~]# 
	[root@ceph-node1 ~]# dd if=/dev/zero of4var/lib/ceph/osd/ceph-0/deleteme bs=10G count=1 oflag=direct 
	0+1 records in 
	0+1 records out 
	2147479552 bytes (2.1 GB) copied, 6.45077 s, 333 MB/s 
	[root@ceph-node1 ~]# 
	   

  Производительность множества дисков на запись

В качестве следующего шага мы выполним dd на всех ваших дисках OSD используемых Ceph на этом узле, ceph-node1, для получения суммарной производительности дисковой записи предоставляемой отдельным узлом.

  Как это сделать...

  1. Получите общее число дисков, используемых на вашем OSD Ceph, в моём случае это 25 дисков:

    # mount | grep -i osd | wc -l
    	   
  2. Прекратите кэширование.

    # echo 3 > /proc/sys/vm/drop_caches
    	   
  3. Следующая команда выполнит команду dd на всех дисках OSD Ceph:

    # for i in `mount | grep osd | awk '{print $3}'`; do (dd if=/dev/zero of=$i/deleteme bs=10G count=1 oflag=direct &) ; done
    	   

Для получения средней суммарной производительности записи возьмите среднее значение от всех скоростей записи. В моём случае среднее значение достигло 60 МБ/с.

  Производительность отдельного диска на чтение

Для получения производительности дискового чтения отдельного диска мы снова воспользуемся командой dd.

  Как это сделать...

  1. Прекратите кэширование.

    # echo 3 > /proc/sys/vm/drop_caches
    	   
  2. Используйте dd для записи файла с именем deleteme, который мы создале в процессе тестирования записи. Мы будем читать наш файл deleteme в /dev/null с iflag установленным в значение direct:

    # dd if=/var/lib/ceph/osd/ceph-0/deleteme of=/dev/null bs=10G count=1 iflag=direct
    	   

В идеале вы должны повторить шаги 1 и 2 несколько раз и получить среднее значение. В нашем случае среднее значение для операций записи приближается к 178 МБ/с, как показано на следующем экранном снимке:

	[root@ceph-node1 ~]# echo 3 > /proc/sys/vm/drop_caches 
	[root@ceph-node1 ~]# 
	[root@ceph-node1 ~]# dd if=/var/lib/ceph/osd/ceph-0/deleteme of=/dev/null bs=10G count=1 iflag=direct 
	0+1 records in 
	0+1 records out 
	2147479552 bytes (2.1 GB) copied, 12.0557 s, 178 MB/s 
	[root@ceph-node1 ~]# 
	[root@ceph-node1 ~]# dd if=/var/lib/ceph/osd/ceph-O/deleteme of=/dev/null bs=10G count=1 iflag=direct 
	0+1 records in 
	0+1 records out 
	2147479552 bytes (2.1 GB) copied, 12.0452 s, 178 MB/s 
	[root@ceph-node1 ~]# dd if=/var/lib/ceph/osd/ceph-O/deleteme of=/dev/null bs=10G count=1 iflag=direct 
	0+1 records in 
	0+1 records out 
	2147479552 bytes (2.1 GB) copied, 12.0408 s, 178 MB/s 
	[root@ceph-node1 ~]# 
	[root@ceph-node1 ~]# 
	   

  Производительность множества диска на чтение

Аналогично производительности отдельного диска на чтение мы используем dd для получения суммарной производительности на чтение множества дисков.

  Как это сделать...

  1. Получите общее число дисков, используемых на вашем OSD Ceph, в моём случае это 25 дисков:

    # mount | grep -i osd | wc -l
    	   
  2. Прекратите кэширование.

    # echo 3 > /proc/sys/vm/drop_caches
    	   
  3. Следующая команда выполнит команду dd на всех ваших дисках Ceph OSD:

    # for i in `mount | grep osd | awk '{print $3}'`; do (dd if=$i/deleteme of=/dev/null bs=10G count=1 iflag=direct &); done
    	   

Для получения суммарной производительности дискового чтения возьмите среднее всех ваших скоростей чтения. В моём случае среднее значение приближается к 123 МБ/с.

  Результаты

На основании выполненных нами тестов результаты выглядят следующим образом. Эти результаты очень сильно изменяются от среды к среде; используемоё вами оборудование и число дисков в вашем узле OSD могут иметь большое значение.

Операция на диск агрегированная

чтение

178МБ/с

123МБ/с

запсиь

319МБ/с

60МБ/с

 Базовый уровень производительности сетевой среды

В этом разделе мы выполним тесты для исследования базовой производительности сети между узлами OSD Ceph. Для этого мы воспользуемся утилитой iperf. Убедитесь что пакет iperf установлен на ваших узлах. iperf является простым средством тестирования полосы пропускания сети точка- точка, которое работает в модели клиент- сервер.

Для запуска эталонного тестирования сети выполните iperf с параметром сервера на своём первом узле, а с параметром клиента на своём втором узле.

  Как это сделать...

  1. На Ceph-node1 выполните iperf с -s для вашего сервера и -p для прослушивания определённого порта:

    # iperf -s -p 6900
    
    	[root@ceph-node1 ~]# iperf -s -p 6900 
    	-----------------------------------------------------------
    	Server listening on TCP port 6900 
    	TCP window size: 85.3 KByte (default) 
    	-----------------------------------------------------------
    	[ 4] local 10.100.1.201 port 6900 connected with 10.100.1.202 port 39630 
    	[ ID] Interval Transfer Bandwidth 
    	[ 4] 0.0-10.0 sec  11.5 GBytes  9.87 Gbits/sec 
    	^C[root@ceph-node1 ~]# 
    	[root@ceph-node1 ~]# 
    	   
    [Замечание]Замечание

    Вы можете опустить параметр -p если порт TCP 5201 открыт или вы можете любой другой порт который открыт и не используется.

  2. На Ceph-node2 выполните iperf с параметром клиента, -c:

    # iperf -c ceph-node1 -p 6900
    
    	[root@ceph-node2 ~]# iperf -c ceph-node1 -p 6900 
    	-----------------------------------------------------------
    	Client connecting to 10.100.1.201, TCP port 6900 
    	TCP window size: 95.8 KByte (default) 
    	-----------------------------------------------------------
    	[ 3] local 10.100.1.202 port 39630 connected with 10.100.1.201 port 6900 
    	[ ID] Interval Transfer Bandwidth 
    	[ 3] 0.0-10.0 sec  11.5 GBytes  9.87 Gbits/sec 
    	[root@ceph-node2 ~]# 
    	   
    [Замечание]Замечание

    Вы можете также применить параметр -p в своей команде iperf для определения числа параллельных соединений потоков создаваемых с вашим сервером. Это вернёт реалистичные результаты если у вас имеется техника связывания каналов, например, LACP.

Результаты показывают, что у нас есть привлекательное сетевое соединение с 9.8Gb/s между нашими узлами Ceph. Аналогично мы можем выполнять проверку пропускной способности сети для всех других узлов в вашем кластере Ceph. Полоса пропускания сетевой среды в реальности зависит от применяемой вами между узлами Ceph сетевой инфраструктуры.

  Смотрите также...

 Показатели Ceph RADOS

Ceph поставляется со встроенным инструментом эталонного тестирования, называемым RADOS bench, который может применяться для измерения производительности кластера Ceph на уровне пула. Инструмент RADOS bench поддерживает тестирование записи, последовательного чтения и случайного чтения, а также позволяет очищаться от временных данных эталонного тестирования, что очень аккуратно.

  Как это сделать...

Давайте выполним некоторые тесты при помощи rados bench:

  1. Для выполнения 10 секундного теста записи в ваш пул rbd без очистки выполните следующую команду:

    # rados bench -p rbd 10 write --no-cleanup
    	   

    После выполнения данной команды мы получим следующий снимок экрана:

    	[root@ceph-node1 ~]# rados bench -p rbd 10 write --no-cleanup 
    	Maintaining 16 concurrent writes of 4194304 bytes for up to 10 seconds or 0 objects 
    	Object prefix: benchmarkdata_ceph-node1_3124629 
    	  sec Cur ops   started finished  avg MB/s   cur MB/s  last lat   avg lat 
    	    0       0         0        0         0          0         -         0 
    	    1      16       118      102    407.85        408 0.0584212  0.127569 
    	    2      16       207      191   381.895        356   0.20105  0.150813 
    	    3      16       279      263   350.581        288  0.141772  0.168736 
    	    4      16       351      335   334.921        288   0.57108  0.181988 
    	    5      16       420      404    323.13        276 0.0724497   0.19139 
    	    6      16       479      463   308.601        236  0.137025  0.194498 
    	    7      16       547      531   303.367        272  0.253194  0.206116 
    	    8      16       615      599   299.441        272  0.172813  0.208689 
    	    9      16       692      676   300.386        308   0.48298  0.209028 
    	   10      16       747      731   292.345        220  0.123282  0.211807 
    	Total time run:         10.721111 
       Total writes made:      747 
       Write size:             4194304 
       Bandwidth (MB/sec):     278.702 
       
       Stddev Bandwidth:       102.44 
       Max bandwidth (MB/sec): 408 
       Min bandwidth (MB/sec): 0 
       Average Latency:        0.227756 
       Stddev Latency:         0.234691 
       Max latency:            1.5534 
       Min latency:            0.041106 
       [root@ceph-node1 ~]# 
    	   
  2. Аналогично, для выполнения 10 секундного теста чтения в вашем пуле rbd, выполните следующую команду:

    # rados bench -p rbd 10 seq
    
    	[root@ceph-node1 ~]# rados bench -p rbd 10 seq 
    	   sec Cur ops   started  finished  avg MB/s  cur MB/s  last lat   avg lat 
    	     0       0         0         0         0         0         -         0 
    	     1      16       247       231   923.573       924  0.181625 0.0620505 
    	     2      16       489       473   945.703       968 0.0366547 0.0645318 
    	     3      16       648       632   698.411       636  0.306308 0.0814809 
    	 Total time run:        4.223407 
    	Total reads made:     747 
    	Read size:            4194304 
    	Bandwidth (MB/sec):   707.486
    	
    	Average Latency:      0.0901875 
    	Max latency:          1.03252 
    	Min latency:          0.00977891 
    	[root@ceph-node1 ~]#  
    	   
    [Замечание]Замечание

    В данном случае может оказаться интересным узнать почему тест чтения завершился через несколько секунд или почему он не выполнялся предписанные 10 секунд. Это обусловлено тем, что ваша скорость чтения быстрее скорости записи, и rados bench завершил чтение всех имеющихся данных, сгенерированных в процессе вашего теста записи. Однако подобное поведение во многом зависит от вашей инфраструктуры оборудования и программных средств.

  3. Аналогично выполните тестирование случайного чтения при помощи rados bench, исполнив следующую команду:

    # rados bench -p rbd 10 rand
    	   

  Как это работает...

Синтаксис для rados bench таков:

# rados bench -p <pool_name> <seconds> <write|seq|rand> -b <block size> -t --no-cleanup
	   
  • -p или --pool: определяет имя пула

  • <seconds>: время тестирования в секундах

  • <write|seq|rand>: тип тестирования, {а именно}: запись, последовательное чтение или случайное чтение

  • -b: для определения размера блока; по умолчанию он 4M

  • -t: число параллельных потоков; по умолчанию 16

  • --no-cleanup: Ваши временные данные, которые записываются в указанный пул при помощи rados bench не должны быть вычищены. Эти данные будут использованы для операций чтения когда они используются при последовательных чтениях ил случайных чтениях. Значение по умолчанию установлено в очистку.

[Замечание]Замечание

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

rados bench является достаточно удобным инструментом для быстрого измерения сырой производительности вашего кластера Ceph и вы можете творчески проектировать свои собственные тесты на основе профилей записи, чтения и случайного чтения.

 RADOS load-gen

Слегка похожий на rados bench, rados load-gen является другим интересным инструментом, предоставляемым Ceph, который работает сразу после вынимания из коробки. Как подсказывает его название, инструмент rados load-gen может применяться для генерации нагрузки и может оказаться полезным при симуляции сценариев с высокой нагрузкой.

  Как это сделать...

Давайте попытаемся создать некоторую нагрузку на наш кластер Ceph при помощи следующей команды:

# rados -p rbd load-gen \
   --num-objects 50 \
   --min-object-size 4M \
   --max-object-size 4M \
   --max-ops 16 \
   --min-op-len 4M \
   --max-op-len 4M \
   --percent 5 \
   --target-throughput 2000 \
   --run-length 60
	   

  Как это работает...

Синтаксис rados load-gen таков:

# rados -p <pool-name> load-gen
	   
  • --num-objects: общее число объектов

  • --min-object-size: минимальный размер объекта в байтах

  • --max-object-size: максимальный размер объекта в байтах

  • --min-ops: минимальное число операций

  • --max-ops: максимальное число операций

  • --min-op-len: минимальная длина операции

  • --max-op-len: максимальная длина операции

  • --max-backlog: максимум незавершённых заданий (в МБ)

  • --percent: процент операций чтения

  • --target-throughput: пропускная способность получателя (в МБ)

  • --run-length: общее время работы в секундах

Эта команда сгенерирует нагрузку на ваш кластер Ceph посредством записи 50 объектов в пул rbd. Длина каждого из этих объектов и операций составит в размере 4M с 5% чтения и временем тестирования 60 секунд.

	[root@ceph-node1 ~]# rados -p rbd load-gen \
	> --num-objects 50 \ 
	> --min-object-size 4M \ 
	> --max-object-size 4M \ 
	> --max-ops 16 \ 
	> --min-op-len 4M \ 
	> --max-op-len 4M \ 
	> --percent 5 \ 
	> --target-throughput 2000 \ 
	> --run-length 60 
	run length 60 seconds 
	preparing 50 objects 
	load-gen will run 60 seconds 
	    1: throughput=0MB/sec pending data=0 
	READ : oid=obj-xtuVtifS5zQ55da off=0 len=4194304 
	READ : oid=obj-0NvPNB07Lz1rTra off=0 len=4194304 
	WRITE : oid=obj-UeV2NunBsTSrYUw off=0 len=4194304 
	op 17 completed, throughput=4MB/sec 
	READ : oid=obj-fL1p0c_7CgEtjlk off=0 len=4194304 
	op 18 completed, throughput=8MB/sec 
	   

Вывод был усечён для краткости мотивации. Когда команда load-gen завершится, она вычистит за собой все объекты, которые она создавала для тестирования и выведет рабочую пропускную способность.

	op 5519 completed, throughput=373MB/sec 
	waiting for all operations to complete 
	cleaning up objects 
	op 5522 completed, throughput=367MB/sec 
	op 5521 completed, throughput=367MB/sec 
	[root@ceph-node1 ~]# 
	   

  Есть кое-что еще...

Также вы можете наблюдать за состоянием вашего кластера на предмет скорости/ операций чтения и записи с помощью команды watch ceph -s, в то время, пока будет работать rados load-gen, просто чтобы смотреть что происходит.

 Эталонное тестирование блочного устройства Ceph

Описанные в последнем рецепте инструменты rados bench и rados load-gen применяются для эталонного тестирования пула вашего кластера Ceph. В данном рецепте мы сосредоточимся на эталонном тестировании блочного устройства Ceph пи помощи инструмента rbd bench-write.

  Ceph rbd bench-write

Интерфейс командной строки ceph rbd предоставляет параметр, называемый bench-write, который является инструментом для выполнения операций эталонного тестирования в ваше блочное устройство RADOS Ceph.

  Как это сделать...

Чтобы выполнить эталонное тестирование блочного устройства Ceph, нам необходимо создать некое блочное устройство и отобразить на ваш узел клиента Ceph:

  1. Создайте блочное устройство с именем block-device1 и размером 1ГБ, а потом отобразите его:

    # rbd create block-device1 --size 10240
    # rbd info --image block-device1
    # rbd map block-device1
    # rbd showmapped
    
    	[root@ceph-client1 ~]# rbd create block-device1 --size 10240 
    	[root@ceph-client1 ~]# rbd info --image block-device1 
    	rbd image 'block-device1': 
    	        size 10240 MB in 2560 objects 
    	        order 22 (4096 kB objects) 
    	        block_name_prefix: rb.0.4cbacc.238e1f29 
    	        format: 1 
    	[root@ceph-client1 ~]# rbd map block-device1 
    	/dev/rbd0 
    	[root@ceph-client1 ~]# rbd showmapped 
    	id pool image         snap device 
    	0  rbd  block-device1 -    /dev/rbd0 
    	[root@ceph-client1 ~]# 
    	   
  2. Создайте файловую систему на вашем блочном устройстве и смонтируйте её.

    # mkfs.xfs /dev/rbd0
    # mkdir -p /mnt/ceph-block-device1
    # mount /dev/rbd0 /mnt/ceph-block-device1
    # df -h /mnt/ceph-block-device1
    
    	[root@ceph-client1 ~]# mkfs.xfs /dev/rbd0 
    	log stripe unit (4194304 bytes) is too large (maximum is 256KiB) 
    	log stripe unit adjusted to 32KiB 
    	meta-data=/dev/rbd0              isize=256    agcount=17, agsize=162816 blks 
    	         =                       sectsz=512   attr=2, projid32bit=1 
    	         =                       crc=0        finobt=0 
    	data     =                       bsize=4096   blocks=2621440, imaxpct.25 
    	         =                       sunit=1024   swidth=1024 blks 
    	naming   =version 2              bsize=4096   ascii-ci=0 ftype=0 
    	log      =internal log           bsize=4096   blocks=2560, version=2 
    	         =                       sectsz=512   sunit=8 blks, lazy-count=1 
    	realtime =none                   extsz=4096   blocks=0, rtextents=0 
    	[root@ceph-client1 ~]# mkdir -p /mnt/ceph-block-device1 
    	[root@ceph-client1 ~]# mount /dev/rbd0 /mnt/ceph-block-device1 
    	[root@ceph-client1 ~]# df -h /mnt/ceph-block-device1 
    	Filesystem      Size  Used Avail Use% Mounted on 
    	/dev/rbd0        10G   33M   10G   1% /mnt/ceph-block-device1 
    	[root@ceph-client1 ~]# 
    	   
  3. Для выполнения эталонного тестирования block-device1 на запись общей длиной выполните следующую команду:

    # rbd bench-write block-device1 --io-total 5368709200
    
    	[root@ceph-client1 ~]# rbd bench-write block-device1 --io-total 5368709200 
    	bench-write  io_size 4096 io_threads 16 bytes 5368709200 pattern seq 
    	  SEC       OPS   OPS/SEC   BYTES/SEC 
    	    1     67285  67304.27  275678272.46 
    	    2    145469  72743.93  297959122.08 
    	    3    224701  74906.90  306818647.61 
    	    4    301802  75427.40  308950632.76 
    	    5    372142  74432.24  304874445.83 
    	    6    444010  75344.90  308612698.37 
    	    7    517287  74363.64  304593457.23 
    	    8    599236  74906.98  306818990.26 
    	    9    672587  74178.98  303837121.67 
    	   10    732910  72153.50  295540718.90 
    	   11    784764  68150.81  279145733.52 
    	   12    852044  66951.41  274232980.96 
    	   13    918326  63817.89  261398064.96 
    	   14    982399  61962.40  253797984.31 
    	   15   1047148  62847.78  257424494.92 
    	   16   1107514  64550.09  264397152.44 
    	   17   1163126  62216.51  254838831.07 
    	   18   1226368  61607.43  252344039.05 
    	   19   1286892  60898.32  249439520.77 
    	elapsed: 51 ops: 1310721 ops/sec: 25221.56 bytes/sec: 103307522.97 
    [root@ceph-client1 ~]# 
    	   

    Как вы можете увидеть, вывод результатов rbd bench-write хорошо форматирован.

  Как это работает...

Синтаксис rbd bench-write выглядит следующим образом:

# rbd bench-write <RBD image name>
	   
  • --io-size: размер записи в байтах; по умолчанию 4М

  • --io-threads: число потоков; по умолчанию 16

  • --io-total: общее число байт для записи; по умолчанию 1024M

  • --io-pattern <seq|rand>: шаблон записи, по умолчанию установлен seq

  Есть кое-что еще...

Для подстройки ваших размера блока, количества потоков и шаблонов ввода/ вывода вы можете применять с rbd bench-write различные параметры.

  Смотрите также...

 Эталонное тестирование Ceph RBD с применением FIO

FIO является аббревиатурой для Flexible I/O; это одно из самых популярных средств для создания рабочей нагрузки ввода/ вывода и эталонного тестирования. FIO имеет только что добавленную встроенную поддержку RBD. FIO является высоко настраиваемым и может применяться для эмуляции и эталонного тестирования практически любых видов нагрузок. В данном рецепте мы изучим то, как FIO может применяться для эталонного тестирования вашего RBD Ceph.

  Как это сделать...

Чтобы выполнить эталонное тестирование блочного устройства Ceph, нам необходимо создать некое блочное устройство и отобразить на ваш узел клиента Ceph:

  1. Установите пакет FIO на свой узел, на который вы отобразили свой образ RBD Ceph. В нашем случае это узел ceph-client1:

    # yum install -y fio
    	   
  2. Так как FIO поддерживает RBD IOengine нам не нужно монтировать образ RBD как файловую систему. Для эталонного тестирования RBD нам нужно просто предоставить имя вашего образа RBD, пул и пользователя Ceph, которые будут использоваться для соединения с кластером Ceph. Создайте профиль FIO со следующим содержанием:

    [write-4M]
    description="write test with block size of 4M"
    ioengine=rbd
    clientname=admin
    pool=rbd
    rbdname=block-device1
    iodepth=32
    runtime=120
    rw=write
    bs=4M
    
    	[root@ceph-client1 ~]# 
    	[root@ceph-client1 ~]# cat write.fio 
    	[write-4m] 
    	description="write test with block size of 4M" 
    	ioengine=rbd 
    	clientname=admin 
    	pool=rbd 
    	rbdname=block-device1 
    	iodepth=32 
    	runtime=120 
    	rw=write 
    	bs=4M 
    	[root@ceph-client1 ~]# 
    	   
  3. Для запуска эталонного тестирования FIO, выполните команду FIO, предоставив ей в качестве аргумента файл профиля FIO:

    
    # fio write.fio
    
    	[root@ceph-client1 ~]#
    	[root@ceph-client1 ~]# fio write.fio 
    	write-4M: (g=0) rw=write, bs=4M-4M/4M-4M/4M-4M, ioengine=rbd, iodepth=32 
    	fio-2.2.8 
    	Starting 1 process 
    	rbd engine: RBD version: 0.1.9 
    	Jobs: 1 (f=0): [w(1)] [100.0% done] [0K8/107.7MB/0K8 /s] [0/26/0 iops] [eta 00m:00s] 
    	write-4m: (groupid=0, jobs=1): err= 0: pid=2146255: Wed Dec 9 00:54:40 2015 
    	  Description : ["write test with block size of 4M"]  
    	  write: io=010240MB, bw=314736KB/s, ops=76, runt= 33316msec
    	    slat (usec) : min=129 , max=15181, avg=473.98, stdev=888.02 
    	    clat (msec) : min=102 , max=2949 avg=409.87, stdev=263.06 
    	     lat (msec) : min=102, max=2949 , avg=410.35 , stdev=263.06 
    	    clat percentiles (msec): 
    	     |  1.00th=[  131],  5.00th=[ 155], 10.00th=[ 180], 20.00th=[ 219],
    	     | 30.00th=[  258], 40.00th=[ 310], 50.00th=[ 351], 60.00th=[ 392],
    	     | 70.00th=[  441], 80.00th=[ 545], 90.00th=[ 693], 95.00th=[ 906],
    	     | 99.00th=[ 1369], 99.50th=[1762], 99.90th=[2409], 99.95th=[2474],
    	     | 99.99th=[ 2966]
    	  bw (KB /s): min=74908, max=568888, per=100.00%, avg=327349.43, stdev=99611.29 
    	  lat (msec) 250=27.70%, 500=47.19%, 750=17.42%, 1000=4.30%, 2000=3.20% 
    	  lat (msec) : >=2000=0.20% 
    	cpu          : usr=3.04%, sys=0.59%, ctx=268, majf=0, minf=52854
    	IO depth     : 1=0.3%, 2=1.2%, 4=4.7%, 8=19.4%, 16=68.5%, 32=5.8%, >=64=0.0%
    	   submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
    	   complete  : 0=0.0%, 4=95.9%, 8=0.1%, 16=0.8%, 32=3.3%, 64=0.0%, >=64=0.0%
    	   issued	 : total=r=0/w=2560/d=0, short=r=0/w=0/d=0, dror=r=0/w=0/d=0 
    	   latency   : target=0, window=0, percentile=100.00%, depth=32 
    	
    	Run status group 0 (all jobs):  
    	 WRITE: io=10240MB, aggrb=314736KB/s, minb=314736KB/s, maxb=314736K8/s, mint=33316msec, maxt=33316msec
    	Disk stats (read/write): 
    	    dm-0: ios=0/5, merge0/0, ticks=0/10, in_queue=10, util=0.01%, aggrios=56/5, aggrmerge=0/0, aggrticks=0/0, aggrin_gueue=0, aggrutil=0.00% 
    	    mdl: ios=56/5, merge0/0, ticks=0/0, in_queue=0, util=0.00%, aggrios=3/13, aggrmerge=24/0, aggrticks=1/6, aggrinqueue=7, aggrutil=0.01% 
    	sdbi : ios=7/13, merge=49/0, ticks=2/6, in_queue=8, util=0.01% 
    	sdbj : ios=0/13, merge=0/0 , ticks=0/6, in_queue=6, util=0.01% ] 
    	[root@ceph-client1 ~]# 
    	   
  4. По завершению FIO сгенерирует массу полезной информации которую следует тщательно изучить. Однако, на первый взгляд вас может заинтересовать IOPS и агрегированная пропускная способность, которые выделены на предыдущем экранном снимке.

  Смотрите также...

 Сокет администратора Ceph

Компоненты Ceph являются демонами и Сокетами домена UNIX (Unix domain socket, UDS, или IPC-сокетами сокетами межпроцессного взаимодействия). Ceph делает возможным для нас использовать эти сокеты для построения очередей демонов. Сокет администратора Ceph является мощным инструментом для получения и сборки настроек демона Ceph во время его выполнения. С применением этого инструмента изменение значений настроек демона становится намного проще даже в сравнении с изменением вашего файла настроек Ceph, который требует перезапуска демона.

Чтобы выполнить это, нам необходимо зарегистрироваться на нашем узле, выполняющем демонов Ceph и выполнить команды ceph daemon.

  Как это сделать...

Существует два способа доступа к вашему сокету администратора:

  • Воспользовавшись именем вашего демона Ceph:

    $ sudo ceph daemon {daemon-name} {option}
    	   
  • Используя абсолютный путь к файлу сокета; его местоположение по умолчанию такое: /var/run/ceph:

    $ sudo ceph daemon {absolute path to socket file} {option}
    	   

Теперь мы попробуем осуществить доступ к демону Ceph используя наш сокет администратора:

  1. Вывести список всех доступных вашему сокету администратора команд для OSD:

    # ceph daemon osd.0 help
    	   
  2. Вывести список всех доступных вашему сокету администратора команд для MON:

    # ceph daemon mon.ceph-node1 help
    	   
  3. Проверить установки настроек OSD для osd.0.

    # ceph daemon osd.0 config show
    	   
  4. Проверить установки настроек MON для mon.ceph-node1.

    # ceph daemon mon.ceph-node1 config show
    	   
    [Замечание]Замечание

    Ваш демон администратора Ceph позволяет вам изменять установки настроек вашего демона во время его выполнения. Однако эти изменения временные. Для изменения настроек вашего демона на постоянно, измените ваш файл настроек Ceph.

  5. Для получения текущего значения настроек для osd воспользуйтесь параметром _recover_max_chunk для демона osd.0:

    # ceph daemon osd.0 config get osd_recovery_max_chunk
    	   
  6. Чтобы изменить ваше значение osd_recovery_max_chunk для osd.0 выполните:

    # ceph daemon osd.0 config set osd_recovery_max_chunk 1000000
    	   
	[root@ceph-node1 ~]# ceph daemon osd.0 config get osd_recovery_max_chunk 
	{
		"osd_recoverymax_chunk": "8388608"
	}
	[root@ceph-node1 ~]# 
	[root@ceph-node1 ~]# ceph daemon osd.0 config set osd_recovery_max_chunk 1000000 
	{
		"success": "oscLrecoveryjnaxchunk = '1000000' "
	}
	[root@ceph-node1 ~]# 
	   

 Применение команды ceph tell

Другим эффективным способом изменения выполняющихся настроек для демона Ceph без дополнительных накладных расходов на регистрацию на этом узле является применение команды ceph tell:

  Как это сделать...

Команда ceph tell избавляет вас от затрат на регистрацию на том узле где выполняется ваш демон. Эта команда проходит через узел монитора, поэтому вы можете выполнять её с любого узла в вашем кластере:

  • Чтобы изменить установки osd_recovery_threads на ceph tell выполните:

    ceph tell osd.0 injectargs '--osd_recovery_threads=2'
    	   
  • Чтобы изменить те же установки для всех OSD по всему вашему кластеру, выполните:

    ceph tell osd.* injectargs '--osd_recovery_threads=2'
    	   
  • Также вы можете изменять множество установок в одной строке:

    ceph tell osd.* injectargs '--osd_recovery_max_active=1 --osd_recovery_max_single_start=1 --osd_recovery_op_priority=50'
    	   

  Как это работает...

Синтаксис команды ceph tell следующий:

ceph tell {daemon-type}.{id or *} injectargs --{config_setting_name} {value}
	   

 Ceph REST API

Ceph поставляется с мощным интерфейсом доступа REST API, который позволяет вам программно адимнистрировать ваш кластер. Он может работать как WSGI приложение или в качестве автономного сервера, по умолчанию прослушивая порт 5000. Он предоставляет функциональность аналогичного вида с предлагаемой инструментарием командной строки через интерфейс доступа HTTP. Команды передаются как HTTP запросы GET и PUT, а результат может возвращаться в форматах JSON, XML и текстовом. В этом рецепте я быстро покажу вам как установить Ceph REST API и как с ним взаимодействовать.

  Как это сделать...

  • Создайте в своём кластере Ceph пользователя client.restapi с соответствующим доступом к mon, osd и mds:

    # ceph auth get-or-create client.restapi mds 'allow' osd 'allow *' mon 'allow *' > /etc/ceph/ceph.client.restapi.keyring
    	   
  • Добавьте в свой файл ceph.conf следующий раздел:

    [client.restapi]
    log file = /var/log/ceph/ceph.restapi.log
    keyring = /etc/ceph/ceph.client.restapi.keyring
    	   
  • Выполните следующую команду для запуска ceph-rest-api в качестве отдельного веб-сервера в фоновом режиме:

    # nohup ceph-rest-api > /var/log/ceph-rest-api &> /var/log/cephrest-api-error.log &
    	   
    [Замечание]Замечание

    Вы также можете выполнить ceph-rest-api без его продвижения, подавляя его в фоновый режим.

  • ceph-rest-api теперь должен прослушивать по адресу 0.0.0.0:5000; выполните curl чтобы запросить ceph-rest-api жизнеспособность вашего кластера:

    # curl localhost:5000/api/v0.1/health
    	   
  • Аналогично проверьте состояние osd и mon через rest-api Чтобы изменить установки osd_recovery_threads на ceph tell выполните:

    # curl localhost:5000/api/v0.1/osd/stat
    # curl localhost:5000/api/v0.1/mon/stat
    
    	[root@ceph-node1 ~]# nohup ceph-rest-api > /var/log/ceph-rest-api &> /var/log/ceph-rest-api-error.log & 
    	[1] 3334321 
    	[root@ceph-node1 ~]# 
    	[root@ceph-node1 ~]# curl localhost:5000/api/v0.1/health 
    	HEALTH_OK 
    	[root@ceph-node1 ~]# 
    	[root@ceph-node1 ~]# curl localhost:5000/api/v0.1/osd/stat 
    	     osdmap e989: 9 olds: 9 up, 9 in 
    	[root@ceph-node1 ~]# 
    	[root@ceph-node1 ~]# curl localhost:5000/api/v0.1/mon/stat 
    	e5: 3 mons at {ceph-node1.192.168.1.101:6789/0,ceph-node2=192.168.1.102:6789/0,ceph-node3=192.168.1.103:6789 /0}, election epoch 3648, quorum 0,1,2 ceph-node1,ceph-node2,ceph-node3 
    	[root@ceph-node1 ~]# 
    	   
  • ceph-rest-api поддерживает большинство команд CLI Ceph. Чтобы проверить перечень доступных ceph-rest-api команд выполните:

    # curl localhost:5000/api/v0.1
    	   
    [Замечание]Замечание

    Эта команда вернёт результаты в формате HTML; вам будет лучше зайти через свой веб- браузер на localhost:5000/api/v0.1 для выстраивания вашего HTML в читаемый вид.

Это базовая реализация ceph-rest-api. Для применения её в промышленной реализации хорошей мыслью будет развернуть её болеечем в одном экземпляре в виде приложения WSGI обёрнутого веб- сервером и с балансровкой нагрузки на входе. ceph-rest-api является масштабируемой, обладающей малым весом службой, которая делает возможным для вас администрировать вашим кластером Ceph на уровне профессионала.

 Профилирование памяти Ceph

Профилирование памяти является процессом динамичного программного анализа с целью определения потребления программами оперативной памяти и выявления способов её оптимизации. В этом рецепте мы обсудим как вы можете применять профилировщики памяти на демонах Ceph для исследования памяти.

  Как это сделать...

  • Запустите профилировщик памяти для определённого демона:

    # ceph tell osd.0 heap start_profiler
    	   
    [Замечание]Замечание

    Для автоматического запуска профилировщика при старте этого демона OSD ceph установите соответствующее значение переменной окружения CEPH_HEAP_PROFILER_INIT=true.

  • Неплохо будет оставить профилировщик работающим на несколько часов чтобы он смог по возможности собрать как можно больше информации, относящейся к отпечаткам памяти. В это же время вы можете создать некоторую нагрузку на свой кластер.

  • Далее выведите статистики кучи о собранных профилировщиком отпечатках памяти:

    # ceph tell osd.0 heap stats
    
    	[root@ceph-node1 ~]# ceph tell osd.0 heap start_profiler 
    	osd.0 started profiler 
    	[root@ceph-node1 ~]# 
    	[root@ceph-node1 ~]# ceph tell osd.0 heap stats 
    	osd.0 tcmalloc heap stats:------------------------------------------------
    	MALLOC:      238029520 (  227.0 MiB) Bytes in use by application 
    	MALLOC: +            0 (    0.0 MiB) Bytes in page heap freelist
    	MALLOC: +     13789912 (   13.2 MiB) Bytes in central cache freelist
    	MALLOC: +      4454720 (    4.2 MiB) Bytes in transfer cache freelist
    	MALLOC: +     28537112 (   27.2 MiB) Bytes in thread cache freelists
    	MALLOC: +      2863264 (    2.7 MiB) Bytes in malloc metadata
    	MALLOC:   ------------
    	MALLOC: =    287674528 (  274.3 MiB) Actual memory used (physical + swap)
    	MALLOC: +      2031616 (    1.9 MiB) Bytes released to OS (aka unmapped)
    	MALLOC:   ------------
    	MALLOC:      289706144 (  276.3 MiB) Virtual address space used
    	MALLOC: 
    	MALLOC:          13148              Spans in use
    	MALLOC:            424              Thread heaps in use
    	MALLOC:           8192              Tcmalloc page size 
    	------------------------------------------------
    	Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()). 
    	Bytes released to the OS take up virtual address space but no physical memory. 
    	[root@ceph-node1 ~]# 
    	   
  • Вы также можете сделать дамп статистик кучи в файл, который может быть использован позже; по умолчанию он создаётся в файле дампа /var/log/ceph/osd.0.profile.0001.heap:

    # ceph tell osd.0 heap dump
    
    	[root@ceph-node1 ~]# ceph tell osd.0 heap dump 
    	osd.0 dumping heap profile now. 
    	------------------------------------------------
    	MALLOC:      238031808 (  227.0 MiB) Bytes in use by application
    	MALLOC: +            0 (    0.0 MiB) Bytes in page heap freelist
    	MALLOC: +     13589456 (   13.0 MiB) Bytes in central cache freelist
    	MALLOC: +      4258112 (    4.1 MiB) Bytes in transfer cache freelist
    	MALLOC: +     28964656 (   27.6 MiB) Bytes in thread cache freelists
    	MALLOC: +      2863264 (    2.7 MiB) Bytes in malloc metadata
    	MALLOC:   ------------
    	MALLOC: =    287707296 (  274.4 MiB) Actual memory used (physical + swap)
    	MALLOC: +      1998848 (    1.9 MiB) Bytes released to OS (aka unmapped)
    	MALLOC:   ------------
    	MALLOC: =    289706144 (  276.3 MiB) Virtual address space used
    	MALLOC: 
    	MALLOC:          13152              Spans in use
    	MALLOC:            424              Thread heaps in use
    	MALLOC:           8192              Tcmalloc page size 
    	------------------------------------------------
    	Call ReleaseFreeMemory() to release freelist memory to the OS (via madvise()). 
    	Bytes released to the OS take up virtual address space but no physical memory. 
    	[root@ceph-node1 ~]# 
    	   
  • Чтобы прочитать этот файл дампа вам понадобится google-perftools:

    # yum install -y google-perftools
    	   
  • Для просмотра журналов профайлера:

    # pprof --text {path-to-daemon} {log-path/filename}
    # pprof --text /usr/bin/ceph-osd /var/log/ceph/osd.0.profile.0001.heap
    	   
  • Для гранулированного сравнения сгенерируйте несколько файлов дампов профайлера для одного и того жедемона и примените инструмент профайлера Google для их сравнения:

    # pprof --text --base /var/log/ceph/osd.0.profile.0001.heap /usr/bin/ceph-osd /var/log/ceph/osd.0.profile.0002.heap
    	   
  • Освободите память, которую выделил TCMALLOC, однако она не используется Ceph:

    # ceph tell osd.0 heap release
    	   
  • По завершению остановите профайлер:

    # ceph tell osd.0 heap stop_profiler
    	   

Процессы демонов Ceph достаточно зрелые, и скорее всего вам не понадобятся профайлеры памяти для анализа, если только вы не столкнётесь с ошибкой, которая вызывает утечки памяти. Вы можете применять обсуждавшуюся ранее процедуру для вычисления проблем памяти в демонах Ceph.

 Развёртывание Ceph с применением Ansible

В этой книге мы уже обсудили развёртывание Ceph множеством способов, которые включают Ceph-deploy и Virtual Storage Manager (VSM, Менеджер виртуальных хранилищ). Оба этих метода требуют ручной установки и настройки вашего кластера Ceph. Однако существуют и другие инструменты и методы которые могут устанавливать и развёртывать Ceph для вас высоко автоматизированным образом. При помощи таких методов вам большене понадобится набирать докучливые команды для развёртывания Ceph; по вашему желанию инструменты управления настройкой, такие как Ansible, Puppet, Chef и прочие могут настраивать ваш кластер Ceph.

  Приготовление

В этом рецепте мы пройдем сквозь Ansible, который является очень простым инструментом автоматизации ИТ и управления настройкой; для дополнительной информации окиньте взглядом http://www.ansible.com/how-ansible-works. Экосистема Ceph имеет живое сообщество вокруг него, которое разрабатывает готовые к применению модули Ansible для Ceph. Мы будем применять эти модули ceph-ansible (отсылаем к https://github.com/ceph/ceph-ansible) для развёртывания вашего кластера Ceph с помощью Ansible.

  Как это сделать...

Существует два способа которыми вы можете развернуть Ceph с применением модулей ceph-ansible:

  • Применить модуль ceph-ansible для первого запуска нескольких виртуальных машин с применением Vagrent и VirtualBox/VMware, а затем установить и настроить Ceph с помощью Ansible.

  • Применить модуль ceph-ansible для установки и настройки кластера Ceph с применением сборников сценариев Ansible на машинах голого железа.

В этом рецепте мы применим первый метод, то есть применим модуль ceph-ansible для запуска виртуальных машин VirtualBox и Ansible для установки и развёртывания вашего кластера Ceph.

[Замечание]Замечание

Модули ceph-ansible являются местом средоточения сообщества и достаточно зрелые для вас чтобы вы могли использовать их для развёртывания Ceph в промышленном применении. Я хотел бы дать высокую оценку сообществу ceph-ansible за великолепно проделанную работу в разработке, совершенствовании и поддержке модулей ceph-ansible.

  • На своей машине хоста VirtualBox клонируйте Git самый последний модуль ceph-ansible:

    $ git clone https://github.com/ceph/ceph-ansible.git
    $ cd ceph-ansible
    	   
  • ceph-ansible использует Vagrant. Для этой цели он поставляется вместе с Vagrantfile, который сообщает Vagrant как раскручивать ВМ. Этот файл требует некоторых переменных, которые определены в другом файле: vagrant_variables.yml. Модуль ceph-ansible приходит с vagrant_variables.yml.sample, который может быть использован напрямую с минимальными изменениями:

    $ cp vagrant_variables.yml.sample vagrant_variables.yml
    	   
  • Настройки по умолчанию для Vagrant определены в vagrant_variables.yml и тоже достаточно хороши. Если вы пожелаете, вы можете подстроить конфигурацию отредактировав этот файл. Поскольку это тестовый кластер, мы уменьшим число мониторов с 3 до 1 изменив переменную mon_vms на значение 1.

  • Модуль ceph-ansible принуждает Vagrant использовать Ansible как своего снабженца; для этой цели скопируйте файл site.yml.sample под именем site.yml в ту же иерархию:

    $ cp site.yml.sample site.yml
    	   
  • Наконец, мы выполним vagrant up, который запустит 4 ВМ (1 монитор Ceph и 3 OSD Ceph), а после этого он запустит установку и развёртывание Ceph при помощи инструмента управления настройкой, Ansible:

    $ vagrant up
    	   
  • Предоставление ВМ и развёртывание Ceph займут несколько минут; после завершения вы должны увидеть примерно вот это:

    	PLAY RECAP ******************************************************************** 
    	mon0                     : ok=82   changed=15   unreachable=0    failed=0 
    	osd0                     : ok=67   changed=9    unreachable=0    failed=0 
    	osdl                     : ok=67   changed=9    unreachable=0    failed=0 
    	osd2                     : ok=67   changed=9    unreachable=0    failed=0 
    
    	   
  • После успешного завершения вы закончите с работающим кластером Ceph, установленным и настроенным при помощи Ansible. Зарегистрируйтесь на своём узле mon0 и проверьте состояние вашего кластера:

    $ vagrant ssh mon0
    $ sudo ceph -s
    
    	vagrant@ceph-mon0:-$ sudo ceph -s 
    	    cluster 4a158d27-f750-41d5-9e7f-26ce4c9d2d45 
    	     health HEALTH_OK 
    	     monmap el: 1 mons at {ceph-mon0=192.168.42.10:6789/0} 
    	            election epoch 2, quorum 0 ceph-mon0 
    	     mdsmap e2: 0/0/1 up 
    	     osdmap e21: 6 osds: 6 up, 6 in 
    	            flags sortbitwise 
    	      pgmap v27: 320 pgs, 3 pools, 0 bytes data, 0 objects 
    	            212 MB used, 65121 MB / 65333 MB avail 
    	                 320 active+clean 
    	vagrant@ceph-mon0:-S 
    	   

  Есть кое-что еще...

Сборка Vagrant может быть удалена при помощи vagrant destroy -f и повторно создана в любое время в течение нескольких минут автоматизированным, интеллектуальным образом. Вы можете отметить как просто, быстро и бесшовно было выполнено это развёртывание Ceph в сравнении с ручным. Для промышленного применения следует на самом деле рассматривать инструменты управления настройкой, подобные Ansible, для развёртывания Ceph для сохранения всех узлов в том же состоянии с точки зрения настройки. К тому же они очень удобны для управления большими кластерами с несколькими десятками узлов.

 Инструментарий ceph-objectstore

Одной из ключевых особенностей Ceph является её качества самовосстановления и самоизлечения. Ceph делает это благодаря сохранению множества копий групп размещения по различным OSD и гарантирует очень высокую вероятность что вы никогда не потеряете свои данные. В очень редких случаях вы можете наблюдать отказы множества OSD, при которых одна или более реплик PG находятся на отказавшем OSD и состояние PG становится уязвимым, что ведёт к ошибкам в жизнеспособности кластера. Для гранулированного восстановления Ceph предоставляет инструмент восстановления низкого уровня групп размещения и данных объекта, называемый ceph-objectstore-tool

  Как это сделать...

ceph-objectstore-tool может быть рискованной операцией и команда обязаны выполняться либо пользователем root, либо с sudo. Не пытайтесь делать это на вашем промышленном кластере без привлечения поддержки Red Hat Ceph Storage, если вы не уверены в том, что вы делаете. Это может вызвать необратимую потерю данных в вашем кластере.

  • Найдите незавершённую группу размещения в вашем кластере Ceph. Примените следующую команду и получите идентификатор вашей PG и её наборы действия:

    # ceph health detail | grep incomplete
    	   
  • С помощью действующего набора определите местоположение хоста OSD:

    # ceph osd find <osd_number>
    	   
  • Зарегистрируйтесь на этом узле OSD и остановите OSD с которым вы собираетесь работать:

    # service ceph stop <osd_ID>
    	   

Следующиеразделы описывают функции с вашими OSD и группами размещения, которые вы можете применять с ceph-objectstore-tool:

  • Для идентификации ваших объектов в пределах OSD выполните следующее. Инструмент выдаст все объекты безотносительно от их групп размещения:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --op list
    	   
  • Чтобы идентифицировать ваш объект внутри группы размещения выполните:

    # ceph-objectstore-tool --data-path >/path/to/osd> --journal-path >/path/to/journal> --pgid <pgid> --op list
    	   
  • Для вывода перчня групп размещения, хранящихся на некоем OSD выполните:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --op list-pgs
    	   
  • Если вы знаете идентификатор объекта который вы ищете, задайте его для определения идентификатора его PG:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --op list <object-id>
    	   
  • Извлеките информацию об определённой группе размещения:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --pgid <pg-id> --op info
    	   
  • Извлеките журнал операций в группе размещения:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --pgid <pg-id> --op log
    	   

Удаление группы размещения является рискованной операцией и может вызвать потерю данных; применяйте эту функциональность с предосторожностью. Если вы разрушите группу размещения в OSD это не допустит одноранговый обмен или запуск службы OSD, перед удалением вашей группы размещения убедитесь что у вас имеется рабочая копия группы размещения на другом OSD. В качестве предосторожности перед удалением вашей PG вы можете также сделать резервную копию этой группы размещения экспортировав её в файл:

  • Для удаления группы размещения выполните следующую команду:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --pgid <pg-id> --op remove
    	   
  • Для экспорта группы размещения в файл выполните следующую команду:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --pgid <pg-id> --file /path/to/file --op export
    	   
  • Для импорта группы размещения из файла выполните следующую команду:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --file </path/to/file> --op import
    	   
  • OSD может иметь объект, помеченный как "lost". Для вывода списка "lost" или "unfound" объектов выполните:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --op list-lost
    	   
  • Чтобы найти объекты помеченный как потерянные для отдельной группы размещения определите pgid:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --pgid <pgid> --op list-lost
    	   
  • Инструмент ceph-objectstore-tool специально используется для фиксации ваших PG утраченных объектов. OSD может иметь объекты, помеченные как "lost". Для удаления этих объектов из группы размещения выполните:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --op fix-lost
    	   
  • Для фиксации потерянных объектов в определённой группе размещения определите pgid:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --pgid <pg-id> --op fix-lost
    	   
  • Если вы уверены в подлинности потерянного объекта, который вы хотите фиксировать, определите идентификатор этого объекта:

    # ceph-objectstore-tool --data-path </path/to/osd> --journal-path </path/to/journal> --op fix-lost <object-id>
    	   

  Как это работает...

Синтаксис для ceph-objectstore-tool следующий: ceph-objectstore-tool <options>.

Значения для <options> могут быть следующими:

  • --data-path: путь к вашему OSD

  • --journal-path: путь к вашему журналу

  • --op: операция

  • --pgid: идентификатор группы размещения

  • --skip-journal-replay: применяйте в случае разрушения вашего журнала

  • --skip-mount-omap: применяйте когда ваш leveldb хранимых данных разрушен и не может быть смонтирован

  • --file: путь к вашему файлу, применяется с операцией импорта/ экспорта

Для лучшего понимания этого инструмента, давайте рассмотрим пример: пулимеет две копии объекта и PG размещаются в osd.1 и osd.2. На данный момент, если случится отказ, произойдёт следующая последовательность:

  1. osd.1 отключается.

  2. osd.2 обрабатывает все операции записи в деградированном состоянии.

  3. osd.1 возвращается и выполняет одноранговый обмен с osd.2 для репликации данных.

  4. Внезапно osd.2 отключается до выполнения репликации всех необходимых объектов на osd.1.

  5. На данный момент у вас есть данные на osd.1, но они просрочены.

В результате поиска неисправностей вы определите, что вы можете прочитать свои данные osd.2 из файловой системы, но его служба osd не запускается. В такой ситуации вам следует применить ceph-objectstore-tool для экспорта/ извлечения данных с отказавшего osd. ceph-objectstore-tool предоставит вам достаточные возможности для изучения, модификации и извлечения данных объекта и метаданных.

[Замечание]Замечание

Вам следует избегать применения средств Linux подобных cp и rsync для восстановления данных с отказавшего OSD, поскольку эти инструменты не примут во внимание все необходимые метаданные и восстановленные объекты могут быть неиспользуемыми.

Наконец, мы достигли конца этойглавы и вообще всей книги. Я надеюсь, что ваше путешествие по Книге рецептов Ceph было информативным. Вы должныбыли изучить некоторые концепции Ceph, которые снабдят вас достаточной уверенностью для работы со своим кластером Ceph в вашем окружении. Наши поздравления! Сейчас вы достигли следующего уровня в Ceph.

Продолжайте Изучение, Продолжайте исследования, Продолжайте совместное применение...

Ура!