Trong bối cảnh này, việc áp dụng thuật toán đồng bộ đồng hồ vật lý, đặc biệt là thuật toán Berkeley, trở nên hết sức quan trọng.Lý do chọn đề tài này xuất phát từ nhu cầu ngày càng tăng
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA CÔNG NGHỆ THÔNG TIN
THEO THUẬT TOÁN BERKELEY
Giảng viên hướng dẫn : ThS LÊ NGỌC BẢO
Trang 2LỜI CẢM ƠN
Em xin bày tỏ lòng biết ơn sâu sắc tới Học viện Công nghệ Bưu chính Viễn thông vì đã đưamôn học Các hệ thống phân tán vào chương trình học của chúng em Đồng thời, em muốn gửi lờicảm ơn chân thành đến Thầy Lê Ngọc Bảo, người đã dành thời gian và tâm huyết hướng dẫn chúng em trong suốt hành trình học tập
Thầy không chỉ là người hướng dẫn mà còn là nguồn động viên quan trọng, giúp em nhận thức rõ hơn về tầm quan trọng của các hệ thống phân tán trong lĩnh vực công nghệ thông tin Thầy đã chia sẻ những kiến thức sâu rộng và cung cấp ví dụ minh họa, giúp em tiếp cận môn học một cách linh hoạt và thú vị
Đặc biệt, em muốn biểu hiện lòng biết ơn đặc biệt đến tâm huyết của Thầy trong việc hướng dẫn về kỹ năng và kinh nghiệm cần thiết cho việc nghiên cứu và triển khai "Các hệ thống phân tán" Những kỹ năng này không chỉ là đòn bẩy cho quá trình học tập mà còn là nền tảng quan trọng cho sự phát triển nghề nghiệp trong tương lai
Em hy vọng rằng Học viện sẽ tiếp tục phát triển và cập nhật chương trình học với các môn học chất lượng như "Các hệ thống phân tán" Điều này sẽ mang lại cơ hội cho sinh viên như em
để nắm bắt và ứng dụng kiến thức một cách hiệu quả, từ đó nâng cao khả năng sáng tạo và ứng dụng trong thực tế
Cuối cùng, em trân trọng nhận định về tầm quan trọng của sự đánh giá và góp ý của Thầy
Lê Ngọc Bảo đối với bài luận của em Em coi đây là cơ hội quý báu để hoàn thiện bản thân và xin chân thành cảm ơn Thầy vì sự hỗ trợ và sự hướng dẫn chân thành trong quá trình học tập
Trang 31 GIỚI THIỆU CHUNG
1.1 Lý do chọn đề tài
Trong thời đại ngày nay, khi công nghệ thông tin ngày càng phát triển, hệ thống phân tán đóng một vai trò quan trọng trong việc xử lý và quản lý thông tin Các máy tính phân tán cần phảiduy trì đồng bộ về thời gian để đảm bảo tính nhất quán và đáng tin cậy của dữ liệu Trong bối cảnh này, việc áp dụng thuật toán đồng bộ đồng hồ vật lý, đặc biệt là thuật toán Berkeley, trở nên hết sức quan trọng
Lý do chọn đề tài này xuất phát từ nhu cầu ngày càng tăng về việc đảm bảo đồng bộ thời gian giữa các máy tính phân tán trong một hệ thống Một hệ thống phân tán hiệu quả không chỉ đòi hỏi sự tương tác chính xác giữa các thành phần mà còn đề cao tính nhất quán trong việc đánh dấu thời gian Thuật toán Berkeley, được thiết kế để giải quyết vấn đề đồng bộ hóa thời gian giữacác máy tính phân tán, trở thành sự chọn lựa lý tưởng để nghiên cứu và triển khai
Qua việc áp dụng thuật toán Berkeley, chúng ta có thể tối ưu hóa quá trình đồng bộ hóa thời gian, giảm thiểu độ trễ và tăng cường khả năng chịu lỗi của hệ thống Đồng thời, việc này còn mang lại những lợi ích to lớn cho việc phát triển các ứng dụng và dịch vụ phức tạp, nơi tính nhất quán và đáng tin cậy là chìa khóa của sự thành công
Trong bối cảnh hiện nay, khi các tổ chức và doanh nghiệp ngày càng chú trọng đến sự kết nối liền mạch giữa các thành phần hệ thống, nghiên cứu về áp dụng thuật toán Berkeley trở nên càng trở nên thiết thực và cần thiết Bài báo cáo này sẽ tập trung vào việc trình bày cơ sở lý thuyết và ứng dụng thực tế của thuật toán Berkeley trong bối cảnh các hệ thống phân tán, với hy vọng đóng góp vào sự hiểu biết và phát triển của lĩnh vực này
1.2 Giới thiệu về thuật toán Berkeley
1.2.1 Khái niệm
Thuật toán Berkeley là một phương pháp đồng bộ hóa đồng hồ trong tính toán phân tán, được phát triển bởi Gusella và Zatti tại Đại học California, Berkeley vào năm 1989 Thuật toán này được thiết kế để sử dụng trong mạng nội bộ, giả định rằng không có máy tính nào có nguồn thời gian chính xác Nó được thiết kế để sử dụng trong mạng nội bộ
1.2.2 Hướng tiếp cận
- Một máy chủ thời gian Server sẽ gửi thời gian của nó đến tất
cả các máy tính để thăm dò sự khác biệt thời gian
Lấy ví dụ: Giả sử có 3 đồng hồ T1,T2,T3 Trong đó T1 là
đồng hồ Server đang là 3h các đồng hồ còn lại là của
Clientvới T2 =2h50’, T3= 3h25’ theo như hình bên
Chú thích:
Time daemon (còn gọi là "time server"), có nhiệm vụ
chính là duy trì thời gian chung cho toàn bộ hệ thống,
giúp đồng bộ hóa đồng hồ của các máy tính khác trong
mạng
Hình 1.1 Ví dụ thuật toán Berkeley (a)
Trang 4 Network: hệ thống mạng nội bộ Gỉa sử độ trễ mạng
không đáng kể
- Các máy tính tính toán độ chênh lệch với thời gian mà máy
chủ gửi tới và sau đó trả lời lại máy chủ
Theo ví dụ ban đầu, T2 và T3 tính toán độ lệch thời gian và
gửi về cho Server lần lượt là: T1’ = -10’ và T2’ = +25’ (T1’,
T2’ lần lượt là độ lệch thời gian của các máy T2 và T3) Dấu
“-” biểu thị cho việc T2 trễ hơn T1 và “+” là T3 sớm hơn T1
- Máy chủ tính toán chênh lệch thời gian trung bình cho mỗi
máy tính: T = (0 + T1’ + T2’)/3 = (0 - 10 + 25)/3 = 5’
- Sau đó Server sẽ đặt thời gian của mình là: Tnew = 3h + 5’ Và
báo cho các máy Client T2 (+15') và T3 (-20')
Hình 1.2 Ví dụ thuật toán Berkeley (b)
Hình 1.3 Ví dụ thuật toán Berkeley (c)
Trang 52 NỘI DUNG THỰC HIỆN
2.1 Hướng tưởng thực hiện
Bài làm xây dựng một hệ thống có server và client kết nối vào server thông qua trang web đơn giản hiển thị thời gian của client khi truy cập vào trang web Server sẽ gửi yêu cầu thời gửi thời gian đến các client có trong hệ thống và các thiết bị trong hệ thống sẽ gửi cho server thời gian của mình Server lập tức tính toán để tìm ra thời gian đồng bộ cho toàn hệ thống và sau đó gửi lại yêu cầu đồng bộ thời gian kèm thời gian chuẩn mà nó đã tính toán cho các thiết bị khác
2.3 Công nghệ được sử dụng
2.3.1 JavaScript
JavaScript là ngôn ngữ lập trình được nhà phát triển sử dụng để tạo trang web tương tác Từlàm mới bảng tin trên trang mạng xã hội đến hiển thị hình ảnh động và bản đồ tương tác, các chức năng của JavaScript có thể cải thiện trải nghiệm người dùng của trang web Là ngôn ngữ kịch bản phía máy khách, JavaScript là một trong những công nghệ cốt lõi của World Wide Web
Ví dụ: khi duyệt internet, bất cứ khi nào bạn thấy quảng cáo quay vòng dạng hình ảnh, menu thả xuống nhấp để hiển thị hoặc màu sắc phần tử thay đổi động trên trang web cũng chính là lúc bạn thấy các hiệu ứng của JavaScript
Hình 2.4 Hình minh họa JavaScript
JavaScript có những ưu điểm sau:
- Dễ dàng học và sử dụng: Cú pháp của JavaScript được lấy cảm hứng từ ngôn ngữ lập trình Java, rất dễ để học và viết mã Các nhà phát triển sử dụng JavaScript trong hầu hết các trang web và ứng dụng di động để viết tập lệnh phía máy khách Node.js cũng đã trở nên hết sức phổ biến đối với việc viết mã backend trong thập kỷ qua Nhiều nền tảng phát trực tuyến và video phổ biến đã được viết mã bằng Node.js
- Có thể không phụ thuộc vào nền tảng: Không giống như các ngôn ngữ lập trình khác, có thể chèn JavaScript vào bất kỳ trang web nào và sử dụng với nhiều ngôn ngữ và khung phát triển
Trang 6web khác Sau khi viết, bạn có thể chạy mã JavaScript trên bất kỳ máy nào Do đó, với
JavaScript, việc phát triển ứng dụng có thể không phụ thuộc vào nền tảng
- Giảm tải máy chủ: Có thể sử dụng JavaScript để giảm tải máy chủ và tắc nghẽn mạng vì JavaScript có thể chạy các phép toán logic và thực hiện nhiều công việc của máy chủ trên chính máy khách
- Cải thiện giao diện người dùng: JavaScript tạo ra các trang web tinh tế giúp thuận tiện trong việc tìm kiếm và xử lý thông tin phức tạp Các nhà phát triển áp dụng JavaScript để mở rộng chức năng và độ dễ đọc cũng như để tương tác giữa người dùng và trang web hiệu quả hơn
- Hỗ trợ đồng thời: JavaScript có thể chạy song song nhiều tập hợp hướng dẫn khác nhau Về phần backend, Node.js có thể giải quyết và xử lý các phản hồi của máy chủ được mở rộng quy
mô mà không tiêu tốn cùng một lượng băng thông để làm việc đó
Hình 2.5 Hình minh họa NodeJS
Tính mã nguồn mở của NodeJS mang lại sự minh bạch và cơ hội cho cộng đồng lập trình Mã nguồn này không chỉ được công bố một cách công khai mà còn được bảo dưỡng và phát triển bởi một đội ngũ đa dạng các đóng góp từ lập trình viên trên toàn thế giới
Một điểm nổi bật khác của NodeJS là khả năng hỗ trợ đa nền tảng Không phụ thuộc vào bất
kỳ hệ điều hành cụ thể nào, NodeJS có thể hoạt động mượt mà trên Linux, macOS, và
Windows, tạo điều kiện thuận lợi cho lập trình viên làm việc trong các môi trường đa dạng.NodeJS không chỉ là một môi trường thời gian chạy mã JavaScript truyền thống mà còn là cầunối giữa trình duyệt và server Trước khi sự xuất hiện của NodeJS, JavaScript chỉ có thể thực thi trong môi trường trình duyệt và chỉ dành cho việc phát triển ứng dụng front-end NodeJS
Trang 7đã mở rộng giới hạn này bằng cách cung cấp môi trường thời gian chạy bên ngoài trình duyệt, được xây dựng trên cơ sở của công cụ JavaScript nổi tiếng của Chrome, V8 Engine Điều này giúp lập trình viên có khả năng xây dựng ứng dụng back-end bằng ngôn ngữ JavaScript quen thuộc, mở ra một thế giới mới của tính linh hoạt và hiệu suất trong phát triển ứng dụng web.
Gói là một công cụ do ai đó tạo và tải lên nền tảng npm Mỗi gói có một phiên bản Khi gói thay đổi, phiên bản gói sẽ cập nhật npm giúp dễ dàng cập nhật các gói và có thể chuyển đổi phiên bản bất kỳ lúc nào
2.3.2.2 Cài đặt NodeJS và npm
Các bước để thiết lập NodeJS (npm được phân phối chung với NodeJS, khi cài đặt NodeJS thì npm sẽ được cài đặt theo):
- Bước 1: Truy cập trang web chính thức của NodeJS: Node.js (nodejs.org)
Hình 2.6 Giao diện trang web NodeJS
- Bước 2: Chọn phiên bản thích hợp để tải về cài đặt (1 trong 2 nút theo mũi tên bên trên)
Trang web tự động phát hiện hệ điều hành máy tính Có thể nhấp vào nút phiên bản “LTS”
được đề xuất cho hầu hết người dùng hoặc nút còn lại là phiên bản mới nhất tính đến lúc truy
cập trang web Dù bằng cách nào thì nó cũng sẽ tải xuống tệp cài đặt có phần mở rộng msi.
LTS là viết tắt của “Hỗ trợ dài hạn” Nó được khuyến khích cho hầu hết người dùng Nếu
muốn triển khai ứng dụng của mình vào môi trường sản xuất, hãy sử dụng phiên bản LTS
Ngoài ra, có thể tải và sử dụng những phiên bản khác bằng cách chọn “Other Downloads”:
Trang 8Hình 2.7 Giao diện download các phiên bản của NodeJS
Tệp thiết lập có sẵn để tải xuống cho các nền tảng khác nhau như macOS hay Linux cũng như
ở các định dạng khác nhau như msi và zip
- Bước 3: Tệp được lưu về theo đường dẫn mặc định của thiết bị Tệp để cài đặt có dạng như sau:
Nhấp đúp chuột để thực thi Thao tác này sẽ mở ra cửa sổ chào mừng để cài đặt Node.js Bấm
vào nút Tiếp theo (Next) để bắt đầu quá trình cài đặt Sau khi nhất Next sẽ đến thỏa thuận cấp
phép người dùng cuối Sau khi đọc và đôngy ý cài đặt, nhấn chọn ô “I accept the terms in the
License Agreement” một lần và nhấn Next.
Hình 2.8 Cài đặt NodeJS (1)
- Bước 4: Chọn thư mục đích để cài đặt Node.js Có thể thay đổi thư mục đích bằng cách nhấp
vào nút Thay đổi… (Change…) Nhấn Next để tiếp tục.
Trang 9Hình 2.9 Cài đặt NodeJS (2)
- Bước 5: Có thể thay đổi cách cài đặt các tính năng bằng cách nhấn vào biểu tượng trong cây bên dưới để thay đổi Nếu không chúng sẽ được cài đặt theo mặc định
Hình 2.10 Cài đặt NodeJS (3)
Sau đó nhấn Next để chuyển sang bước tiếp theo của quá trình cài đặt.
- Bước 6: Đến bước này, cửa sổ thiết lập công cụ cho module gốc hiện ra Có thể không chọn vì
nó không bắt buộc Tiếp tục nhấn Next.
Trang 11Hình 2.13 Cài đặt NodeJS (6)
Sau khi quá trình cài đặt hoàn tất, chọn Finish để kết thúc quá trình thiệt lập:
Hình 2.14 Cài đặt NodeJS (7)
Để kiểm tra xem việc thiết lập NodeJS đã hoàn toàn thành công hay chưa có thể nhập lệnh sau
vào terminal: node –version
Tương tự với npm: npm version
Nếu có thông báo như sau thì đã thành công:
Trang 12Hình 2.15 Cài đặt NodeJS (8)
2.3.3 Visual Studio Code
Visual Studio Code là một trình biên tập mã được phát triển bởi Microsoft dành cho
Windows, Linux và macOS Nó hỗ trợ chức năng debug, đi kèm với Git, có syntax highlighting,
tự hoàn thành mã thông minh, snippets (đoạn trích), và cải tiến mã nguồn Nó cũng cho phép tùy chỉnh, do đó, người dùng có thể thay đổi theme (chủ đề), phím tắt, và các tùy chọn khác Visual Studio Code miễn phí và là phần mềm mã nguồn mở
Visual Studio Code được cài đặt theo các bước:
- Bước 1: Truy cập vào trang web của tổ chức theo đường dẫn: https://code.visualstudio.com/
Hình 2.16 Cài đặt Visual Studio Code (1)
Chọn Download for free để tải về phiên bản mới nhất hoặc chọn cụ thể một phiên bản theo
yêu cầu theo mũi tên bên cạnh
- Bước 2: Sau khi đã tải về, nhấn đúp chuột vào tệp vừa tải về để tiến hành cài đặt:
- Bước 3:
Trang 13Hình 2.17 Cài đặt Visual Studio Code (2)
Tích chọn “I accept the agreement” để đồng ý các điều khoản của Visual Studio Code Sau
đó nhấn Next.
- Bước 4:
Hình 2.18 Cài đặt Visual Studio Code (3)
Tích chọn những ô trong Other theo nhu cầu sử dụng và nhấn Next (lưu ý “Add to PATH” là một lựa chọn cần thiết) Cũng nhấn Next ở các ô tiếp theo.
- Bước 5: Nhấn Install khi đã hoàn tất chọn lựa các phần cần thiết, sau khi đã cài đặt hoàn tất thì chọn Finish.
Trang 142.4 Giải quyết bài toán
Hệ thống được xây dựng không quá phức tạp, xây dựng dựa theo mô hình Server/Client gồm có 2tệp JavaScript được xây dựng là server.js và client.js có chức năng tương ứng
2.4.1 Mô tả công việc của Server
Như đã trình bày ở phần giới thiệu đề tài, một thiết bị sẽ đóng vai trò như một server để chạy ứng dụng Có nghĩa là khi ứng dụng bắt đầu chạy từ thiết bị này, tệp server.js sẽ được kích hoạt và server sẽ được hoạt động theo trình tự như sau:
2.4.1.1 Tạo webserver
Sử dụng thư viện Express (một framework phổ biến trong việc xây dựng ứng dụng web bằng Node.js) và Socket.IO (Socket.IO là một thư viện cho phép giao tiếp hai chiều (real-time) giữa máy chủ và trình duyệt, giúp xây dựng các ứng dụng web thời gian thực) trong Node.js để tạo một máy chủ web (web server) và cổng kết nối (port) mà máy chủ sẽ lắng nghe
“const express = require("express");”: Sử dụng require để import thư viện Express vào
trong chương trình Node.js
“const io = require("socket.io");”: Tương tự bên trên, import thư viện Socket.IO
“const port = process.env[2] || 5500;”: Đoạn này đặt giá trị của biến port bằng cách kiểm tra
xem có giá trị được đặt trong biến môi trường process.env[2] hay không Nếu không có, mặc định sẽ là cổng 5500 Cổng này là nơi mà máy chủ sẽ lắng nghe các yêu cầu (requests).
Tiếp tục khởi tạo một ứng dụng Express và kết nối nó với Socket.IO để hỗ trợ giao tiếp thờigian thực giữa máy chủ và các clients (trình duyệt):
“const app = express();”: Tạo một đối tượng ứng dụng Express bằng cách gọi hàm
express() “app” sẽ đại diện cho ứng dụng web được xây dựng bằng Express.
“const http = require("http").Server(app);”: Tạo một máy chủ HTTP bằng cách truyền đối
tượng ứng dụng “app” vào hàm Server() của module “http” Điều này làm cho ứng dụng
Express có thể chạy trên một máy chủ HTTP
“let socket = io(http);”: Tạo một đối tượng “socket” bằng cách gọi hàm io() của thư viện
Socket.IO và truyền vào đối tượng máy chủ HTTP “http” Điều này thiết lập kết nối thời
gian thực giữa máy chủ và trình duyệt thông qua Socket.IO
Trang 15Sử dụng “http.listen” để lắng nghe các kết nối đến máy chủ HTTP Khi máy chủ được khởi
động và lắng nghe trên cổng được chỉ định, hiển thị một thông điệp ứng dụng đang được chạy trên port đã được định nghĩa trước đó:
2.4.1.2 Xây dựng ứng dụng web
Đầu tiên, thiết lập middleware để phục vụ các tệp tĩnh từ thư mục "public", giúp ứng
dụng có khả năng truy cập và hiển thị các tệp tĩnh này khi được yêu cầu từ trình duyệt (khi các client muốn truy cập vào hệ thống):
Tiếp theo, khai báo các biến toàn cục sẽ được sử dụng trong toàn bộ ứng dụng, bao gồm
danh sách nodes (mỗi thiết bị không phải là server khi truy cập vào ứng dung web sẽ được gọi là một node) chứa thông tin về các node kết nối, clients là số lượng node đang kết nối,
master_time là thời gian của node chủ đạo, synchronized_time là thời gian được đồng bộ hóa,
và các biến khác liên quan đến thuật toán Berkeley:
2.4.1.3 Xử lý sự kiện khi có một client kết nối tới server
Sử dụng sự kiện connection của Socket.IO để lắng nghe kết nối từ các nút trong mạng Mỗi
khi một nút kết nối, thông tin của nó được thêm vào mảng nodes Khi số lượng nút bằng số lượng
kết nối trong phòng time room thuật toán Berkeley được gọi và sau đó một sự kiện synchronize
được phát ra để thông báo thời gian đã đồng bộ