Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.44 MB, 78 trang )
Các kênh được giả sử là có một số bộ đệm hữu hạn để phân phát các tin nhắn đi theo
thứ tự gửi. Thứ tự các tin nhắn nhận được trong một kênh giống như thứ tự các tin
nhắn trong bộ đệm khi gửi đi.Trạng thái của một kênh là thứ tự của các tin nhắn được
gửi đi về phía trước trong kênh và cũng bao gồm các tin nhắn nhận được ở phía trước
trong kênh.
Một tiến trình được định nghĩa bởi một tập hợp các trạng thái, một trạng thái khởi tạo
và một tập các sự kiện. Một sự kiện e trong một tiến trình p là một hành động cơ sở có
thể thay đổi trạng thái của p và các kênh c gắn liền với p. Trạng thái của c có thể được
thay đổi bằng cách gửi một tin nhắn trong c hoặc nhận một tin nhắn trong c. Một sự
kiện e được định nghĩa bởi:
•
•
•
•
•
Tiến trình p mà trong đó sự kiện e xảy ra.
Trạng thái s của p ngay trước khi sự kiện e xảy ra.
Trạng thái s’ của p ngày sau khi sự kiện e xảy ra.
Kênh c, kênh mà trạng thái thay đổi bởi sự kiện
Tin nhắn M được gửi bằng c hoặc nhận được bằng c.
Nói cách khác chúng ta định nghĩa một sự kiện e bởi 5 thành phần (p,s,s’,c,M) ở đây c
và M các ký hiệu đặc biệt, nó sẽ rỗng nếu sự xảy ra của e không thay đổi trạng thái của
bất kì kênh nào.
Một trạng thái toàn cục (global state) của một hệ thống phân tán là một tập hợp các
tiến trình và các trạng thái kênh: khởi tạo trạng thái toàn cục là trạng thái của mỗi tiến
trình khởi tạo và trạng thái của các kênh là có hàng đợi rỗng (bộ đệm rỗng). Sự xảy ra
của sự kiện e có thể thay đổi đến trạng thái toàn cục. Chúng ta nói e = (p,s,s’,c,M) có
thể xảy ra trong trạng thái toàn cục S nếu và chỉ nếu:
• Trạng thái của tiến trình p trong trạng thái toàn cục S là s
• Nếu kênh c là một kênh trực tiếp đến tiến trình p, khi đó trạng thái của c trong
trạng thái toàn cục S là chuỗi tuần tự các tin nhắn với M ở vị trí dẫn đầu.
Chúng ta định nghĩa một hàm next(S,e) là trạng thái toàn cục ngay sau khi sự kiện e
xảy ra xong trong trạng thái toàn cục S. Giá trị của next(S,e) là được định nghĩa nếu và
chỉ nếu sự kiện e có thể xảy ra trong trạng thái toàn cục S, trong đó next(S,e) là trạng
thái toàn cục chính đến S ngoại trừ:
• Trạng thái của p trong next(S,e) là s’
• Nếu e là kênh trực tiếp đến p, khi đó trạng thái của c trong next(S,e) là c’với tin
nhắn M đã được xóa khỏi vị trí đầu.
Trang 36
• Nếu c là kênh trực tiếp đi ra khỏi p, khi đó trạng thái của c trong next(S,e) là c’
với M được thêm vào đuôi.
Giả sử
seq = (ei : 0 ≤ i ≤ n ) là một chuỗi tuần tự các sự kiện trong các tiến trình của một hệ
thống phân tán. Chúng ta nói seq là một sự tín toán (computation) của một hệ thống
nếu và chỉ nếu sự kiện ei có thể xảy ra trong trạng thái toàn cục S i : 0 ≤ i ≤ n . Ở đây S0
là trạng thái khởi tạo toàn cục và
S i +1 = next ( S i , ei ); 0 ≤ i ≤ n
Ký hiệu Cij là kênh từ tiến trình i đến tiến trình j, SCij là trạng thái của kênh Cij . Các
hoạt động trên một tiến trình có 3 dạng:
• Sự kiện nội tại (Internal event)
• Sự kiện gửi tin nhắn.
• Sự kiện nhận tin nhắn.
mij là tin nhắn được gửi đi bởi tiến trình i đến tiến trình j, send (mij ) và rec(mij ) là sự kiện
gửi và nhận. Trạng thái của tiến trình i được ký hiệu là LS i là kết quả của một chuỗi
các sự kiện được thực hiện bởi tiến trình i. Một kênh là một thực thể phân tán, trạng
thái của nó phụ thuộc vào các trạng thái cục bộ của các tiến trình mà nó liên quan. Với
một kênh Cij , tập các tin nhắn có thể được định nghĩa dựa trên trạng thái cục bộ của
tiến trình i và j.
transit ( LSi , LS j ) = {mij | send (mij ) ∈ LSi ∧ rec( mij ) ∉ LS j }
Trạng thái toàn cục của hệ thống phân tán là một tập hợp các trạng thái của các tiến
trình và các kênh. Ký hiệu trạng thái toàn cục là GS, ta có thể định nghĩa như sau:
{
GS = U LSi , U SCij
i
i, j
}
Một trạng thái toàn cục GS là một trạng thái toàn cục thật sự nếu nó thỏa mãn hai điều
kiện sau:
• C1: send (mij ) ∈ LSi ⇒ mij ∈ SCij ⊕ rec(mij ) ∈ LS j
• C2: send (mij ) ∉ LSi ⇒ mij ∉ SCij ∧ rec(mij ) ∈ LS j
Vấn đề trong việc ghi lại trạng thái toàn cục:
Trang 37
Nếu không có một đồng hồ vật lý toàn cục, một thủ tục đơn giản có thể sử dụng để ghi
lại trạng thái toàn cục của hệ thống phân tán là: khởi tạo việc thu thập các snapshot
được quyết định trong thời gian tương lai mà tại đó các snapshot được tạo ra và quản
bá thời gian này đến từng tiến trình. Tất cả các tiến trình sẽ tạo snapshot cục bộ tại mỗi
instant của thời gian toàn cục. Snapshot của kênh Cij bao gồm tất cả các tin nhắn mà
tiến trình j nhận được sau khi nó đã tạo được snapshot. Hai vấn đề cần xem xét khi ghi
lại trạng thái toàn cục thật sự của một hệ thống phân tán:
• I1:Cách nào phân biệt giữa các tin nhắn được ghi trong snapshot (tin nhắn trong
trạng thái kênh và tin nhắn trong trạng thái tiến trình). Câu trả lời đến từ điều
kiện C1 và C2 như sau: Bất kì tin nhắn được gửi đi bởi một tiến trình trước khi
ghi lại trạng thái của nó phải được ghi trong trạng thái toàn cục (từ C1). Bất kỳ
tin nhắn gửi đi bởi một tiến trình sau khi ghi lại trạng thái của nó không cần ghi
trong trạng thái toàn cục (từ điều kiện C2).
• I2:Cách xác định một thể hiện khi một tiến trình ghi lại trạng thái của nó. Câu
trả lời đến từ điều kiện C2: Một tiến trình j phải ghi lại trạng thái của nó trước
khi xử lý tin nhắn mij được gửi bởi tiến trình i sau khi ghi lại trạng thái của nó.
Ví dụ 1: Để mô tả định nghĩa của một hệ thống phân tán, chúng ta xem xét một hệ
thống đơn giản bao gồm hai tiến trình p và q và có hai kênh c và c’ như trong hình
dưới:
Hình 7: Bài toán đơn giản gồm hai tiến trình
Hệ thống chứa một token dùng để chuyển từ một tiến trình này sang một tiến trình
khác và bởi vậy chúng ta gọi hệ thống này là single-token conversation. Mỗi tiến trình
có hai trạng thái s0 và s1, ở đây s0 là trạng thái mà trong đó các tiến trình không xử lý
token và s1 là trạng thái xử lý. Trạng thái khởi tạo của p là s1 và của q là s0. Mỗi tiến
trình có hai sự kiện:
• Gửi token từ trạng thái s1 đến trạng thái s0.
• Nhận token từ trạng thái s0 đến trạng thái s1.
Mô hình chuyển trạng thái của một tiến trình được thể hiện trong hình dưới:
Trang 38
Hình 8: Các chiều đi và về của thẻ trên các kênh
Trạng thái toàn cục và chuyển đổi được thể hiện như sau:
Hình 9: Một ví dụ đầy đủ về quá trình gửi nhận token
(1) hàng đợi rỗng
(2) tiến trình p gửi đi token
(3) tiến trình q nhận token
(4) tiến trình q gửi lại token
Bởi vậy ta có bốn trạng thái toàn cục theo thứ tự chuyển đổi là (1) trong p, (2) trong c,
(3) trong q và (4) trong c’.
Thuật toán ghi lại trạng thái toàn cục làm việc như sau: Mỗi tiến trình ghi lại trạng thái
của chính nó và hai tiến trình có một kênh liên quan sẽ ghi lại trạng thái kênh. Chúng
ta không thể chắc chắn rằng trạng thái của tất cả các tiến trình và kênh sẽ ghi lại trạng
thái toàn cục hiện tại bởi vì không có một đồng hồ toàn cục, tuy nhiên nó sẽ định dạng
một trạng thái toàn cục với ngữ nghĩa.
Giả sử m là số tin nhắn nhận được từ trong kênh c trước trạng thái của q được ghi lại,
m’ là số tin nhắn nhân được trong kênh c trước khi trạng thái c’ được ghi lại. Vậy thì
m=m’.
Trang 39
Trong mọi trạng thái, số các tin nhắn nhận được trong một kênh không thể vượt quá số
tin nhắn gửi đi trong kênh kia. Do vậy n ' ≥ m ' , từ đó ta có n ≥ m . Trạng thái của kênh
c ghi lại phải là chuỗi tuần tự các tin nhắn gửi đi theo kênh trước khi trạng thái bên gửi
được ghi lại, bao gồm chuỗi tuần tự các tin nhắn nhận được theo kênh trước khi trạng
thái bên nhận được ghi lại. Nếu m ' = n ' trạng thái được ghi lại của c phải là một chuỗi
rỗng và nếu n ' > m ' trạng thái được ghi lại của c phải là (m’+1)st,…,n’th các tin nhắn
được gửi đi bởi tiến trình p trong kênh c.
Các biểu thức gợi ý cho ta thấy một thuật toán đơn giản: q có thể ghi lại trạng thái của
kênh c , tiến trình p gửi một tin nhắn đặc biệt được gọi là maker sau tin nhắn thứ n
trong kênh c. Maker không ảnh hưởng đến các quá trình tính toán. Trạng thái của c là
chuỗi tuần tự các tin nhắn nhận được bởi q sau khi q ghi lại trạng thái của nó trước khi
q nhận được maker. Để chắc chắn biểu thức n ≥ m , q phải ghi lại trạng thái của nó, nếu
nó không hoàn thành, sau khi nhận được maker và trước khi q nhận được các tin nhắn
khác.
Cuts of a distributed computation:
t1
t1
t1
t1
t1
S1: Account A
S2: Account B
Hình 10: Ví dụ chuyển tiền trong hệ thống gồm 2 tài khoản
Tính toán phân tán có thể được thể hiện sử dụng giản đồ thời gian như hình trên với
các đường ngang thể hiện cho đường thời gian của các tiến trình. Một đường nối hai
điểm trên hai đường tiến trình chia giản đồ thời gian thành hai phần “Quá khứ” và
“Tương lai”. Giống như đường này, thuật ngữ “cut” có ý nghĩa tương tự. Một trạng
thái toàn cục tương ứng với một cut, khi mà mọi tín nhắn được nhận trong “Quá khứ”
của cut đã được gửi trong “Quá khứ” của cut. Có hai dạng tin nhắn được sử dụng:
• Tin nhắn phục vụ cho tính toán.
• Tin nhắn phục vụ cho điều khiển.
Việc thực thi thuật toán snapshot là trong suốt với các ứng dụng lớp dưới, ngoại trừ
việc làm trễ một vài các hoạt động của ứng dụng.
Trang 40
3. Thuật toán snapshot cho hệ thống có các kênh truyền theo mô hình FIFO:
a. Nguyên lý:
Sau khi một node ghi lại được trạng thái của nó, nó sẽ gửi đi một tin nhắn điều khiển
(control message) được gọi là một maker, được gửi đi tất cả các kênh ra ngoài node
trước khi gửi thêm bất kỳ tin nhắn tính toán nào khác. Vì các kênh theo mô hình FIFO,
maker sẽ chia các tin nhắn trong kênh thành hai phần: phần được ghi vào trạng thái
toàn cục và phần không được ghi vào trạng thái toàn cục (xem I1 ở phần 2). Quy tắc
của các marker trong hệ thống FIFO là hoạt động như các thành phần phân định ranh
giới thời gian cho các tin nhắn trong các kênh, bởi vậy trạng thái kênh được ghi bởi
tiến trình tại nơi nhận thỏa mãn điều kiện C2. Tất cả các tin nhắn đi sau maker sẽ được
gửi bởi tiến trình i sau khi tiến trình i ghi được trạng thái của nó, tiến trình j phải ghi
được trạng thái của nó không muộn hơn khi nó nhận được maker trong kênh Cij .
Hình 11: Quá trình nhận marker và ghi lại trạng thái
b. Thuật toán Chandy-Lamport:
Hình 12: Thuật toán Chandy-Lamport
Trang 41
Thuật toán được đưa ra trong hình trên. Một tiến trình khởi tạo việc thu thập snapshot
bằng cách thực hiện “Luật gửi maker” bằng cách nó ghi lại trạng thái cục bộ của nó và
gửi đi một maker trên mỗi kênh ra. Một tiến trình thực thi “Luật nhận maker” khi nhận
một maker. Nếu tiến trình này chưa ghi lại trạng thái cục bộ của nó, nó sẽ thực hiện
“Luật gửi maker” để ghi lại trạng thái cục bộ của nó. Trạng thái của kênh đến (nơi
maker được nhận) được ghi lại bằng một tập các tin nhắn tính toán nhận được trên
kênh sau khi ghi lại trạng thái cục bộ nhưng trước khi nhận được marker trên kênh.
Thuật toán này có thể khởi tạo bởi bất kỳ tiến trình nào bằng cách thực thi “Luật gửi
maker”.
Mỗi tiến trình sẽ gửi lại snapshot local của nó đến tiến trình khởi tạo thuật toán. Ngoài
ra mỗi tiến trình sẽ gửi thông tin nó ghi về các kênh ra và mỗi tiến trình nhận thông tin
này cho lần đầu quảng bá trên các kênh ra.
Hình 13: Quá trình gửi marker trên hệ thống 2 tài khoản
Hình 14: Một chu trình trên thuật toán Chandy-Lamport
(a) Tổ chức của một tiến trình và các kênh cho một distributed snapshot.
(b) Tiến trình Q nhận maker lần đầu và ghi lại trạng thái cục bộ của nó.
(c) Q ghi lại tất cả các incoming message.
(d) Q nhận một maker trong incoming channel và kết thúc ghi trạng thái của
incoming channel.
Trang 42
c. Sự đúng đắn của thuật toán:
Để thấy được sự đúng đắn của thuật toán chúng ta xem một ví dụ thực hiện thuật toán
snapshot cho việc chuyển tiền trong ngân hàng (xem hình dưới):
C12 : $0
C21 : $0
C12 : $100
C21 : $0
C12 : $100
C21 : $50
C12 : $100
C21 : $0
C12 : $0
C21 : $0
Hình 15: Một ví dụ snapshot trong hệ thống ngân hàng
Giả sử node N1 khởi tạo thuật toán sau khi kết thúc bước 1. Node N1 ghi lại trạng thái
cục bộ của nó (Số dư tài khoản A = 500$) và gửi một maker đi trong bước 2. Maker
được nhận bởi node N2 tại lúc kết thúc bước 4. Khi node N2 nhận được maker, nó ghi
lại trạng thái cục bộ của nó (Số dư tài khoản B = 250$). Trạng thái của kênh C1 là 0$
và gửi một maker theo kênh C2. Khi node N1 nhận được maker này, nó ghi lại trạng
thái của kênh C2 là 50$. Tổng số dư các tài khoản là 700$ được xem là trạng thái toàn
cục. Tuy nhiên, trạng thái toàn cục này không bao giờ xảy ra trong sự thực thi.
Trang 43
t1
S1: Account A
S2: Account B
t2
t3
t4
t5
X
X
Computation message
Hình 16: Lắt cắt thể hiện đúng trạng thái toàn cục hệ thống
Một cách diễn giải của việc thu thập trạng thái toàn cục như sau: Xem xét hai thể hiện
của việc ghi lại các trạng thái toàn cục trong ví dụ chuyển tiền ngân hàng. Các thể hiện
này được đánh dấu bởi các đường dọc. Nếu thực hiện cắt bằng các thể hiện được xem
như là các dải cao su, nếu các dải cao su này căng ra thì nó là đường dọc, khi đó tát cả
các trạng thái được ghi một cách đồng thời tại một thể hiện vật lý của hệ thống. Hệ
thống không bao giờ thực hiện được như vậy do tốc độ các bộ xử lý, độ trễ của các tin
nhắn là khác nhau.
Ví dụ:
Giả sử trạng thái của p là được ghi lại trong trạng thái toàn cục S0 (chính là trạng thái
A). như hình dưới:
Trang 44
Hình 17: Tính đúng đắn của thuật toán
Sau khi ghi lại trạng thái của nó, p gửi đi một maker theo kênh c. Giả sử rằng hệ thống
chuyển trạng thái toàn cục từ S1, sau đó là S2 và S3 trong khi maker vẫn trong quá
trình ghi duyển trong các kên và maker được nhận bởi q khi hệ thống đang trong trạng
thái toàn cục S3. Trong khi nhận maker, q sẽ ghi lại trạng thái của mình là D và ghi lại
trạng thái kênh c thành chuỗi tuần tự rỗng. Sau khi ghi lại trạng thái, q gửi một maker
theo kênh c’. Khi nhận được maker, p ghi lại trạng thái c’ như là một chuỗi tuần tự bao
gồm một tin nhắn đơn lẻ M’. Trạng thái toàn cục S* như ở hình sau:
Hình 18: Trạng thái marker trở về
Thuật toán ghi lại trạng thái được khởi tạo trong trạng thái S0 và dừng trong trạng thái
S3. Theo dõi thấy trạng thái toàn cục được ghi lại S* không là bất cứ trạng thái S0, S0,
Trang 45
S, S3. Vậy sử dụng thuật toán làm gì nếu trạng thái toàn cục được ghi không bao giờ
xảy ra, chúng ta sẽ trả lời câu hỏi này:
Giả sử seq = (ei , 0 ≤ i ) là một tính toán phân tán và giả sử Si là trạng thái toàn cục của hệ
thống ngay trước khi sự kiện ei trong chuỗi seq. Thuật toán khởi tạo trạng thái toàn cục
S0 và nó dừng trong trạng thái Sφ ,0 ≤ i ≤ φ , nói cách khác thuật toán sẽ khởi tạo sau ei-1
và trước ei và nó sẽ dừng sau eφ −1 , φ > 0 và trước eφ . Trạng thái toàn cục S* có thể khác
tất cả các trạng thái toàn cục S k , i ≤ k ≤ φ . Chúng ta thấy rằng:
(1) S* có thể với tới được từ trạng thái Si
(2) Sφ có thể với tới được từ S*.
Chúng ta thấy rằng tồn tại một tính toán seq’, ở đây:
(1) Seq’ là sự hoán vị của seq, như là Si, S* và Sφ xảy ra trong các trạng thái toàn
cục trong seq’
(2) Si=S* hoặc Si xảy ra sớm hơn S*
(3) Sφ =S* hoặc S* xảy ra sớm hơn Sφ trong seq’.
Định lý 1: Tồn tại seq ' = (ei ', 0 ≤ i ) mà:
• Với mọi i, ở đây i
• Chuỗi tuần tự (ei ', I ≤ i < φ ) là sự hoán vị của chuỗi tuần tự (ei , I ≤ i < φ )
• Với mọi I, ở đây i
• Tồn tại một vài k, I ≤ k ≤ φ sao cho S*=Sk’
Phần chứng minh xem trong [12].
Ví dụ: Mục đích của ví dụ là thể hiện cách tính toán seq’ xuất phát từ cách tính toán
seq. Chuỗi các sự kiện thể hiện tính toán trong hình ở ví dụ trên:
e0 : p gửi M và thay đổi trạng thái thành B (sự kiện thông báo ghi lại trạng thái)
e1: q gửi M’ và thay đổi trạng thái thành D (sự kiện trước khi ghi lại trạng thái)
e2: p nhận M’ và thay đổi trạng thái thành A (sự kiện thông báo ghi lại trạng thái)
Kể từ khi e0, một sự kiện thông báo ghi lại trạng thái đi ngay trước e1, một sự kiện
trước khi ghi lại trạng thái, chúng ta trao đổi chúng để có được chuỗi hoán vị seq’:
e0’ : q gửi đi M’ và thay đổi trạng thái thành D (sự kiện trước khi ghi lại trạng thái)
Trang 46