Ceph - من "على الركبة" إلى "إنتاج"

اختيار CEPH. الجزء 1


كان لدينا خمسة رفوف ، عشرة مفاتيح بصرية ، BGP مهيأة ، بضع عشرات من محركات أقراص الحالة الصلبة ومجموعة من أقراص SAS من جميع الألوان والأحجام ، وكذلك proxmox والرغبة في وضع كل ما هو ثابت في تخزين S3 الخاص بنا. ليس هذا كل ما هو ضروري للمحاكاة الافتراضية ، ولكن بمجرد البدء في استخدام source مفتوحة ، ثم انتقل إلى هوايتك. الشيء الوحيد الذي أزعجني هو BGP. لا يوجد أحد في العالم عاجز وغير مسؤول وغير أخلاقي عن توجيه BGP الداخلي. وكنت أعرف أنه في وقت قريب سنغرق فيه.



كانت المهمة شائعة - كان هناك CEPH ، لم تنجح بشكل جيد. كان من الضروري أن تفعل "جيدا".
المجموعة التي حصلت عليها كانت غير متجانسة ، ومُضلَّلة ، ولا يتم ضبطها عملياً. كان يتألف من مجموعتين من العقد المختلفة ، مع شبكة مشتركة واحدة تلعب دور كل من الكتلة والشبكة العامة. كانت العقد محملة بأربعة أنواع من الأقراص - نوعان من محركات أقراص الحالة الثابتة ، تم تجميعهما في قاعدتين منفصلتين للموضع ونوعين من محركات الأقراص الصلبة ذات الأحجام المختلفة ، تم تجميعهما في مجموعة ثالثة. تم حل مشكلة الأحجام المختلفة من خلال أوزان OSD مختلفة.


تم تقسيم الإعداد نفسه إلى قسمين - ضبط نظام التشغيل وضبط CEPH نفسه وإعداداته.


التسوية OS


شبكة


الكمون العالي يتأثر عند التسجيل وعند الموازنة. عند التسجيل - لأن العميل لا يتلقى استجابة حول التسجيل الناجح حتى تؤكد النسخ المتماثلة للبيانات في مجموعات المواضع الأخرى النجاح. نظرًا لأن قواعد توزيع النسخ المتماثلة في خريطة CRUSH كانت لدينا نسخة متماثلة واحدة لكل مضيف ، فقد كانت الشبكة تستخدم دائمًا.


لذلك ، أول شيء قررت تكوين الشبكة الحالية قليلاً ، بينما أحاول إقناعي بالانتقال إلى شبكات منفصلة.


للبدء ، الملتوية إعدادات بطاقات الشبكة. بدأت بإعداد قوائم الانتظار:


ماذا كان:


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 

يمكن ملاحظة أن المعلمات الحالية بعيدة عن الحد الأقصى. زيادة:


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

تسترشد مقال ممتاز


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


زيادة طول قائمة انتظار إرسال txqueuelen من 1000 إلى 10،000


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

حسنا ، بعد توثيق ceph نفسها


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


زيادة MTU إلى 9000.


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

تمت الإضافة إلى / etc / network / واجهات ، بحيث يتم تحميل كل ما سبق عند بدء التشغيل


القط / الخ / شبكة / واجهات
 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 

بعد ذلك ، بعد نفس المقالة ، بدأ في الانتهاء بعناية من مقابض النواة 4.15. بالنظر إلى أنه على 128G RAM RAM ، حصلنا على ملف تكوين معين لـ 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 .     ,  #  ) 

مع شبكة اللمعان ، تم تخصيصها على واجهات شبكة منفصلة بسرعة 10 جيجابت في الثانية لشبكة مسطحة منفصلة. تم تسليم بطاقات الشبكة ثنائية المنافذ Mellanox 10/25 جيجابت في الثانية والتي يتم شحنها في محولين منفصلين بسرعة 10 جيجابت في الثانية على كل جهاز. تم تنفيذ التجميع باستخدام OSPF ، حيث أظهر الترابط مع lacp لسبب ما عرض النطاق الترددي الكلي بحد أقصى 16 جيجابت في الثانية ، بينما استخدم ospf بنجاح كليهما العشرات على كل آلة. وكانت الخطط المستقبلية لاستخدام ROCE على هذه الميلانوكسات للحد من الكمون. كيفية تكوين هذا الجزء من الشبكة:


  1. نظرًا لأن الأجهزة نفسها لديها عناوين IP خارجية على BGP ، نحتاج إلى برنامج - (أو بالأحرى ، في وقت كتابة هذا التقرير ، كان frr = 6.0-1 ) موجودًا بالفعل.
  2. في المجموع ، كان لدى الأجهزة واجهتان للشبكة مع واجهتين - ما مجموعه 4 منافذ. نظرت إحدى بطاقات الشبكة إلى المصنع من خلال منفذين وتم تكوين BGP عليه ، والثانية - في اثنين من المنافذ نظرت إلى مفتاحين مختلفين وتم ضبط OSPF عليه

