गरीबों के लिए iSCSI भंडारण

शुभ दिन, प्रिय समुदाय!

इस लेख में मैं एक डिस्क स्टोरेज बनाने के अनुभव को साझा करना चाहूंगा, जिसके परिणामस्वरूप कई प्रयोगों, परीक्षणों, त्रुटियों, पाता है, जो कड़वी निराशा के साथ अनुभवी हैं। और, अंत में, यह कुछ दिलचस्प, अपेक्षाकृत बजट और तेजी से भंडारण में समाप्त हो गया।

यदि आपके पास एक समान कार्य है या आप सिर्फ शीर्षक में रुचि रखते हैं, तो हैबरकट में आपका स्वागत है।

प्रस्तावना


इसलिए, हाल ही में हमारे विभाग ने एक बड़े भंडारण की मात्रा के साथ VMware ESXi 5.1 हाइपरविजर्स के क्लस्टर प्रदान करने के कार्य का सामना किया। इस पर, हमने dovecot और "क्लाउड" फ़ाइल स्टोरेज के लिए एन्क्रिप्टेड maildir रखने की योजना बनाई है। बजट के आवंटन के लिए एक शर्त कंपनी के लिए महत्वपूर्ण जानकारी संग्रहीत करने के लिए एक जगह प्रदान करना था, और इस अनुभाग को एन्क्रिप्ट किया जाना चाहिए।

लोहा


दुर्भाग्य से, या शायद सौभाग्य से, हम इस तरह के महत्वाकांक्षी कार्यों के लिए बड़े बजट पर बोझ नहीं थे। इसलिए, हम, अधिकतमवाद के सच्चे प्रशंसक के रूप में, किसी भी ब्रांडेड स्टोरहाउस का खर्च नहीं उठा सकते हैं, और आवंटित भौतिक संसाधनों के भीतर हमने निम्नलिखित लोहा चुना है:


यह सब हमें लगभग 200 हजार रूबल की लागत देता है।

कार्यान्वयन


लक्ष्यों को देने के लिए, अर्थात्, उपभोक्ताओं को भंडारण संसाधनों का आवंटन करने के लिए, हमने iSCSI और NFS का उपयोग करने का निर्णय लिया। सबसे उचित और त्वरित समाधान, निश्चित रूप से, FCoE का उपयोग करना होगा, ताकि टीसीपी में संगत ओवरहेड के साथ न जाएं, जो सामान्य रूप से, हमारे नेटवर्क कार्ड के साथ किया जा सकता है, लेकिन, दुर्भाग्य से, हमारे पास एक एसएफएफ स्विच नहीं है। FCoE समर्थन, इसे खरीदना संभव नहीं था, क्योंकि यह हमें 500 tr खर्च होगा ऊपर से।
फिर से इंटरनेट पर धूम मचाने के बाद, उन्हें vn2vn तकनीक में एक रास्ता मिल गया, लेकिन ESXi केवल 6.x संस्करण में vn2vn के साथ काम करना सीख जाएगा, इसलिए, आगे के बारे में सोचे बिना, हमने वही शुरू किया जो हमारे पास है।

लिनक्स सर्वरों के लिए हमारा कॉर्पोरेट मानक CentOS है, लेकिन वर्तमान कर्नेल (2.6.32-358) में, एन्क्रिप्शन बहुत धीमा है, इसलिए मुझे फेडोरा को ओएस के रूप में उपयोग करना पड़ा। बेशक, यह रेड हैट ट्रेनिंग ग्राउंड है, लेकिन नवीनतम लिनक्स कर्नेल में, डेटा लगभग फ्लाई पर एन्क्रिप्ट किया गया है, और हमें बाकी की आवश्यकता नहीं है।
इसके अलावा, वर्तमान संस्करण 19 का उपयोग आरएचईएल 7 के लिए आधार के रूप में किया जाएगा, और इसलिए हमें भविष्य में CentOS 7 पर मूल रूप से स्विच करने की अनुमति देगा।

