Thursday, September 19, 2024

Handoff trong OpenStack Swift là gì?

-

1. Tổng quan.

Trong quá trình một object được tải lên vào OpenStack Swift, nó sẽ trải qua rất nhiều các trạng thái khác nhau. Trạng thái handoff là một trong những trạng thái quan trọng, nó diễn ra sau khi object đã được lưu trữ thành công vào một số node nhất định trong cluster.

2. Ý nghĩa.

Khi một object ở trạng thái handoff, có nghĩa là nó đã được sao chép sang các node khác trong cluster để đảm bảo tính sẵn sàng cao. Nếu một node bị lỗi, các bản sao của object trên các node khác sẽ được sử dụng để phục vụ yêu cầu của người dùng.

3. Mục tiêu.

Mục tiêu chính của quá trình handoff là tăng cường độ bền vững và khả năng phục hồi của dữ liệu. Nếu một node bị hỏng hoặc toàn bộ một đĩa bị lỗi, dữ liệu vẫn được bảo vệ vì đã có các bản sao trên các node khác.

4. Quá trình handoff diễn ra như thế nào?

Bước 1 – Tải lên object.

Khi bạn tải lên một object, nó sẽ được lưu trữ trên một số node nào đó trong cluster.

Bước 2 – Kiểm tra tính toàn vẹn.

Hệ thống sẽ tiến hành kiểm tra tính toàn vẹn của dữ liệu để đảm bảo rằng dữ liệu đã được lưu trữ chính xác.

Bước 3 – Sao chép dữ liệu.

Sau khi kiểm tra xong, dữ liệu sẽ được sao chép sang các node khác trong cluster. Quá trình này được gọi là handoff.

Bước 4 – Cập nhật metadata.

Hệ thống sẽ cập nhật metadata của object để phản ánh trạng thái mới của nó.

5. Tại sao trạng thái handoff lại quan trọng?

Bảo vệ dữ liệu.

Trạng thái handoff giúp đảm bảo rằng dữ liệu của bạn sẽ không bị mất ngay cả khi một node bị lỗi.

Khả năng phục hồi.

Nếu một node bị hỏng, hệ thống có thể nhanh chóng phục hồi dữ liệu từ các bản sao trên các node khác.

Hiệu suất.

Trạng thái handoff giúp phân tán tải làm việc lên nhiều node, cải thiện hiệu suất của hệ thống.

6. Những yếu tố ảnh hưởng đến quá trình handoff.

Cấu hình của cluster.

Số lượng node, dung lượng lưu trữ, băng thông mạng đều ảnh hưởng đến tốc độ và hiệu quả của quá trình handoff.

Kích thước của object.

Các object lớn sẽ mất nhiều thời gian hơn để sao chép.

Số lượng replica.

Số lượng bản sao của một object cũng ảnh hưởng đến thời gian handoff.

7. Ví dụ minh họa về quá trình handoff trong OpenStack Swift.

Điều kiện bình thường (không có disk hay node hỏng).

Giả sử chúng ta có một cluster OpenStack Swift với 3 node (A, B, C) và mỗi node có 3 disk. Khi tải lên một object có tên windows11.iso với dung lượng 4GB, quá trình handoff sẽ diễn ra như sau:

  • Tải lên: Object windows11.iso được tải lên node A và lưu trữ trên disk1 của node này.
  • Kiểm tra tính toàn vẹn: Hệ thống kiểm tra tính toàn vẹn của dữ liệu trên disk1 của node A.
  • Handoff:
    • Object gốc: Lưu trữ trên disk1 của node A.
    • Bản sao 1: Lưu trữ trên disk1 của node B.
    • Bản sao 2: Lưu trữ trên disk1 của node C.
    • của node
    • Cập nhật metadata: Hệ thống cập nhật metadata của object để chỉ ra rằng nó đã được sao chép thành công.
  • Hoàn thành: Quá trình handoff hoàn tất. Giờ đây, object “windows11.iso” có 3 bản sao trên 3 disk khác nhau của 3 node.

Khi có 1 disk hỏng.

