18.18. Highly Available Storage (HAST)

Хувь нэмэр болгон оруулсан Даниел Гэрзо. Зарим нэг зүйлс нэмэрлэсэн Фредди Кэш, Павел Жакуб Давидек, Майкл В. Лукас, ба Виктор Петерсон.

18.18.1. Ерөнхий зүйл

Байнгын бэлэн ажиллагаатай байх (High-availability) нь бизнесийн чухал програм хангамжуудын хувьд хамгийн гол шаардлага бөгөөд тийм хадгалалтын төхөөрөмж нь уг орчны түлхүүр хэсэг юм. Highly Available STorage буюу HAST-г Pawel Jakub Dawidek хөгжүүлсэн бөгөөд энэ нь өгөгдлийг TCP/IP сүлжээнд холбогдсон хэд хэдэн тусдаа байгаа машинууд дээр тунгалгаар хадгалах боломжийг бүрдүүлдэг. HAST-г сүлжээний RAID1 (толь) гэж ойлгож болох бөгөөд GNU/Linux тавцангийн хувьд байдаг DRBD хадгалалтын системтэй төстэй юм. CARP зэрэг FreeBSD-н бусад байнгын бэлэн ажиллагааг хангагч боломжуудын хамтаар HAST нь тоног төхөөрөмжийн эвдрэлээс ангид байнгын бэлэн ажиллагаатай хадгалалтын кластер бүтээх боломжийг бүрдүүлдэг.

Энэ хэсгийг уншаад та дараах зүйлсийг мэдэх болно:

Энэ хэсгийг уншихаасаа өмнө та дараах зүйлсийг мэдсэн байх шаардлагатай:

HAST төслийг FreeBSD сан OMCnet Internet Service GmbH болон TransIP BV-н дэмжлэгтэйгээр санхүүжүүлжээ.

18.18.2. HAST-н боломжууд

HAST системийн гол боломжуудад:

18.18.3. HAST-н ажиллагаа

HAST нь дурын хадгалалтын төхөөрөмжийн хувьд блок түвшний синхрон олшруулалтыг хэд хэдэн машин уруу хийдэг болохоор хамгийн багадаа хоёр цэг (физик машинууд) шаарддаг -- Эдгээр нь анхдагч (бас мастер гэгддэг) цэг болон хоёрдогч (боол) цэг юм. Энэ хоёр машиныг хамтад нь кластер гэж дуудах болно.

Тэмдэглэл: HAST нь одоогоор хоёр кластерын цэгээр хязгаарлагдсан байгаа.

HAST нь анхдагч-хоёрдогч тохиргоогоор ажилладаг болохоор тухайн үед зөвхөн нэг кластерын цэгийг идэвхтэй байхыг зөвшөөрдөг. анхдагч цэг буюу актив нь HAST-р удирдуулсан төхөөрөмжүүдэд хандах I/O хүсэлтүүдтэй ажилладаг цэг юм. хоёрдогч цэг нь дараа нь primary цэгээсээ автоматаар синхрончлогддог.

HAST системийн физик хэсгүүд нь:

HAST нь блок түвшинд синхроноор ажилладаг бөгөөд энэ нь файлын системүүд болон програм хангамжуудын хувьд тунгалаг болгодог. HAST нь бусад хэрэгслүүд эсвэл програм хангамжуудад ашиглах боломжтойгоор /dev/hast/ санд ердийн GEOM үйлчилгээ үзүүлэгчдээр хангадаг бөгөөд ингэснээр HAST-р хангагдсан төхөөрөмжүүд болон түүхий дискнүүд, хуваалтууд гэх зэргүүдийн хооронд ялгаа байхгүй болдог байна.

Бичих, устгах, эсвэл flush үйлдэл бүрийг локал диск болон алсын диск рүү TCP/IP ашиглан илгээдэг. Унших үйлдэлд локал диск дээрх мэдээлэл шинэ биш эсвэл I/O алдаа гараагүй л бол локал дискнээс хариу өгдөг. Хэрэв тийм тохиолдол байвал унших үйлдлийг хоёрдогч цэг рүү илгээдэг.

18.18.3.1. Синхрончлол ба Олшруулалтын горимууд

HAST нь унасан байдлаас хурдан сэргээх боломжийг бий болгохыг оролддог. Энэ зорилгоор цэг унасны дараа синхрончлох хугацааг багасгах нь хамгийн чухал юм. Синхрончлолыг хурдан хангахын тулд HAST нь диск дээрх бохир өгөгдлүүдийн битмапыг зохицуулж байдаг бөгөөд ердийн синхрончлолын үед зөвхөн тэдгээрийг синхрончилдог (эхний синхрончлолыг тооцолгүйгээр).

