Multipath_simple_example1

آموزش راه اندازی Multipath در لینوکس

معرفی 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

yum target

بعد از نصب، با دستورات زیر به ترتیب ابتدا سرویس را برای این که در هر بار بوت سیستم عامل شروع به کار کند فعال میکنیم سپس سرویس را جهت ادامه کار Start  میکنیم.

Server1~]#  systemctl enable target
Server1~]#  systemctl start target

بعد از شروع به کار سرویس با دستور targetcli وارد محیط prompt این سرویس میشویم.

Server1~]# targetcli

در محیط prompt با دستور ls لیستی از اطلاعات موجود و پیکربندی های فعلی را میتوانیم ببینیم.  که در آن تمامی دیوایس ها در قسمت backstore نمایش داده خواهند شد که میتواند یکی از تایپ های block،  fileio، pscsi و ramdisk باشد. در قسمت target  لیستی از iSCSI target  های ایجاد شده داده خواهد شد.

targetcli menu

در اینجا از پیش دو دیسک sdb و  sdc یک physical volume ایجاد کرده و در نهایت یک lvm با حجمی برابر با حجم هر دو دیسک ایجاد کرده ایم را  به عنوان iSCSI target  معرفی نمائیم. اما ابتدا لازم است وارد قسمت block  شویم لذا مراحل ما به صورت زیر خواهد بود.

/> cd backstores/block 
/backstores/block> create LUN00 /dev/isc-co-vg/isc-co-lv

create lunn001

با دستور ls میتواینم ببینیم که block device ما ایجاد شده است.

block ls

حال برای ایجاد target مورد نظر ابتدا با دستور cd /iscsi وارد مسیر iscsi  میشویم سپس با دستور زیر iSCSI target مورد نظر را ایجاد میکنیم.

cd /iscsi
/iscsi> create iqn.2020-01.com.test:server

create iqn

بعد از ایجاد iSCSI target برای آن port group با نام tpg1 ایجاد می شود که داخل آن میتوانیم به صورت زیر دسترسی به Target را فقط برای کلاینت های مجاز فراهم کنیم.

cd /iscsi/iqn.2020-01.com.test:server/tpg1/acls
create iqn.2020-01.com.test:clients

create iqn client

در انتها نیاز است که LUN مورد نظر را به target  ایجاد شده اختصاص دهیم. برای این کار وارد مسیر lun در target  رفته و دستور زیر را وارد می نمائیم.

cd /iscsi/iqn.2020-01.com.test:server/tpg1/luns 
create /backstores/block/LUN00

create block lun00

در نهایت با بازگشت به صفحه اصلی و زدن دستور ls پیکربندی نهایی را خواهیم دید. همانطور که در شکل زیر قابل مشاهده است، LUN ایجاد شده در مرال قبل به acl  مرتبط به clients به درستی map  شده است.

ls after all configuration

در نهایت با استفاده از دستور 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

cat initiator iscsi

سپس سرویس های iscsi  و iscsid را Enable و start میکنیم.

systemctl enable iscsi iscsid
systemctl start iscsi iscsid

سپس با دستور زیر از صحت ارتباط اطمینان برقرار میکنیم.

iscsiadm --mode discovery --type sendtargets --portal 192.168.200.200:3260

iscsiadm

در صورتی که مشکلی در ارتباط و پیکربندی وجود نداشت، با دستور زیر به iSCSI target معرفی شده login میکنیم.

iscsiadm -m node -T iqn.2020-01.com.test:server -p 192.168.200.200 –l

iscsiadm-m node

در نهایت با زدن دستور  های زیر میبینیم که دیسک جدید به ماشین اضافه شده است و میتوان از آن استفاده کرد.

fdisk –l
pvs –a –o +dev_size

psw dev_size

در صورتی که قصد داشته باشیم ارتباط را قطع نمایئم میتوانیم از درستور قبل با option –u استفاده نمائیم.

iscsiadm -m node -T iqn.2020-01.com.test:server -p 192.168.200.200 –u