Giả sử disk1 của node A bị hỏng sau khi quá trình handoff hoàn tất. Khi người dùng muốn truy cập object windows11.iso, hệ thống sẽ tự động chuyển hướng yêu cầu đến các bản sao còn lại trên disk1 của node B và disk1 của node C.

Khi có 1 node hỏng.

Giả sử node A bị hỏng hoàn toàn sau khi quá trình handoff hoàn tất. Khi người dùng muốn truy cập object windows11.iso, hệ thống sẽ tự động chuyển hướng yêu cầu đến bản sao còn lại trên disk1 của node B và disk1 của node C.

8. Ví dụ về thực tế.

Tạo 1 container.

shell> openstack container create container1
+---------------------------------------+------------+------------------------------------+
| account                               | container  | x-trans-id                         |
+---------------------------------------+------------+------------------------------------+
| AUTH_115c7bd73e6f4139bffa972ef7d48d7b | container1 | txdff3884a37204ad6b6a70-0066afadf1 |
+---------------------------------------+------------+------------------------------------+

Hãy verify chắc chắn container đã tạo thành công.

shell> swift stat
                        Account: AUTH_115c7bd73e6f4139bffa972ef7d48d7b
                     Containers: 1
                        Objects: 0
                          Bytes: 0
Containers in policy "policy-0": 1
   Objects in policy "policy-0": 0
     Bytes in policy "policy-0": 0
                         Server: nginx/1.18.0 (Ubuntu)
                   Content-Type: text/plain; charset=utf-8
                     Connection: keep-alive
                    X-Timestamp: 1722789361.96218
                  Accept-Ranges: bytes
                           Vary: Accept
                     X-Trans-Id: tx34091e93d8ac4b9c84a53-0066afadfe
         X-Openstack-Request-Id: tx34091e93d8ac4b9c84a53-0066afadfe
        Content-Security-Policy: upgrade-insecure-requests

Bạn cũng có thể verify với lệnh swift list.

shell> swift list
container1

Mình đã có sẵn 1 file /home/ubuntu-22.04.2-live-server-amd64.iso.

shell> ls /home/ubuntu-22.04.2-live-server-amd64.iso
/home/ubuntu-22.04.2-live-server-amd64.iso

Mình sẽ upload file này vào storage bằng lệnh openstack object create.

shell> openstack object create container1 /home/ubuntu-22.04.2-live-server-amd64.iso
+--------------------------------------------+------------+----------------------------------+
| object                                     | container  | etag                             |
+--------------------------------------------+------------+----------------------------------+
| /home/ubuntu-22.04.2-live-server-amd64.iso | container1 | 33993f79ba694f1dba9fcf89f11257ea |
+--------------------------------------------+------------+----------------------------------+

Xác minh file đã upload thành công vào storage.

shell> openstack object list container1
+--------------------------------------------+
| Name                                       |
+--------------------------------------------+
| /home/ubuntu-22.04.2-live-server-amd64.iso |
+--------------------------------------------+

Verify bằng lệnh openstack object show sẽ cho bạn nhiều thông tin hơn.

shell> openstack object show container1 /home/ubuntu-22.04.2-live-server-amd64.iso
+----------------+--------------------------------------------+
| Field          | Value                                      |
+----------------+--------------------------------------------+
| account        | AUTH_115c7bd73e6f4139bffa972ef7d48d7b      |
| container      | container1                                 |
| content-length | 1975971840                                 |
| content-type   | application/x-iso9660-image                |
| etag           | 33993f79ba694f1dba9fcf89f11257ea           |
| last-modified  | Sun, 04 Aug 2024 16:37:06 GMT              |
| object         | /home/ubuntu-22.04.2-live-server-amd64.iso |
+----------------+--------------------------------------------+

Để kiểm tra xem một object đang ở trạng thái handoff như thế nào, bạn có thể sử dụng lệnh swift-get-nodes từ công cụ swift để lấy thông tin về các nodes lưu trữ object đó.

Cài đặt công cụ swift nếu chưa có:

apt-get install swift -y

Sử dụng swift-get-nodes để lấy thông tin về các nodes lưu trữ object:

swift-get-nodes /etc/swift/object.ring.gz <account> <container> <object>