Синхрончлолтой ажиллах олон аргууд байдаг. HAST нь янз бүрийн синхрончлолын аргуудтай (доор дурдсан) ажиллахын тулд хэд хэдэн олшруулалтын горимыг хийдэг:

  • memsync: локал бичих үйлдэл дууссан ба алсын цэг өгөгдөл ирснийг баталгаажуулсан бөгөөд өгөгдлийг яг хадгалахаас өмнөх үед бичих үйлдэл дууссан гэж үздэг. Алсын цэг дээрх өгөгдөл баталгаажуулалт илгээгдсэний дараа хадгалагддаг. Энэ горим нь саатлыг багасгах зориулалттай бөгөөд маш сайн найдвартай байдлыг хангадаг. memsync олшруулалтын горим нь одоогоор хийгдээгүй байгаа.

  • fullsync: локал болон алсын бичих үйлдэл хийгдэж дууссаны дараа бичих үйлдэл дууссан гэж үздэг. Энэ нь хамгийн найдвартай бөгөөд удаан горим юм. Энэ горим нь анхдагч байдаг.

  • async: локал бичих үйлдэл дууссан үед бичих үйлдлийг дууссан гэж үздэг. Энэ нь хамгийн хурдан бөгөөд аюултай олшруулалтын горим юм. Энэ горимыг бусад горимын хувьд саатал хэтэрхий өндөр байгаа алсын цэг рүү олшруулахдаа ашиглах ёстой. async олшруулалтын горим одоогоор хийгдээгүй байгаа.

Сануулга: Зөвхөн fullsync олшруулалтын горим одоогоор дэмжигдсэн.

18.18.4. HAST-н тохиргоо

HAST нь ажиллахын тулд GEOM_GATE дэмжлэгийг шаарддаг. GENERIC цөм нь анхдагчаар GENERICагуулдаггүй боловч FreeBSD-н анхдагч суулгацад дуудагдах боломжтой geom_gate.ko модуль байдаг. Мөн дараах мөрийг цөмийн тохиргооны файлд нэмэн GEOM_GATE дэмжлэгийг цөмд оруулан бүтээж болдог:

options        GEOM_GATE

HAST тогтолцоо нь үйлдлийн системийн өнцгөөс харахад хэд хэдэн хэсгээс тогтдог:

Дараах жишээ хоёр цэгийг мастер-боол / анхдагч-хоёрдогч үйлдлийн хувьд өгөгдлийг уг хоёр цэгийн хооронд олшруулахын тулд HAST ашиглан тохируулах талаар тайлбарлана. Цэгүүдийг 172.16.0.1 IP хаягтай hasta болон 172.16.0.2 IP хаягтай hastb гэж нэрлэе. Эдгээр цэгүүд нь HAST үйлдлийн хувьд ижил хэмжээтэй өөр өөрийн /dev/ad6 хатуу дисктэй байна. HAST нөөцийг (заримдаа эх үүсвэр гэгддэг, өөрөөр хэлбэл /dev/hast/ дахь GEOM үйлчилгээ үзүүлэгч) test гэж нэрлэнэ.

HAST-н тохиргоог /etc/hast.conf файлд хийнэ. Энэ файл нь хоёр цэг дээр ижил байх ёстой. Боломжит хамгийн хялбар тохиргоо дараах байдалтай байна:

resource test {
        on hasta {
                local /dev/ad6
                remote 172.16.0.2
        }
        on hastb {
                local /dev/ad6
                remote 172.16.0.1
        }
}

Илүү дэлгэрэнгүй тохиргооны талаар hast.conf(5) гарын авлагаас үзнэ үү.

Зөвлөгөө: Мөн remote гэсэн хэсэгт хостын нэрийг ашиглаж бас болно. Тэр тохиолдолд тэдгээр хостуудыг таних боломжтой байх ёстойг анхаараарай, өөрөөр хэлбэл тэдгээр нь /etc/hosts файл юм уу эсвэл локал DNS дээр тодорхойлогдсон байх ёстой.

Одоо хоёр цэг дээр тохиргоо байгаа болохоор HAST нөөцийг үүсгэх боломжтой. Хоёр цэг дээр дараах тушаалыг ажиллуулж эхний мета өгөгдлийг локал диск дээр байрлуулж hastd(8) демонг ажиллуулна:

