Ceph - de "en la rodilla" a "producción"

Elección de CEPH. Parte 1


Teníamos cinco bastidores, diez interruptores ópticos, BGP configurado, un par de docenas de SSD y un montón de discos SAS de todos los colores y tamaños, así como proxmox y el deseo de poner toda la estática en nuestro propio almacenamiento S3. No es que todo esto fuera necesario para la virtualización, pero una vez que comenzaste a usar código abierto, ve a tu pasatiempo hasta el final. Lo único que me molestó fue BGP. No hay nadie en el mundo más indefenso, irresponsable e inmoral que el enrutamiento interno de BGP. Y sabía que muy pronto nos sumergiríamos en eso.



La tarea era común: había CEPH, no funcionaba muy bien. Era necesario hacerlo "bien".
El grupo que obtuve era heterogéneo, agitado y prácticamente sin sintonizar. Consistía en dos grupos de nodos diferentes, con una cuadrícula común que desempeña el papel de clúster y red pública. Los nodos estaban empaquetados con cuatro tipos de discos: dos tipos de SSD, ensamblados en dos reglas de colocación separadas y dos tipos de HDD de diferentes tamaños, ensamblados en un tercer grupo. El problema con diferentes tamaños fue resuelto por diferentes pesos OSD.


La configuración en sí se dividió en dos partes: sintonizar el sistema operativo y sintonizar el CEPH y sus configuraciones.


OS de nivelación


Red


La alta latencia afectó tanto al grabar como al equilibrar. Al grabar, porque el cliente no recibe una respuesta sobre la grabación exitosa hasta que las réplicas de datos en otros grupos de ubicación confirman el éxito. Como las reglas para distribuir réplicas en el mapa CRUSH teníamos una réplica por host, la red siempre se usaba.


Por lo tanto, lo primero que decidí fue configurar ligeramente la red actual, mientras intentaba convencerme de pasar a redes separadas.


Para comenzar, cambió la configuración de las tarjetas de red. Comenzó configurando colas:


lo que fue:


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 

Se puede ver que los parámetros actuales están lejos de los máximos. Aumentado:


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

Guiado por un excelente artículo


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


aumentó la longitud de la cola de despacho de txqueuelen de 1000 a 10,000


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

Bueno, siguiendo la documentación de ceph mismo


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


aumentó MTU a 9000.


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

Se agregó a / etc / network / interfaces, para que todo lo anterior se cargue al inicio


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 

Después de lo cual, siguiendo el mismo artículo, comenzó a enrollar cuidadosamente los mangos del kernel 4.15. Teniendo en cuenta que en los nodos de RAM 128G, tenemos un cierto archivo de configuración para sysctl


cat /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- bytes\2  -tcp_adv_win_scale #  bytes –     .   tcp_adv_win_scale # ,       : # Bytes- bytes\2  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 .     ,  #  ) 

Con la red lustre, se asignó en interfaces de red de 10 Gbps separadas a una red plana separada. Las tarjetas de red de doble puerto Mellanox 10/25 Gbps enviadas en dos conmutadores separados de 10 Gbps se entregaron en cada máquina. La agregación se realizó utilizando OSPF, ya que la unión con lacp por alguna razón mostró un ancho de banda total de un máximo de 16 Gbps, mientras que ospf utilizó con éxito las dos docenas en cada máquina. Los planes futuros eran utilizar ROCE en estos melanoxes para reducir la latencia. Cómo configurar esta parte de la red:


  1. Dado que las propias máquinas tienen IP externas en BGP, necesitamos software - (o más bien, al momento de escribir esto, era frr = 6.0-1 ) ya estaba en pie.
  2. En total, las máquinas tenían dos interfaces de red con dos interfaces: un total de 4 puertos. Una tarjeta de red miró a la fábrica con dos puertos y BGP se configuró en ella, la segunda, en dos puertos, miró a dos conmutadores diferentes y OSPF se configuró en ella.