Ví dụ về đầu ra của object ví dụ của mình.

shell> swift-get-nodes /etc/swift/object.ring.gz AUTH_115c7bd73e6f4139bffa972ef7d48d7b container1 /home/ubuntu-22.04.2-live-server-amd64.iso

Account         AUTH_115c7bd73e6f4139bffa972ef7d48d7b
Container       container1
Object          /home/ubuntu-22.04.2-live-server-amd64.iso

Partition       1002
Hash            faa49c3a77204e375bdd47ff333dc221

Server:Port Device      10.237.7.86:6200 sdd
Server:Port Device      10.237.7.84:6200 sdd
Server:Port Device      10.237.7.85:6200 sdf     [Handoff]
Server:Port Device      10.237.7.83:6200 sdf     [Handoff]

curl -g -I -XHEAD "http://10.237.7.86:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
curl -g -I -XHEAD "http://10.237.7.84:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
curl -g -I -XHEAD "http://10.237.7.85:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso" # [Handoff]
curl -g -I -XHEAD "http://10.237.7.83:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso" # [Handoff]

Use your own device location of servers:
such as "export DEVICE=/srv/node"
ssh 10.237.7.86 "ls -lah ${DEVICE:-/srv/node*}/sdd/objects/1002/221/faa49c3a77204e375bdd47ff333dc221"
ssh 10.237.7.84 "ls -lah ${DEVICE:-/srv/node*}/sdd/objects/1002/221/faa49c3a77204e375bdd47ff333dc221"
ssh 10.237.7.85 "ls -lah ${DEVICE:-/srv/node*}/sdf/objects/1002/221/faa49c3a77204e375bdd47ff333dc221" # [Handoff]
ssh 10.237.7.83 "ls -lah ${DEVICE:-/srv/node*}/sdf/objects/1002/221/faa49c3a77204e375bdd47ff333dc221" # [Handoff]

note: `/srv/node*` is used as default value of `devices`, the real value is set in the config file on each storage node.

Kết quả của lệnh swift-get-nodes cung cấp thông tin chi tiết về các nodes lưu trữ object /home/ubuntu-22.04.2-live-server-amd64.iso trong container container1.

Thông tin chung.

Account: AUTH_115c7bd73e6f4139bffa972ef7d48d7b
Container: container1
Object: /home/ubuntu-22.04.2-live-server-amd64.iso
Partition: 1002
Hash: faa49c3a77204e375bdd47ff333dc221

Nodes lưu trữ object.

Các thiết bị được đánh dấu là [Handoff] trong hệ thống lưu trữ đối tượng thường không chứa dữ liệu gốc mà chỉ được sử dụng khi có vấn đề với các thiết bị chính. Khi một trong những thiết bị chính gặp sự cố, dữ liệu sẽ được sao lưu hoặc chuyển qua các thiết bị [Handoff] để đảm bảo tính toàn vẹn và khả dụng của dữ liệu.

Server:Port Device 10.237.7.86:6200 sdd
Server:Port Device 10.237.7.84:6200 sdd
Server:Port Device 10.237.7.85:6200 sdf [Handoff]
Server:Port Device 10.237.7.83:6200 sdf [Handoff]

Cụ thể trong trường hợp:

  • 10.237.7.85:6200 sdf và 10.237.7.83:6200 sdf là các thiết bị [Handoff].
  • Các thiết bị này sẽ không chứa dữ liệu trừ khi có sự cố với các thiết bị chính (10.237.7.86:6200 sdd và 10.237.7.84:6200 sdd).

Do đó, trong trạng thái hoạt động bình thường, dữ liệu chỉ nằm trên các thiết bị chính. Các thiết bị [Handoff] được sử dụng để đảm bảo tính dự phòng trong trường hợp có sự cố với thiết bị chính.

Trạng thái Handoff bạn thấy ở lệnh swift-get-nodes là gì?

Handoff nodes là các nodes tạm thời lưu trữ object khi các nodes chính không thể lưu trữ object đó. Điều này có thể xảy ra do nhiều lý do, chẳng hạn như lỗi phần cứng hoặc quá tải. Handoff nodes giúp đảm bảo tính sẵn sàng và độ tin cậy của hệ thống bằng cách lưu trữ object tạm thời cho đến khi các nodes chính có thể tiếp nhận lại.

