Sơ lược cách hoạt động của LVM
TIL
498
Male avatar

manhdung viết ngày 20/07/2016

Nguyên tắc hoạt động

Gần đây, tôi phải làm việc với LVM snapshot khá nhiều, cũng mất công tìm hiểu, share cho anh em cái note cá nhân này luôn.

LVM2 snapshot hoàn toàn là read/write, nghĩa là không chỉ read snapshot có thể write vào snapshot mà không làm ảnh hưởng đến origin device, ngược lại write vào origin device cũng không làm ảnh hưởng đến snapshot device. Khi thực hiện snapshot, LVM sẽ sinh ra 4 devices

Xem bằng dmsetup table
VG-data-real: 0 943718400 linear 8:5 2048
VG_snap: 0 943718400 snapshot 253:1 253:2 P 8
VG_snap-cow: 0 914776064 linear 8:5 943720448
VG-data: 0 943718400 snapshot-origin 253:1

VG-data-real là device origin thực sự lưu data
VG-data là một device mới được tạo ra, user sẽ chỉ thấy device này
VG_snap-cow dùng để lưu exception list, các thay đổi trong VG-data-real sẽ được copy vào exception list
VG_snap là snapshot device

Flow:

alt text

Khi tạo snapshot, vg0-lv0 sẽ được tạo ra để user tham chiếu còn vg0-lv0-real thì là device thực sự lưu origin data. Ban đầu vg0-snap1 chỉ là ánh xạ hard link đến vg0-lv0-real, đó là lý do bạn thấy đường read từ vg0-snap1 đến vg0-lv0-real, còn cow table vg0-snap1-cow thì hoàn toàn trống trơn. Cũng vì thế nên việc tạo snapshot rất nhanh do đơn giản chỉ là link data qua hard link.

Nhưng, về mặt metadata thì giống như là data được nhân đôi:
/dev/mapper/VolGroup0-data1
ext4 5,8G 2,1G 3,5G 37% /data1
/dev/mapper/VolGroup0-backup1
ext4 5,8G 2,1G 3,5G 37% /backup1

VolGroup0-data1 là origin
VolGroup0-backup1 là snapshot

Khi read từ origin, data được read trực tiếp từ vg0-lv0-real
Khi write vào origin, data được write thẳng vào vg0-lv0-real, vì sự write này dẫn đến thay đổi giữa data của origin và snapshot nên những data cũ trước khi bị thay đổi mà đang được snapshot tham chiếu đến vào thời điểm tạo snapshot sẽ được copy vào trong cow. Vào lần write thứ hai cũng vào data này, LVM đơn giản chỉ overwrite data trong vg0-lv0-real mà không cần copy on write sang cow.

Khi read từ snapshot, data được read có thể vẫn nằm trong origin nếu data đó chưa bị thay đổi hoặc đã nằm trong cow table, nếu data đó đã bị thay đổi trong origin. Snapshot sẽ đọc data từ cow trước nếu không có thì có nghĩa là data đó chưa bị thay đổi, nên tìm tiếp trong origin. Đó là lý do có hai đường read từ vg0-snap1 đến cow và đến vg0-lv0-real. Bằng cách dùng cow table, data trước khi bị thay đổi được clone và copy sang cow để snapshot tham chiếu, còn bản data được clone thì nằm trong origin và bị ghi đè thôi.

Khi write vào snapshot, data không chỉ đơn giản chỉ là write thẳng vào cow. Đây cũng là điểm khác biệt so với LVM1, LVM2 hỗ trợ read/write snapshot. Vì snapshot ban đầu chỉ chứa các hard link đến origin, nên nếu thay đổi trong snapshot thì dẫn đến thay đổi trong origin. Mà mục đích của việc tạo snapshot là độc lập data hoàn toàn với origin trong quá trinh sử dụng, phần nào giống nhau thì dùng chung, phần nào khác nhau thì clone ra như khi write vào origin, để đảm bảo điều đó, khi write vào snapshot, data cần được ghi sẽ được kiểm tra xem nó đã được clone ra và di chuyển vào cow chưa, nếu chưa thì data đó sẽ phải bị clone và di chuyển vào cow và sau đó data vừa clone vào cow sẽ được overwrite. Nhờ vậy origin data và snapshot data mới độc lập được. Thường thì LVM định nghĩa data được copy sang cow thành từng chunk có độ dài cố định, ví dụ 8KB nên nếu write snapshot thay đổi 1KB thì vẫn copy hẳn 8KB sang cow rồi ghi đè 1KB trong 8KB đó.

Khi remove snapshot, quá trình rất nhanh, do chỉ đơn giản là destroy vg0-snap1, cow, vg0-lv0, rename vg0-lv0-real thành vg0-lv0, tất cả data đã write vào snapshot qua vg0-snap1 đều bị LOST

Cũng vì mỗi khi có sự thay đổi, một copy on write sẽ thực hiện tại sự thay đổi lần đầu trên data của origin nên việc duy trì snapshot trên một runtime server rất nặng nhọc do double IOPS: write vào real rồi clone data rồi write clone sang cow. Đó là lý do của lời khuyên nên remove snapshot càng sớm càng tốt hoặc không thực hiện write data quá nhiều vào origin khi vẫn đang giữ snapshot.

Trọng tâm của giải pháp LVM snapshot nằm ở kỹ thuật Copy on write:
Rất nhiều các file system hiện đại cũng hỗ trợ cow: như OCFS, ZFS, BtrFS.

Do dùng cơ chế cow nên có thể snapshot không cần có dung lượng đúng bằng dung lượng của origin, nhưng nên đặt dung lượng ngang nhau vì có thể có trường hợp tất cả data của origin bị thay đổi. Nếu không đủ không gian cho snapshot thì snapshot sẽ bị remove và xóa không cần hỏi khỏi hệ thống.

Ứng dụng của LVM

Vậy bạn có thể tự hỏi LVM snapshot hữu dụng trong case nào ?
LVM snapshot chỉ là một implementation của snapshot. Snapshot nói chung có thể dùng làm backup nhanh data: backup dịch vụ, backup cả một OS luôn cũng được, trong trường hợp deploy OS lên VM, thay vì dùng snapshot VM bạn có thể dùng snapshot ở mức file system.

Một case khác như sau, bạn muốn file system của mình được chia sẻ cho nhiều người dùng qua nfs, nhưng thời gian sử dụng là hữu hạn, kiểu trial, bạn chỉ cần snapshot ra và mount nfs đến bản snapshot, người dùng làm gì cũng được trên snapshot này, hết giờ gỡ snapshot là xong, origin nguyên vẹn. Case này tự nghĩ nên ứng dụng đại trà bạn tự cân nhắc nhé :D

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

manhdung

44 bài viết.
240 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
67 11
Giới thiệu RabbitMQ là một message broker ( messageoriented middleware) sử dụng giao thức AMQP Advanced Message Queue Protocol (Đây là giao thức ph...
manhdung viết hơn 2 năm trước
67 11
Male avatar
45 4
Giả định bạn tiếp nhận một server mới toanh, bạn cần tìm một số thông tin về nó như loại CPU, loại main, loại memory, memory dùng của hãng nào... c...
manhdung viết hơn 1 năm trước
45 4
Male avatar
38 7
Giới thiệu MongoDB là một giải pháp nosql database. Data được lưu ở dạng các bson document. Hỗ trợ vertical scaling và horizontal scaling, dynamic...
manhdung viết hơn 2 năm trước
38 7
Bài viết liên quan
White
18 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết hơn 1 năm trước
18 1
White
1 1
Chào mọi người, hôm nay mình viết một bài TIL nhỏ về cách lấy độ phân giải của màn hình hiện tại đang sử dụng. xdpyinfo | grep dimensions Kết quả...
namtx viết 7 tháng trước
1 1
White
8 0
Lấy fake path của file trong html input Ngữ cảnh: em cần làm một cái nút tải ảnh lên có preview. GIải pháp đầu: Dùng (Link) đọc file ảnh thành ba...
Hoàng Duy viết gần 2 năm trước
8 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
44 bài viết.
240 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!