Kỹ thuật 2PL tập trung

Một phần của tài liệu tìm hiểu một số thuật toán điều khiển tương tranh trong cơ sở dữ liệu phân tán (Trang 49 - 58)

6. Cấu trúc luận văn

3.2.1.4.Kỹ thuật 2PL tập trung

Thay vì phân phối lịch trình 2PL ta có thể tập trung nó tại một trạm đơn. Trƣớc khi truy xuất dữ liệu tại bất kỳ trạm nào, các khóa thích hợp phải đƣợc thu lại từ lịch trình 2PL trung tâm. Do đó, chẳng hạn khi thực hiện lệnh dm-write(x) mà x không đƣợc lƣu tại trạm trung tâm, TM trƣớc hết phải yêu cầu một khóa đọc trên x từ trạm trung tâm, đợi trạm này trả lời là khóa đã đƣợc thiết lập rồi gửi dm-read(x) tới DM đang kiểm soát x. Giống nhƣ bản sao chính 2PL, phƣơng pháp tiếp cận này

hƣớng đến yêu cầu nhiều kết nối hơn phƣơng pháp 2PL cơ bản, khi các lệnh dm- read prewrite hoàn toàn không yêu cầu khóa.

Tất cả các yêu cầu về tài nguyên phải đƣợc gửi đến một vị trí đƣợc gọi là bộ

điều khiển khoá (Lock Controller - LC).

LC sẽ duy trì một bảng khoá của tất cả các tài nguyên của hệ thống.

Trƣớc khi một vị trí có thể thực hiện một giao dịch, nó phải nhận đƣợc khoá chốt từ LC.

Ưu điểm:

Yêu cầu ít thông điệp hơn so đối với việc thiết lập các khoá chốt so với các thuật toán khoá chốt phân tán.

Nhược điểm:

Độ tin cậy kém; yêu cầu phải có hệ thống sao lƣu. LC phải duy trì một số lƣợng lớn các giao dịch.

3.2.1.4. Kỹ thuật 2PL phân tán

Trong D2PL, các LM tồn tại trên mỗi vị trí. Không giống PC2PL, khi một giao dịch cần truy cập vào một tập đơn vị nào đó thì cần phải nhận đƣợc khoá trên tất cả các bản sao của nó tại mọi vị trí khác nhau.

Khi dữ liệu không đƣợc tạo thành các bản sao thì chỉ tồn tại một bản tại một vị trí duy nhất. Khi đó D2PL trở thành PC2PL. Còn khi bản sao đƣợc thực hiện thì nghi thức ROWA (Read-One-Write-All) đƣợc thực hiện.

Khi sử dụng nghi thức ROWA:

Bản sao bất kỳ nào đấy của mục dữ liệu có thể đƣợc sử dụng để đọc (read). Tất cả các bản sao phải đƣợc khoá ghi (write-locked) trƣớc khi tiến hành cập nhật.

Các bƣớc thực hiện cụ thể:

B1: Đợi giao dịch từ phía ngƣời dùng. B2: Gửi n thông điệp yêu cầu khoá chốt.

B3: Nếu có bất kỳ khoá chốt nào bị từ chối thì gửi thông điệp giải phóng khoá đó và nhảy về bƣớc 2 để tiếp tục thử lại sau một khoảng thời gian nhất định.

B4: Thực hiện giao dịch cục bộ (local transaction) và gửi n thông điệp cập nhật.

B5: Đợi cập nhật các thông điệp ACK

B6: Gửi n thông điệp giải phóng khoá, nhắc nhở giao dịch đã hoàn tất và quay về bƣớc 1.

Nhược điểm:

Kiểm soát điểm chết phức tạp.

Chi phí giao tiếp lớn hơn so với PC2PL. Tốn nhiều thời gian.

Độ trễ lớn.

3.2.2. Phát hiện và ngăn chặn tắc nghẽn

Các cách thực hiện của phƣơng pháp 2PL đã nói ở trên bắt buộc các giao dịch phải đợi các khóa không có hiệu lực. Nếu quá trình chờ đợi này không đƣợc điều khiển sẽ dẫn đến tắc nghẽn (hình 3.5).