Kiểm tra trạng thái object trên các nodes.

Bạn có thể sử dụng các lệnh curl để kiểm tra trạng thái của object trên các nodes:

curl -g -I -XHEAD "http://10.237.7.86:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
curl -g -I -XHEAD "http://10.237.7.84:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
curl -g -I -XHEAD "http://10.237.7.85:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso" # [Handoff]
curl -g -I -XHEAD "http://10.237.7.83:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso" # [Handoff]

Như bạn thấy mã lỗi trả về là 404 cho thấy file ubuntu-22.04.2-live-server-amd64.iso không tồn tại trên đĩa sdf.

shell> curl -g -I -XHEAD "http://10.237.7.85:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1/home/ubuntu-22.04.2-live-server-amd64.iso"
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Sun, 04 Aug 2024 16:41:21 GMT

Nhưng trong disk sdd status code trả về 200 cho thấy ubuntu-22.04.2-live-server-amd64.iso đang nằm trong disk này với dung lượng là 1975971840 byte tương đương 1.9GB.

shell> curl -g -I -XHEAD "http://10.237.7.86:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
HTTP/1.1 200 OK
Content-Type: application/x-iso9660-image
Etag: "33993f79ba694f1dba9fcf89f11257ea"
Last-Modified: Sun, 04 Aug 2024 16:37:06 GMT
X-Timestamp: 1722789425.85991
X-Backend-Timestamp: 1722789425.85991
X-Backend-Data-Timestamp: 1722789425.85991
X-Backend-Durable-Timestamp: 1722789425.85991
Content-Length: 1975971840
Date: Sun, 04 Aug 2024 16:41:01 GMT

Bạn cũng có thể chạy lệnh ssh để kiển tra sự tồn tại của object.

shell> ssh 10.237.7.86 "ls -lah ${DEVICE:-/srv/node*}/sdd/objects/1002/221/faa49c3a77204e375bdd47ff333dc221"
total 1.9G
drwxr-xr-x 2 swift swift   35 Aug  7 15:25 .
drwxr-xr-x 3 swift swift   46 Aug  4 23:37 ..
-rwxr-xr-x 1 swift swift 1.9G Aug  4 23:37 1722789425.85991.data

Dưới đây là kết quả bạn sẽ nhìn thấy khi object không tồn tại trên disk sdf node 10.237.7.85.

shell> ssh 10.237.7.85 "ls -lah ${DEVICE:-/srv/node*}/sdf/objects/1002/221/faa49c3a77204e375bdd47ff333dc221"
ls: cannot access '/srv/node*/sdf/objects/1002/221/faa49c3a77204e375bdd47ff333dc221': No such file or directory

Giả sử mình sẽ cố tình unmount 1 disk trên node 10.237.7.84.

umount -l /dev/sdd

Nếu bạn sử dụng swift-recon –all bạn sẽ thấy có 1 thông báo có 1 device đã rớt mount như dưới Not mounted: sdd on 10.237.7.84:6200.

shell> swift-recon --all
===============================================================================
--> Starting reconnaissance on 4 hosts (object)
===============================================================================
[2024-08-13 06:21:40] Getting unmounted drives from 4 hosts...
Not mounted: sdd on 10.237.7.84:6200

Dưới đây là các phản hồi của lệnh curl khi bạn unmount 1 device.

Server 10.237.7.86:6200 – sdd.

shell> curl -g -I -XHEAD "http://10.237.7.86:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
HTTP/1.1 200 OK
Content-Type: application/x-iso9660-image
Etag: "33993f79ba694f1dba9fcf89f11257ea"
Last-Modified: Sun, 04 Aug 2024 16:37:06 GMT
X-Timestamp: 1722789425.85991
X-Backend-Timestamp: 1722789425.85991
X-Backend-Data-Timestamp: 1722789425.85991
X-Backend-Durable-Timestamp: 1722789425.85991
Content-Length: 1975971840
Date: Tue, 13 Aug 2024 06:26:10 GMT
  • Trạng thái HTTP: 200 OK
  • Ổ đĩa sdd trên server này vẫn hoạt động bình thường và đang lưu trữ đối tượng.
  • Các thông tin bổ sung như Content-Type, Etag, Last-Modified, và Content-Length cho thấy file ISO được lưu trữ trên server này một cách chính xác.

