FreeBSD гарын авлага
Өмнөх | Бүлэг 18. Хадгалалт | Дараах

# 18.18. Highly Available Storage (HAST)

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

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

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

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

- HAST гэж юу болох, хэрхэн ажилладаг болон ямар боломжуудыг хангадаг талаар.

- FreeBSD дээр HAST-г хэрхэн тохируулж ашиглах талаар.

- CARP болон devd(8)-г хэрхэн тохируулж уян хатан хадгалалтын систем бүтээх талаар.

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

- UNIX� болон FreeBSD-ийн үндсийг ойлгосон байх (Бүлэг 3).

- Сүлжээний интерфэйсүүд болон FreeBSD-н бусад гол дэд системүүдийг хэрхэн тохируулах талаар мэддэг байх (Бүлэг 11).

- FreeBSD-н сүлжээний талаар сайн мэддэг байх (хэсэг IV дотор FreeBSD гарын авлага).

- FreeBSD�8.1-RELEASE буюу түүнээс хойшхи хувилбарыг ашиглах.

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

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

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

- Локал хатуу дискний хөтчүүд дээрх I/O алдаануудыг халхлахад ашиглаж болох боломж.

- FreeBSD-н дэмждэг дурын файлын системийг ашиглах боломжийг бүрдүүлдэг файлын системээс үл хамаарсан байдал.

- Тухайн цэг унасан байх үед зөвхөн өөрчлөгдсөн блокуудыг синхрончлох замаар үр ашигтай, хурдан дахин синхрончлох боломж.

- Нэмэлт нөөц бололцоог нэмэхийн тулд аль хэдийн бий болгосон орчинд ашиглах боломж.

- CARP, Heartbeat эсвэл бусад хэрэгслүүдийн хамтаар уян хатан, бөх бат хадгалалтын системийг бүтээхэд цуг ашиглаж боломж.

## 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 тогтолцоо нь үйлдлийн системийн өнцгөөс харахад хэд хэдэн хэсгээс тогтдог:

- өгөгдлийн синхрончлолд зориулсан hastd(8) демон,

- хэрэглэгчийн талбарын удирдлагын хэрэгсэл hastctl(8),

- hast.conf(5) тохиргооны файл.

Дараах жишээ хоёр цэгийг `мастер`-`боол` / `анхдагч`-`хоёрдогч` үйлдлийн хувьд өгөгдлийг уг хоёр цэгийн хооронд олшруулахын тулд 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>

Өмнөх | Эхлэл | Дараах
Swap зайг шифрлэх | Дээш | GEOM: Модульчлагдсан Диск Хувиргах Тогтолцоо

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

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