Escolha do CEPH. Parte 1
Tínhamos cinco racks, dez comutadores ópticos, BGP configurado, algumas dúzias de SSDs e vários discos SAS de todas as cores e tamanhos, além de proxmox e o desejo de colocar toda a estática em nosso próprio armazenamento S3. Não que tudo isso fosse necessário para a virtualização, mas depois que você começou a usar o código-fonte, siga seu hobby até o fim. A única coisa que me incomodou foi o BGP. Não há ninguém no mundo mais desamparado, irresponsável e imoral do que o roteamento interno do BGP. E eu sabia que em breve entraríamos nisso.

A tarefa era comum - havia o CEPH, não funcionava muito bem. Era necessário fazer "bem".
O cluster que obtive era heterogêneo, preparado e praticamente não ajustado. Consistia em dois grupos de nós diferentes, com uma grade comum desempenhando o papel de cluster e rede pública. Os nós foram empacotados com quatro tipos de discos - dois tipos de SSDs, montados em duas regras de posicionamento separadas e dois tipos de HDDs de tamanhos diferentes, montados em um terceiro grupo. O problema com tamanhos diferentes foi resolvido por diferentes pesos OSD.
A configuração em si foi dividida em duas partes - o sistema operacional e o próprio CEPH e suas configurações.
SO de nivelamento
Rede
Alta latência afetada ao gravar e ao balancear. Ao gravar - porque o cliente não recebe uma resposta sobre a gravação bem-sucedida até que as réplicas de dados em outros grupos de veiculações confirmem o sucesso. Como nas regras de distribuição de réplicas no mapa CRUSH, tínhamos uma réplica por host, a rede sempre foi usada.
Portanto, a primeira coisa que decidi configurar levemente a rede atual, enquanto tentava me convencer a mudar para redes separadas.
Para começar, alterou as configurações das placas de rede. Iniciado configurando filas:
o que foi:
ethtool -l ens1f1root@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
Pode-se observar que os parâmetros atuais estão longe do máximo. Aumento:
root@ceph01:~#ethtool -G ens1f0 rx 4096 root@ceph01:~#ethtool -G ens1f0 tx 4096 root@ceph01:~#ethtool -L ens1f0 combined 63
Guiado por um excelente artigo
https://blog.packagecloud.io/eng/2017/02/06/monitoring-tuning-linux-networking-stack-sending-data/
aumentou o comprimento da fila de expedição txqueuelen de 1000 para 10.000
root@ceph01:~#ip link set ens1f0 txqueuelen 10000
Bem, seguindo a documentação do próprio ceph
https://ceph.com/geen-categorie/ceph-loves-jumbo-frames/
MTU aumentado para 9000.
root@ceph01:~#ip link set dev ens1f0 mtu 9000
Adicionado ao / etc / network / interfaces, para que todos os itens acima sejam carregados na inicialização
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
Depois disso, seguindo o mesmo artigo, ele começou a encerrar cuidadosamente as alças do kernel 4.15. Considerando que em nós de 128G RAM, obtivemos um certo arquivo de configuração 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 . , # )
Com a rede de brilho, ele foi alocado em interfaces de rede de 10 Gbps separadas para uma rede plana separada. As placas de rede Mellanox de 10/25 Gbps de porta dupla enviadas em dois switches de 10 Gbps foram entregues em cada máquina. A agregação foi realizada usando o OSPF, pois a ligação com o lacp, por algum motivo, mostrou uma largura de banda total de no máximo 16 Gbps, enquanto o ospf utilizou com êxito completamente as duas dezenas em cada máquina. Os planos futuros eram usar o ROCE nesses melanoxes para reduzir a latência. Como configurar esta parte da rede:
- Como as próprias máquinas têm IPs externos no BGP, precisamos de software - (ou melhor, no momento em que escrevemos este documento, era frr = 6.0-1 ) já estava de pé.
- No total, as máquinas tinham duas interfaces de rede com duas interfaces - um total de 4 portas. Uma placa de rede olhou para a fábrica com duas portas e o BGP foi configurado nela; a segunda - em duas portas, olhou para dois comutadores diferentes e o OSPF foi definido nela.
Detalhes da configuração do OSPF: A tarefa principal é agregar dois links e ter tolerância a falhas.
duas interfaces de rede são configuradas em duas redes simples e planas - 10.10.10.0/24 e 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
pelo qual os carros se vêem.
DISCO
O próximo passo foi otimizar o desempenho dos discos. Para SSD, mudei o agendador para noop , para HDD - prazo final . Se mais ou menos - então o NOOP trabalha com o princípio de "quem primeiro se levantou - e chinelos", que em inglês soa como "FIFO (primeiro a entrar, primeiro a sair)". As solicitações são colocadas na fila quando ficam disponíveis. DEADLINE é mais somente leitura, e o processo da fila obtém acesso quase exclusivo ao disco no momento da operação. Isso é ótimo para o nosso sistema - afinal, apenas um processo funciona com cada disco - daemon OSD.
(Aqueles que desejam mergulhar no agendador de E / S podem ler sobre isso aqui:
http://www.admin-magazine.com/HPC/Articles/Linux-IO-Schedulers
Preferindo ler em russo: https://www.opennet.ru/base/sys/linux_shedulers.txt.html )
Nas recomendações para ajustar o Linux, é recomendável também aumentar o nr_request
nr_requests
O valor de nr_requests determina a quantidade de solicitações de E / S que são armazenadas em buffer antes que o agendador de E / S envie / receba dados para o dispositivo de bloco, se você estiver usando um cartão RAID / Dispositivo de Bloco que possa lidar com uma fila maior do que o I O planejador de E / S está definido como, aumentar o valor de nr_requests pode ajudar a melhorar e reduzir a carga do servidor quando grandes quantidades de E / S ocorrem no servidor. Se você estiver usando Deadline ou CFQ como planejador, é recomendável definir o valor nr_request como 2 vezes o valor da profundidade da fila.
MAS! Os próprios cidadãos são os desenvolvedores do CEPH que nos convencem de que seu sistema prioritário funciona melhor

WBThrottle e / ou nr_requestsWBThrottle e / ou nr_requests
O armazenamento de arquivos usa E / S em buffer para gravar; isso traz vários benefícios se o log de armazenamento de arquivos estiver em mídia mais rápida. As solicitações do cliente são notificadas assim que os dados são gravados no log e, em seguida, liberadas no próprio disco de dados posteriormente, usando a funcionalidade padrão do Linux. Isso possibilita que os discos de eixo OSD forneçam latências de gravação semelhantes às SSDs ao gravar em pacotes pequenos. Essa gravação atrasada atrasada também permite que o próprio kernel reconstrua as solicitações de E / S no disco com a esperança de mesclá-las ou de permitir que as cabeças de disco existentes escolham um caminho mais ideal no topo de suas placas. O efeito final é que você pode extrair um pouco mais de E / S de cada disco do que seria possível com E / S direta ou síncrona.
No entanto, um certo problema surge se o volume de registros recebidos em um determinado cluster Ceph estiver à frente de todos os recursos dos discos subjacentes. Nesse cenário, o número total de gravações pendentes de E / S pendentes em um disco pode crescer incontrolavelmente e resultar em uma fila de operações de E / S que preenchem as filas inteiras de disco e Ceph. As solicitações de leitura funcionam especialmente mal, pois ficam presas entre as solicitações de gravação, o que pode levar alguns segundos para liberar para o disco principal.
Para solucionar esse problema, o Ceph possui um mecanismo de limitação de write-back chamado WBThrottle, incorporado ao armazenamento de arquivos. Ele foi projetado para limitar a quantidade total de operações de E / S de gravação pendentes que podem ser enfileiradas e iniciar seu processo de redefinição mais cedo do que aconteceria naturalmente devido à inclusão pelo próprio kernel. Infelizmente, o teste demonstra que os valores padrão ainda podem não reduzir o comportamento existente para um nível que pode reduzir esse efeito na latência das operações de leitura. O ajuste pode alterar esse comportamento e reduzir a duração geral das filas de gravação e tornar esse impacto não forte. No entanto, existe uma desvantagem: reduzindo o número máximo total de entradas permitidas para a fila, você pode reduzir a capacidade do próprio kernel de maximizar sua eficiência na solicitação de solicitações recebidas. Vale a pena pensar que você precisa de mais para o seu aplicativo específico, cargas de trabalho e ajuste para se adequar a eles.
Para controlar a profundidade de uma fila de gravação pendente, você pode reduzir o número máximo total de operações de E / S com falha usando as configurações WBThrottle ou diminuir o valor máximo para operações com falha no nível do bloco do kernel. Tanto esse como outro podem efetivamente controlar o mesmo comportamento e são suas preferências que servirão de base para a implementação dessa configuração.
Observe também que a prioridade do sistema Ceph de operação é mais eficiente para consultas mais curtas no nível do disco. Ao reduzir a fila geral para um determinado disco, o local da fila principal se move para Ceph, onde ele tem mais controle sobre a prioridade da operação de E / S. Considere o seguinte exemplo:
echo 8 > /sys/block/sda/queue/nr_requests
http://onreader.mdl.ru/MasteringCeph/content/Ch09.html#030202
COMUM
E mais algumas configurações do kernel para fazer seu carro é macio e sedoso espremer um pouco mais de desempenho do ferro
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 # ,, , .
Mergulhe no CEPH
Configurações nas quais eu gostaria de permanecer com mais detalhes:
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
Alguns parâmetros que foram testados no controle de qualidade na versão 12.2.12 estão ausentes no ceph versão 12.2.2, por exemplo, osd_recovery_threads. Portanto, os planos incluíam uma atualização do produto para 12.2.12. A prática mostrou compatibilidade em um cluster das versões 12.2.2 e 12.2.12, o que permite a atualização sem interrupção.
Cluster de teste
Naturalmente, para testar, era necessário ter a mesma versão da batalha, mas na época em que comecei a trabalhar com o cluster no repositório, havia apenas uma mais nova. Como na versão secundária você não parece muito grande ( 1393 linhas nas configurações versus 1436 na nova versão), decidimos começar a testar uma nova (atualizando assim mesmo, por que ir para a lixeira antiga)
A única coisa que eles tentaram deixar a versão antiga é o pacote ceph-deploy, já que parte dos utilitários (e parte dos funcionários) foi aprimorada por sua sintaxe. A nova versão era bem diferente, mas não afetou a operação do próprio cluster, e as versões 1.5.39 o deixaram
Como o comando ceph-disk diz claramente que está obsoleto e usa, querido, o comando ceph-volume - começamos a criar o OSD com esse comando, sem perder tempo com o obsoleto.
O plano era criar um espelho de dois discos SSD, nos quais colocamos os logs OSD, que, por sua vez, estão localizados nos SASs do eixo. Assim, podemos nos proteger de problemas de dados quando um disco com um log cai.
Criar um cluster de documentação do aço
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 treeroot@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/