Server 10.237.7.84:6200 – sdd.

shell> curl -g -I -XHEAD "http://10.237.7.84:6200/sdd/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
HTTP/1.1 507 Insufficient Storage
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Tue, 13 Aug 2024 06:26:15 GMT
  • Trạng thái HTTP: 507 Insufficient Storage
  • Server này báo lỗi Insufficient Storage, có nghĩa là ổ đĩa sdd đã không thể truy cập được hoặc không còn đủ không gian lưu trữ. Điều này phù hợp với việc bạn đã unmount ổ đĩa sdd trên server này.

Server 10.237.7.85:6200 – sdf (Handoff).

shell> curl -g -I -XHEAD "http://10.237.7.85:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
HTTP/1.1 200 OK
Content-Type: application/x-iso9660-image
Etag: "33993f79ba694f1dba9fcf89f11257ea"
Last-Modified: Sun, 04 Aug 2024 16:37:06 GMT
X-Timestamp: 1722789425.85991
X-Backend-Timestamp: 1722789425.85991
X-Backend-Data-Timestamp: 1722789425.85991
X-Backend-Durable-Timestamp: 1722789425.85991
Content-Length: 1975971840
Date: Tue, 13 Aug 2024 06:26:21 GMT
  • Trạng thái HTTP: 200 OK
  • Mặc dù đây là một server handoff, nó vẫn đang lưu trữ đối tượng và trả về phản hồi 200 OK. Điều này cho thấy Swift đã thực hiện cơ chế handoff thành công để đảm bảo rằng dữ liệu vẫn có sẵn dù một trong những ổ đĩa chính gặp sự cố.

Server 10.237.7.83:6200 – sdf (Handoff)

shell> curl -g -I -XHEAD "http://10.237.7.83:6200/sdf/1002/AUTH_115c7bd73e6f4139bffa972ef7d48d7b/container1//home/ubuntu-22.04.2-live-server-amd64.iso"
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
Content-Length: 0
Date: Tue, 13 Aug 2024 06:26:25 GMT
  • Trạng thái HTTP: 404 Not Found
  • Server này không chứa bản sao của đối tượng này, thể hiện qua mã trạng thái 404 Not Found. Mặc dù được liệt kê là một handoff, server này không có dữ liệu của đối tượng tại thời điểm yêu cầu.

Phân tích tổng quan.

  • Server 10.237.7.86:6200 vẫn hoạt động bình thường và giữ bản sao dữ liệu như dự kiến.
  • Server 10.237.7.84:6200 gặp sự cố do ổ đĩa đã bị unmount, dẫn đến việc không thể truy cập vào dữ liệu, và điều này được phản ánh qua mã lỗi 507 Insufficient Storage.
  • Handoff server 10.237.7.85:6200 đã nhận nhiệm vụ lưu trữ dữ liệu thay cho server gặp sự cố và đã thực hiện tốt công việc này.
  • Handoff server 10.237.7.83:6200 không chứa dữ liệu này, có thể vì nó không cần thiết trong quá trình phân phối lại dữ liệu (rebalance) do các thông số của ring hoặc cấu hình Swift.

Kết luận.

Swift đã thực hiện đúng cơ chế bảo vệ dữ liệu bằng cách phân phối dữ liệu đến các handoff nodes khi một ổ đĩa chính gặp sự cố.

Các mã phản hồi 200 OK, 507 Insufficient Storage, và 404 Not Found đều phù hợp với tình huống thực tế bạn đã mô tả.

Điều này cho thấy hệ thống Swift của bạn đang hoạt động theo đúng thiết kế, với các cơ chế bảo vệ và đảm bảo dữ liệu hiệu quả khi xảy ra sự cố với các ổ đĩa.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories