Lưu ý
Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.
- Bản gốc:
- Người dịch:
Google Translate (machine translation)
- Phiên bản gốc:
8541d8f725c6
Cảnh báo
Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.
Cụm MD¶
Cụm MD là thiết bị dùng chung RAID cho một cụm, nó hỗ trợ hai cấp độ: raid1 và raid10 (hỗ trợ hạn chế).
1. Định dạng trên đĩa¶
Các bitmap mục đích ghi riêng biệt được sử dụng cho mỗi nút cụm. Bitmap ghi lại tất cả các thao tác ghi có thể đã được bắt đầu trên nút đó, và có thể vẫn chưa kết thúc. Bố cục trên đĩa là:
- 0 4k 8k 12k
ZZ0000ZZ md siêu ZZ0001ZZ ZZ0002ZZ bm siêu [1] + bit ZZ0003ZZ ZZ0004ZZ bm bit [2, tiếp theo] ZZ0005ZZ ZZ0006ZZ ZZ0007ZZ
Trong quá trình hoạt động “bình thường”, chúng tôi giả sử hệ thống tập tin đảm bảo rằng chỉ một nút ghi vào bất kỳ khối nhất định nào tại một thời điểm, vì vậy một yêu cầu ghi sẽ
đặt bit thích hợp (nếu chưa được đặt)
cam kết ghi vào tất cả các máy nhân bản
lập lịch để xóa bit sau khi hết thời gian chờ.
Việc đọc chỉ được xử lý bình thường. Tùy thuộc vào hệ thống tập tin để đảm bảo một nút không đọc từ một vị trí mà nút khác (hoặc nút tương tự nút) đang viết.
2. Khóa DLM để quản lý¶
Có ba nhóm khóa để quản lý thiết bị:
2.1 Tài nguyên khóa bitmap (bm_lockres)¶
- bm_lockres bảo vệ các bitmap nút riêng lẻ. Họ có tên trong
dạng bitmap000 cho nút 1, bitmap001 cho nút 2, v.v. Khi một nút tham gia vào cụm, nó lấy được khóa ở chế độ PW và nó vẫn giữ nguyên vì vậy trong suốt thời gian tồn tại, nút là một phần của cụm. cái khóa số tài nguyên dựa trên số vị trí được DLM trả về hệ thống con. Vì DLM bắt đầu đếm nút từ một và các khe bitmap bắt đầu từ số 0, số vị trí DLM bị trừ đi một để đến nơi tại số vị trí bitmap.
- LVB của khóa bitmap cho một nút cụ thể ghi lại phạm vi
của các lĩnh vực đang được nút đó đồng bộ hóa lại. không có cái khác nút có thể ghi vào các lĩnh vực đó. Điều này được sử dụng khi một nút mới tham gia vào cụm.
2.2 Khóa chuyển tin nhắn¶
- Mỗi nút phải liên lạc với các nút khác khi bắt đầu hoặc kết thúc
đồng bộ lại và cập nhật siêu khối siêu dữ liệu. Sự giao tiếp này là được quản lý thông qua ba khóa: “mã thông báo”, “tin nhắn” và “ack” cùng nhau với Khối giá trị khóa (LVB) của một trong các khóa “tin nhắn”.
2.3 quản lý thiết bị mới¶
- Một khóa duy nhất: “no-new-dev” được sử dụng để phối hợp việc thêm
thiết bị mới - điều này phải được đồng bộ hóa trên toàn mảng. Thông thường tất cả các nút đều có khóa đọc đồng thời trên thiết bị này.
3. Giao tiếp¶
- Tin nhắn có thể được phát đến tất cả các nút và người gửi sẽ đợi tất cả
các nút khác xác nhận tin nhắn trước khi tiếp tục. Chỉ có một tin nhắn có thể được xử lý tại một thời điểm.
3.1 Các loại thông báo¶
Có sáu loại tin nhắn được truyền:
3.1.1 METADATA_UPDATED¶
- thông báo cho các nút khác rằng siêu dữ liệu có
đã được cập nhật và nút phải đọc lại siêu khối md. Đây là được thực hiện đồng bộ. Nó chủ yếu được sử dụng để báo hiệu thiết bị thất bại.
3.1.2 RESYNCING¶
- thông báo cho các nút khác rằng quá trình đồng bộ lại được bắt đầu hoặc
kết thúc để mỗi nút có thể tạm dừng hoặc tiếp tục khu vực. Mỗi Thông báo RESYNCING xác định một loạt các thiết bị mà nút gửi sắp đồng bộ lại. Điều này ghi đè mọi thứ trước đó thông báo từ nút đó: chỉ có thể đồng bộ lại một phạm vi tại một thời điểm thời gian trên mỗi nút.
3.1.3 NEWDISK¶
- thông báo cho các nút khác rằng một thiết bị đang được thêm vào
mảng. Tin nhắn chứa mã định danh cho thiết bị đó. Xem bên dưới để biết thêm chi tiết.
3.1.4 REMOVE¶
- Một thiết bị bị lỗi hoặc dự phòng đang bị xóa khỏi
mảng. Số khe cắm của thiết bị được bao gồm trong tin nhắn.
3.1.5 RE_ADD:
- Một thiết bị bị lỗi đang được kích hoạt lại - giả định
là nó đã được xác định là sẽ hoạt động trở lại.
3.1.6 BITMAP_NEEDS_SYNC:
- Nếu một nút bị dừng cục bộ nhưng bitmap
không sạch thì nút khác sẽ được thông báo để sở hữu đồng bộ lại.
3.2 Cơ chế giao tiếp¶
- DLM LVB được sử dụng để liên lạc trong các nút của cụm. Ở đó
Có ba tài nguyên được sử dụng cho mục đích này:
3.2.1 mã thông báo¶
- Tài nguyên bảo vệ toàn bộ thông tin liên lạc
hệ thống. Nút có tài nguyên mã thông báo được phép giao tiếp.
3.2.2 tin nhắn¶
Tài nguyên khóa mang dữ liệu để liên lạc.
3.2.3 xác nhận¶
- Tài nguyên thu được có nghĩa là thông điệp đã được
được thừa nhận bởi tất cả các nút trong cụm. BAST của tài nguyên được sử dụng để thông báo cho nút nhận rằng nút đó muốn giao tiếp.
Thuật toán là:
trạng thái nhận - tất cả các nút đều có khóa trình đọc đồng thời trên “ack”:
- người gửi người nhận người nhận
“ack”:CR “ack”:CR “ack”:CR
- người gửi nhận EX trên “mã thông báo”,
người gửi nhận được EX trên “tin nhắn”:
- người gửi người nhận người nhận
“mã thông báo”:EX “ack”:CR “ack”:CR “tin nhắn”:EX “ack”:CR
- Người gửi kiểm tra xem nó vẫn cần gửi tin nhắn. Tin nhắn
nhận được hoặc các sự kiện khác xảy ra trong khi chờ đợi “mã thông báo” có thể khiến thông báo này không phù hợp hoặc dư thừa.
người gửi viết LVB
người gửi chuyển đổi “tin nhắn” từ EX sang CW
người gửi cố gắng lấy EX của “ack”
[đợi cho đến khi tất cả người nhận có “tin nhắn” ZZ0000ZZ]
- [ được kích hoạt bởi tiếng “ack”]
người nhận nhận được CR trên “tin nhắn” đầu thu đọc LVB người nhận xử lý tin nhắn [chờ kết thúc] người nhận phát hành “ack” người nhận cố gắng PR về “tin nhắn”
- người gửi người nhận người nhận
“mã thông báo”:EX “tin nhắn”:CR “tin nhắn”:CR “tin nhắn”:CW “ack”:EX
- được kích hoạt bằng cách cấp EX trên “ack” (cho biết tất cả người nhận
đã xử lý tin nhắn)
người gửi chuyển đổi xuống “ack” từ EX sang CR
người gửi phát hành “tin nhắn”
người gửi phát hành “mã thông báo”
- người nhận chuyển đổi sang PR trên “tin nhắn”
người nhận nhận được CR của “ack” người nhận phát hành “tin nhắn”
- người gửi người nhận người nhận
“ack”:CR “ack”:CR “ack”:CR
4. Xử lý lỗi¶
4.1 Lỗi nút¶
- Khi một nút bị lỗi, DLM sẽ thông báo cho cụm có khe cắm
số. Nút bắt đầu một chuỗi khôi phục cụm. Cụm chủ đề phục hồi:
- lấy được khóa bitmap<number> của nút bị lỗi
mở bitmap
đọc bitmap của nút bị lỗi
sao chép bitmap đã đặt vào nút cục bộ
làm sạch bitmap của nút bị lỗi
giải phóng khóa bitmap<number> của nút bị lỗi
bắt đầu đồng bộ lại bitmap trên nút hiện tại md_check_recovery được gọi trong recovery_bitmaps, sau đó md_check_recovery -> siêu dữ liệu_update_start/kết thúc, nó sẽ khóa liên lạc bằng lock_comm. Điều đó có nghĩa là khi một nút đang đồng bộ lại, nó sẽ chặn tất cả các nút khác ghi vào bất kỳ vị trí nào trên mảng.
- Quá trình đồng bộ lại là quá trình đồng bộ lại md thông thường. Tuy nhiên, trong một cụm
môi trường khi thực hiện đồng bộ lại, nó cần thông báo cho các nút khác trong số các khu vực bị đình chỉ. Trước khi quá trình đồng bộ lại bắt đầu, nút gửi RESYNCING với phạm vi (lo,hi) của khu vực cần gửi bị đình chỉ. Mỗi nút duy trì một danh sách treo, trong đó có chứa danh sách các phạm vi hiện đang bị đình chỉ. Khi nhận được RESYNCING, nút thêm phạm vi vào danh sách treo. Tương tự, khi nút thực hiện kết thúc đồng bộ lại, nó sẽ gửi RESYNCING với phạm vi trống tới các nút khác và các nút khác loại bỏ mục nhập tương ứng khỏi đình chỉ_list.
- Một hàm trợ giúp ->area_resyncing() có thể được sử dụng để kiểm tra xem
phạm vi I/O cụ thể có nên bị đình chỉ hay không.
4.2 Lỗi thiết bị¶
- Lỗi thiết bị được xử lý và liên lạc với bản cập nhật siêu dữ liệu
thường lệ. Khi một nút phát hiện lỗi thiết bị, nó không cho phép mọi thao tác ghi tiếp vào thiết bị đó cho đến khi lỗi được khắc phục được tất cả các nút khác thừa nhận.
5. Thêm thiết bị mới¶
- Để thêm một thiết bị mới, điều cần thiết là tất cả các nút đều “nhìn thấy” thiết bị mới
thiết bị cần được thêm vào. Đối với điều này, thuật toán sau được sử dụng:
- Nút 1 phát hành mdadm --manage /dev/mdX --add /dev/sdYY phát hành
ioctl(ADD_NEW_DISK với disc.state được đặt thành MD_DISK_CLUSTER_ADD)
Nút 1 gửi tin nhắn NEWDISK với uuid và số vị trí
- Các nút khác phát hành kobject_uevent_env với uuid và số vị trí
(Bước 4,5 có thể là quy tắc udev)
- Trong không gian người dùng, nút có thể tìm kiếm đĩa
sử dụng blkid -t SUB_UUID=””
- Các nút khác đưa ra một trong những điều sau đây tùy thuộc vào việc
đĩa đã được tìm thấy: ioctl(ADD_NEW_DISK với disc.state được đặt thành MD_DISK_CANDIDATE và disc.number được đặt thành số khe) ioctl(CLUSTERED_DISK_NACK)
Các nút khác sẽ khóa “no-new-devs” (CR) nếu tìm thấy thiết bị
Nút 1 thử khóa EX trên “no-new-dev”
- Nếu nút 1 nhận được khóa, nó sẽ gửi METADATA_UPDATED sau
bỏ đánh dấu đĩa là SpareLocal
- Nếu không (nhận khóa “no-new-dev”), thao tác sẽ không thành công và gửi
METADATA_UPDATED.
Các nút khác nhận được thông tin về việc đĩa có được thêm vào hay không bởi METADATA_UPDATED sau đây.
6. Giao diện mô-đun¶
- Có 17 lệnh gọi lại mà lõi md có thể thực hiện đối với cụm
mô-đun. Hiểu những điều này có thể cung cấp một cái nhìn tổng quan tốt về toàn bộ quá trình.
6.1 tham gia (nút) và rời khỏi ()¶
- Chúng được gọi khi một mảng được bắt đầu bằng một bitmap được nhóm,
và khi mảng dừng lại.
join()đảm bảo cụm được có sẵn và khởi tạo các tài nguyên khác nhau. Chỉ các nút ‘nút’ đầu tiên trong cụm mới có thể sử dụng mảng.
6.2 slot_number()¶
- Báo cáo số vị trí được cơ sở hạ tầng cụm tư vấn.
Phạm vi là từ 0 đến nút-1.
6.3 resync_info_update()¶
- Điều này cập nhật phạm vi đồng bộ lại được lưu trữ trong khóa bitmap.
Điểm bắt đầu được cập nhật khi quá trình đồng bộ lại diễn ra. các điểm cuối luôn là điểm cuối của mảng. Nó thực hiện ZZ0000ZZ gửi tin nhắn RESYNCING.
6.4 resync_start(), resync_finish()¶
- Chúng được gọi khi quá trình đồng bộ lại/khôi phục/định hình lại bắt đầu hoặc dừng.
Họ cập nhật phạm vi đồng bộ lại trong khóa bitmap và cả gửi tin nhắn RESYNCING. resync_start báo cáo toàn bộ mảng đang đồng bộ hóa lại, resync_finish không báo cáo điều đó.
- resync_finish() cũng gửi tin nhắn BITMAP_NEEDS_SYNC
cho phép một số nút khác tiếp quản.
6.5 siêu dữ liệu_update_start(), siêu dữ liệu_update_finish(), siêu dữ liệu_update_cancel()¶
- siêu dữ liệu_update_start được sử dụng để có quyền truy cập độc quyền vào
siêu dữ liệu. Nếu vẫn cần thay đổi khi quyền truy cập đó đã hết đạt được, siêu dữ liệ
u_update_finish()sẽ gửi METADATA_UPDATE thông báo tới tất cả các nút khác, nếu không thìmetadata_update_cancel()có thể được sử dụng để mở khóa.
6.6 vùng_resyncing()¶
Điều này kết hợp hai yếu tố chức năng.
- Đầu tiên, nó sẽ kiểm tra xem có nút nào hiện đang đồng bộ lại không
bất cứ điều gì trong một phạm vi nhất định của các lĩnh vực. Nếu tìm thấy bất kỳ đồng bộ lại nào, thì người gọi sẽ tránh viết hoặc cân bằng đọc trong đó phạm vi.
- Thứ hai, trong khi quá trình khôi phục nút đang diễn ra, nó báo cáo rằng
tất cả các khu vực đang đồng bộ lại cho các yêu cầu READ. Điều này tránh các cuộc đua giữa hệ thống tập tin cụm và xử lý cụm-RAID một nút bị lỗi.
6.7 add_new_disk_start(), add_new_disk_finish(), new_disk_ack()¶
- Chúng được sử dụng để quản lý giao thức đĩa mới được mô tả ở trên.
Khi một thiết bị mới được thêm vào,
add_new_disk_start()được gọi trước nó được liên kết với mảng và nếu thành công,add_new_disk_finish()được gọi là thiết bị được thêm đầy đủ.- Khi một thiết bị được thêm vào để xác nhận thiết bị trước đó
yêu cầu hoặc khi thiết bị được tuyên bố là “không khả dụng”,
new_disk_ack()được gọi.
6.8 xóa_đĩa()¶
- Điều này được gọi khi một thiết bị dự phòng hoặc bị lỗi được gỡ bỏ khỏi
mảng. Nó khiến một thông báo REMOVE được gửi đến các nút khác.
6.9 tập hợp_bitmaps()¶
- Điều này sẽ gửi tin nhắn RE_ADD đến tất cả các nút khác và sau đó
thu thập thông tin bitmap từ tất cả các bitmap. Điều này kết hợp bitmap sau đó được sử dụng để khôi phục thiết bị được thêm lại.
6.10 lock_all_bitmaps() và unlock_all_bitmaps()¶
- Chúng được gọi khi thay đổi bitmap thành không. Nếu một nút có kế hoạch
để xóa bitmap của cluster raid, cần đảm bảo không có bitmap nào khác các nút đang sử dụng cuộc đột kích đạt được bằng cách khóa tất cả bitmap khóa trong cụm và những khóa đó cũng được mở khóa tương ứng.
7. Các tính năng không được hỗ trợ¶
Có một số thứ chưa được cụm MD hỗ trợ.
thay đổi mảng_sector.