# hastctl create test
# /etc/rc.d/hastd onestart

Тэмдэглэл: GEOM үйлчилгээ үзүүлэгчдийг одоо байгаа файлын систем дээр ашиглаж болохгүй (жишээ нь HAST-р удирдуулсан нөөц рүү одоо байгаа хадгалалтын төхөөрөмжийг хувиргах). Учир нь энэ процедур нь ямар нэг мета өгөгдлийг үйлчилгээ үзүүлэгч дээр хадгалах хэрэгтэй байдаг бөгөөд шаардлагатай зай хангалттай байхгүй байх болно.

HAST нь цэгийн үүргийг сонгох үүрэггүй (анхдагч эсвэл хоёрдогч). Цэгийн үүргийг администратор тохируулах юм уу эсвэл hastctl(8) хэрэгсэл ашиглан Heartbeat зэрэг бусад програмаар тохируулж болно. Анхдагч цэг рүү (hasta) шилжээд дараах тушаалыг өгнө:

# hastctl role primary test

Үүнтэй адилаар хоёрдогч цэг дээр (hastb) дараах тушаалыг ажиллуулна:

# hastctl role secondary test

Анхааруулга: Хоёр цэг хоорондоо холбогдож чадахгүй бөгөөд хоёулаа анхдагч гэж тохируулагдсан байж болно. Энэ нөхцлийг split-brain гэж нэрлэдэг. Энэ тохиолдолд алдааг олж засварлахын тулд Хэсэг 18.18.5.2 хэсэгт зааснаар ажиллана.

Үр дүнг хоёр цэг дээр hastctl(8) хэрэгсэл ашиглан шалгаж болно:

# hastctl status test

Гаралтаас хамгийн чухал текст нь status мөр бөгөөд хоёр цэг дээр complete гэж байх ёстой. Хэрэв энэ нь degraded гэж байх юм бол ямар нэг юм болохоо больсныг илтгэнэ. Энэ үед цэгүүдийн хооронд синхрончлол явагдаад эхэлчихсэн байна. hastctl status тушаал dirty гэдэг дээр 0 байт харуулж байвал синхрончлол дууссан гэсэн үг юм.

Эцсийн алхам бол /dev/hast/test GEOM үйлчилгээ үзүүлэгч дээр файлын систем үүсгэж холбох явдал юм. Үүнийг анхдагч цэг (учир нь /dev/hast/test зөвхөн primary цэг дээр харагдана) дээр хийх ёстой бөгөөд хатуу дискийн хэмжээнээс хамаарч хэдэн минут үргэлжилж болох юм:

# newfs -U /dev/hast/test
# mkdir /hast/test
# mount /dev/hast/test /hast/test

HAST тогтолцоог зөв тохируулсны дараа хамгийн сүүлийн алхам бол HAST систем ачаалах үед автоматаар эхэлсэн байхыг шалгах явдал юм. Дараах мөрийг /etc/rc.conf файлд нэмж өгөх шаардлагатай:

hastd_enable="YES"

18.18.4.1. Нэгээс нөгөөд шилжих тохиргоо

Энэ жишээний зорилго нь өгөгдсөн дурын цэг ажиллахаа больсон тохиолдолд ажиллаж байх уян хатан хадгалалтын систем бүтээх явдал юм. Энд хамгийн түлхүүр ажил бол кластерын анхдагч цэг ажиллахаа болих тохиолдлыг байхгүй болгох юм. Хэрэв боллоо гэхэд хоёрдогч цэг сааталгүйгээр авч ажиллан файлын системийг шалган холбож өгөгдлийн нэг ч битийг алдалгүйгээр үргэлжлүүлэн ажиллах ёстой.

Энэ зорилтод хүрэхийн тулд FreeBSD-ийн өөр нэг боломж болох IP давхарга дээр автоматаар шилжих боломжийг бүрдүүлдэг CARP-г ашиглах шаардлагатай байдаг. CARP нь Common Address Redundancy Protocol гэсэн үг бөгөөд ижил сүлжээнд олон хостууд IP хаяг хуваалцаж хэрэглэх боломжийг бүрдүүлдэг. CARP-г кластерын цэг бүр дээр Хэсэг 31.14 хэсэгт зааснаар тохируулна. Үүнийг хийснийхээ дараа цэг бүр хуваалцсан IP 172.16.0.254 гэсэн хаягтай carp0 гэсэн интерфэйстэй байх болно. Мэдээж кластерын анхдагч HAST цэг мастер CARP цэг байх ёстой.