iscsiadm disconnect

در نهایت با معرفی LUN مورد نظر به Server2 به نحوه پیکربندی multipath میپردازیم.

پیکربندی multipath:

قبل از راه اندازی multipath، یک نیازمندی دیگر باقی است، اضافه کردن دو اینترفیس جدید به Server1. با توجه به عدم وجود پیچیدگی در نحوه اضافه کردن اینترفیس جدید، از ارائه توضیحات مربوطه صرف نظر می کنیم. در نهایت وضعیت سرور ما بعد از اضافه کردن سا اینترفیس به صورت زیر خواهد شد.

بعد از اضافه شدن اینترفیس ها از این که امکان دسترسی به LUN ایجاد شده در مرحله قبل از طریق هر سه اینترفیس Servcer1 فراهم است، اطمینان حاصل میکنیم.

iscsiadm sendtargets

سپس دستور 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

iscsiadm on server 2

بعد از انجام عملیات فوق در صورتی که وضعیت دیسک های متصل به سرور را بررسی کنیم، خواهیم دید که LUN معرفی شده به Server2 با توجه به این که از سه مسیر مخلف به آن معرفی شده است، به عنوان سه دیسک شناخته شده است.

pvs dev_size 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  می باشد.  تفاوت نمایش با رنگ زرد مشخص شده است.

multipath-ll

لازم به ذکر است درصورتی که 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-conf

بعد از راه اندازی سرویس با زدن دستور multipath –ll وضعیت دسترسی به دیسک را مشاهده خواهیم کرد. در تصویر مشخصات دیسک به همراه نام انتخاب شده برای آن و وضعیت مسیر ها  نمایش داده شده است. همانطور که مشاهده میشود وضعیت دیسک ها Active  و آماده فعالیت نمایش داده می شود.

multipath-ll server2

حال برای تست عملکرد یکی از اینترفیس های Server1 را قطع کرده سپس مجددا وضعیت را در server2 بررسی میکنیم.

همانطور که در شکل مشاهده می شود، یکی از مسیر ها به وضعیت failed و  faulty تغییر وضعیت داده شده است.

multipath-ll server2-faulty

وضعیت مسیر بر اساس مقدار polling interval  چک و بررسی خواهد شد و در صورت فعال شدن مجددا به صورت Active و ready تغییر وضعیت داده شده و مجددا مورد استفاده قرار میگیرد.

نتیجه گیری:

در محیط های عملیاتی می بایست برای حفظ دوام سرویس دهی و کیفیت آن، تلاش کرد مواردی که به هر دلیلی میتواند گلوکاهی برای سرویس دهی باشد حذف شده و یا ریسک آنها به حداقل ممکن رسانده شود. بروز مشکلاتی مانند قطعی ارتاط یک سرور به دلیل عدم وجود fault tolerance میتواند ضرر های هنگفت مالی و غیر مالی برای کسب و کارهای حساس ایجاد کند. در این مستند سعی شد تا معرفی multipath مکانیزمی برای تحمل خطا در سرور هایی که از دیسک های شبکه ای مانند SAN استفاده میکنند را مورد بررسی قرار گیرد. باید توجه داشت که پیکربندی این سرویس با در نظر گرفتن محیط آزمایشگاهی و سادگی آنها انجام شده است و در محیط ها عملیاتی میبایست پارامتر های مختلفی را جهت پیکربندی مناسب سرویس در نظر گرفت.

 

 

 

 

 

 

 

 

 

حامد
اشتراک دانش رو دوست دارم برای همین سعی میکنم مطالب آموزشی ای تهیه شده دارای جزئیات خوب و به صورت کامل تهیه بشوند.استفاده از مطالب این سایت در هر جایی بلا مانع می باشد. اما ذکر منبع رفتاری حرفه ای و اخلاقی خواهد بود. من را از نظرات خود مطلع سازید. و اگر میخواهید در مورد من بیشتر بدانید سری به صفحه "در باره من" بزنید.