Ceph - dari "berlutut" ke "produksi"

Memilih CEPH. Bagian 1

Kami memiliki lima rak, sepuluh sakelar optik, BGP yang dikonfigurasi, beberapa lusin SSD dan sekumpulan disk SAS dengan berbagai warna dan ukuran, serta proxmox dan keinginan untuk memasukkan semua data statis ke dalam penyimpanan S3 kami sendiri. Bukan berarti semua ini diperlukan untuk virtualisasi, tetapi begitu Anda mulai menggunakan opensource, ikuti hobi Anda sampai akhir. Satu-satunya hal yang mengganggu saya adalah BGP. Tidak ada orang di dunia ini yang lebih tidak berdaya, tidak bertanggung jawab, dan tidak bermoral selain perutean BGP internal. Dan saya tahu bahwa kami akan segera terjun ke dalamnya.

Ceph - dari "berlutut" ke "produksi"

Tugasnya sepele - ada CEPH, tetapi tidak berfungsi dengan baik. Penting untuk melakukan “kebaikan”.
Cluster yang saya terima heterogen, disetel dengan tergesa-gesa, dan praktis tidak disetel. Ini terdiri dari dua kelompok node yang berbeda, dengan satu grid umum yang bertindak sebagai cluster dan jaringan publik. Node diisi dengan empat jenis disk - dua jenis SSD, dikumpulkan dalam dua aturan penempatan terpisah, dan dua jenis HDD dengan ukuran berbeda, dikumpulkan dalam kelompok ketiga. Masalah dengan ukuran berbeda diselesaikan dengan bobot OSD berbeda.

Pengaturannya sendiri dibagi menjadi dua bagian - penyetelan sistem operasi и penyetelan CEPH itu sendiri dan pengaturannya.

Mengupgrade OS

jaringan

Latensi tinggi memengaruhi perekaman dan penyeimbangan. Saat merekam - karena klien tidak akan menerima respons tentang perekaman yang berhasil hingga replika data di grup penempatan lain mengonfirmasi keberhasilan. Karena aturan untuk mendistribusikan replika di peta CRUSH adalah satu replika per host, jaringan selalu digunakan.

Oleh karena itu, hal pertama yang saya putuskan untuk dilakukan adalah sedikit mengubah jaringan saat ini, sekaligus mencoba meyakinkan saya untuk pindah ke jaringan terpisah.

Untuk memulainya, saya mengubah pengaturan kartu jaringan. Saya mulai dengan menyiapkan antrian:

Apa yang terjadi:

ethtool -l ens1f1

root@ceph01:~# ethtool -l ens1f1
Channel parameters for ens1f1:
Pre-set maximums:
RX:     0
TX:     0
Other:      1
Combined:   63
Current hardware settings:
RX:     0
TX:     0
Other:      1
Combined:   1
root@ceph01:~# ethtool -g ens1f1
Ring parameters for ens1f1:
Pre-set maximums:
RX:     4096
RX Mini:    0
RX Jumbo:   0
TX:     4096
Current hardware settings:
RX:     256
RX Mini:    0
RX Jumbo:   0
TX:     256
root@ceph01:~# ethtool -l ens1f1
Channel parameters for ens1f1:
Pre-set maximums:
RX:     0
TX:     0
Other:      1
Combined:   63
Current hardware settings:
RX:     0
TX:     0
Other:      1
Combined:   1

Terlihat parameter yang ada saat ini masih jauh dari maksimal. Ditingkatkan:

root@ceph01:~#ethtool -G ens1f0 rx 4096
root@ceph01:~#ethtool -G ens1f0 tx 4096
root@ceph01:~#ethtool -L ens1f0 combined 63

Dipandu oleh artikel yang bagus

https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/

menambah panjang antrian pengiriman txqueuelen dari 1000 hingga 10

root@ceph01:~#ip link set ens1f0  txqueuelen 10000

Nah, berikut dokumentasi dari ceph itu sendiri

https://ceph.com/geen-categorie/ceph-loves-jumbo-frames/

meningkat MTU hingga 9000.

root@ceph01:~#ip link set dev ens1f0  mtu 9000

Ditambahkan ke /etc/network/interfaces sehingga semua hal di atas dimuat saat startup

cat / etc / network / interfaces

root@ceph01:~# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto ens1f0
iface ens1f0 inet manual
post-up /sbin/ethtool -G ens1f0 rx 4096
post-up /sbin/ethtool -G ens1f0 tx 4096
post-up /sbin/ethtool -L ens1f0 combined 63
post-up /sbin/ip link set ens1f0  txqueuelen 10000
mtu 9000

auto ens1f1
iface ens1f1 inet manual
post-up /sbin/ethtool -G ens1f1 rx 4096
post-up /sbin/ethtool -G ens1f1 tx 4096
post-up /sbin/ethtool -L ens1f1 combined 63
post-up /sbin/ip link set ens1f1  txqueuelen 10000
mtu 9000

Setelah itu, setelah mengikuti artikel yang sama, saya mulai memutar pegangan kernel 4.15 dengan serius. Mengingat node tersebut memiliki RAM 128G, kami mendapatkan file konfigurasi untuk sysctl

kucing /etc/sysctl.d/50-ceph.conf