تفاصيل إعداد OSPF: المهمة الرئيسية هي تجميع ارتباطين والحصول على التسامح مع الخطأ.
تم تكوين واجهات شبكة في شبكتين ثابتتين بسيطتين - 10.10.10.0/24 و 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 

الذي السيارات نرى بعضنا البعض.


DISK


كانت الخطوة التالية هي تحسين أداء الأقراص. ل SSD لقد غيرت جدولة ل noop ، ل HDD - الموعد النهائي . إذا كان الأمر تقريبًا - فإن NOOP يعمل وفقًا لمبدأ "من قام أولاً - والنعال" ، والذي يبدو باللغة الإنجليزية مثل "FIFO (First In ، First Out)". الطلبات في قائمة الانتظار عندما تصبح متاحة. DEADLINE أكثر قراءة فقط ، بالإضافة إلى أن العملية من قائمة الانتظار تحصل على وصول حصري تقريبا إلى القرص في وقت التشغيل. هذا أمر رائع لنظامنا - بعد كل شيء ، هناك عملية واحدة فقط تعمل مع كل قرص - OSD daemon.
(يمكن لأولئك الذين يرغبون في الانغماس في جدولة I / O أن يقرأوا عنها هنا:
http://www.admin-magazine.com/HPC/Articles/Linux-IO-Schedulers


تفضل القراءة باللغة الروسية: https://www.opennet.ru/base/sys/linux_shedulers.txt.html )


في توصيات لضبط ينصح لينكس لزيادة nr_request أيضا


nr_requests
تحدد قيمة nr_requests مقدار طلبات الإدخال / الإخراج التي يتم تخزينها مؤقتًا قبل قيام جدولة I / O بإرسال / استقبال البيانات إلى جهاز الحظر ، إذا كنت تستخدم بطاقة RAID / جهاز كتلة يمكنه التعامل مع قائمة انتظار أكبر مما حددته I تم تعيين جدولة الإدخال / الإخراج إلى ، قد يساعد رفع قيمة nr_requests في تحسين بالكامل وتقليل تحميل الخادم عند حدوث كميات كبيرة من I / O على الخادم. إذا كنت تستخدم Deadline أو CFQ كجدول زمني ، فمن المقترح أن تضبط قيمة nr_request على ضعفي قيمة عمق قائمة الانتظار.

لكن! المواطنون أنفسهم هم مطورو CEPH الذين يقنعوننا بأن نظام أولوياتهم يعمل بشكل أفضل



WBThrottle و / أو nr_requests
WBThrottle و / أو nr_requests
يستخدم تخزين الملفات مخزنة مؤقتًا I / O للكتابة؛ وبذلك يرتفع عدد من الفوائد إذا كان سجل تخزين الملفات على وسائط أسرع. يتم إعلام طلبات العميل بمجرد كتابة البيانات في السجل ، ثم يتم مسحها على قرص البيانات نفسه في وقت لاحق باستخدام وظائف Linux القياسية. هذا يجعل من الممكن للأقراص المغزل OSD توفير زمن كتابة مماثل ل SSDs عند الكتابة في حزم صغيرة. تتيح هذه الكتابة المتأخرة أيضًا للنواة نفسها إعادة إنشاء طلبات الإدخال / الإخراج إلى القرص على أمل إما دمجها معًا أو السماح لرؤوس الأقراص الموجودة باختيار مسار أكثر مثالية أعلى اللوحات الخاصة بهم. التأثير النهائي هو أنه يمكنك ضغط إدخال / إخراج أكثر قليلاً من كل قرص مما سيكون ممكنًا باستخدام إدخال / إخراج مباشر أو متزامن.

ومع ذلك ، تنشأ مشكلة معينة إذا كان حجم السجلات الواردة في كتلة Ceph معينة قبل جميع إمكانيات الأقراص الأساسية. في مثل هذا السيناريو ، يمكن زيادة العدد الإجمالي لقوائم I / O المعلقة المعلقة للكتابة على القرص بشكل لا يمكن السيطرة عليه وينتج عن ذلك قائمة انتظار لعمليات I / O التي تملأ كامل قوائم انتظار القرص و Ceph. تعمل طلبات القراءة بشكل سيء بشكل خاص ، لأنها تتعطل بين طلبات الكتابة ، والتي قد تستغرق عدة ثوانٍ للتنقل إلى القرص الرئيسي.


لدحر هذه المشكلة ، لدى Ceph آلية اختناق للكتابة تدعى WBThrottle مدمجة في تخزين الملفات. تم تصميمه للحد من إجمالي عمليات الإدخال / الإخراج للكتابة المعلقة التي يمكن وضعها في قائمة الانتظار وبدء عملية إعادة التعيين الخاصة بها في وقت سابق مما سيحدث بشكل طبيعي بسبب التضمين بواسطة kernel نفسه. لسوء الحظ ، يوضح الاختبار أن القيم الافتراضية قد لا تؤدي إلى تقليل السلوك الحالي إلى مستوى يمكن أن يقلل هذا التأثير على زمن انتقال عمليات القراءة. يمكن أن يؤدي الضبط إلى تغيير هذا السلوك وتقليل الطول الكلي لقوائم الانتظار وجعل هذا التأثير غير قوي. ومع ذلك ، هناك مفاضلة: من خلال تقليل إجمالي عدد الإدخالات المسموح بها في قائمة الانتظار ، يمكنك تقليل قدرة النواة نفسها على زيادة كفاءتها في ترتيب الطلبات الواردة. يجدر التفكير قليلاً في أنك بحاجة إلى المزيد من أجل تطبيقك المحدد ، وعبء العمل ، والتكيف ليناسبهم.


للتحكم في عمق قائمة انتظار الكتابة المعلقة هذه ، يمكنك إما تخفيض الحد الأقصى الإجمالي لعدد عمليات الإدخال / الإخراج المعلقة باستخدام إعدادات WBThrottle ، أو تقليل الحد الأقصى لقيمة العمليات الفاشلة عند مستوى الكتلة ذاته من kernel. يمكن لكل من الآخر والآخر التحكم بشكل فعال في نفس السلوك وتفضيلاتك هي التي ستكون الأساس لتنفيذ هذا الإعداد.
تجدر الإشارة أيضًا إلى أن أولوية تشغيل نظام Ceph تكون أكثر فعالية للاستعلامات الأقصر على مستوى القرص. عند تقليص قائمة الانتظار الإجمالية إلى قرص معين ، ينتقل موقع قائمة الانتظار الرئيسي إلى Ceph ، حيث يتمتع بمزيد من التحكم في الأولوية التي تتمتع بها عملية الإدخال / الإخراج. النظر في المثال التالي:


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

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


COMMON


وعدد قليل من إعدادات النواة لجعل سيارتك لينة وحريري ضغط بعض الأداء أكثر من الحديد


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

الغوص في CEPH


الإعدادات التي أود أن أتناولها بمزيد من التفاصيل:


القط / الخ / السيف / السيف
 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 

بعض المعلمات التي تم اختبارها على ضمان الجودة في الإصدار 12.2.12 مفقودة في ceph الإصدار 12.2.2 ، على سبيل المثال ، osd_recovery_threads. لذلك ، تضمنت الخطط تحديثًا على prod إلى 12.2.12. أظهرت الممارسة التوافق في مجموعة واحدة من الإصدارات 12.2.2 و 12.2.12 ، والتي تسمح بالتحديث المستمر.


كتلة الاختبار


وبطبيعة الحال ، كان من الضروري اختبار الإصدار نفسه كما هو الحال في المعركة ، ولكن في الوقت الذي بدأت فيه العمل مع المجموعة في المستودع ، لم يكن هناك سوى إصدار أحدث. نظرًا لأنك في الإصدار الثانوي ليست كبيرة جدًا ( 1393 سطرًا في التكوينات مقابل 1436 سطرًا في الإصدار الجديد) ، فقد قررنا بدء اختبار واحد جديد (لا يزال محدّثًا ، لماذا تستمر في المهملات القديمة)


الشيء الوحيد الذي حاولوا ترك الإصدار القديم هو حزمة نشر ceph ، حيث تم تحسين جزء من الأدوات المساعدة (وجزء من الموظفين) من خلال بناء الجملة. كان الإصدار الجديد مختلفًا تمامًا ، لكنه لم يؤثر على تشغيل المجموعة نفسها ، وتركت الإصدارات 1.5.39


نظرًا لأن الأمر ceph-disk يوضح بوضوح أنه تم إهماله واستخدامه ، أيها العزيز ، الأمر ceph-volume ، بدأنا في إنشاء OSD باستخدام هذا الأمر ، دون إضاعة الوقت على المتقادم.


كانت الخطة هي إنشاء نسخة متطابقة من قرصين SSD ، نضع عليهما سجلات OSD ، والتي بدورها توجد على SASs المغزل. حتى نتمكن من حماية أنفسنا من مشاكل البيانات عند سقوط قرص بسجل.


إنشاء مجموعة من وثائق الصلب


القط / الخ / السيف / السيف
 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/ar456446/


All Articles