Báo cáo thu hoạch môn Lập trình mạng nâng cao
PHẦN I : ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO LẬP TRÌNH MẠNG
BÁO CÁO LẬP TRÌNH MẠNG
NHÓM 12 - ĐỀ 22
NHÓM 12 - ĐỀ 22
Áp dụng thuật toán duy trì gắn bó,
Á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 hai
tránh bế tắc và thiếu thốn vô hạn hai
pha trong hệ đa Server
pha trong hệ đa Server
Nhóm 12 – Đề số 22 Trang 1
Báo cáo thu hoạch môn Lập trình mạng nâng cao
Giảng viên
Giảng viên
: PGS.TS. LÊ VĂN SƠN
: PGS.TS. LÊ VĂN SƠN
Học viên
Học viên
: Thái Thị Bích Thủy
: Thái Thị Bích Thủy
Nguyễn Thị Diễm Thúy
Nguyễn Thị Diễm Thúy
Lớp
Lớp
: Cao học KHMT khóa 11
: Cao học KHMT khóa 11
Đà Nẵng, tháng 03/2010
Nhóm 12 – Đề số 22 Trang 2
Báo cáo thu hoạch môn Lập trình mạng nâng cao
LỜ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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
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!
NHÓM 12.
Nhóm 12 – Đề số 22 Trang 4
Computer A
A2
2
A1
Computer C
C1
C2
C3
Computer B
B1
Báo cáo thu hoạch môn Lập trình mạng nâng cao
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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
tượ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
Nhóm 12 – Đề số 22 Trang 6
Báo cáo thu hoạch môn Lập trình mạng nâng cao
gọ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
A1
A2
B1_stub
C1_
stub
Computer B
B1_skel
B1
Computer C
C1
C1_
skel
Báo cáo thu hoạch môn Lập trình mạng nâng cao
thô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.
Nhóm 12 – Đề số 22 Trang 8
Báo cáo thu hoạch môn Lập trình mạng nâng cao
Hì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
Nhóm 12 – Đề số 22 Trang 9
Máy tính vật lý 1
(IP: 172.16.11.13)
C. Máy ảo Java chạy
chương trình khách
(CalculatorClient)
Máy tính vật lý 2 (IP: 172.16.11.12)
A. Máy ảo Java
chạy rmiregisty
B. Máy ảo Java
chạy đối tượng
Báo cáo thu hoạch môn Lập trình mạng nâng cao
Hì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í
Nhóm 12 – Đề số 22 Trang 10
Báo cáo thu hoạch môn Lập trình mạng nâng cao
rmiregistry 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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
//khai báo đối tượng của Server2 public synchronized java.lang.String
getInformation(java.lang.String s ) {
java.lang.String s1 = "";
try{ // Server1 tìm kiếm đối tượng xử lý từ xa của Server2 để
xin giúp đỡ
ser2 =(Server2)Naming.lookup("rmi://"+ nameserver2+
":1099/Server2");
s1= ser2.receive(s); // gọi phương thức của receive(s) của
Server2
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
java.rmi.registry.LocateRegistry.createRegistry(1999);
Server1Impl server1impl = new Server1Impl();
java.rmi.Naming.rebind("rmi://" + args[0]
+ ":1999/Server1", server1impl);
java.lang.System.out.println("Server1 Ready");
// 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) {
Nhóm 12 – Đề số 22 Trang 12
Báo cáo thu hoạch môn Lập trình mạng nâng cao
java.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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
java.rmi.registry.LocateRegistry.createRegistry(1099);
Server2Impl server2impl = new Server2Impl();
java.rmi.Naming.rebind("rmi://" + args[0] +
":1099/Server2", server2impl);
java.lang.System.out.println("Server2 Ready");
}
catch(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);
}catch (Exception e)
{ System.out.println ("Client exception: " + e);
}
}
}
Nhóm 12 – Đề số 22 Trang 14
Báo cáo thu hoạch môn Lập trình mạng nâng cao
II. 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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
tấ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
Nhóm 12 – Đề số 22 Trang 16
Báo cáo thu hoạch môn Lập trình mạng nâng cao
II.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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
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ứ 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.
Nhóm 12 – Đề số 22 Trang 18
Báo cáo thu hoạch môn Lập trình mạng nâng cao
II.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
Báo cáo thu hoạch môn Lập trình mạng nâng cao
ev: Event
PL: Danh Sách Thành viên (đượng XD trước khi nghi thức 2PC)
begin
WAIT(ev)
case of ev
MsgArrival;
Begin
đặt thông báo vừa đến trong msg
case msg
Commit:
begin
ghi mẫu tin begin_commit vào nhật ký
gửi thông báo prepare đến tất cả các thành viên trong PL
đặt giờ cho bộ định giờ
end
vote-commit
begin
cập nhật danh sách thành viên trả lời
if nếu tấtcả các thành viên trả lời then
begin
ghi mẫu tin commit vào nhật ký
gửi thông báo global-commit đến tất cả các thành viên
trong PL
đặt giờ cho bộ định giờ
end
ACK:
begin
cập nhật danh sách thành viên trả lời
if nếu tấtcả các thành viên trả lời then
ghi mẫu tin end_of_trasaction vào nhật ký
else
Gửi quyết định toàn cục cho tất cả các thành viên chưa trả
lời
endif
end
end-case
end
timeout:
begin
thực thi nghi thức kết thúc
end
end-case
end (2PC)(coordinator)
Thuật toán 2PC Cho điều thành viên (Participant)
Nhóm 12 – Đề số 22 Trang 20
Báo cáo thu hoạch môn Lập trình mạng nâng cao
declare-var
msg:message
ev: Event
begin
WAIT(ev)
case of ev
MsgArrival;
Begin
đặt thông báo vừa đến trong msg
case msg
prepare:
begin
if nếu sẵn sàng uỷ thác then
begin
ghi mẫu tin ready vào nhật ký
gửi thông báo vote-commit đến điều phối viên
đặt giờ cho bộ định giờ
end
else begin {huỷ bỏ đơn phương}
ghi mẫu tin abort nhật ký
gửi thông báo vote-abort đến điều phồi viên
yêu cầu bộ sử lý dữ liệu huỷ bỏ giao dịch
end
global-abort:
begin
ghi mẫu tin abort nhật ký
yêu cầu bộ sử lý dữ liệu huỷ bỏ giao dịch
end
global-commit
begin
ghi mẫu tin commit vào nhật ký
yêu cầu bộ sử lý dữ liệu uỷ thác giao dịch
end
end-case
end
timeout:
begin
thực thi nghi thức kết thúc
end
end-case
end (2PC)(Participant)
Nhóm 12 – Đề số 22 Trang 21
Báo cáo thu hoạch môn Lập trình mạng nâng cao
II.3 Nghi thức kết thúc và phụ hồi cho 2PC
Nghi thức kết thúc sử dụng các quá hạn cho điều phối viên và thành viên. Một quá
hạn (timeout) xảy ra tại vị trí đến khi nó không nhận được thông báo mong đợi.
II.3.1 Quá hạn ở điều phối viên
Có 3 trạng thái xảy ra quá hạn WAIT, COMMIT, và ABORT. Quá hạn ở trạng thái
WAIT điều phối viên đang đợi các quyết định cục bộ của các thành viên. Điều phối
viên không thể đưa ra ủy thác giao dịch. Tuy nhiên nó có thể quyết định hủy bỏ giao
dịch toàn cục bằng cách ghi mẫu tin abort trong nhật ký và gửi thông báo global-
abort đến tất cảc các thành viên. Quá hạn trong trạng thái COMMIT hoặc ABORT.
Điều phối viên sẽ gửi các thông báo global-commit hoặc global-abort đến các vị trí
chưa có hồi đáp và đợi hồi đáp của chúng.
II.3.2 Quá hạn ở thành viên
Có thể xảy ra trong 2 trạng thái INITAL và READY. Trong trạng thái INITAL
thành viên đang đợi thông báo prepare từ điều phối viên trong khi điều phối viên bị
sự cố trong trạng thái INITAL thì thành viên có thể hủy bỏ giao dịch sau một thời
gian quá hạn. Nếu thông báo prepare này đến được với thành viên sau đó thì nó
được xử lý, hoặc nó kiểm tra lại trong nhật ký tìm mẫu tin abort và trả lời vote-
abort . Hoặc nó có thể bỏ qua thông báo này. Trong trường hợp này điều phối viên
sẽ quá hạn ở trạng thái Wait. Quá hạn ở trạng thái READY. Trong trường hợp này
thành viên đã biểu quyết ủy thác giao dịch nhưng không thể đưa ra quyết định. Bởi
vị nó trong trạng thái ủy thác. Vì vậy nó không thể thay đổi biểu quyết và đơn
phương hủy bỏ. Ngược lại nó không thể đơn phương ủy thác vì một thành viên khác
biểu quyết hủy bỏ. Trong trường hợp này thành viên sẽ bị phong tỏa cho đến khi
điều phối viên hay một thành viên khác thông tin cho nó biết về kết cục cuối cùng
của giao dịch.
Nhóm 12 – Đề số 22 Trang 22
Báo cáo thu hoạch môn Lập trình mạng nâng cao
II.4 Tác động của sự cố đối với việc gắn bó dữ liệu
Nhằm nghiên cứu và phát triển phương pháp đảm bảo gắn bó dữ liệu một cách khả
thi trong điều kiện có sự cố cho các hệ thống thông tin đăng ký nói riêng, các hệ
thống tin học phân tán nói chung, bản chất của vấn đề gắn bó dữ liệu cũng như
nguyên nhân dẫn đến sự cố làm cho dữ liệu không còn gắn bó được chỉ ra và nhóm
ghép trong quá trình phân tích, thiết kế hệ thống.
Một cơ sở dữ liệu nào đó được gọi là gắn bó, nếu nó thỏa mãn một tập các ràng
buộc về toàn vẹn ngữ nghĩa. Để đảm bảo tính gắn bó dữ liệu nhiều cơ chế khác nhau
như điều khiển hoạt động đồng thời , kiểm soát tính toàn vẹn ngữ nghĩa, …được sử
dụng.
Việc kiểm soát tính toàn vẹn ngữ nghĩa tốt sẽ đảm bảo được tính gắn bó dữ liệu của
hệ thống thông tin. Hiện nay, người ta đang áp dụng hai phương pháp chủ yếu:
1. Loại bỏ các chương trình/thủ tục cập nhật có thể dẫn đến trạng thái không
gắn bó dữ liệu trong các cơ sở dữ liệu [PP
1
]
Nhóm 12 – Đề số 22 Trang 23
Báo cáo thu hoạch môn Lập trình mạng nâng cao
2. Triệu gọi các chương trình/thủ tục đặc biệt đã được cài đặt trên hệ thống
nhằm khôi phục trạng thái ban đầu trước khi cập nhật [PP
2
].
Các ràng buộc toàn vẹn được phân làm hai loại chủ yếu :
1. Ràng buộc cấu trúc (Structural Constraint) diễn tả những đặc tính ngữ
nghĩa cơ bản vốn có trong mô hình. Ví dụ như ràng buộc thể hiện bằng khóa duy
nhất trong mô hình quan hệ hoặc các liên kết theo kiểu 1 – n, (n > 1) giữa các đối
tượng trong mô hình mạng
2. Ràng buộc hành vi (Behavioral Constraint) nhằm điều hòa các hoạt động
của các ứng dụng.
Trong quá trình nghiên cứu bài toán, các tác giả vận dụng phương pháp tổng quát
đảm bảo gắn bó dữ liệu và các ràng buộc toàn vẹn thông tin phục vụ công tác phân
tích, thiết kế hệ quản trị cơ sở dữ liệu cho hệ thống cơ sở dữ liệu đăng ký với thông
tin gắn bó trong điều kiện phân tán.
Để có thể khôi phục lại dữ liệu và trạng thái gắn bó thông tin của toàn hệ thống khi
có sự cố diễn ra, một trong những vấn đề quan trọng hàng đầu là cần phải xác định
được loại, bản chất và vị trí diễn ra sự cố mà từ đó nhận biết một cách tự động và
chuyển đến phương án giải quyết nào cho phù hợp. Bản chất (mã) sự cố và thủ tục
giải quyết sự cố có liên quan đến gắn bó được lưu trữ tại trung tâm hoặc phân tán
trên các trạm của hệ đăng ký phân tán. Trong trường hợp các thủ tục được phân tán,
thì bản thân các thủ tục đó cũng đòi hỏi phải có giải pháp đảm bảo gắn bó giống như
dữ liệu bình thường.
Về tổng quan, các sự cố được chia làm hai loại chính là sự cố xảy ra do các
trạm trên hệ thống phân tán và sự cố do hệ thống viễn thông gây ra . Song để tiện
lập trình giải pháp, người ta cụ thể hoá ra thành bốn mức với các nguyên nhân
tương ứng thể hiện trong bảng 1.
Nhóm 12 – Đề số 22 Trang 24
Báo cáo thu hoạch môn Lập trình mạng nâng cao
Bảng 1. Các loại sự cố và nguyên nhân gây ra sự cố
TT Loại sự cố Nguyên nhân
1 Sự cố giao dịch
Transaction Failure
Do một lỗi nào đó trong bản thân giao dịch gây
nên. Ví dụ như dữ liệu nhập không đúng hoặc do
phát hiện ra một khóa gài tiềm tàng hoặc hiện hữu
2
Sự cố vị trí
Site Failure
Do một lỗi phát sinh trong quá trình vận hành hệ
thống. Lỗi này có thể bắt nguồn từ phần thiết bị
như bộ xử lý/bộ vi xử lý, bộ nhớ, các thiết bị
ngoại vi, bị sự cố. Khi bị sự cố, hệ thống lập tức
bị ngừng hoạt động. Hệ thống chương trình, đặc
biệt là các chương trình điều khiển cũng có thể
sinh lỗi. Đó là các lỗi do thuật toán, do lệnh viết
sai, do phần lưu trữ chương trình hay do virus.
Các lỗi này thường là ở các chương trình và cơ sở
dữ liệu
3
Sự cố phương tiện
Media Failure
Do sự cố của các thiết bị lưu trữ thứ cấp dùng để
lưu cơ sở dữ liệu. Khi có sự cố này thì một phần
hoặc tất cả cơ sở dữ liệu trên thiết bị đó được xem
như bị hủy hoại hoặc không thể truy cập một cách
bình thường được
4
Sự cố đường truyền
Transmission Failure
Do lỗi trong các thông điệp, các thông điệp vô trật
tự, thông điệp bị thất lạc hoặc không phân phối
thông điệp và sự cố khác liên quan đến đường
truyền.
Phương pháp tổng quát cho việc khắc phục bốn loại sự cố này được trình bày trong
bảng 2.
Bảng 2. Phương pháp tổng quát khắc phục sự cố
Nhóm 12 – Đề số 22 Trang 25