लक्ष्य


लेख को न बढ़ाने और विषय से दूर न जाने के क्रम में, मैं लोहे के सभी निर्बाध प्रकारों को छोड़ देता हूं, एक नियंत्रक के साथ, ओएस और अन्य चीजों को स्थापित करने के लिए। मैं यथासंभव कम से कम लक्ष्य का वर्णन करने की कोशिश करूंगा और अपने आप को केवल ईएसएक्सआई सर्जक के साथ अपने काम तक सीमित करूंगा।

लक्ष्य से हम निम्नलिखित प्राप्त करना चाहते थे:

मिलो, यहाँ वे हैं।

LIO
linux-iscsi.org
लिनक्स कर्नेल 3.10.10 के साथ, उसने मुझे 300 एमबी / एस लिखने और ब्लॉकियो मोड में 600 एमबी / एस पढ़ा। उसने फाइलियो के साथ और रैम डिस्क के साथ भी वही नंबर दिखाए। ग्राफ़ ने दिखाया कि लिखने की गति बहुत अधिक उछलती है, शायद इस तथ्य के कारण कि ईएक्सआईआई आरंभकर्ता को रिकॉर्डिंग सिंक्रनाइज़ेशन की आवश्यकता होती है। इसी कारण से, फ़ाइल और ब्लॉकियो के साथ प्रति रिकॉर्ड IOPS की संख्या समान थी।
मेलिंग सूचियों में, emulate_fua_write को अक्षम करने की सिफारिश की गई थी, लेकिन इससे कोई परिवर्तन नहीं हुआ। इसके अलावा, 3.9.5 कर्नेल के साथ यह सबसे अच्छा परिणाम दिखाता है, जो हमें इसके भविष्य के बारे में भी सोचता है।
एलआईओ, विवरण से देखते हुए, बहुत कुछ कर सकते हैं, लेकिन ज्यादातर विशेषताएं केवल व्यावसायिक संस्करण में उपलब्ध हैं। साइट, जो, मेरी राय में, मुख्य रूप से सूचना का एक स्रोत होना चाहिए, विज्ञापनों से भरा है, जो एक नकारात्मक का कारण बनता है। परिणामस्वरूप, उन्होंने मना करने का फैसला किया।

istgt
www.peach.ne.jp/archives/istgt
FreeBSD द्वारा उपयोग किया जाता है।
कुछ ही को छोड़कर लक्ष्य काफी अच्छा काम करता है।
सबसे पहले, वह नहीं जानता कि कैसे ब्लॉकियो करना है, और दूसरी बात, वह विभिन्न मैक्सरेक और मैक्सएक्सट्रान का उपयोग नहीं कर सकता है, कम से कम मैं सफल नहीं हुआ। कम MaxRec मूल्यों पर, अनुक्रमिक लिखने की गति 250 एमबी / एस से अधिक नहीं थी, और पढ़ना बहुत उच्च स्तर पर था - 700 एमबी / एस। मुझे 32 की कतार की गहराई के साथ एक यादृच्छिक 4k रिकॉर्डिंग से लगभग 40K आईपीएस मिला। मैक्सरेक में वृद्धि के साथ, लेखन की गति 700 एमबी / एस तक बढ़ जाती है, 600 एमबी / एस तक की बूंदों को पढ़ना। Iops लिखने के लिए 30K और 20K तक गिर जाते हैं।
यही है, किसी भी तरह से सेटिंग्स को बदलकर एक मध्य जमीन को ढूंढना संभव होगा, लेकिन किसी भी तरह यह trues नहीं लग रहा था।