net.core.rmem_max = 56623104  
#Максимальный размер буфера приема данных для всех соединений  54M
net.core.wmem_max = 56623104
#Максимальный размер буфера передачи данных для всех соединений 54M
net.core.rmem_default = 56623104
#Размер буфера приема данных по умолчанию для всех соединений. 54M
net.core.wmem_default = 56623104
#Размер буфера передачи данных по умолчанию для всех соединений 54M  
# на каждый сокет
net.ipv4.tcp_rmem = 4096 87380 56623104
#Векторная (минимум, по умолчанию, максимум) переменная в файле tcp_rmem
# содержит 3 целых числа, определяющих размер приемного буфера сокетов TCP.
# Минимум: каждый сокет TCP имеет право использовать эту память по 
# факту своего создания. Возможность использования такого буфера 
# гарантируется даже при достижении порога ограничения (moderate memory pressure).
# Размер минимального буфера по умолчанию составляет 8 Кбайт (8192).
#Значение по умолчанию: количество памяти, допустимое для буфера 
# передачи сокета TCP по умолчанию. Это значение применяется взамен
# параметра /proc/sys/net/core/rmem_default, используемого другими протоколами.
# Значение используемого по умолчанию буфера обычно (по умолчанию) 
# составляет 87830 байт. Это определяет размер окна 65535 с 
# заданным по умолчанию значением tcp_adv_win_scale и tcp_app_win = 0, 
# несколько меньший, нежели определяет принятое по умолчанию значение tcp_app_win.
# Максимум: максимальный размер буфера, который может быть автоматически
# выделен для приема сокету TCP. Это значение не отменяет максимума, 
# заданного в файле /proc/sys/net/core/rmem_max. При «статическом»
# выделении памяти с помощью SO_RCVBUF этот параметр не имеет значения.
net.ipv4.tcp_wmem = 4096 65536 56623104
net.core.somaxconn = 5000    
# Максимальное число открытых сокетов, ждущих соединения.
net.ipv4.tcp_timestamps=1
# Разрешает использование временных меток (timestamps), в соответствии с RFC 1323.
net.ipv4.tcp_sack=1
# Разрешить выборочные подтверждения протокола TCP
net.core.netdev_max_backlog=5000 (дефолт 1000)
# максимальное количество пакетов в очереди на обработку, если 
# интерфейс получает пакеты быстрее, чем ядро может их обработать.
net.ipv4.tcp_max_tw_buckets=262144
# Максимальное число сокетов, находящихся в состоянии TIME-WAIT одновременно.
# При превышении этого порога – «лишний» сокет разрушается и пишется
# сообщение в системный журнал.
net.ipv4.tcp_tw_reuse=1
#Разрешаем повторное использование TIME-WAIT сокетов в случаях,
# если протокол считает это безопасным.
net.core.optmem_max=4194304
#Увеличить максимальный общий буфер-космической ALLOCATABLE
#измеряется в единицах страниц (4096 байт)
net.ipv4.tcp_low_latency=1
#Разрешает стеку TCP/IP отдавать предпочтение низкому времени ожидания
# перед более высокой пропускной способностью.
net.ipv4.tcp_adv_win_scale=1
# Эта переменная влияет на вычисление объема памяти в буфере сокета,
# выделяемой под размер TCP-окна и под буфер приложения.
# Если величина tcp_adv_win_scale отрицательная, то для вычисления размера
# используется следующее выражение:
# Bytes- bytes2в степени -tcp_adv_win_scale
# Где bytes – это размер окна в байтах. Если величина tcp_adv_win_scale
# положительная, то для определения размера используется следующее выражение:
# Bytes- bytes2в степени tcp_adv_win_scale
# Переменная принимает целое значение. Значение по-умолчанию – 2, 
# т.е. под буфер приложения отводится ¼ часть объема, определяемого переменной
# tcp_rmem.
net.ipv4.tcp_slow_start_after_idle=0
# механизм перезапуска медленного старта, который сбрасывает значение окна 
# перегрузки, если соединение не использовалось заданный период времени.
# Лучше отключить SSR на сервере, чтобы улучшить производительность 
# долгоживущих соединений.
net.ipv4.tcp_no_metrics_save=1
#Не сохранять результаты измерений TCP соединения в кеше при его закрытии.
net.ipv4.tcp_syncookies=0
#Отключить механизм отправки syncookie
net.ipv4.tcp_ecn=0
#Explicit Congestion Notification (Явное Уведомление о Перегруженности) в 
# TCP-соединениях. Используется для уведомления о возникновении «затора» 
# на маршруте к заданному хосту или сети. Может использоваться для извещения
# хоста-отправителя о необходимости снизить скорость передачи пакетов через
# конкретный маршрутизатор или брандмауэр.
net.ipv4.conf.all.send_redirects=0
# выключает выдачу ICMP Redirect … другим хостам. Эта опция обязательно
# должна быть включена, если хост выступает в роли маршрутизатора любого рода.
# У нас нет маршрутизации.
net.ipv4.ip_forward=0
#Сопсно отключение форвардинга. Мы не шлюз, докер на машинах не поднят,
# нам это не нужно.
net.ipv4.icmp_echo_ignore_broadcasts=1
#Не отвечаем на ICMP ECHO запросы, переданные широковещательными пакетами
net.ipv4.tcp_fin_timeout=10
#определяет время сохранения сокета в состоянии FIN-WAIT-2 после его
# закрытия локальной стороной. Дефолт 60
net.core.netdev_budget=600 # (дефолт 300)
# Если выполнение программных прерываний не выполняются достаточно долго,
# то темп роста входящих данных может превысить возможность ядра 
# опустошить буфер. В результате буферы NIC переполнятся, и трафик будет потерян.
# Иногда, необходимо увеличить длительность работы SoftIRQs
# (программных прерываний) с CPU. За это отвечает netdev_budget. 
# Значение по умолчанию 300. Параметр заставит процесс SoftIRQ обработать
# 300 пакетов от NIC перед тем как отпустить CPU
net.ipv4.tcp_fastopen=3
# TFO TCP Fast Open
# если и клиент и сервер имеют поддержку TFO, о которой сообщают за счет
# специального флага в TCP пакете. В нашем случае является плацебо, просто
# выглядит красиво)

Сjaringan kilau dialokasikan pada antarmuka jaringan 10Gbps terpisah ke dalam jaringan datar terpisah. Setiap mesin dilengkapi dengan kartu jaringan port ganda melanoks 10/25 Gbps, dicolokkan ke dua sakelar 10Gbps terpisah. Agregasi dilakukan menggunakan OSPF, karena pengikatan dengan laCP karena alasan tertentu menunjukkan total throughput maksimum 16 Gbps, sedangkan ospf berhasil memanfaatkan kedua puluhan pada setiap mesin. Rencana masa depan adalah memanfaatkan ROCE pada melanox ini untuk mengurangi latensi. Cara mengatur bagian jaringan ini:

  1. Karena mesin itu sendiri memiliki alamat IP eksternal di BGP, kita memerlukan perangkat lunak - (lebih tepatnya, pada saat artikel ini ditulis frr=6.0-1 ) sudah berdiri.
  2. Secara total, mesin memiliki dua antarmuka jaringan, masing-masing dengan dua antarmuka - total 4 port. Satu kartu jaringan melihat ke pabrik dengan dua port dan BGP dikonfigurasi di dalamnya, yang kedua melihat dua switch berbeda dengan dua port dan OSPF diatur di atasnya