Detalles de configuración de OSPF: la tarea principal es agregar dos enlaces y tener tolerancia a fallas.
dos interfaces de red están configuradas en dos redes planas simples: 10.10.10.0/24 y 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 

por el cual los autos se ven.


DISCO


El siguiente paso fue optimizar el rendimiento de los discos. Para SSD cambié el planificador a noop , para HDD - fecha límite . Si más o menos, entonces NOOP funciona según el principio de "quién se levantó primero y zapatillas", que en inglés suena como "FIFO (Primero en entrar, Primero en salir)". Las solicitudes se ponen en cola a medida que están disponibles. DEADLINE es más de solo lectura, además el proceso desde la cola obtiene acceso casi exclusivo al disco en el momento de la operación. Esto es excelente para nuestro sistema: después de todo, solo un proceso funciona con cada disco: el demonio OSD.
(Aquellos que deseen sumergirse en el programador de E / S pueden leer sobre esto aquí:
http://www.admin-magazine.com/HPC/Articles/Linux-IO-Schedulers


Prefiere leer en ruso: https://www.opennet.ru/base/sys/linux_shedulers.txt.html )


En las recomendaciones para ajustar Linux, se recomienda aumentar también nr_request


nr_requests
El valor de nr_requests determina la cantidad de solicitudes de E / S que se almacenan en el búfer antes de que el planificador de E / S envíe / reciba datos al dispositivo de bloque, si está utilizando una tarjeta RAID / Dispositivo de bloque que puede manejar una cola más grande de lo que el I El programador / O está configurado en, aumentar el valor de nr_requests puede ayudar a mejorar y reducir la carga del servidor cuando se producen grandes cantidades de E / S en el servidor. Si usa Deadline o CFQ como planificador, se sugiere que establezca el valor nr_request en 2 veces el valor de la profundidad de la cola.

PERO! Los ciudadanos mismos son los desarrolladores de CEPH que nos convencen de que su sistema de prioridad funciona mejor



WBThrottle y / o nr_requests
WBThrottle y / o nr_requests
El almacenamiento de archivos usa E / S almacenadas para escribir; Esto trae una serie de beneficios si el registro de almacenamiento de archivos está en medios más rápidos. Las solicitudes de los clientes se notifican tan pronto como los datos se escriben en el registro, y luego se transfieren al disco de datos en un momento posterior utilizando la funcionalidad estándar de Linux. Esto hace posible que los discos de husillo OSD proporcionen latencias de escritura similares a las SSD al escribir en paquetes pequeños. Esta escritura retrasada retrasada también permite que el núcleo reconstruya las solicitudes de E / S en el disco con la esperanza de fusionarlas o permitir que los cabezales de los discos existentes elijan una ruta más óptima en la parte superior de sus placas. El efecto final es que puede exprimir un poco más de E / S de cada disco de lo que sería posible con E / S directa o sincrónica.

Sin embargo, surge un cierto problema si el volumen de registros entrantes en un grupo Ceph dado está por delante de todas las capacidades de los discos subyacentes. En tal escenario, el número total de E / S pendientes de escritura pendiente en un disco puede crecer sin control y resultar en una cola de operaciones de E / S que llenan todo el disco y las colas Ceph. Las solicitudes de lectura funcionan especialmente mal, ya que se atascan entre las solicitudes de escritura, que pueden tardar varios segundos en vaciarse en el disco principal.


Para vencer este problema, Ceph tiene un mecanismo de aceleración de reescritura llamado WBThrottle integrado en el almacenamiento de archivos. Está diseñado para limitar la cantidad total de operaciones de E / S de escritura pendientes que se pueden poner en cola y comenzar su proceso de reinicio antes de lo que sucedería naturalmente debido a la inclusión del núcleo mismo. Desafortunadamente, las pruebas demuestran que los valores predeterminados pueden no reducir el comportamiento existente a un nivel que puede reducir este efecto en la latencia de las operaciones de lectura. El ajuste puede cambiar este comportamiento y reducir la longitud total de las colas de grabación y hacer que tal impacto no sea fuerte. Sin embargo, existe una compensación: al reducir el número máximo total de entradas que se pueden poner en cola, puede reducir la capacidad del núcleo para maximizar su eficiencia al ordenar las solicitudes entrantes. Vale la pena pensar un poco que necesita más para su aplicación específica, cargas de trabajo y ajustes para adaptarse a ellos.


Para controlar la profundidad de una cola de escritura pendiente, puede reducir el número máximo total de operaciones de E / S fallidas utilizando la configuración de WBThrottle, o disminuir el valor máximo para operaciones fallidas en el nivel de bloque de su núcleo. Tanto eso como otro pueden controlar efectivamente el mismo comportamiento y son sus preferencias las que serán la base para la implementación de esta configuración.
También se debe tener en cuenta que la prioridad de operación del sistema Ceph es más eficiente para consultas más cortas a nivel de disco. Al reducir la cola general a un disco dado, la ubicación de la cola principal se mueve a Ceph, donde tiene más control sobre qué prioridad tiene la operación de E / S. Considere el siguiente ejemplo:


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

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


COMÚN


Y algunas configuraciones de kernel más para hacer tu auto es suave y sedoso exprimir un poco más de rendimiento de hierro


cat /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 #      ,,   ,    . 

Bucear en CEPH


Configuración en la que me gustaría quedarme con más detalle:


cat /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 

Faltan algunos parámetros que se probaron en QA en la versión 12.2.12 en ceph versión 12.2.2, por ejemplo, osd_recovery_threads. Por lo tanto, los planes incluyeron una actualización del producto a 12.2.12. La práctica ha demostrado compatibilidad en un grupo de versiones 12.2.2 y 12.2.12, lo que permite una actualización continua.


Grupo de prueba


Naturalmente, para probar era necesario tener la misma versión que en la batalla, pero cuando comencé a trabajar con el clúster en el repositorio solo había una nueva. Al ver que puede ver en la versión menor no muy grande ( 1393 líneas en configuraciones versus 1436 en la nueva versión), decidimos comenzar a probar una nueva (todavía está actualizada, ¿por qué ir a la basura vieja?)


Lo único que intentaron dejar la versión anterior es el paquete ceph-deploy, ya que parte de las utilidades (y parte de los empleados) se agudizó por su sintaxis. La nueva versión era bastante diferente, pero no afectaba el funcionamiento del clúster en sí, y las versiones 1.5.39 la dejaron


Dado que el comando ceph-disk dice claramente que está en desuso y utiliza, querido, el comando ceph-volume, comenzamos a crear el OSD con este comando, sin perder tiempo en lo obsoleto.


El plan era crear un espejo de dos discos SSD, en el que colocamos los registros de OSD, que, a su vez, se encuentran en los SAS del eje. Así podemos protegernos de los problemas de datos cuando cae un disco con un registro.


Crear un grupo de documentación de acero.


cat /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 

, ceph-deploy 12.2.12 — OSD db -


 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 

, blkid PARTUUID, :


 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 "n\n\n\n+5G\nw" | fdisk /dev/md0; done 

, OSD (, , )


OSD bluestore WAL, 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 

- ( , ) WAL OSD — ( WAL, , , ).


, WAL NVMe, .


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

, OSD. , — SSD , SAS.


20 , , — .
, , :


ceph osd tree

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


:


 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 

, , — ceph osd crush move ceph01-host root=rack01 , . CTRL+C .


: https://tracker.ceph.com/issues/23386


crushmap rule replicated_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 #   

: placement group OSD. , .


, — , OSD , , root default.
, , root ssd , default root. OSD .
, .


.


root- — ssd hdd


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


 # : 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 


 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:~#     

ssd-root hdd-root root-default ,


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

, — root — , ( root, )


:
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 

, — 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 


  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 

— , ( ) , .


300 , — 10 Tb 10 PG — (pg) — ).


PG — — .


, CEPH.


:


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

Source: https://habr.com/ru/post/456446/


All Articles