STGT
stgt.sourceforge.net
हाइपरवाइज़र के साथ इंटरफ़ेस सेट करने वाले इस लक्ष्य के साथ समस्याएं थीं। ESXi ने लगातार LUN को भ्रमित किया - एक दूसरे के लिए स्वीकार किया, या सभी को देखना बंद कर दिया। सीरियल नंबर के गलत बाइंडिंग में एक समस्या का संदेह था, लेकिन उन्हें कॉन्फ़िगरेशन में पंजीकृत करने से मदद नहीं मिली।
गति भी प्रसन्न नहीं है। वह न तो पढ़ने के लिए और न ही लिखने के लिए 500 एमबी / एस से अधिक पाने में सफल रहा। पढ़ने के लिए IOPS की संख्या 20K के बारे में लिखने के लिए 20K है।
परिणामस्वरूप - कॉन्फ़िगरेशन के साथ समस्याएं और गति में कम प्रदर्शन। इंकार कर दिया।

आईईटी
iscsitarget.sourceforge.net
लगभग त्रुटिहीन काम किया। 700MB / s पढ़ें और लिखें। 2000 लिखने के लिए 30K के बारे में पढ़ने के लिए IOPS।
ESXi सर्जक ने सिस्टम कैश का उपयोग किए बिना, डेटा को तुरंत डिस्क पर लिखने के लिए लक्ष्य को मजबूर किया। मालेवादियों में भी उनके बारे में कुछ हद तक डर है - कई लोगों ने लोड के तहत अस्थिर काम की सूचना दी।

SCST
scst.sourceforge.net
और अंत में हमारी जाति के नेता के पास गया।
कर्नेल के पुनर्निर्माण और लक्ष्य को न्यूनतम करने के बाद, हमें 750MB / s पढ़ने और 950MB / s लिखने की सुविधा मिली। फ़ाइल मोड में IOPS - 44K पढ़ा और 37K लिखता है। तुरंत, लगभग बिना किसी टेम्बुरीन के।
यह लक्ष्य बिल्कुल पसंद की तरह लग रहा था।

SCST और फेडोरा पर VMWare ESXi 5.1 के लिए iSCSI


और अब, वास्तव में, हम सभी यहां क्या इकट्ठा करने के लिए।
ईएसएक्सआई का लक्ष्य और सर्जक स्थापित करने पर एक छोटा निर्देश। मैंने तुरंत हैबर पर एक लेख लिखने की कोशिश करने का फैसला नहीं किया है, इसलिए निर्देश चरण-दर-चरण नहीं होगा - मैं इसे मेमोरी से पुनर्स्थापित करूंगा, लेकिन इसमें सेटिंग्स के मुख्य बिंदु शामिल होंगे, जो वांछित परिणाम प्राप्त करने की अनुमति देते हैं।

ESXi 5.1 तैयारी

निम्नलिखित सेटिंग्स हाइपरविज़र में बनाई गई हैं:


आपको नेटवर्क एडाप्टर के लिए इंटरप्ट मॉडरेशन और LRO को अक्षम करना होगा। आप यह आदेशों के साथ कर सकते हैं:

ethtool -C vmnicX rx-usecs 0 rx-frames 1 rx-usecs-irq 0 rx-framesirq 0 esxcfg-advcfg -s 0 /Net/TcpipDefLROEnabled esxcli system module parameters set -m ixgbe -p "InterruptThrottleRate=0" 


ऐसा करने के कारण:
www.odbms.org/download/vmw-vfabric-gemFire-best-practices-guide.pdf
www.vmware.com/files/pdf/techpaper/VMW-Tuning-Latency-Sensitive-Workloads.pdf

इन मानों को फिर से सेट न करने के लिए, आप उन्हें इस स्क्रिप्ट में जोड़ सकते हैं:
/etc/rc.local.d/local.sh


फेडोरा तैयारी

डाउनलोड करें और फेडोरा के नवीनतम संस्करण के न्यूनतम संस्करण में स्थापित करें।

सिस्टम को अपडेट करें और रिबूट करें:

 [root@nas ~]$ yum -y update && reboot 


सिस्टम केवल स्थानीय नेटवर्क पर काम करेगा, इसलिए मैंने फ़ायरवॉल और SELinux को बंद कर दिया:

 [root@nas ~]$ systemctl stop firewalld.service [root@nas ~]$ systemctl disable firewalld.service [root@nas ~]$ cat /etc/sysconfig/selinux SELINUX=disabled SELINUXTYPE=targeted 