Detail lebih lanjut tentang pengaturan OSPF: Tugas utamanya adalah menggabungkan dua tautan dan memiliki toleransi kesalahan.
dua antarmuka jaringan dikonfigurasikan menjadi dua jaringan datar sederhana - 10.10.10.0/24 dan 10.10.20.0/24

1: ens1f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
inet 10.10.10.2/24 brd 10.10.10.255 scope global ens1f0
2: ens1f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
inet 10.10.20.2/24 brd 10.10.20.255 scope global ens1f1

dimana mobil saling bertemu.

DISK

Langkah selanjutnya adalah mengoptimalkan disk. Untuk SSD saya mengubah penjadwal menjadi tidak, untuk HDD - batas waktu. Terus terang, NOOP bekerja berdasarkan prinsip “first in, first out”, yang dalam bahasa Inggris terdengar seperti “FIFO (First In, First Out).” Permintaan diantrekan saat diterima. DEADLINE lebih berorientasi pada baca, ditambah lagi proses antrian mendapat akses eksklusif ke disk pada saat operasi. Ini sempurna untuk sistem kami - lagipula, hanya satu proses yang bekerja pada setiap disk - daemon OSD.
(Mereka yang ingin mendalami penjadwal I/O dapat membacanya di sini:
http://www.admin-magazine.com/HPC/Articles/Linux-I-O-Schedulers

Mereka yang lebih suka membaca dalam bahasa Rusia: https://www.opennet.ru/base/sys/linux_shedulers.txt.html)

Dalam rekomendasi untuk menyetel Linux, disarankan juga untuk meningkatkan nr_request

nr_permintaan
Nilai nr_requests menentukan jumlah permintaan I/O yang di-buffer sebelum penjadwal I/O mengirim/menerima data ke perangkat blok, jika Anda menggunakan kartu RAID/Perangkat Blok yang dapat menangani antrian lebih besar dari apa yang I /O penjadwal diatur ke, meningkatkan nilai nr_requests dapat membantu meningkatkan keseluruhan dan mengurangi beban server ketika sejumlah besar I/O terjadi di server. Jika Anda menggunakan Deadline atau CFQ sebagai penjadwal, disarankan agar Anda menyetel nilai nr_request menjadi 2 kali nilai kedalaman antrian.

TETAPI! Warga negara sendiri, pengembang CEPH, meyakinkan kami bahwa sistem prioritas mereka bekerja lebih baik

Ceph - dari "berlutut" ke "produksi"

WBThrottle dan/atau nr_requests

WBThrottle dan/atau nr_requests
Penyimpanan file menggunakan I/O buffered untuk menulis; Hal ini membawa sejumlah keuntungan jika penyimpanan file log berada pada media yang lebih cepat. Permintaan klien diberitahukan segera setelah data ditulis ke log, dan kemudian dimasukkan ke disk data itu sendiri di lain waktu menggunakan fungsionalitas standar Linux. Hal ini memungkinkan OSD spindel memberikan latensi tulis yang serupa dengan SSD saat menulis dalam jumlah kecil. Penundaan penulisan kembali ini juga memungkinkan kernel untuk mengatur ulang permintaan I/O disk, dengan harapan dapat menggabungkan permintaan tersebut atau memungkinkan kepala disk yang ada untuk memilih jalur yang lebih optimal pada platternya. Efek akhirnya adalah Anda dapat memeras lebih banyak I/O dari setiap disk dibandingkan dengan I/O langsung atau sinkron.

Namun, masalah tertentu muncul jika volume catatan yang masuk ke cluster Ceph tertentu melebihi semua kemampuan disk yang mendasarinya. Dalam skenario ini, jumlah total operasi I/O tertunda yang menunggu untuk ditulis ke disk dapat bertambah tak terkendali dan mengakibatkan antrean I/O memenuhi seluruh disk dan antrean Ceph. Permintaan baca sangat terpengaruh karena permintaan tersebut terhenti di antara permintaan tulis, yang memerlukan waktu beberapa detik untuk dipindahkan ke disk utama.

Untuk mengatasi masalah ini, Ceph memiliki mekanisme pembatasan penulisan balik yang dibangun ke dalam penyimpanan file yang disebut WBThrottle. Ini dirancang untuk membatasi jumlah keseluruhan I/O tulis lambat yang dapat mengantri dan memulai proses flush lebih awal daripada yang terjadi secara alami karena diaktifkan oleh kernel itu sendiri. Sayangnya, pengujian menunjukkan bahwa nilai default mungkin masih tidak mengurangi perilaku yang ada ke tingkat yang dapat mengurangi dampak pada latensi baca. Penyesuaian dapat mengubah perilaku ini dan mengurangi panjang antrean tulis secara keseluruhan serta membuat dampaknya tidak terlalu parah. Namun ada trade-offnya: dengan mengurangi jumlah maksimum keseluruhan entri yang diperbolehkan untuk dimasukkan ke dalam antrian, Anda dapat mengurangi kemampuan kernel itu sendiri untuk memaksimalkan efisiensinya dalam mengurutkan permintaan yang masuk. Ada baiknya memikirkan sedikit tentang apa yang lebih Anda perlukan untuk kasus penggunaan spesifik Anda, beban kerja, dan penyesuaian agar sesuai.

Untuk mengontrol kedalaman antrian write-backlog, Anda dapat mengurangi jumlah maksimum keseluruhan operasi I/O yang belum diselesaikan menggunakan pengaturan WBThrottle, atau Anda dapat mengurangi nilai maksimum untuk operasi yang belum selesai pada tingkat blok kernel Anda sendiri. Keduanya dapat mengontrol perilaku yang sama secara efektif, dan preferensi Anda akan menjadi dasar untuk menerapkan pengaturan ini.
Perlu juga dicatat bahwa sistem prioritas operasi Ceph lebih efisien untuk kueri yang lebih pendek di tingkat disk. Dengan memperkecil keseluruhan antrean ke disk tertentu, lokasi utama antrean berpindah ke Ceph, di mana ia memiliki kontrol lebih besar terhadap prioritas operasi I/O. Perhatikan contoh berikut:

echo 8 > /sys/block/sda/queue/nr_requests

http://onreader.mdl.ru/MasteringCeph/content/Ch09.html#030202

UMUM

Dan beberapa penyesuaian kernel lagi untuk membuat mobil Anda lembut dan halus serta meningkatkan kinerja perangkat kerasnya

kucing /etc/sysctl.d/60-ceph2.conf

 kernel.pid_max = 4194303
#Дисков в каждой машине по 25, потому рассчитывали что процессов будет много
kernel.threads-max=2097152
# Тредов, естессно, тоже.
vm.max_map_count=524288
# Увеличили количество областей карты памяти процесса. 
# Как следует из документации по ядерным переменным 
# Области карты памяти используется как побочный эффект вызова
# malloc, напрямую с помощью mmap, mprotect и madvise, а также при загрузке
# общих библиотек.
fs.aio-max-nr=50000000
# Подтюним параметры input-output
# Ядро Linux предоставляет функцию асинхронного неблокирующего ввода-вывода (AIO),
# которая позволяет процессу инициировать несколько операций ввода-вывода
# одновременно, не дожидаясь завершения какой-либо из них. 
# Это помогает повысить производительность приложений, 
# которые могут перекрывать обработку и ввод-вывод.
# Параметр aio-max-nr определяет максимальное количество допустимых 
# одновременных запросов.
vm.min_free_kbytes=1048576
# минимальный размер свободной памяти который необходимо поддерживать.
# Выставлен 1Gb, чего вполне достаточно для работы операционной системы, 
# и позволяет избегать OOM Killer для процессов OSD. Хотя памяти и так
# как у дурака фантиков, но запас карман не тянет
vm.swappiness=10
# Говорим использовать своп если осталось свободным 10% памяти.
# На машинах 128G оперативы, и 10% это 12 Гигов. Более чем достаточно для работы.
# Штатный параметр в 60% заставлял тормозить систему, залезая в своп,
# когда есть еще куча свободной памяти
vm.vfs_cache_pressure=1000
# Увеличиваем со штатных 100. Заставляем ядро активнее выгружать
# неиспользуемые страницы памяти из кеша.
vm.zone_reclaim_mode=0
# Позволяет  устанавливать более или менее агрессивные подходы к
# восстановлению памяти, когда в зоне заканчивается память. 
# Если он установлен на ноль, то не происходит восстановление зоны.
# Для файловых серверов или рабочих нагрузок
# выгодно, если их данные кэшированы, zone_reclaim_mode
# оставить отключенным, поскольку эффект кэширования, 
# вероятно, будет более важным, чем местонахождение данных.
vm.dirty_ratio=20
# Процент оперативной памяти, который можно выделить под "грязные" страницы
# Вычисляли из примерного расчета: 
# В система 128 гигов памяти.
# Примерно по 20 дисков SSD, у которых в настройках CEPH указано 
# выделять под кэширование по 3G оперативы.
# Примерно по 40 дисков HDD, для которых этот параметр равен 1G
# 20% от 128 это 25.6 гигов. Итого, в случае максимальной утилизации памяти,
# для системы останется 2.4G памяти. Чего ей должно хватить чтоб выжить и дождаться
# стука копыт кавалерии - то есть пришествия DevOps который все починит.
vm.dirty_background_ratio=3
# процент системной памяти, который можно заполнить dirty pages до того,
# как фоновые процессы pdflush/flush/kdmflush запишут их на диск
fs.file-max=524288
# Ну и открытых файлов у нас,вероятно, будет сильно больше, чем указано по дефолту. 

Perendaman dalam CEPH

Pengaturan yang ingin saya bahas lebih detail:

kucing /etc/ceph/ceph.conf

osd:
journal_aio: true               # Три параметра, включающие 
journal_block_align: true       # прямой i/o
journal_dio: true               # на журнал
journal_max_write_bytes: 1073714824 # Немного растянем максимальный размер
# разово записываемой операции в журнал
journal_max_write_entries: 10000    # Ну и количество одновременных записей
journal_queue_max_bytes: 10485760000 
journal_queue_max_ops: 50000
rocksdb_separate_wal_dir: true      # Решили делать отдельный wal                                                                            
# Даже попытались выбить под это дело                                                                                                                                                                                     
# NVMe
bluestore_block_db_create: true     # Ну и под журнал отдельное устройство
bluestore_block_db_size: '5368709120 #5G'
bluestore_block_wal_create: true
bluestore_block_wal_size: '1073741824   #1G' 
bluestore_cache_size_hdd: '3221225472   # 3G' 
# большой объем оперативы позволяет 
# хранить достаточно большие объемы
bluestore_cache_size_ssd: '9663676416   # 9G' 
keyring: /var/lib/ceph/osd/ceph-$id/keyring
osd_client_message_size_cap: '1073741824 #1G'
osd_disk_thread_ioprio_class: idle
osd_disk_thread_ioprio_priority: 7
osd_disk_threads: 2 # количество тредов у демона на один диск
osd_failsafe_full_ratio: 0.95
osd_heartbeat_grace: 5
osd_heartbeat_interval: 3
osd_map_dedup: true
osd_max_backfills: 2 # количество одновременных операций заполнения на один ОСД.
osd_max_write_size: 256
osd_mon_heartbeat_interval: 5
osd_op_threads: 16
osd_op_num_threads_per_shard: 1
osd_op_num_threads_per_shard_hdd: 2
osd_op_num_threads_per_shard_ssd: 2
osd_pool_default_min_size: 1     # Особенности жадности. Очень быстро стало
osd_pool_default_size: 2         # нехватать места, потому как временное                                                                                                                                                      
# решение приняли уменьшение количество 
# реплик данных
osd_recovery_delay_start: 10.000000
osd_recovery_max_active: 2
osd_recovery_max_chunk: 1048576
osd_recovery_max_single_start: 3
osd_recovery_op_priority: 1
osd_recovery_priority: 1            # параметр регулируем по необходимости на ходу
osd_recovery_sleep: 2
osd_scrub_chunk_max: 4

Beberapa parameter yang diuji QA pada versi 12.2.12 hilang di ceph versi 12.2.2, misalnya osd_recovery_threads. Oleh karena itu, rencananya mencakup pembaruan produksi ke 12.2.12. Praktek telah menunjukkan kompatibilitas antara versi 12.2.2 dan 12.2.12 dalam satu cluster, yang memungkinkan pembaruan berkelanjutan.

Kluster uji

Tentu saja, untuk pengujian, diperlukan versi yang sama seperti dalam pertempuran, tetapi pada saat saya mulai bekerja dengan cluster, hanya versi terbaru yang tersedia di repositori. Setelah melihat, apa yang dapat Anda lihat dalam versi minor tidak terlalu besar (1393 baris dalam konfigurasi melawan 1436 di versi baru), kami memutuskan untuk mulai menguji yang baru (tetap memperbarui, mengapa menggunakan sampah lama)

Satu-satunya hal yang kami coba tinggalkan pada versi lama adalah paketnya penerapan ceph karena beberapa utilitas (dan beberapa karyawan) disesuaikan dengan sintaksisnya. Versi baru ini sangat berbeda, tetapi tidak memengaruhi pengoperasian cluster itu sendiri, dan tetap berada dalam versi tersebut 1.5.39

Karena perintah ceph-disk dengan jelas mengatakan bahwa itu sudah tidak digunakan lagi dan menggunakan perintah ceph-volume, sayang sekali, kami mulai membuat OSD dengan perintah ini, tanpa membuang waktu untuk yang sudah ketinggalan zaman.

Rencananya adalah membuat cermin dari dua drive SSD tempat kami akan menempatkan log OSD, yang, pada gilirannya, terletak di spindel SAS. Dengan cara ini kita dapat melindungi diri kita dari masalah data jika disk dengan log terjatuh.

Kami mulai membuat cluster sesuai dengan dokumentasi

kucing /etc/ceph/ceph.conf

root@ceph01-qa:~# cat /etc/ceph/ceph.conf # положили заранее подготовленный конфиг
[client]
rbd_cache = true
rbd_cache_max_dirty = 50331648
rbd_cache_max_dirty_age = 2
rbd_cache_size = 67108864
rbd_cache_target_dirty = 33554432
rbd_cache_writethrough_until_flush = true
rbd_concurrent_management_ops = 10
rbd_default_format = 2
[global]
auth_client_required = cephx
auth_cluster_required = cephx
auth_service_required = cephx
cluster network = 10.10.10.0/24
debug_asok = 0/0
debug_auth = 0/0
debug_buffer = 0/0
debug_client = 0/0
debug_context = 0/0
debug_crush = 0/0
debug_filer = 0/0
debug_filestore = 0/0
debug_finisher = 0/0
debug_heartbeatmap = 0/0
debug_journal = 0/0
debug_journaler = 0/0
debug_lockdep = 0/0
debug_mon = 0/0
debug_monc = 0/0
debug_ms = 0/0
debug_objclass = 0/0
debug_objectcatcher = 0/0
debug_objecter = 0/0
debug_optracker = 0/0
debug_osd = 0/0
debug_paxos = 0/0
debug_perfcounter = 0/0
debug_rados = 0/0
debug_rbd = 0/0
debug_rgw = 0/0
debug_throttle = 0/0
debug_timer = 0/0
debug_tp = 0/0
fsid = d0000000d-4000-4b00-b00b-0123qwe123qwf9
mon_host = ceph01-q, ceph02-q, ceph03-q
mon_initial_members = ceph01-q, ceph02-q, ceph03-q
public network = 8.8.8.8/28 # адрес изменен, естественно ))
rgw_dns_name = s3-qa.mycompany.ru # и этот адрес измен
rgw_host = s3-qa.mycompany.ru # и этот тоже
[mon]
mon allow pool delete = true
mon_max_pg_per_osd = 300 # больше трехсот плейсмент групп
# на диск не решились
# хотя параметр, естественно, зависит от количества пулов,
# их размеров и количества OSD. Иметь мало но здоровых PG
# тоже не лучший выбор - страдает точность балансировки
mon_osd_backfillfull_ratio = 0.9
mon_osd_down_out_interval = 5
mon_osd_full_ratio = 0.95 # пока для SSD дисков местом для их
# журнала является тот-же девайс что и для ОСД
# решили что 5% от диска (который сам размером 1.2Tb)
#  должно вполне хватить, и коррелирует с параметром
# bluestore_block_db_size плюс вариативность на большие 
# плейсмент группы
mon_osd_nearfull_ratio = 0.9
mon_pg_warn_max_per_osd = 520
[osd]
bluestore_block_db_create = true
bluestore_block_db_size = 5368709120 #5G
bluestore_block_wal_create = true
bluestore_block_wal_size = 1073741824 #1G
bluestore_cache_size_hdd = 3221225472 # 3G
bluestore_cache_size_ssd = 9663676416 # 9G
journal_aio = true
journal_block_align = true
journal_dio = true
journal_max_write_bytes = 1073714824
journal_max_write_entries = 10000
journal_queue_max_bytes = 10485760000
journal_queue_max_ops = 50000
keyring = /var/lib/ceph/osd/ceph-$id/keyring
osd_client_message_size_cap = 1073741824 #1G
osd_disk_thread_ioprio_class = idle
osd_disk_thread_ioprio_priority = 7
osd_disk_threads = 2
osd_failsafe_full_ratio = 0.95
osd_heartbeat_grace = 5
osd_heartbeat_interval = 3
osd_map_dedup = true
osd_max_backfills = 4
osd_max_write_size = 256
osd_mon_heartbeat_interval = 5
osd_op_num_threads_per_shard = 1
osd_op_num_threads_per_shard_hdd = 2
osd_op_num_threads_per_shard_ssd = 2
osd_op_threads = 16
osd_pool_default_min_size = 1
osd_pool_default_size = 2
osd_recovery_delay_start = 10.0
osd_recovery_max_active = 1
osd_recovery_max_chunk = 1048576
osd_recovery_max_single_start = 3
osd_recovery_op_priority = 1
osd_recovery_priority = 1
osd_recovery_sleep = 2
osd_scrub_chunk_max = 4
osd_scrub_chunk_min = 2
osd_scrub_sleep = 0.1
rocksdb_separate_wal_dir = true

# создаем мониторы
root@ceph01-qa:~#ceph-deploy mon create ceph01-q
# генерируем ключи для аутентификации нод в кластере
root@ceph01-qa:~#ceph-deploy gatherkeys ceph01-q
# Это если поштучно. Если у нас несколько машин доступны - те, которые описаны в конфиге в секции 
# mon_initial_members = ceph01-q, ceph02-q, ceph03-q
# можно запустить эти две команды в виде одной
root@ceph01-qa:~#ceph-deploy mon create-initial
# Положим ключи в указанные в конфиге места
root@ceph01-qa:~#cat ceph.bootstrap-osd.keyring > /var/lib/ceph/bootstrap-osd/ceph.keyring 
root@ceph01-qa:~#cat ceph.bootstrap-mgr.keyring > /var/lib/ceph/bootstrap-mgr/ceph.keyring 
root@ceph01-qa:~#cat ceph.bootstrap-rgw.keyring > /var/lib/ceph/bootstrap-rgw/ceph.keyring
# создадим ключ для управления кластером
root@ceph01-qa:~#ceph-deploy admin ceph01-q
# и менеджер, плагинами управлять
root@ceph01-qa:~#ceph-deploy mgr create ceph01-q

Hal pertama yang saya temukan ketika bekerja dengan versi ceph-deploy ini dengan cluster versi 12.2.12 adalah kesalahan ketika mencoba membuat OSD dengan db pada serangan perangkat lunak -

root@ceph01-qa:~#ceph-volume lvm create --bluestore --data /dev/sde --block.db /dev/md0
blkid could not detect a PARTUUID for device: /dev/md1

Memang blkid sepertinya bukan PARTUUID, jadi saya harus membuat partisi secara manual:

root@ceph01-qa:~#parted /dev/md0 mklabel GPT 
# разделов будет много, 
# без GPT их создать не получится
# размер раздела мы указали в конфиге выше = bluestore_block_db_size: '5368709120 #5G'
# Дисков у меня 20 под OSD, руками создавать разделы лень
# потому сделал цикл
root@ceph01-qa:~#for i in {1..20}; do echo -e "nnnn+5Gnw" | fdisk /dev/md0; done

Segalanya tampaknya sudah siap, kami mencoba membuat OSD lagi dan mendapatkan kesalahan berikut (yang, omong-omong, tidak direproduksi dalam pertempuran)

saat membuat OSD bertipe bluestore tanpa menentukan jalur ke WAL, tetapi menentukan db

root@ceph01-qa:~#ceph-volume lvm create --bluestore --data /dev/sde --block.db /dev/md0
stderr: 2019-04-12 10:39:27.211242 7eff461b6e00 -1 bluestore(/var/lib/ceph/osd/ceph-0/) _read_fsid unparsable uuid
stderr: 2019-04-12 10:39:27.213185 7eff461b6e00 -1 bdev(0x55824c273680 /var/lib/ceph/osd/ceph-0//block.wal) open open got: (22) Invalid argument
stderr: 2019-04-12 10:39:27.213201 7eff461b6e00 -1 bluestore(/var/lib/ceph/osd/ceph-0/) _open_db add block device(/var/lib/ceph/osd/ceph-0//block.wal) returned: (22) Invalid argument
stderr: 2019-04-12 10:39:27.999039 7eff461b6e00 -1 bluestore(/var/lib/ceph/osd/ceph-0/) mkfs failed, (22) Invalid argument
stderr: 2019-04-12 10:39:27.999057 7eff461b6e00 -1 OSD::mkfs: ObjectStore::mkfs failed with error (22) Invalid argument
stderr: 2019-04-12 10:39:27.999141 7eff461b6e00 -1  ** ERROR: error creating empty object store in /var/lib/ceph/osd/ceph-0/: (22) Invalid argumen

Terlebih lagi, jika di mirror yang sama (atau di tempat lain, pilihan Anda) Anda membuat partisi lain untuk WAL dan menentukannya saat membuat OSD, maka semuanya akan berjalan lancar (kecuali tampilan WAL terpisah, yang mungkin tidak Anda miliki. ingin).

Namun, karena rencana untuk memindahkan WAL ke NVMe masih dalam jangka panjang, praktik tersebut ternyata tidak berlebihan.

root@ceph01-qa:~#ceph-volume lvm create --bluestore --data /dev/sdf --block.wal  /dev/md0p2 --block.db /dev/md1p2

Membuat monitor, manajer, dan OSD. Sekarang saya ingin mengelompokkannya secara berbeda, karena saya berencana untuk memiliki jenis disk yang berbeda - kumpulan cepat di SSD dan kumpulan besar namun lambat di pancake SAS.

Mari kita asumsikan server memiliki 20 disk, sepuluh disk pertama adalah satu jenis, yang kedua adalah jenis lainnya.
Kartu awal, default, terlihat seperti ini:

pohon ceph osd

root@ceph01-q:~# pohon ceph osd
ID KELAS BERAT JENIS NAMA STATUS REWEIGHT PRI-AFF
-1 14.54799 akar bawaan
-3 9.09200 tuan rumah ceph01-q
0 SSD 1.00000 osd.0 naik 1.00000 1.00000
1 SSD 1.00000 osd.1 naik 1.00000 1.00000
2 SSD 1.00000 osd.2 naik 1.00000 1.00000
3 SSD 1.00000 osd.3 naik 1.00000 1.00000
4 hdd 1.00000 osd.4 naik 1.00000 1.00000
5 hdd 0.27299 osd.5 naik 1.00000 1.00000
6 hdd 0.27299 osd.6 naik 1.00000 1.00000
7 hdd 0.27299 osd.7 naik 1.00000 1.00000
8 hdd 0.27299 osd.8 naik 1.00000 1.00000
9 hdd 0.27299 osd.9 naik 1.00000 1.00000
10 hdd 0.27299 osd.10 naik 1.00000 1.00000
11 hdd 0.27299 osd.11 naik 1.00000 1.00000
12 hdd 0.27299 osd.12 naik 1.00000 1.00000
13 hdd 0.27299 osd.13 naik 1.00000 1.00000
14 hdd 0.27299 osd.14 naik 1.00000 1.00000
15 hdd 0.27299 osd.15 naik 1.00000 1.00000
16 hdd 0.27299 osd.16 naik 1.00000 1.00000
17 hdd 0.27299 osd.17 naik 1.00000 1.00000
18 hdd 0.27299 osd.18 naik 1.00000 1.00000
19 hdd 0.27299 osd.19 naik 1.00000 1.00000
-5 5.45599 tuan rumah ceph02-q
20 SSD 0.27299 osd.20 naik 1.00000 1.00000
21 SSD 0.27299 osd.21 naik 1.00000 1.00000
22 SSD 0.27299 osd.22 naik 1.00000 1.00000
23 SSD 0.27299 osd.23 naik 1.00000 1.00000
24 hdd 0.27299 osd.24 naik 1.00000 1.00000
25 hdd 0.27299 osd.25 naik 1.00000 1.00000
26 hdd 0.27299 osd.26 naik 1.00000 1.00000
27 hdd 0.27299 osd.27 naik 1.00000 1.00000
28 hdd 0.27299 osd.28 naik 1.00000 1.00000
29 hdd 0.27299 osd.29 naik 1.00000 1.00000
30 hdd 0.27299 osd.30 naik 1.00000 1.00000
31 hdd 0.27299 osd.31 naik 1.00000 1.00000
32 hdd 0.27299 osd.32 naik 1.00000 1.00000
33 hdd 0.27299 osd.33 naik 1.00000 1.00000
34 hdd 0.27299 osd.34 naik 1.00000 1.00000
35 hdd 0.27299 osd.35 naik 1.00000 1.00000
36 hdd 0.27299 osd.36 naik 1.00000 1.00000
37 hdd 0.27299 osd.37 naik 1.00000 1.00000
38 hdd 0.27299 osd.38 naik 1.00000 1.00000
39 hdd 0.27299 osd.39 naik 1.00000 1.00000
-7 6.08690 tuan rumah ceph03-q
40 SSD 0.27299 osd.40 naik 1.00000 1.00000
41 SSD 0.27299 osd.41 naik 1.00000 1.00000
42 SSD 0.27299 osd.42 naik 1.00000 1.00000
43 SSD 0.27299 osd.43 naik 1.00000 1.00000
44 hdd 0.27299 osd.44 naik 1.00000 1.00000
45 hdd 0.27299 osd.45 naik 1.00000 1.00000
46 hdd 0.27299 osd.46 naik 1.00000 1.00000
47 hdd 0.27299 osd.47 naik 1.00000 1.00000
48 hdd 0.27299 osd.48 naik 1.00000 1.00000
49 hdd 0.27299 osd.49 naik 1.00000 1.00000
50 hdd 0.27299 osd.50 naik 1.00000 1.00000
51 hdd 0.27299 osd.51 naik 1.00000 1.00000
52 hdd 0.27299 osd.52 naik 1.00000 1.00000
53 hdd 0.27299 osd.53 naik 1.00000 1.00000
54 hdd 0.27299 osd.54 naik 1.00000 1.00000
55 hdd 0.27299 osd.55 naik 1.00000 1.00000
56 hdd 0.27299 osd.56 naik 1.00000 1.00000
57 hdd 0.27299 osd.57 naik 1.00000 1.00000
58 hdd 0.27299 osd.58 naik 1.00000 1.00000
59 hdd 0.89999 osd.59 naik 1.00000 1.00000

Mari buat rak dan server virtual kita sendiri dengan blackjack dan hal lainnya:

root@ceph01-q:~#ceph osd crush add-bucket rack01 root #создали новый root
root@ceph01-q:~#ceph osd crush add-bucket ceph01-q host #создали новый хост
root@ceph01-q:~#ceph osd crush move ceph01-q root=rack01 #переставили сервер в другую стойку
root@ceph01-q:~#osd crush add 28 1.0 host=ceph02-q # Добавили ОСД в сервер
# Если криво создали то можно удалить
root@ceph01-q:~# ceph osd crush remove osd.4
root@ceph01-q:~# ceph osd crush remove rack01

Permasalahan yang kami temui di tempur cluster, ketika mencoba membuat host baru dan memindahkannya ke rak yang ada - perintah ceph osd crush pindahkan ceph01-host root=rack01 membeku, dan monitor mulai berjatuhan satu per satu. Membatalkan perintah dengan CTRL+C sederhana akan mengembalikan cluster ke dunia kehidupan.

Pencarian menunjukkan masalah ini: https://tracker.ceph.com/issues/23386

Solusinya ternyata membuang crushmap dan menghapus bagian tersebut dari sana aturan direplikasi_ruleset

root@ceph01-prod:~#ceph osd getcrushmap -o crushmap.row #Дампим карту в сыром виде
root@ceph01-prod:~#crushtool -d crushmap.row -o crushmap.txt #переводим в читаемый
root@ceph01-prod:~#vim  crushmap.txt #редактируем, удаляя rule replicated_ruleset
root@ceph01-prod:~#crushtool -c crushmap.txt  -o new_crushmap.row #компилируем обратно
root@ceph01-prod:~#ceph osd setcrushmap -i  new_crushmap.row #загружаем в кластер

Achtung: Operasi ini dapat menyebabkan penyeimbangan kembali grup penempatan antar OSD. Hal ini memang menyebabkan hal ini bagi kami, tetapi sangat kecil.

Dan hal aneh yang kami temui di cluster pengujian adalah setelah me-reboot server OSD, mereka lupa bahwa mereka telah dipindahkan ke server dan rak baru, dan kembali ke default root.
Hasilnya, setelah menyusun skema akhir di mana kami membuat root terpisah untuk drive SSD dan root terpisah untuk drive spindel, kami memasukkan semua OSD ke dalam rak dan menghapus root default. Setelah reboot, OSD mulai tetap di tempatnya.
Setelah menggali dokumentasinya nanti, kami menemukan parameter yang bertanggung jawab atas perilaku ini. Tentang dia di bagian kedua

Bagaimana kami membuat grup berbeda berdasarkan jenis disk.

Untuk memulainya, kami membuat dua root - untuk SSD dan untuk hdd

root@ceph01-q:~#ceph osd crush add-bucket ssd-root root
root@ceph01-q:~#ceph osd crush add-bucket hdd-root root

Karena server secara fisik terletak di rak yang berbeda, untuk kenyamanan kami membuat rak dengan server di dalamnya

# Стойки:
root@ceph01-q:~#ceph osd crush add-bucket ssd-rack01 rack
root@ceph01-q:~#ceph osd crush add-bucket ssd-rack02 rack
root@ceph01-q:~#ceph osd crush add-bucket ssd-rack03 rack
root@ceph01-q:~#ceph osd crush add-bucket hdd-rack01 rack
root@ceph01-q:~#ceph osd crush add-bucket hdd-rack01 rack
root@ceph01-q:~#ceph osd crush add-bucket hdd-rack01 rack
# Сервера
root@ceph01-q:~#ceph osd crush add-bucket ssd-ceph01-q host
root@ceph01-q:~#ceph osd crush add-bucket ssd-ceph02-q host
root@ceph01-q:~#ceph osd crush add-bucket ssd-ceph03-q host
root@ceph01-q:~#ceph osd crush add-bucket hdd-ceph01-q host
root@ceph01-q:~#ceph osd crush add-bucket hdd-ceph02-q host
root@ceph01-q:~#ceph osd crush add-bucket hdd-ceph02-q host

dan mendistribusikan disk menurut tipenya ke server yang berbeda

root@ceph01-q:~# Диски с 0 по 3 это SSD, находятся в ceph01-q, ставим их в сервер 
root@ceph01-q:~#  ssd-ceph01-q
root@ceph01-q:~#ceph osd crush add 0 1 host=ssd-ceph01-q
root@ceph01-q:~#ceph osd crush add 1 1 host=ssd-ceph01-q
root@ceph01-q:~#ceph osd crush add 2 1 host=ssd-ceph01-q
root@ceph01-q:~#ceph osd crush add 3 1 host=ssd-ceph01-q
root-ceph01-q:~# аналогично с другими серверами

Setelah menyebarkan disk di antara rute ssd-root dan hdd-root, kami membiarkan root-default kosong, sehingga kami dapat menghapusnya

root-ceph01-q:~#ceph osd crush remove default

Selanjutnya kita perlu membuat aturan distribusi yang akan kita ikat ke pool yang sedang dibuat - dalam aturan kita akan menunjukkan root mana yang dapat menempatkan data pool kita dan tingkat keunikan replikanya - misalnya replika harus berada di server yang berbeda, atau di rak yang berbeda (Anda bahkan bisa di akar yang berbeda, jika kami memiliki distribusi seperti itu)

Sebelum memilih jenis, ada baiknya membaca dokumentasi:
http://docs.ceph.com/docs/jewel/rados/operations/crush-map/#crushmaprules

root-ceph01-q:~#ceph osd crush rule create-simple rule-ssd ssd-root host firstn
root-ceph01-q:~#ceph osd crush rule create-simple rule-hdd hdd-root host firstn
root-ceph01-q:~# Мы указали два правила, в которых данные реплицируются 
root-ceph01-q:~# между хостами - то есть реплика должна лежать на другом хосте,
root-ceph01-q:~# даже если они в одной стойке
root-ceph01-q:~# В продакшене, если есть возможность, лучше распределить хосты
root-ceph01-q:~# по стойкам и указать распределять реплики по стойкам:
root-ceph01-q:~# ##ceph osd crush rule create-simple rule-ssd ssd-root rack firstn

Ya, kami membuat kumpulan di mana kami ingin menyimpan gambar disk virtualisasi kami di masa depan - PROXMOX:

    root-ceph01-q:~# #ceph osd pool create {NAME} {pg_num}  {pgp_num}
root-ceph01-q:~# ceph osd pool create ssd_pool 1024 1024 
root-ceph01-q:~# ceph osd pool create hdd_pool 1024 1024

Dan kami memberi tahu kumpulan ini aturan penempatan apa yang harus digunakan

 root-ceph01-q:~#ceph osd crush rule ls # смотрим список правил
root-ceph01-q:~#ceph osd crush rule dump rule-ssd | grep rule_id #выбираем ID нужного
root-ceph01-q:~#ceph osd pool set ssd_pool crush_rule 2

Pilihan jumlah grup penempatan harus didekati dengan visi yang sudah ada sebelumnya untuk cluster Anda - kira-kira berapa banyak OSD yang akan ada di sana, berapa jumlah data (sebagai persentase dari total volume) yang akan ada di kumpulan, berapa jumlah total data.

Secara total, disarankan untuk tidak memiliki lebih dari 300 grup penempatan pada disk, dan akan lebih mudah untuk menyeimbangkan dengan grup penempatan kecil - yaitu, jika seluruh kumpulan Anda memakan 10 Tb dan memiliki 10 PG di dalamnya - maka seimbangkan dengan melempar batu bata terabyte (pg) akan menjadi masalah - menuangkan pasir dengan butiran pasir ukuran kecil ke dalam ember lebih mudah dan merata).

Namun kita harus ingat bahwa semakin besar jumlah PG, semakin banyak sumber daya yang dihabiskan untuk menghitung lokasinya - memori dan CPU mulai digunakan.

Pemahaman kasar mungkin berikan aku kalkulator, disediakan oleh pengembang dokumentasi CEPH.

Daftar bahan:

https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data
http://www.admin-magazine.com/HPC/Articles/Linux-I-O-Schedulers
http://onreader.mdl.ru/MasteringCeph/content/Ch09.html#030202
https://tracker.ceph.com/issues/23386
https://ceph.com/pgcalc/

Sumber: www.habr.com

Tambah komentar