Các khối tắc nghẽn đƣợc mô tả bằng các đồ thị “chờ” (waits-for graph). Đồ thị “chờ” là một đồ thị có hƣớng dùng để chỉ ra giao dịch nào đang đợi các giao dịch khác. Các đỉnh của đồ thị là các giao dịch, cung biểu thị mối quan hệ “chờ”: một cung đi từ giao dịch T đến giao dịch Tj nếu T đang đợi một khóa mà Tj đang sở hữu. Tồn tại một khối tắc nghẽn trong hệ thống nếu và chỉ nếu đồ thị “chờ” có chứa chu trình (hình 3.6).

Hai kỹ thuật thƣờng dùng để giải quyết vấn đề tắc nghẽn là ngăn chặn tắc nghẽn và phát hiện tắc nghẽn.

Giả sử các giao dịch thực thi đồng thời, mỗi giao dịch phát lệnh READ trƣớc khi có bất kỳ giao dịch nào phát lệnh END.

Sự thực thi từng phần này đƣợc biểu diễn bởi các log sau: DM A: r1[x1] (adsbygoogle = window.adsbygoogle || []).push({});

DM B: r2[y2] DM C: r3[z3]

Tại mỗi điểm này: T1 có khóa đọc trên x1

T2 có khóa đọc trên y2

T3 có khóa đọc trên z3

Trƣớc khi tiếp tục, mọi giao dịch phải thu đƣợc khóa ghi T1 yêu cầu khóa ghi trên y1 và y2

T2 yêu cầu khóa ghi trên z2 và z3

T3 yêu cầu khóa ghi trên x1

Nhƣng T1 không thể nhận khóa ghi trên y2 cho đến khi T2 giải phóng khóa đọc

T2 không thể nhận khóa ghi trên z3 cho đến khi T3 giải phóng khóa đọc

T3 không thể nhận khóa ghi trên x1 cho đến khi T2 giải phóng khóa đọc

Đây là 1 trƣờng hợp tắc nghẽn.

Hình 3.6: Đồ thị chờ của giao dịch tắc nghẽn

Chúng ta gọi đồ thị chờ cục bộ (Local wait-for graph - LWFG) là phần của đồ

thị chờ chỉ gồm các nút và các cạnh mà hoàn toàn đƣợc chứa trong một trạm. T3 phải đợi T1 giải phóng khóa

đọc trên x1

T3

T1 T2

T1 phải đợi T2 giải phóng khóa đọc trên y2

T2 phải đợi T3 giải phóng khóa đọc trên z3

3.2.2.1. Ngăn chặn tắc nghẽn

Vấn đề ngăn chặn tắc nghẽn cần phải đƣợc chú ý kỹ khi một giao dịch bị khởi động lại vì hệ thống có nguy cơ xảy ra tắc nghẽn. Để thực hiện việc ngăn chặn tắc nghẽn, lịch trình 2PL đƣợc điều chỉnh nhƣ sau: Khi có một khóa đƣợc yêu cầu bị từ chối, lịch trình kiểm tra giao dịch phát ra yêu cầu (gọi là Ti) và giao dịch đang sở hữu khóa (Tj). Nếu Ti và Tj qua đƣợc cuộc kiểm tra thì Ti đƣợc phép đợi Tj diễn ra, ngƣợc lại, một trong hai giao dịch sẽ bị hủy bỏ. Nếu Ti khởi động lại, thuật toán ngăn chặn tắc nghẽn gọi là không ƣu tiên theo thứ tự (nonpreemptive), nếu Tj khởi động lại thì thuật toán gọi là ƣu tiên theo thứ tự (preemptive). Bài kiểm tra đƣa vào lịch trình phải đảm bảo rằng nếu Ti đợi Tj thì tắc nghẽn không thể cho ra kết quả. Một cách tiếp cận đơn giản là không bao giờ để cho Ti đợi Tj. Điều này không có ý nghĩa đối với việc ngăn chặn tắc nghẽn nhƣng lại có hiệu lực trong nhiều trƣờng hợp khởi động lại.