नेटवर्क इंटरफेस सेट करें और NetworkManager.service सेवा को अक्षम करें। यह BRIDGE इंटरफेस के साथ संगत नहीं है, और NFS के लिए यह आवश्यक था।

 [root@nas ~]$ systemctl disable NetworkManager.service [root@nas ~]$ chkconfig network on 


नेटवर्क कार्ड पर अक्षम LRO।

 [root@nas ~]$ cat /etc/rc.d/rc.local #!/bin/bash ethtool -K ethX lro off 


Intel अनुशंसाओं के बाद, निम्न सिस्टम पैरामीटर बदल दिए गए थे:

 [root@nas ~]$ cat /etc/sysctl.d/ixgbe.conf net.ipv4.tcp_sack = 0 net.ipv4.tcp_timestamps = 0 net.ipv4.tcp_rmem = 10000000 10000000 10000000 net.ipv4.tcp_wmem = 10000000 10000000 10000000 net.ipv4.tcp_mem = 10000000 10000000 10000000 net.core.rmem_max = 524287 net.core.wmem_max = 524287 net.core.rmem_default = 524287 net.core.wmem_default = 524287 net.core.optmem_max = 524287 net.core.netdev_max_backlog = 300000 


लक्ष्य तैयार करना

SCST का उपयोग करने के लिए, कर्नेल में पैच जोड़ने की सिफारिश की जाती है। यह वैकल्पिक है, लेकिन उनके साथ प्रदर्शन अधिक है।
रिपॉजिटरी के निर्माण के दौरान, नवीनतम कर्नेल संस्करण 3.10.10-200 था। जब तक आप लेख पढ़ते हैं, तब तक कर्नेल पहले से ही अपडेट किया जा सकता है, लेकिन मुझे नहीं लगता कि यह प्रक्रिया को बहुत प्रभावित करेगा।

संशोधित कर्नेल के साथ आरपीएम पैकेज बनाना यहाँ विस्तार से वर्णित है:
fedoraproject.org/wiki/Building_a_custom_kernel/ru

लेकिन कठिनाइयों का कारण न बनने के लिए, मैं विस्तार से तैयारी का वर्णन करूंगा।

एक उपयोगकर्ता बनाएँ:
 [root@nas ~]$ useradd mockbuild 


आइए उसके पर्यावरण की ओर बढ़ें:
 [root@nas ~]$ su mockbuild [mockbuild@nas root]$ cd 


असेंबली के लिए पैकेज स्थापित करें और कर्नेल स्रोत तैयार करें:
 [mockbuild@nas ~]$ su -c 'yum install yum-utils rpmdevtools' [mockbuild@nas ~]$ rpmdev-setuptree [mockbuild@nas ~]$ yumdownloader --source kernel [mockbuild@nas ~]$ su -c 'yum-builddep kernel-3.10.10-200.fc19.src.rpm' [mockbuild@nas ~]$ rpm -Uvh kernel-3.10.10-200.fc19.src.rpm [mockbuild@nas ~]$ cd ~/rpmbuild/SPECS [mockbuild@nas ~]$ rpmbuild -bp --target=`uname -m` kernel.spec 


अब पैच खुद की आवश्यकता होगी। Svn भंडार से SCST डाउनलोड करें:
 [mockbuild@nas ~]$ svn co https://scst.svn.sourceforge.net/svnroot/scst/trunk scst-svn 


~ / Rpmbuild / SOURCES / के लिए आवश्यक पैच कॉपी करें
 [mockbuild@nas ~]$ cp scst-svn/iscsi-scst/kernel/patches/put_page_callback-3.10.patch ~/rpmbuild/SOURCES/ [mockbuild@nas ~]$ cp scst-svn/scst/kernel/scst_exec_req_fifo-3.10.patch ~/rpmbuild/SOURCES/ 


