Hiện nay, với sự phát triển nhanh chóng của công nghệ và đặc biệt là số lượng người sử dụng ngày càng tăng, hệ phân tán trở nên phù hợp hơn cho đại bộ phận các ứng dụng như: hệ kinh doanh từ xa (HKDTX), hệ đăng ký giữ chỗ của các công ty hàng không, hệ quản lý và đăng ký tua du lịch từ xa… Đối với các hệ thống thông tin lớn, cơ sở dữ liệu không chỉ được lưu trữ và quản lý bởi các Server độc lập mà thường được phân tán trên nhiều Server và phân bố ở các vị trí địa lý khác nhau. Hệ thống cho phép xử lý đa truy cập đồng thời và cho phép đăng ký từ xa. Một trong những lợi ích của việc phân tán dữ liệu như vậy là nhằm phân chia yêu cầu xử lý dữ liệu cho nhiều máy nhằm làm tăng năng lực xử lý thông tin của hệ thống và đặc biệt, nó đảm bảo yêu cầu toàn dữ liệu vì dữ liệu được lưu trữ dự phòng ở nhiều nơi khác nhau. Tuy nhiên, hệ thống trình bày như trên là hệ thống đa server mang tính phức tạp. Một trong các yêu cầu đặt ra cho hệ thống là phải đảm bảo gắn bó dữ liệu giữa các server đồng thời không làm ảnh hưởng đến năng lực xử lý của hệ thống. Do đó, vấn đề gắn bó dữ liệu trong các hệ thống phân tán là một trong những vấn đề đang được các nhà nghiên cứu quan tâm. Có nhiều giải pháp trình bày phương pháp đảm bảo đặc tính gắn bó, trong đó có giải thuật hai pha tuyến tính và giải thuật MAONT (Model Avanced of Open Nested Transaction) . Báo cáo này sẽ trình bày một giải thuật được phát triển trên cơ sở danh sách di chuyển và minh họa thuật toán bằng chương trình đăng ký tua du lịch. Nội dung cụ thể là: 1. Tên đề tài : Hãy viết chương trình áp dụng thuật toán duy trì gắn bó, tránh bế tắc và thiếu thốn vô hạn (2 pha) trong hệ đa Server; 2. Xây dựng hệ thống 3 Server và CSDL (tr. 270 trở đi); 3. Xây dựng chương trình thực hiện cập nhật trong điều kiện đảm bảo gắn bó thông tin; 4. Viết chương trình quan sát quá trình nêu trên. Trong phạm vi của báo cáo này, chương trình được cài đặt demo trên 3 server, tuy nhiên chúng ta có thể cài đặt trên hệ thống gồm nhiều server. Chương trình cũng bao gồm một công cụ tạm gọi là monitor nhằm giám sát việc cập nhật dữ liệu giữa các server, nhằm đánh giá tính gắn bó dữ liệu giữ liệu giữa các server với nhau. Cuối cùng, tập thể nhóm 12 mong muốn nhận được các ý kiến đóng góp, bổ sung của quý Thầy và các bạn. Xin chân thành cảm ơn
Trang 2Giảng viên : PGS.TS LÊ VĂN SƠN Học viên : Thái Thị Bích Thủy
Nguyễn Thị Diễm Thúy Lớp : Cao học KHMT khóa 11
Đà Nẵng, tháng 03/2010
Trang 3LỜI MỞ ĐẦU
- Hiện nay, với sự phát triển nhanh chóng của công nghệ và đặc biệt là số lượng người sử dụng ngày càng tăng, hệ phân tán trở nên phù hợp hơn cho đại bộ phận các ứng dụng như: hệ kinh doanh từ xa (HKDTX), hệ đăng ký giữ chỗ của các công ty hàng không, hệ quản lý và đăng ký tua du lịch từ xa… Đối với các hệ thống thông tin lớn, cơ sở dữ liệu không chỉ được lưu trữ và quản lý bởi các Server độc lập
-mà thường được phân tán trên nhiều Server và phân bố ở các vị trí địa lý khác nhau
Hệ thống cho phép xử lý đa truy cập đồng thời và cho phép đăng ký từ xa Một trong những lợi ích của việc phân tán dữ liệu như vậy là nhằm phân chia yêu cầu xử
lý dữ liệu cho nhiều máy nhằm làm tăng năng lực xử lý thông tin của hệ thống và đặc biệt, nó đảm bảo yêu cầu toàn dữ liệu vì dữ liệu được lưu trữ dự phòng ở nhiều
nơi khác nhau.
Tuy nhiên, hệ thống trình bày như trên là hệ thống đa server mang tính phức tạp Một trong các yêu cầu đặt ra cho hệ thống là phải đảm bảo gắn bó dữ liệu giữa các server đồng thời không làm ảnh hưởng đến năng lực xử lý của hệ thống Do đó, vấn đề gắn bó dữ liệu trong các hệ thống phân tán là một trong những vấn đề đang được các nhà nghiên cứu quan tâm Có nhiều giải pháp trình bày phương pháp đảm bảo đặc tính gắn bó, trong đó có giải thuật hai pha tuyến tính và giải thuật MAONT (Model Avanced of Open Nested Transaction) Báo cáo này sẽ trình bày một giải thuật được phát triển trên cơ sở danh sách di chuyển và minh họa thuật toán bằng chương trình đăng ký tua du lịch Nội dung cụ thể là:
1 Tên đề tài : Hãy viết chương trình áp dụng thuật toán duy trì gắn bó,
tránh bế tắc và thiếu thốn vô hạn (2 pha) trong hệ đa Server;
2 Xây dựng hệ thống 3 Server và CSDL (tr 270 trở đi);
Nhóm 12 – Đề số 22 Trang 3
Trang 43 Xây dựng chương trình thực hiện cập nhật trong điều kiện đảm bảo gắn
bó thông tin;
4 Viết chương trình quan sát quá trình nêu trên.
Trong phạm vi của báo cáo này, chương trình được cài đặt demo trên 3 server, tuy nhiên chúng ta có thể cài đặt trên hệ thống gồm nhiều server Chương trình cũng bao gồm một công cụ tạm gọi là monitor nhằm giám sát việc cập nhật dữ liệu giữa các server, nhằm đánh giá tính gắn bó dữ liệu giữ liệu giữa các server với nhau
Cuối cùng, tập thể nhóm 12 mong muốn nhận được các ý kiến đóng góp, bổ sung của quý Thầy và các bạn
Xin chân thành cảm ơn!
NHÓM 12
Trang 5Computer A
A22
I Kỹ thuật lập trình phân tán đối tượng trong java
I.1 Lập trình phân tán đối tượng
Thông thường các chương trình của chúng ta được viết dưới dạng thủ tục hay hàm gọi Mã lệnh của hàm hay thủ tục được nạp thẳng vào kí ức và thực thi ngay tên máy cục bộ Đối với các hàm (hoặc đối tượng) thư viện như System.out.println () chẳng hạn bạn thường không phải quan tâm đến cách thức mà hàm thư viện này được cài đặt Điều mà hầu hết các lập trình viên quan tâm là đối số truyền cho hàm
và kết quả trả về Vậy thì có cách nào nạp nội dung của hàm hay đối tượng ở một máy nào đó và gọi chúng từ một máy khác hay không? Đây chính là nội dung của lập trình phân tán mã lệnh Việc triệu gọi phương thức từ xa – là cách thức giao tiếp giữa các đối tượng Java có mã lệnh cài đặt (bao gồm phương thức và thuộc tính) nằm trên các máy khác nhau có thể triệu gọi lẫn nhau
Hình 1 - Mô hình triệu gọi các đối tượng từ xa
Trên máy A các đối tượng A1, A2 gọi phương thức của nhau được gọi là triệu gọi phương thức cục bộ (local methol Invoke), đây là cách mà lập trình hướng đối
Nhóm 12 – Đề số 22 Trang 5
Trang 6tượng truyền thống vẫn sử dụng Tương tự, tương tác giữa C1, C2, C3 là tương tác cục bộ.
Tuy nhiên, đối tượng của Java có thể gọi phương thức của đối tượng nằm trên một máy khác dựa vào giao thức triệu gọi từ xa RMI (như A1 gọi C1, A2 gọi B1, C3 gọi B1)
I.2 Gọi phương thức từ xa và các vấn đề phát sinh
Việc gọi phương thức của các đối tượng từ xa thoạt nhìn có vẻ đơn giản nhưng thực
tế lại phức tạp hơn triệu gọi phương thức cục bộ Các đối tượng trên hai máy khác nhau hoạt động trên hai tiến trình (hay không gian địa chỉ) khác nhau cho nên việc tham chiếu biến, địa chỉ đối tượng là hoàn toàn khác nhau Ví dụ, khi bạn truyền con trỏ cho một phương thức ở xa, trên máy bạn con trỏ này tồn tại nhưng trên máy khác (nơi có đối tượng thực thi phương thức) sẽ không có bất kỹ vùng nhớ nào được cấp phát dành cho con trỏ Lời gọi các phương thức cục bộ thường luôn trả về kết quả trong khi lời gọi các phương thức từ xa phải thông qua kết nối mạng và luôn có thể
bị cắt ngang do mạng gặp sự cố
Đối với lời gọi hàm trên máy cục bộ, các tham số truyền cho hàm thường được dặt vào ngăn xếp (stack) trong khi tham số truyền cho phương thức của đối tượng ở xa phải được đóng gói và chuyển qua mạng để đến được với phương thức thực sự
I.3 Các lớp trung gian (stub và skeletion)
Để giải quyết các vấn đề trên, đối tượng Java trên hai máy khác nhau không gọi nhau trực tiếp mà thông qua lớp trung gian Lớp trung gian này tồn tại ở cả hai phía: máy khách (nơi gọi phương thức của các đối tượng ở xa) và máy chủ (nơi đối tượng thực sự được cài đặt để thực thi mã lệnh của phương thức) Phía máy khách lớp trung gian này được gọi là stub (lớp móc), phía máy chủ lớp trung gian này được
Trang 7gọi là skeletion (lớp nối) Ta hình dung stub và skeletion là hai người môi giới giúp các đối tượng ở xa giao dịch với nhau.
Hình 2 - Gọi các phương thức của các đối tượng thông qua lớp trung gian
Ví dụ bạn có đối tượng C1 được cài đặt chạy trên máy C Trình biên dịch Java sẽ giúp bạn tạo ra hai lớp trung gian C1_Skel và C1_stub Lớp C1_Stub sẽ được đem
về máy computer A Khi A1 trên máy Computer A gọi C1 nó sẽ chuyển lời gọi đến lớp C1_Stub C1_Stub chịu trách nhiệm đóng gói tham số, chuyển tham số quan mạng đến máy Computer C trên máy Computer C lớp nối C1-Skel sẽ nhận tham số chuyển vào vùng không gian địa chỉ tương thích với đối tượng C1 sau đó gọi phương thức tương ứng Kết quả nếu có do phương thức của đối tượng C1 trả về sẽ được lớp C1_Skel đóng gói trả ngược về cho C1_stub C1-Stub chuyển giao kết quả cuối cùng lại cho A1 Bằng cơ chế này, A1 luôn nghĩ rằng nó đang hoạt động trực tiếp với đối tượng C1 ngay trên máy cục bộ Hơn nữa, nhờ sự giúp đỡ của lớp trung gian C1-Stub, khi kết nối mạng gặp sự cố lớp trung gian Stub sẽ luôn biết cách
Nhóm 12 – Đề số 22 Trang 7
Computer A
A1A2
ske l
Trang 8thông báo lỗi đến đối tượng A1.
Thực tế làm cách nào A1 tham chiếu được đến C1, một khi không có lớp C1 nào được cài đặt ở máy A? C1_Stub trên máy A chỉ làm lớp nền trung gian chuyển đổi tham số và thực hiện các giao thức mạng, nó không phải là hình ảnh của đối tượng C1 Để làm được điều này, đối tượng C1 cần cung cấp một giao tiếp interface tương ứng với các phương thức cho phép đối tượng A1 gọi nó trên máy A Chúng ta sẽ tiếp tục làm sáng tỏ vấn đề hơn trong quá trình xây dựng một ứng dụng RMI thật sự sau đây
I.4 Bộ đăng ký (rmiregistry), classpath và codebase
Với ví dụ trên bạn đã biết đến bộ đăng kí rmiregistry dùng để tiếp nhận đăng kí tên của đối tượng Hầu như trước khi máy khách muốn sử dụng được các phương thức
và được gọi đối tượng ở xa nó phải liên lạc với rmiregistry để lấy về tham chiếu đến đối tượng trên máy chủ Dịch vị dăng kí và truy tìm tên đối tượng (các bước , ,
ở hình 4) được Java quản lý bằng các hàm giao tiếp API JNDI (Java Naming Directory Interface) Các hàm JNDI ở máy khách (Naming.lookup()) sẽ liên lạc với rmiregistry để nhận về tham chiếu của đối tượng trong khi các hàm JNDI ở máy chủ (Naming.bind()) có nhiệm vụ đăng kí tên của đối tượng với rmiregistry
Trong Windows khi mở cửa sổ DOS-Prompt để chạy một chương trình Java, về lý thuyết chương trình này được xem là chạy độc lập trên một máy (máy ảo) Do đó nếu 3 chương trình Java chạy trên 3 cửa sổ DOS-Prompt khác nhau bạn có thể xem đây là kết quả kiết xuất từ hai máy tính khác nhau Hay nói cách khác dựa vào máy
ảo Java bạn có thể tuỳ thích tạo ra các máy tính ảo để giao tiếp với nhau giả lập mạng Dữ liệu chuyển từ máy ảo Java này sang máy ảo Java khác hoàn toàn tương
tự quá trình giao tiếp và chuyển dữ liệu giữa hai máy tính kết nối vật lý thực sự trên mạng
Trang 9Hình 4 - Cơ chế làm việc của các máy ảo Java khi đăng kí và gọi đối tượng giữa
trình khách và trình chủTuy nhiên cũng có một số hạn chế đó là tất cả các máy ảo Java đều dùng chng một địa chỉ IP vật lý trong khi hai máy ảo Java chạy trên hai máy tính vật lý khác nhau
sẽ có địa chỉ IP khác nhau Các máy ảo Java chạy trên cùng một máy vật lý sẽ sử dụng cùng thư viện Java, cùng một chính sách bảo mật, điều này làm bạn rất dễ nhầm tưởng là chương trình chạy tốt trên cả hai phía máy khách và máy chủ Trong khi thực tế nếu máy khách và máy chủ dùng hai thư viện Java (cũng như biến môi trường CLASSPATH) khác nhau hoặc chính sách bảo mật khác nhau sẽ làm cho kết nối từ phía máy khách và máy chủ không thực hiện được Bạn nên lưu ý đến vấn đề này khi cài đặt các ứng dụng Java trên các máy mạng vật lý thực sự
I.4.1 Đăng ký rmiregistry
Hình 5 trình bày cơ chế làm việc của trình khách và trình chủ trên máy ảo Java khi đăng kí và truy xuất rmiregistry
Trang 10Hình 5 Cơ chế hoạt động của các máy ảo Java trên mô hình máy mạng vật lý thật sự
Đối tượng trên máy ảo Java B dùng hàm Naming.bind() hoặc Naming.rebind() để đăng kí đối tượng với chương trình rmiregistry đang chạy trên máy ảo Java A
Chương trình khách chạy trên máy ảo Java dùng hàm Naming.lookup() để yêu cầu bộ quản lý rmiregistry trên máy ảo A trả về bộ tham chiếu đến đối tượng
Bộ quản lý rmiregistry trên máy ảo A trả về tham chiếu đến đối tượng đang tồn tại trên máy ảo B
Chương trình khách chạy trên máy ảo Java sử dụng tham chiếu do hàm Naming.lookup() trả về để truy và gọi phương thức của đối tượng đang chạy trên máy ảo B từ xa
Như đã nêu, cả 3 máy ảo đều có thể xem như 3 máy vật lý kết nối trực tiếp với nhau qua mô hình mạng Tuy nhiên nếu 3 máy ảo này chạy trên 3 máy khác nhau chúng
sẽ khác nhau số đại chỉ IP Do cùng chạy trên một máy vật lý nên cả 3 máy ảo này
sẽ mang cùng một địa chỉ IP cục bộ 127.0.0.1 (hay localhost)
Thực tế với mô hình trên, nếu hoạt động thật sự qua mạng thì chỉ có thể tách ra làm
2 máy vật lý chứ không thể là 3 Máy ảo A chạy chương trình rmiregistry và máy ảo
B chạy phần cài đặt của đối tượng phải chạy trên cùng một máy vật lý Tức là máy
ảo A và B phải trùng địa chỉ IP của nhau Hiện tại, Java không cho phép rmiregistry chạy trên máy vật lý khác với nơi mà đối tượng đang hoạt động
Hình 5 là cơ chế hoạt động của các máy ảo Java trên mô hình máy mạng vật lý thật
sự Máy khách có địa chỉ mạng IP là 172.16.11.13 truy xuất đến bộ đăng kí
Trang 11rmiregistry của máy chủ có địa chỉ IP là 172.16.11.12 Trên máy chủ 172.16.11.12 chúng ta có cả 2 máy ảo Java cùng hoạt động Máy ảo Java A chạy chương trình rmiregistry trong khi đó máy ảo Java B chạy phần cài đặt của đối tượng.
I.4.2 Thiết lập và cài đặt hệ đa server dùng Java và RMI
Mô hình xử lý thông tin có thể được trình bày ngắn gọn như sau: Khi Server1 nhận yêu cầu cần xử lý từ Client gửi đến , Server1 xử lý một phần, và có thể xảy ra việc thiếu dữ liệu và cần lấy dữ liệu từ Server2 để xử lý tiếp hay gửi phần xử lý còn lại cho Server2 để xử lý giúp Tất cả các công việc trao đổi dữ liệu hay chia xẻ tác
vụ giữa hai hay nhiều Server này diễn ra đều thực hiện được nhờ vào giải pháp xử lý
đa Server và xử lý song song thông qua giao thức triệu gọi từ xa (RMI mà Java cung cấp) và các tác tử (Agent) điều kiển được tạo ra Một ví dụ cụ thể cho các bước xây dựng một giải pháp xử lý đa Server dùng RMI + Xây dựng Interface cho các phương thức triệu gọi từ xa cho Server1 (Server1.java) import java.rmi.Remote; import java.rmi.RemoteException; public interface Server1 extends java.rmi.Remote{
public abstract java.lang.Stringget
Information(java.lang.String s )
throws java.rmi.RemoteException; }
+ Xây dựng lớp thực thi cho các phương thức triệu gọi từ xa cho Server1 (Server1Impl.java) import java.io.*; import java.rmi.*; public class Server1Impl extends java.rmi.server.UnicastRemoteObject implements Server1{
public Server1Impl()
throws java.rmi.RemoteException {
java.lang.System.out.println("Starting Server1 ");}
static String nameserver2 = null;
// Khai báo biến để giữ tên của Server2 static Server2 ser2=null ;
Nhóm 12 – Đề số 22 Trang 11
Trang 12//khai báo đối tượng của Server2 public synchronized java.lang.String getInformation(java.lang.String s ) {
System.out.println("Goi Server2 lam giup ");
}catch (Exception e){
System.out.println("connect with server2 err "+ e);
} return s1;}
public static void main(java.lang.String args[ ] ) {
java.lang.System.out.println("Creating Registry Server1 "); try {//Server1 tạo ra đối tượng server1impl và đăng ký nó để sẵn sàng cho việc gọi từ xa
// lay ten cua server2 giữ đấy để khi cần thì gọi
DataInputStream inname = new DataInputStream(System.in);
java.lang.System.out.print("Nhap Ten Cua Server Thu 2 Vao:"); nameserver2=inname.readLine();}
catch(java.lang.Exception exception) {
Trang 13java.lang.System.out.println("Create registry failed " +
exception.getMessage()); java.lang.System.exit(0);}}}
+ Xây dựng Interface cho các phương thức triệu gọi từ xa cho Server2 (Server2.java) import java.rmi.Remote; import java.rmi.RemoteException; public interface Server2 extends java.rmi.Remote {
public abstract java.lang.String receive(java.lang.String s) throws java.rmi.RemoteException;}
+ Xây dựng lớp thực thi cho các phương thức triệu gọi từ xa cho Server2 (Server2Impl.java) import java.io.*; import java.rmi.*; public class Server2Impl extends java.rmi.server.UnicastRemoteObject implements Server2 {
public Server2Impl()throws java.rmi.RemoteException {
java.lang.System.out.println("Starting Server2 ");} public synchronized java.lang.String receive(java.lang.String s){
java.lang.String s1 = "Yeu cau cua Client duoc Server1 va anh Server2 xu ly xong";
System.out.println("Server2 da xu ly yeu cau cua Server1 gui den ");
return s1; }
public static void main(java.lang.String args[ ] ) {
java.lang.System.out.println("Creating Registry Server2 ");
try { //Server2 tạo ra đối tượng server2impl và đăng ký nó để sẵn sàng cho việc gọi từ xa
Nhóm 12 – Đề số 22 Trang 13
Trang 14catch(java.lang.Exception exception) {
java.lang.System.out.println("Create registry failed " + exception.getMessage());
java.lang.System.exit(0); } } }
+ Xây dựng chương trình Client để gọi thực hiện (Client.java) import java.io.*; import java.rmi.*;
public class Client {
static Server1 obj = null;
public static void main (String argv[]){
try{ obj = (Server1)Naming.lookup("rmi://"+ argv[0] +":1999/Server1");
java.lang.String message = obj.getInformation(“Help me !”) ; System.out.println(message);
Trang 15II THUẬT TOÁN TWO PHASE COMMIT (2PC)
II.1 Thuật toán Linear Two Phase Commit – TPC
Chúng ta giả thiết rằng, tại vị trí nguồn của giao dịch một tiến trình thực hiện các thao tác của nó, tiến trình này được gọi là điều phối viên (Coordinator) Điều phối viên trao đổi với các thành viên (Participant) tại những vị trí có tham gia vào việc thực hiện các thao tác của giao dịch
Có một thứ tự giữa các vị trí trong hệ thống dành cho việc giao tiếp Chúng ta hãy giả thiết rằng thứ tự giữa các vị trí có tham gia vào việc thực hiện một giao dịch là 1, 2,…, N với điều phối viên là vị trí đầu tiên trong thứ tự này Nghi thức 2PC được cài đặt bằng cách trong pha đầu tiên truyền tới [ tính từ điều phối viên (số 1) đến N]
và trong pha thứ hai truyền ngược từ N về điều phối viên Thuật toán 2PC tuyến tính hoạt động theo cách sau:
Điều phối viên gửi thông báo prepare đến thành viên 2 Nếu thành viên 2 chưa sẵn sàng ủy thác giao dịch, nó gửi thông báo biểu quyết hủy bỏ vote-abort (VA) và giao dịch bị hủy tại thời điểm này (hủy bỏ đơn phương của 2) Ngược lại nếu thành viên
2 đồng ý ủy thác, nó gửi thông báo vote-commit(VC) cho thành viên 3 rồi chuyển sang trạng thái READY Quá trình này tiếp tục cho đến khi một biểu quyết ủy thác đến được thành viên N Đến đây kết thúc pha đầu tiên Nếu N quyết định ủy thác, nó gửi cho thành viên N-1 thông báo global-commit (GC); bằng không, nó gửi một thông báo toàn cục global-abort(GA) Theo đó các thành viên sẽ chuyển sang trạng thái thích hợp (COMMIT hoặc ABORT) và làm lan truyền thông báo trở về điều phối viên
II.2 Nghi thức ủy thác 2 pha 2PC
Ủy thác hai pha (Two-phasde commit, 2PC) là một nghi thức đơn giản và tinh tế đảm bảo hành động ủy thác nguyên tử cho các giao dịch phân tán Khẳng định rằng
Nhóm 12 – Đề số 22 Trang 15
Trang 16tất cả các vị trí liên đới trong việc thực hiện giao dịch phân tán đều đồng ý ủy thác giao dịch trước khi tác dụng của nó được đưa vào CSDL thực sự.
Khởi đầu, điều phối viên ghi mẫu begin_commit vào nhật ký của nó và gửi thông báo chuẩn bị (prepare) đến tất cả các thành viên và chuyển sang trạng thái wait Khi một thành viên nhận được thông báo chuẩn bị nó kiểm tra xem nó có thể uỷ thác được giao dich hay không Nêu được nó ghi một mẫu tin ready vào nhật ký vào gửi thông báo biểu quyết uỷ thác (vote-commit) đến điều phối viên rồi chuyển sang trạng thái read Nếu không nó chuyển nó ghi mẫu tin abort và gửi thông báo vote-abort đến điều phối viên Nếu quyết định của vị trí này là huỷ bỏ thì nó có thể quên giao dịch đi vì quyết định của nó được dùng như một phủ quyết (huỷ bỏ đơn phương) Sau khi nhận được sự đáp, nó quyết định hay huỷ bỏ giao dịch Nếu có một thành viên gửi phủ quyết thì điều phối viên sẽ phải huy bỏ toàn bộ giao dịch
Vì thế nó ghi mẫu tin Abort vào nhật ký, gửi thông báo global-abort đến tất cả các thành viên, và chuyển sang trạng thái ABORT , ngược lại nó ghi mẩu tin commit, gửi global-commit tới tất cả các thành viên rối chuyển sang trang thái commit Các thành viên sẽ ủy thác hoặc hủy bỏ giao dịch tùy theo hướng dẫn của điều phối viên
và gửi thông báo ACK Và điều phối viên kết thúc giao dịch bằng cách ghi mẫu tin end-of-transaction vào nhật ký
Quy tắc ủy thác toàn cục (global commit rule)
- Nếu có một thành viên biểu quyết hủy bỏ giao dịch, điều phối viên sẽ đưa
ra quyết định hủy bỏ toàn cục
- Nếu tất cả mọi thành viên đều biểu quyết ủy thác giao dịch , thì điều phối viên sẽ đưa ra quyết định ủy thác toàn cục
Trang 17II.2.1 Cấu trúc 2PC tập quyền
Một lựa chọn khác là nghi thực 2PC tuyến tính (linear 2PC) Còn được gọi là nghi thức 2PC lồng trong đó các thành viên có thể trao đổi với nhau Có một thứ tự giữa các vị trí trong hệ thống dành cho việc giao tiếp Gia thiết thứ tự giữa các vị trí có tham gia vào việc thực hiện một giao dịc là 1,…,với điều phối viên là vị trí đầu tiên trong giao dịch này
Nhóm 12 – Đề số 22 Trang 17
Trang 18Nghi thức 2PC được cài đặt bằng cách trong pha đầu tiên truyền tới (tính từ điều phối viên số 1 đến N và trong pha thứ 2 truyền ngược lại từ N đến điều phối viên hoạt động theo các nguyên tắc sau: Điều phối viên gửi thông báo prepare đến thành viên 2 Nếu thành viên 2 chưa sẵn sàng ủy thác giao dịch nó gửi thông báo quyết định hủy bỏ Vote-abort (VA) đến thành viên 3 và giao dịch bị hủy bỏ tại thời điểm này (hủy bỏ đơn phương của 2) Ngược lại nó gửi thông báo vote-commit (VC) cho thành viên thứ 3 chuyển sang trạng thái Ready Quá trình tiếp tục cho đến khi biều quyết ủy thác được đến thành viên thứ N Đến đây kết thúc pha đầu tiên Nếu biểu quyết ủy thác, nó gửi trở lại cho N-1 thành viên thông báo global-commit (GC) Bằng không nó gửi thông báo hủy bỏ toàn cục global- abort (GA) Theo đó các thành viên sẽ chuyển sang trạng thái thíc hợp (commit hoặc abort) và làm lan truyền thông báo tới điều phối viên như hình sau.
Trang 19II.2.2 Cấu trúc 2PC phân quyền
Tất các các thành viên có thể độc lập đưa ra quyết định kết thúc ứng với giao dịch
cụ thể loại bỏ nhu cầu cần phải có pha thứ 2 của nghi thức bởi vì các thành viên có thể đưa ra quyết định dựa vào chính nó hoạt động như sau điều phố viên gửi thông báo prepare đến tất cả các thành viên sau đó mỗi thành viên gửi quyết định của mình đến các thành viên khác ( và đến điều phối viên ) bằng thông báo Vote-commit hoặc Vote-abort Một thành viên đợi thông báo từ tất cả các thành viên khác rồi ra quyết định kết thúc theo theo đúng quy tắc ủy thác toàn cục
Thuật toán2PC Cho điều phối viên (coordinator)
declare-var
msg:message
Nhóm 12 – Đề số 22 Trang 19