Một cách tiếp cận hay hơn là đánh dấu các thuộc tính của các giao dịch và kiểm tra quyền ƣu tiên để quyết định xem Ti có đợi Tj không. Ví dụ để Ti đợi Tj nếu Ti có độ ƣu tiên thấp hơn Tj (nếu cả hai có cùng độ ƣu tiên, Ti không thể đợi Tj hoặc ngƣợc lại). Việc kiểm tra này ngăn chặn đƣợc tắc nghẽn vì với mỗi cung (Ti,Tj) trong đồ thị chờ, Ti có độ ƣu tiến thấp hơn Tj. Vì chu trình là đƣờng đi từ một

đỉnh đến chính nó và vì Ti không thể có độ ƣu tiên thấp hơn chính nó nên không thể

tồn tại chu trình.

Một vấn đề nảy sinh khi sử dụng phƣơng pháp này là sự khởi động lại theo chu kỳ. Một số giao dịch có thể liên tục khởi động lại mà không thể kết thúc. Để tránh lỗi này, Rosenkrantz et al. đề nghị dùng nhãn thời gian (timestamps) làm độ ƣu tiên. Nhãn thời gian của một giao dịch là thời điểm nó bắt đầu thực hiện, do đó, một giao dịch cũ có độ ƣu tiên lớn hơn giao dịch mới.

Kỹ thuật này yêu cầu mỗi giao dịch phải đƣợc TM của nó gán cho một nhãn thời gian duy nhất. Khi một giao dịch bắt đầu, TM đọc đồng hồ địa phƣơng và gán một dấu hiệu nhận dạng TM duy nhất cho các bít có thứ tự thấp. Số thu đƣợc là nhãn thời gian. TM sẽ không gán nhãn thời gian khác cho đến khi đồng hồ phát tín hiệu tiếp theo. Do vậy, các nhãn thời gian do các TM khác nhau gán là khác nhau

trong các bit có thứ tự thấp, trong khi các nhãn thời gian đƣợc gán bởi cùng một TM lại khác nhau ở các bit có thứ tự cao (vì TM không dùng một đồng hồ hai lần). Vì thế, nhãn thời gian là duy nhất trong hệ thống. Kỹ thuật này không yêu cầu đồng hồ tại các trạm khác nhau phải đƣợc đồng bộ hóa trƣớc khi tiến hành thuật toán.

Hai sơ đồ ngăn chặn tắc nghẽn dự trên nhãn thời gian là Wait-Die

Wound-Wait . Wait-Die là kỹ thuật không theo chế độ ƣu tiên. Giả sử giao tac Ti cố đợi Tj. Nếu Ti có độ ƣu tiên thấp hơn Tj thì Ti đƣợc phép đợi. Ngƣợc lại, nó bị hủy

và phải khởi động lại. Một điều quan trọng là Ti không đƣợc gán lại nhãn thời gian (adsbygoogle = window.adsbygoogle || []).push({});

mới khi khởi động lại. Wound-wait là một bản sao có thực hiện chế độ ƣu tiên của wait-die. Nếu Ti có độ ƣu tiên cao hơn Tj thì Ti đợi, ngƣợc lại Tj bị hủy.

Cả Wait-Die và Wound-Wait đều tránh đƣợc hiện tƣợng khởi động theo chu kỳ. Tuy nhiên, trong kỹ thuật wound-wait, một giao dịch cũ có thể khởi động nhiều lần, trong khi nếu sử dụng kỹ thuật wait-die thì giao dịch cũ sẽ không bao giờ khởi động lại. Khi dùng kỹ thuật ngăn chặn tắc nghẽn trong chuyển giao dữ liệu hai pha, phải chú ý rằng một giao dịch không đƣợc phép hủy khi pha thứ hai dx bắt đầu. Nếu

một kỹ thuật có sử dụng chế độ ƣu tiên muốn hủy Tj, nó sẽ kiểm tra TM của Tj và

hủy lệnh hủy Tj nếu Tj đã bắt đầu chuyển sang giai đoạn thứ hai. Kết quả thu đƣợc

là không có tắc nghẽn nếu Tj đang ở pha thứ hai, nó không thể đợi bất kỳ một giao

dịch nào cả.