कर्नेल कॉन्फ़िगरेशन में एक पंक्ति जोड़ें:
 [mockbuild@nas ~]$ vim ~/rpmbuild/SOURCES/config-generic ... CONFIG_TCP_ZERO_COPY_TRANSFER_COMPLETION_NOTIFICATION=y ... 


आइए kernel.spec को संपादित करें।
 [mockbuild@nas ~]$ cd ~/rpmbuild/SPECS [mockbuild@nas ~]$ vim kernel.spec 


हम बदलते हैं:
 #% define buildid .local 

करने के लिए:
 %define buildid .scst 


हमारे पैच जोड़ें, अधिमानतः अन्य सभी के बाद:
 Patch25091: put_page_callback-3.10.patch Patch25092: scst_exec_req_fifo-3.10.patch 

हम पैच एप्लिकेशन कमांड जोड़ते हैं, शेष प्रविष्टियों के बाद इसे जोड़ने की सिफारिश की जाती है:
 ApplyPatch put_page_callback-3.10.patch ApplyPatch scst_exec_req_fifo-3.10.patch 


सभी कार्यों के बाद, हम शामिल फर्मवेयर फ़ाइलों के साथ आरपीएम कर्नेल पैकेजों की असेंबली शुरू करते हैं:
 [mockbuild@nas ~]$ rpmbuild -bb --with baseonly --with firmware --without debuginfo --target=`uname -m` kernel.spec 


असेंबली पूरी होने के बाद, फ़र्मवेयर कर्नेल और कर्नेल हेडर फ़ाइलों को स्थापित करें:
 [mockbuild@nas ~]$ cd ~/rpmbuild/RPMS/x86_64/ [mockbuild@nas ~]$ su -c 'rpm -ivh kernel-firmware-3.10.10-200.scst.fc19.x86_64.rpm kernel-3.10.10-200.scst.fc19.x86_64.rpm kernel-devel-3.10.10-200.scst.fc19.x86_64.rpm kernel-headers-3.10.10-200.scst.fc19.x86_64.rpm' 


रीबूट।

सफल होने के बाद, मुझे उम्मीद है कि डाउनलोड, एससीएसटी स्रोतों के साथ डायरेक्टरी पर जाएं और पहले से ही रूट उपयोगकर्ता लक्ष्य को स्वयं एकत्रित करें:
 [root@nas ~]$ make scst scst_install iscsi iscsi_install scstadm scstadm_install 


विधानसभा के बाद, सेवा को ऑटोरन में जोड़ें:
 [root@nas ~]$ systemctl enable "scst.service" 


और /etc/scst.conf में कॉन्फिगर करे। उदाहरण के लिए, मेरा:
 [root@nas ~]$ cat /etc/scst.conf HANDLER vdisk_fileio { DEVICE mail { filename /dev/mapper/mail nv_cache 1 } DEVICE cloud { filename /dev/sdb3 nv_cache 1 } DEVICE vmstore { filename /dev/sdb4 nv_cache 1 } } TARGET_DRIVER iscsi { enabled 1 TARGET iqn.2013-09.local.nas:raid10-ssdcache { LUN 0 mail LUN 1 cloud LUN 2 vmstore enabled 1 } } 


यदि आवश्यक हो तो विशिष्ट पते से लक्ष्य कनेक्शनों को अनुमति देने या अस्वीकार करने वाली फाइलें बनाएँ:
 [root@nas ~]$ cat /etc/initiators.allow ALL 10.0.0.0/24 [root@nas ~]$ cat /etc/initiators.deny ALL ALL 


कॉन्फ़िगरेशन फ़ाइलों को कॉन्फ़िगर करने के बाद, SCST चलाएँ:
 [root@nas ~]$ /etc/init.d/scst start 


यदि सब कुछ सही ढंग से किया गया था, तो ईएसएक्सआई में संबंधित लक्ष्य दिखाई देगा।

अंत तक पढ़ने के लिए धन्यवाद!

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


All Articles