راه اندازی Multipath در لینوکس
آموزش قدم به قدم راه اندازی Multipath در Centos
معرفی Multipath و آموزش راه اندازی آن
Path چیست؟
path مسیر ارتباطی بین سرور و Storage است که میتواند از طریق HBA یا کابل سرور را به storage متصل کند. در صورتی که به هر دلیلی مانند مشکل در San Switch، مشکل در کابل، مشکل شبکه ای و … مشکلی در عملکرد ارتباط برقرار شود، قطع شدن مسیر ارتباطی میتواند مشکلاتی را برای سرور و سریس دهی آن ایجاد کرده و یا کل عملکرد آن را مختل نماید.
در واقع ارتباط بین سرور و Storage آن هم از یک مسیر میتواند گلوگاهی پر خطر در سرویس دهی و معماری سرویس باشد. تصور کنید سرور دیتابیسی که دیسک آن بر روی SAN یا SDN قرار دارد. قطع شدن تنها راه ارتباطی آن به دیسک خود و عدم توانایی آن در خواندن و نوشتن داده ها میتواند سرویس دهی تمامی سرویس های وابسته به آن مجموعه را مختل کند.
Multipath چیست؟
با توجه به توضیحات بالا، جهت رفع این دست مشکلات معمولا بیش از یک مسیر ارتباطی بین سرور و Storage فراهم میگردد تا علاوه بر ایجاد redundancy و بالا بردن throughput در صورتی که یکی از مسیر ها به هر دلیلی دچار مشکل شد، عملکرد سیستم از طریق مسیر فرعی و بدون مشکل ادامه داشته باشد.
در لینوکس ابزاری بومی به نام DM- multipathing وجود دارد که امکان معرفی چند مسیر برای ارتباط با Storage را فراهم می سازد. به این ترتیب که مسیر های معرفی شده را با هم تجمیع کرده و هر LUN متصل به سرور را به عنوان block device جدیدی در مسیر /dev/mapper ایجاد می نماید.
اجزا multipath:
Multipath دارای چهار جز اصلی و به شرح زیر می باشد.
dm-multipath | ماژولی در کرنل است که وظیفه تصمیم گیری در خصوص routing مسیر ها را در حالت عادی و حالتی که یک یا چند مسیر دچار مشکل شده باشند را بر عهده دارد. |
multipath | دستوری در command line است که برای پیکربندی، لیست کردن و یا مشاهده مسیر ها به کار می رود. |
multipathd | سرویسی است که مسیسر ها را دائما مانیتور کرده تا وجود قطعی در مسیری یا رفع مشکل در مسیر قطع شده، را متوجه شده و آن را به عنوان failed path و یا restored علامت گذاری می کند. |
kpartx | دستوری است که به صورت خودکار هنگامی که دستور multipath اجرا میشود فراخوانی شده، و وظیفه ایجاد device mapper را برای LUN های multipath بر عهده دارد. |
مشخصات سرور های مورد استفاده:
برای پیاده سازی multipath از دو سرو با مشخصات زیر استفاده شده است که در آن سرور یک به عنوان storage server و server دوم نقش کلاینت را در این سناریو ایفا می کنند.
Server1:
CentOS Linux release 7.4.1708 (Core)
IP: 192.168.200.200
Server2:
CentOS Linux release 7.4.1708 (Core)
IP: 192.168.200.201
نیازمندی های انجام پروژه:
در این پروژه جهت شبیه سازی شرایط مورد نظر نیاز به وجود حداقل یک LUN متصل به سرور است. با توجه محیط آزمایشگاهی و نبود SAN، از طریق Server1 نسبت به ایجاد یک iSCSI Target و ایجاد LUN و معرفی ان به Server2 اقدام میکنیم و در نهایت با افزودن دو کارت شبکه دیگر به Server1 پیکربندی Multipath و تست شرایط قطعی را بررسی خواهیم کرد.
پیاده سازی iSCSI:
تنظیمات سمت سرور (iSCSI target):
برای ییاده سازی ISCSI در لینوکس از ابزاری به نام target استفاده می کنیم که این امکان را برای ما فراهم میکند تا یک یا چند دیسک از سرور را از طریق پروتکل iSCSI در شبکه به صورت block device به اشتراک گذاشته و یک Storage متمرکز ایجاد نمائیم. به سروری که iSCSI در آن اجرا می شود و دیسک ها آن به شاتراک گذاشته می شود، iSCSI target و به کلاینت هایی که به سرور متصل می شوند و از دیسک ها استفاده میکنند، iSCSI initiator گفته می شود. در مستند با توجه به موضوع اصلی آن توضیحات ارائه شده در خصوص پیکربندی iSCSI به صورت خلاصه بیان خواهد شد.
مرحل پیاده سازی iSCSI target در لینوکس به شرح زیر می باشد.
در ابتدا با دستور زیر targetcli را در Server1 نصب مینمائیم.
Server1~]# yum install targetcli
بعد از نصب، با دستورات زیر به ترتیب ابتدا سرویس را برای این که در هر بار بوت سیستم عامل شروع به کار کند فعال میکنیم سپس سرویس را جهت ادامه کار Start میکنیم.
Server1~]# systemctl enable target
Server1~]# systemctl start target
بعد از شروع به کار سرویس با دستور targetcli وارد محیط prompt این سرویس میشویم.
Server1~]# targetcli
در محیط prompt با دستور ls لیستی از اطلاعات موجود و پیکربندی های فعلی را میتوانیم ببینیم. که در آن تمامی دیوایس ها در قسمت backstore نمایش داده خواهند شد که میتواند یکی از تایپ های block، fileio، pscsi و ramdisk باشد. در قسمت target لیستی از iSCSI target های ایجاد شده داده خواهد شد.
در اینجا از پیش دو دیسک sdb و sdc یک physical volume ایجاد کرده و در نهایت یک lvm با حجمی برابر با حجم هر دو دیسک ایجاد کرده ایم را به عنوان iSCSI target معرفی نمائیم. اما ابتدا لازم است وارد قسمت block شویم لذا مراحل ما به صورت زیر خواهد بود.
/> cd backstores/block
/backstores/block> create LUN00 /dev/isc-co-vg/isc-co-lv
با دستور ls میتواینم ببینیم که block device ما ایجاد شده است.
حال برای ایجاد target مورد نظر ابتدا با دستور cd /iscsi وارد مسیر iscsi میشویم سپس با دستور زیر iSCSI target مورد نظر را ایجاد میکنیم.
cd /iscsi
/iscsi> create iqn.2020-01.com.test:server
بعد از ایجاد iSCSI target برای آن port group با نام tpg1 ایجاد می شود که داخل آن میتوانیم به صورت زیر دسترسی به Target را فقط برای کلاینت های مجاز فراهم کنیم.
cd /iscsi/iqn.2020-01.com.test:server/tpg1/acls
create iqn.2020-01.com.test:clients
در انتها نیاز است که LUN مورد نظر را به target ایجاد شده اختصاص دهیم. برای این کار وارد مسیر lun در target رفته و دستور زیر را وارد می نمائیم.
cd /iscsi/iqn.2020-01.com.test:server/tpg1/luns
create /backstores/block/LUN00
در نهایت با بازگشت به صفحه اصلی و زدن دستور ls پیکربندی نهایی را خواهیم دید. همانطور که در شکل زیر قابل مشاهده است، LUN ایجاد شده در مرال قبل به acl مرتبط به clients به درستی map شده است.
در نهایت با استفاده از دستور saveconfig تنظمیات انجام شده را ذخیره میکنیم. البته در صورت استفاده از دستور exit به صورت اتوماتیک آخرین اغییرات اعمال شده ذخیره خواهد شد اما همچنان می توان با استفاده از دستور saveconfig از ذخیره شدن تنظیمات مطمئن شد. پیکربندی های انجام شده در فایل /etc/target/saveconfig.json ذخیره خواهد شد.
سرویس target را با استفاده از دستور زیر restart میکنیم.
Systemctl restart target
به عنوان آخرین قدم پورت 3260 را در فایروایل نیز باز میکنیم.
firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload
تنظیمات سمت کلاینت (iSCSI initiator):
در سمت کلاینت ابتدا با دستور زیر iscsi-initiator-utils را نصب میکنیم.
yum install iscsi-initiator-utils
بعد از نصب، وارد مسیر /etc/iscsi/initiatorname.iscsi شده و iqn ایجاد شده برای clients را در آن به صورت زیر وارد میکنیم.
InitiatorName=iqn.2020-01.com.test:clients
سپس سرویس های iscsi و iscsid را Enable و start میکنیم.
systemctl enable iscsi iscsid
systemctl start iscsi iscsid
سپس با دستور زیر از صحت ارتباط اطمینان برقرار میکنیم.
iscsiadm --mode discovery --type sendtargets --portal 192.168.200.200:3260
در صورتی که مشکلی در ارتباط و پیکربندی وجود نداشت، با دستور زیر به iSCSI target معرفی شده login میکنیم.
iscsiadm -m node -T iqn.2020-01.com.test:server -p 192.168.200.200 –l
در نهایت با زدن دستور های زیر میبینیم که دیسک جدید به ماشین اضافه شده است و میتوان از آن استفاده کرد.
fdisk –l
pvs –a –o +dev_size
در صورتی که قصد داشته باشیم ارتباط را قطع نمایئم میتوانیم از درستور قبل با option –u استفاده نمائیم.
iscsiadm -m node -T iqn.2020-01.com.test:server -p 192.168.200.200 –u
در نهایت با معرفی LUN مورد نظر به Server2 به نحوه پیکربندی multipath میپردازیم.
پیکربندی multipath:
قبل از راه اندازی multipath، یک نیازمندی دیگر باقی است، اضافه کردن دو اینترفیس جدید به Server1. با توجه به عدم وجود پیچیدگی در نحوه اضافه کردن اینترفیس جدید، از ارائه توضیحات مربوطه صرف نظر می کنیم. در نهایت وضعیت سرور ما بعد از اضافه کردن سا اینترفیس به صورت زیر خواهد شد.
بعد از اضافه شدن اینترفیس ها از این که امکان دسترسی به LUN ایجاد شده در مرحله قبل از طریق هر سه اینترفیس Servcer1 فراهم است، اطمینان حاصل میکنیم.
سپس دستور iscsiadm را برای سایر اینترفیس های اضافه شده نیز اجرا میکنیم تا از طریق دو IP جدید نیز به LUN مورد نظر login کنیم.
[root@server2 ~]# iscsiadm -m node -T iqn.2020-01.com.test:server -p 192.168.200.199 -l
[root@server2 ~]# iscsiadm -m node -T iqn.2020-01.com.test:server -p 192.168.200.198 -l
بعد از انجام عملیات فوق در صورتی که وضعیت دیسک های متصل به سرور را بررسی کنیم، خواهیم دید که LUN معرفی شده به Server2 با توجه به این که از سه مسیر مخلف به آن معرفی شده است، به عنوان سه دیسک شناخته شده است.
حال که دیسک از سه مسیر قابل مشاهده و دسترسی است، به سراغ پیکربندی multipath خواهیم رفت. Multipath در لینوکس با استفاده از device-mapper-mulitpath یا dm-multipath انجام می شود و همانطور که گفته شد به صورت بومی بر روی سرور های لینوکسی وجود دارد. با این حال ّرای اطمینان از وجود این package میتوانیم از دستور زیر استفاده کنیم.
rpm -qa |grep multipath
در صورتی که این package نصب نبود، با دستور زیر نسبت به نصب آن اقدام میکنیم.
yum install device-mapper-multipath
سپس سرویس را برای راه اندازی خودکار در هر بار بوت سیستم عامل فعال و راه اندازی میکنیم.
systemctl enable multipathd
systemctl start multipathd
بعد از شروع سرویس، فایل پیکربندی را با دستور زیر ایجاد میکنیم.
mpathconf --enable --user_friendly_names n
درصورتی که user_freindly_names برابر با y قرار داده شود، در هنگام نمایش مشخصات دیسک ها و مسیر های آنها از alias آن ها برای نمایش به جای WWID استفاده خواهد شد. علت استفاده از WWID این است که این ID برای هر دیسک منحصر به فرد بوده و قابل تغییر نیست در صورتی که نام میتواند به هر دلیلی دچار تغییر شود. در این صورت ممکن است این تغییر نام مشکلاتی درعملکرد و شناسایی تنظیمات مبتنی بر نام ایجاد کند. در شکل زیر، در دستور اول این گزینه برابر با no و در دستور دوم مقدار آن برابر با yse می باشد. تفاوت نمایش با رنگ زرد مشخص شده است.
لازم به ذکر است درصورتی که WWID ای به نامی map شود، اطلاعات آن در مسیر /etc/multipath/bindings ذخیره خواهد ش
فایل پیکربندی ایجاد شده دارای چند بخش می باشد که در ادامه به معرفی بخش ها آن خواهیم پرداخت:
- defaults
- blacklist
- multipath
- devices
defaults:
تنظیماتی است که به صورت پیش فرض برروی تمامی Device ها اعمال می شود. به عنوان نمونه در تنظیمات زیر، از round-robin برای انتخاب مسیر استفاده خواهد شد، friendly name برای همه yes خواهد بود مگر این که در قیمت devices و multipath برای Device مشخصی مقدار جداگانه ای برای آن تغریف شود.
defaults {
path_selector "round-robin 0"
user_friendly_names yes
}
برخی از پارامتر های قابل استفاده در این قسمت به قرار زیر است:
polling_interval | بیانگر زمان چک کردن وضعیت بین path ها بر حسب ثانیه میباشد. |
multipath_dir | بیانگر نحوه ایجاد Device است. درصورتی که برابر با yes باشد، به ازای هر مسیری که black list نشده باشد اقدام به ایجاد device برای آن path نخواهد کرد مگر این که یا کاربر سرویس رو force کند device ی از یک path ایجاد شود، یا قبلا آن path ایجاده شده بوده و WWID آن ذحیره شده باشد یا حداقل دو path به Device موجود باشد. |
find_multipaths | بیانگر نحوه ایجاد Device است. درصورتی که برابر با yes باشد، به ازای هر مسیری که black list نشده باشد اقدام به ایجاد device برای آن path نخواهد کرد مگر این که یا کاربر سرویس رو force کند device ی از یک path ایجاد شود، یا قبلا آن path ایجاده شده بوده و WWID آن ذحیره شده باشد یا حداقل دو path به Device موجود باشد. |
path_selector | مشخص کننده این است که برای عملیات I/O بعدی از چه الگوریتمی برای انتخاب مسیر استفاده کند. که شامل سه الگوریتم است. round-robin 0: از طریق ایجاد یه حلقه بین مسیر های موجود هر بار یکی را انتخاب میکند. به عنوان نمونه عملیات اول به مسیر اول، عملیات دوم به مسیر دوم، عملیات سوم به مسیر سوم هدایت میشوند. برای عملیات های بعدی نیز به ترتیب مسیر ها انتخاب و عملیات های I/O به ان ارسال میشوند.queue-length 0: ارسال عملیات های I/O بر این اساس انجام میشود که کدام مسیر کمتری I/O به آن ارسال شده است. service-time 0: ارسال عملیات I/O بر اساس مدت زمان سرویس دهی هر مسیر انتخاب می شود که بر اساس میزان I/O بر throughput مسیر محاسبه می شود.مقدار پیش فرض برای این پارامتر Service_time م ی باشد. |
path_checker | بیانگر متدی است که وضعیت مسیر جهت تشخیص وضعیت آن به کار گرفته می شود. مقدار پیش فرض این پارامتر directioاست که اولین سکتور از path را با به صورت direct I/O میخواند. درصورت که موفق باشد، مسیر در دسترس و در غیر این صورت مسیر قطع شده در نظر گرفته می شود. |
no_path_retry | تعداد دفعاتی است که سیستم سعی میکند از یک مسیر fail شده استفاده کند. مقدار پیش فرض این پارامتر برابر با صفر است. |
user_friendly_names | در صورت yes بودن از alias Device برای نمایش آن استفاده میکند. در غیر این صورت تنها WWID آن استفاده خواهد شد. |
blacklist:
در این قسمت میتوان Device ها را از فرایند multipath خارج یا black list کرد. برای black list کردن Device ها میتوان از WWID، devnode (device name)، vendor، product، property های device و همچنین بر اساس device type استفاده کرد.
به عنوان نمونه:
Black list با استفاده از WWID
lacklist {
wwid 26353900f0264456456
}
Black list با استفاده ازdevnode
lacklist {
devnode "^sd[a-z]"
}
Black list با استفاده از vendor و product
blacklist {
device {
vendor "HP"
product "*"
}
}
Multipaths:
در این قسمت میتوانیم به تفکیک برای هر Device تنظیمات بخصوص آن را جداگانه معرفی نمایئم. تنظیماتی که در این قسمت معرفی می شوند، بر تنظیماتی که در قسمت Devices و defaults مشخص شده اند overwrite خواهند شد. پارامتر هایی که میتوان در این قسمت استفاده کرد همانند پارامتر های دو قسمت قبل است. یک نمونه از این تنظیمات به صورت زیر است.
multipaths {
multipath {
wwid 3600508b40000775650000000b0000
alias server1
path_selector "round-robin 0"
no_path_retry 5
}
}
devices:
درصورتی که Storage controller ی در لیست تجهیزات شناخته شده multipath نباشد یا بخواهیم Attribute خاصی از آن را با مقدار مشخصی مقدار دهی کنیم، میتوانیم از طریق این قسمت آن را به سیستم معرفی کنیم. برای مشاهده vendor های پشتیبانی شده از دستور زیر استفاده میکنیم.
multipath –t
در ادامه بعد از آشنایی اولیه با پارامتر ها و اجزاری فایل پیکربندی این سرویس، فایل پیکربندی را با تنظیماتی ساده و به شکل زیر تغییر می دهیم و سرویس را مجددا راه اندازی میکنیم.
بعد از راه اندازی سرویس با زدن دستور multipath –ll وضعیت دسترسی به دیسک را مشاهده خواهیم کرد. در تصویر مشخصات دیسک به همراه نام انتخاب شده برای آن و وضعیت مسیر ها نمایش داده شده است. همانطور که مشاهده میشود وضعیت دیسک ها Active و آماده فعالیت نمایش داده می شود.
حال برای تست عملکرد یکی از اینترفیس های Server1 را قطع کرده سپس مجددا وضعیت را در server2 بررسی میکنیم.
همانطور که در شکل مشاهده می شود، یکی از مسیر ها به وضعیت failed و faulty تغییر وضعیت داده شده است.
وضعیت مسیر بر اساس مقدار polling interval چک و بررسی خواهد شد و در صورت فعال شدن مجددا به صورت Active و ready تغییر وضعیت داده شده و مجددا مورد استفاده قرار میگیرد.
نتیجه گیری:
در محیط های عملیاتی می بایست برای حفظ دوام سرویس دهی و کیفیت آن، تلاش کرد مواردی که به هر دلیلی میتواند گلوکاهی برای سرویس دهی باشد حذف شده و یا ریسک آنها به حداقل ممکن رسانده شود. بروز مشکلاتی مانند قطعی ارتاط یک سرور به دلیل عدم وجود fault tolerance میتواند ضرر های هنگفت مالی و غیر مالی برای کسب و کارهای حساس ایجاد کند. در این مستند سعی شد تا معرفی multipath مکانیزمی برای تحمل خطا در سرور هایی که از دیسک های شبکه ای مانند SAN استفاده میکنند را مورد بررسی قرار گیرد. باید توجه داشت که پیکربندی این سرویس با در نظر گرفتن محیط آزمایشگاهی و سادگی آنها انجام شده است و در محیط ها عملیاتی میبایست پارامتر های مختلفی را جهت پیکربندی مناسب سرویس در نظر گرفت.