همانطور که می دانید در محیط RAC و در زمان ایجاد یک سرویس، می توان preferred instance و available instance را مشخص کرد در این صورت، سرویس بصورت پیش فرض در preferred instance اجرا خواهد شد.
اگر به هر دلیلی preferred instance دچار مشکل شود و یا به صورت کلی، نود مربوط به آن، از دسترس خارج شود، سرویس هم به available instance منتقل خواهد شد و حتی با استارت مجدد preferred instance، اصطلاحا failbackای برای این سرویس رخ نخواهد داد و سرویس کماکان در همان available instance به کارش ادامه خواهد داد و برای انتقال ان به preferred instance، باید به صورت دستی، عملیات relocate را انجام داد.
مثال زیر را ببینید.
مثال: در این مثال، سرویسی با نام mysrv را در اوراکل 11g ایجاد می کنیم:
[grid@node1 ~]$ crsctl query crs releaseversion
Oracle High Availability Services release version on the local node is [11.2.0.4.0]
[oracle@node1 ~]$ srvctl add service -d mydb -s mysrv -r instance1 -a instance2
بعد از ایجاد سرویس، ان را استارت کرده و خواهیم دید که این سرویس در preferred instance در حال اجرا است:
[oracle@node1 ~]$ srvctl start service -d mydb -s mysrv
[oracle@node1 ~]$ srvctl status service -d mydb -s mysrv
Service mysrv is running on instance(s) instance1
سوال؟! در صورتی که preferred instance دچار مشکل شود، چه اتفاقی برای این سرویس رخ خواهد داد؟
[oracle@node1 ~]$ srvctl stop instance –d mydb –I instance1 –f
با مشاهده وضعیت سرویس mysrv، خواهیم دید که این سرویس به صورت خودکار، به instance دوم منتقل شده است:
[oracle@node1 ~]$ srvctl status service –d mydb –s mysrv
Service mysrv is running on instance(s) instance2
همچنین با استارت مجدد instance1، کماکان سرویس در همان instance شماره دو، باقی خواهد ماند و به instance اول که اصطلاحا برای این سرویس، preferred می باشد، بر نمی گردد:
[oracle@node1 ~]$ srvctl start instance -d mydb -i instance1
[oracle@node1 ~]$ srvctl status service -d mydb -s mysrv
Service mysrv is running on instance(s) instance2
برای relocate دستی این سرویس به instance1، می توان دستور زیر را اجرا نمود:
[oracle@node1 ~]$ srvctl relocate service -d mydb -s mysrv -i instance2 -t instance1
[oracle@node1 ~]$ srvctl status service -d mydb -s mysrv
Service mysrv is running on instance(s) instance1
همانطور که می بینید، با اجرای دستور srvctl relocate service، سرویس از instance2 به instance1 منتقل شده است.
در اوراکل 19c، پارامتری به نام failback به دستور srvctl add service اضافه شد که امکان relocate خودکار سرویس را در چنین شرایطی فراهم می کند. مثال زیر ببینید.
مثال: قصد داریم با دستور زیر، دو سرویس با نامهای srv_nonfailback و srv_failback را ایجاد کنیم که قابلیت failback صرفا برای سرویس srv_failback فعال می باشد:
[grid@node1 ~]$ crsctl query crs releaseversion
Oracle High Availability Services release version on the local node is [19.0.0.0.0]
[oracle@node1 ~]$ srvctl add service -d db19c -service srv_nonfailback -preferred instance1 -available instance2
[oracle@node1 ~]$ srvctl add service -d db19c -service srv_failback -preferred instance1 -available instance2 -failback YES
[oracle@node1 ~]$ srvctl config service -d db19c|egrep -i ‘Service name|instances’
Service name: srv_failback
Preferred instances: instance1
Available instances: instance2
Service name: srv_nonfailback
Preferred instances: instance1
Available instances: instance2
با اجرای دستور srvctl start service، خواهیم دید که هر دو این سرویسها، در instance1 اجرا خواهند شد:
[oracle@node1 ~]$ srvctl start service -d db19c -s srv_nonfailback,srv_failback
[oracle@node1 ~]$ srvctl status service -d db19c -s srv_nonfailback,srv_failback
Service srv_nonfailback is running on instance(s) instance1
Service srv_failback is running on instance(s) instance1
قصد داریم با down کردن نود اول، رفتار این دو سرویس را مورد بررسی قرار دهیم به همین جهت، با دستور reboot، نود اول را به صورت کلی از دسترس خارج می کنیم:
[root@node1 ~]# reboot
با down شدن این نود، سرویس به instance2، نقل مکان خواهد کرد:
[oracle@node2 ~]$ srvctl status service -d db19c
Service srv_failback is running on instance(s) instance2
Service srv_nonfailback is running on instance(s) instance2
با استارت مجدد نود اول، به صورت خودکار، سرویس srv_failback به این نود relocate خواهد شد اما سرویس srv_nonfailback کماکان در instance دوم در حال اجرا خواهد ماند:
[oracle@node1 ~]$ srvctl status service -d db19c
Service srv_failback is running on instance(s) instance1
Service srv_nonfailback is running on instance(s) instance2
بسیار ممنون به خاطر به اشتراک گذاشتن دانش و تجربه گرانبهایتان