Өмнөх хэсэгт үүсгэсэн HAST нөөц сүлжээн дэх бусад хостууд руу экспорт хийгдэхэд бэлэн болсон байна. Үүнийг NFS, Samba гэх мэтүүдийн тусламжтайгаар хуваалцсан IP хаяг 172.16.0.254 ашиглан экспорт хийх замаар хийнэ. Шийдэгдээгүй цор ганц асуудал бол анхдагч цэг унахад автоматаар шилжих асуудал юм.

Хэрэв CARP интерфэйсүүд унаж босоод байвал FreeBSD үйлдлийн систем devd(8) үйл явдал гаргах бөгөөд энэ нь CARP интерфэйсүүд дээр төлвийг харах боломжийг бүрдүүлдэг. CARP интерфэйс дээрх төлвийн өөрчлөлт нь аль нэг цэг ажиллахаа байсан эсвэл ажиллаж эхэлснийг харуулна. Энэ тохиолдолд шилжилтийг автоматаар зохицуулах тусгай скриптийг ажиллуулах боломжтой юм.

CARP интерфэйсүүд дээрх төлвийн өөрчлөлтүүдийг барьж чадахын тулд дараах тохиргоог цэг бүр дээр /etc/devd.conf файлд хийж өгөх ёстой:

notify 30 {
        match "system" "IFNET";
        match "subsystem" "carp0";
        match "type" "LINK_UP";
        action "/usr/local/sbin/carp-hast-switch master";
};

notify 30 {
        match "system" "IFNET";
        match "subsystem" "carp0";
        match "type" "LINK_DOWN";
        action "/usr/local/sbin/carp-hast-switch slave";
};

Шинэ тохиргоог идэвхтэй болгохын тулд дараах тушаалыг цэг бүр дээр ажиллуулна:

# /etc/rc.d/devd restart

carp0 интерфэйс унаж босож байгаа тохиолдолд (өөрөөр хэлбэр интерфэйсийн төлөв өөрчлөлгдсөн тохиолдолд) систем мэдээлэл өгөх бөгөөд энэ нь devd(8) дэд системд скрипт ажиллуулах боломжийг бүрдүүлэх бөгөөд энэ тохиолдолд /usr/local/sbin/carp-hast-switch байна. Энэ скрипт нь автоматаар шилжих шилжилтийг зохицуулах юм. Дээрх devd(8) тохиргооны талаар дэлгэрэнгүйг devd.conf(5) гарын авлагаас үзнэ үү.

Ийм скриптийн жишээ дараах байдлаар байж болох юм:

#!/bin/sh

# Original script by Freddie Cash <fjwcash@gmail.com>
# Modified by Michael W. Lucas <mwlucas@BlackHelicopters.org>
# and Viktor Petersson <vpetersson@wireload.net>

# The names of the HAST resources, as listed in /etc/hast.conf
resources="test"

# delay in mounting HAST resource after becoming master
# make your best guess
delay=3

# logging
log="local0.debug"
name="carp-hast"

# end of user configurable stuff

case "$1" in
        master)
                logger -p $log -t $name "Switching to primary provider for ${resources}."
                sleep ${delay}

                # Wait for any "hastd secondary" processes to stop
                for disk in ${resources}; do
                        while $( pgrep -lf "hastd: ${disk} \(secondary\)" > /dev/null 2>&1 ); do
                                sleep 1
                        done

                        # Switch role for each disk
                        hastctl role primary ${disk}
                        if [ $? -ne 0 ]; then
                                logger -p $log -t $name "Unable to change role to primary for resource ${disk}."
                                exit 1
                        fi
                done

                # Wait for the /dev/hast/* devices to appear
                for disk in ${resources}; do
                        for I in $( jot 60 ); do
                                [ -c "/dev/hast/${disk}" ] && break
                                sleep 0.5
                        done

                        if [ ! -c "/dev/hast/${disk}" ]; then
                                logger -p $log -t $name "GEOM provider /dev/hast/${disk} did not appear."
                                exit 1
                        fi
                done

                logger -p $log -t $name "Role for HAST resources ${resources} switched to primary."


                logger -p $log -t $name "Mounting disks."
                for disk in ${resources}; do
                        mkdir -p /hast/${disk}
                        fsck -p -y -t ufs /dev/hast/${disk}
                        mount /dev/hast/${disk} /hast/${disk}
                done

        ;;

        slave)
                logger -p $log -t $name "Switching to secondary provider for ${resources}."

                # Switch roles for the HAST resources
                for disk in ${resources}; do
                        if ! mount | grep -q "^/dev/hast/${disk} on "
                        then
                        else
                                umount -f /hast/${disk}
                        fi
                        sleep $delay
                        hastctl role secondary ${disk} 2>&1
                        if [ $? -ne 0 ]; then
                                logger -p $log -t $name "Unable to switch role to secondary for resource ${disk}."
                                exit 1
                        fi
                        logger -p $log -t $name "Role switched to secondary for resource ${disk}."
                done
        ;;