Sắp xếp trƣớc các tài nguyên (Preordering of resources) là một kỹ thuật tránh tắc nghẽn mà hoàn toàn tránh đƣợc việc khởi động lại. Kỹ thuật này yêu cầu phải khai báo trƣớc các khóa ( mỗi giao dịch phải thu nhận mọi khóa trƣớc khi bắt đầu). Các mục dữ liệu đƣợc đánh số và mỗi giao dịch yêu cầu từng khóa một theo thứ tự đƣợc đánh số. Độ ƣu tiên của các giao dịch là giá trị cao nhất của khóa đƣợc đánh số của của nó. Vì một giao dịch chỉ có thể đợi các giao dịch có độ ƣu tiên cao hơn nên không xảy ra tắc nghẽn. Ngoài yêu cầu khai báo trƣớc, bất tiện chính của kỹ thuật này là nó đòi hỏi các khóa phải có thứ tự, điều này làm tăng thời gian trả lời.

Xét thực thi trong hình 3.5 và 3.6. Các khóa đƣợc yêu cầu tại các DM theo thứ tự sau:

Bảng 3.2: Bảng mô tả khóa tại nhiều trạm

DM A DM B DM C

khóa đọc x1 choT1 khóa ghi y1 choT1 khóa *khóa ghi x1 cho T3

khóa đọc x1 choT1 khóa ghi y1 choT1 khóa *khóa ghi x1 cho T3

khóa đọc x1 choT1 khóa ghi y1 choT1 khóa *khóa ghi x1 cho T3

Không một khóa đƣợc đánh dấu * nào đƣợc chấp nhận và hệ thống rơi vào tình trạng tắc nghẽn. Tuy nhiên đồ thị chờ tại mỗi DM không xếp vòng.

Hình 3.7: Tắc nghẽn tại nhiều trạm 3.2.2.2. Phát hiện tắc nghẽn

Các khối tắc nghẽn đƣợc phát hiện nhờ vào việc tìm kiếm chu trình trên đồ thị chờ. Nếu tìm thấy chu trình, một giao dịch trên chu trình đƣợc chọn để huỷ, gọi là victim, do đó phá hủy đƣợc tắc nghẽn. Để cực tiểu hóa chi phí khởi động lại victim, việc chọn victim thƣờng đƣợc dựa vào số tài nguyên đƣợc dùng bởi mỗi giao dịch trong chu trình.

Khó khăn lớn nhất trong việc phát hiện tắc nghẽn trong một hệ thống phân tán là xây dựng đồ thị chờ một cách có hiệu quả. Mỗi lịch trình 2PL có thể xây dựng đồ thị chờ một cách dễ dàng dựa vào mối quan hệ chờ cục bộ. Tuy nhiên, những đồ thị này không có tác dụng trong việc mô tả tất cả các tắc nghẽn trong cơ sở dữ liệu phân tán (hình 3.7). Thay vào đó, các đồ thị chờ cục bộ phải kết nối thành đồ thị chờ tổng thể.

Chúng ta hãy bàn về một số kỹ thuật xây dựng đồ thị chờ tổng thể để phát hiện tắc nghẽn: tập trung và phân cấp.

Trong kỹ thuật tập trung, theo định kỳ, mỗi lịch trình gửi đồ thị chờ cục bộ của nó tới bộ phận phát hiện tắc nghẽn. Bộ phận này kết hợp các đồ thị cục bộ thành một hệ thống đồ thị chờ bằng cách hợp các đồ thị cục bộ lại. T3 T1 DM A T1 T2 DM B T2 T3 DM C

Trong kỹ thuật phân cấp, các trạm dữ liệu đƣợc tổ chức thành cây phân cấp với bộ phận phát hiện tắc nghẽn tại mỗi nút của cây. Các khối tắc nghẽn địa phƣơng tại các trạm đơn đƣợc phát hiện tại trạm; các khối tắc nghẽn liên quan đến hai hay nhiều trạm của cùng một miền đƣợc phát hiện bởi bộ phận phát hiện tắc nghẽn miền.

Mặc dù hai kỹ thuật đƣợc đề cập ở đây khác nhau ở mức chi tiết, nhƣng cả hai đều liên quan đến chu kỳ chuyển dữ liệu tới bộ phận phát hiện tắc nghẽn của một hay nhiều trạm. Chu kỳ tự nhiên của quá trình sinh ra hai vấn đề. Thứ nhất, một khối tắc nghẽn có thể tồn tại trong vài phút mà không bị phát hiện vì thời gian trả lời không đƣợc đảm bảo. Để giải quyết điều này, các bộ phận phát hiện tắc nghẽn

phải hoạt động thƣờng xuyên hơn, tăng chi phí phát hiện tắc nghẽn. Thứ hai, một

giao dịch T có thể khởi động lại vì nhiều lí do khác hơn là vấn đề tƣơng tranh (chẳng hạn trạm bị hỏng). Cho đến khi việc khởi động lại của T đƣợc truyền đến bộ phận phát hiện tắc nghẽn, bộ phận này có thể tìm thấy chu trình trong đồ thị chờ có chứa T. Một chu trình nhƣ thế gọi là khối tắc nghẽn ảo (phantom deadlock). Khi phát hiện ra một khối tắc nghẽn ảo, bộ phận phát hiện tắc nghẽn không cần khởi động lại giao dịch khác hơn T. Sự đề phòng đặc biệt cần thiết để tránh việc khởi động lại không cần thiết trong 2PL biểu quyết.

Chi phí chính trong việc phát hiện tắc nghẽn là khởi động lại các giao dịch đã thực hiện chƣa hoàn chỉnh. Việc khai báo trƣớc có thể giảm đƣợc chi phí này. Bằng cách thu các khóa của giao dịch trƣớc khi thực thi, hệ thống chỉ phải khởi động lại các giao dịch chƣa thực hiện.

3.2. ương tranh dựa vào gán nhãn thời gian

Các thuật toán loại này không cố gắng bảo đảm tính tuần tự bởi vì chúng sẽ loại trừ lẫn nhau. Thay vào đó, chúng sẽ sắp xếp các giao dịch T

i theo tiêu chí nhãn thời gian TS(T

i). TS(T

i) đối với mỗi giao dịch là duy nhất nhằm phục vụ cho mục đích

sắp xếp thứ tự: nếu một giao dịch T i trƣớc đó đã có nhãn thời gian là TS(T i) thì một giao dịch mới, T j, có TS(T j) với TS(T j) < TS(T i). (adsbygoogle = window.adsbygoogle || []).push({});

TS có thể đƣợc gán dựa vào thời gian của hệ thống hoặc một vài bộ đếm luận lý tăng dần theo mỗi TS đƣợc gán [4].

Các quy tắc của lớp thuật toán này:

- Hai thao tác O

1 và O

2 thuộc hai giao dịch T

1 và T 2 (O 1 và O 2 xung đột với nhau) khi đó O 1 sẽ đƣợc thực hiện trƣớc O 2 nếu và chỉ nếu T 1 < T 2. T 1 đƣợc hiểu là giao dịch “cũ hơn” còn T

2 đƣợc hiểu là giao dịch “mới hơn”.

- Bộ SC, trong khi thực hiện một thao tác mới, kiểm tra tất cả các thao tác xung đột. Nếu thao tác đó thuộc một giao dịch “cũ nhất” thì nó sẽ đƣợc thực hiện, ngƣợc lại, toàn bộ các giao dịch của thao tác đó sẽ đƣợc khởi động lại và nhận một TS mới.

Để đảm bảo tính tuần tự, nghi thức này sử dụng hai giá trị nhãn thời gian cho mỗi mục dữ liệu Q nhƣ sau:

W-timestamp(Q) hay W TS(Q): nhãn thời gian lớn nhất của giao dịch bất kỳ đã thực thi write(Q) thành công.

WTS(Q) = max(TS(T) | T đã đọc Q}

R-timestamp(Q): nhãn thời gian lớn nhất của giao dịch bất kỳ đã thực thi

read(Q) thành công.

RTS(Q) = max(TS(T) | T đã ghi lên Q}

Các nhãn thời gian đọc và ghi trên mục dữ liệu đƣợc phân phối bởi bộ lập lịch SC trong khi các nhãn thời gian giao dịch và các nhãn thời gian thao tác lại đƣợc phân bởi TM.

Một điểm nữa là bộ lập lịch TO luôn tạo ra các lịch biểu tuần tự. Nghi thức

TO đảm bảo bất kỳ thao tác read write mâu thuẫn nào cũng đều đƣợc thực hiện

Một phần của tài liệu tìm hiểu một số thuật toán điều khiển tương tranh trong cơ sở dữ liệu phân tán (Trang 49 - 58)