esac

Товчхондоо скрипт нь цэг мастер / анхдагч болох үед дараахийг хийнэ:

  • Өгөгдсөн цэг дээр HAST нөөцийг анхдагч болгоно.

  • HAST нөөц доор байгаа файлын системийг шалгана.

  • Тохирох газарт нь нөөцүүдийг холбоно.

нөөц / хоёрдогч болсон тохиолдолд:

  • HAST нөөцүүдийг салгана.

  • HAST нөөцүүдийг хоёрдогч болгож бууруулна.

Анхааруулга: Энэ нь зөвхөн боломжой шийдэл байдаг гэдгийг харуулсан жишээ скрипт гэдгийг санаарай. Энэ нь бүх л боломжит нөхцлийг тооцоогүй бөгөөд шаардлагатай үйлчилгээг эхлүүлэх/зогсоох гэх мэтээр сайжруулж өргөтгөх юм уу эсвэл дураараа өөрчлөх боломжтой юм.

Зөвлөгөө: Энэ жишээн дээр бид стандарт UFS файлын системийг ашигласан. Сэргээхэд шаардлагатай цагийг багасгахын тулд журнал дэмжигдсэн UFS эсвэл ZFS файлын системийг ашиглаж болох юм.

Нэмэлт жишээнүүд бүхий илүү дэлгэрэнгүй мэдээллийг HAST Wiki хуудаснаас олж болно.

18.18.5. Алдааг олж засварлах

18.18.5.1. Алдааг олж засварлах ерөнхий аргууд

HAST ерөнхийдөө асуудалгүй ажиллах ёстой боловч бусад програмуудын нэгэн адил ажиллах ёстойгоосоо өөрөөр ажиллах тохиолдол байдаг. Асуудлын шалтгаан өөр өөр байж болох боловч гол шалгах юм нь кластерын цэгүүдийн хооронд цаг синхрончлогдсон байгаа эсэхийг мэдэх явдал юм.

HAST-н асуудлуудыг шалгаж байхдаа hastd(8)-н дибаг түвшинг ихэсгэж үзэх ёстой. Ингэхдээ hastd(8)-d өгөгдөлтэйгээр ажиллуулах хэрэгтэй. Дибаг түвшинг дахин дахин ихэсгэхийн тулд энэ аргументыг олон удаа тавьж өгч болно. Энэ замаар маш их хэрэгтэй мэдээллийг олж авч болно. Мөн -F аргументыг ашиглан hastd(8) демонг ил ажиллуулах нь зүйтэй байдаг.

18.18.5.2. Split-brain нөхцлөөс сэргэж гарах

Хоёр цэг нэг нэгэнтэйгээ холбогдож чадахгүй бөгөөд хоёул анхдагч цэг гэж тохируулагдсан үеийн нөхцлийг split-brain гэдэг. Энэ нь аюултай нөхцөл бөгөөд учир нь энэ тохиолдолд өгөгдөлд хоёр цэг хоёул нийцгүй өөрчлөлтийг хийх боломжийг олгодог. Энэ нөхцлийг системийн администратор гараар зохицуулах шаардлагатай.

Энэ тохиолдлыг засварлахын тулд администратор аль цэг хамгийн чухал өөрчлөлттэй байгаа дээр шийдвэр гаргаж (эсвэл гараар нийлүүлэн) HAST-д эвдэрсэн өгөгдөл бүхий цэгийн бүтэн синхрончлол хийх боломжийг олгох ёстой. Ингэхийн тулд дараах тушаалуудыг дахин синхрончлол шаардлагатай байгаа цэг дээр ажиллуулна:

# hastctl role init <resource>
# hastctl create <resource>
# hastctl role secondary <resource>

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.