














Preview text:
  lOMoAR cPSD| 58815430    
H Ọ C VI Ệ N CÔNG NGH Ệ BƯU CHÍNH VI Ễ N THÔNG   
KHOA CÔNG NGH Ệ   THÔNG TIN 1        BÁO CÁO BÀI T    ẬP L N      Ớ  Đ  
 Ề TÀI:  SQL LAB   
H ọ c ph ầ n: 
Phát tri ể n  ph ầ n m ề m hư ớ ng d ị ch v ụ   
Nhóm h ọ c ph ầ n: 0 4 
Nhóm bài t ậ p l ớ n: 18 
Th ự c hi ệ n: 
1. Bùi Hoàng Vinh – B20DCCN736 
2. Ph ạ m Văn T ớ i – B20DCCN606 
3. Nguy ễ n H ữ u Tu ấ n – B20DCCN616   
HÀ N Ộ I, 202 4        lOMoAR cPSD| 58815430 MỤC LỤC   
MỤC LỤC ................................................................................................................................ 1 
I. GIỚI THIỆU ....................................................................................................................... 2 
II. KHẢO SÁT ........................................................................................................................ 2 
III. MỤC TIÊU ....................................................................................................................... 3 
IV. GIẢI PHÁP ....................................................................................................................... 3 
1. Với bài tập bao gồm các câu lệnh truy vấn dữ liệu ....................................................... 3 
2. Với bài tập bao gồm các lệnh ghi dữ liệu và thay đổi cấu trúc của dữ liệu ................ 4 
V. TRIỂN KHAI HỆ THỐNG ................................................................................................ 4 
1. Kiến trúc hệ thống ............................................................................................................ 4 
2. Tự động triển khai bằng CICD Pipline .......................................................................... 5 
VI. KẾT QUẢ TRIỂN KHAI ................................................................................................ 5 
VII. PHƯƠNG HƯỚNG PHÁT TRIỂN ............................................................................. 13                                      lOMoAR cPSD| 58815430 I.  GIỚI THIỆU 
Ngày nay, công nghệ thông tin được xem là lĩnh vực đầu thể hiện mức độ phát triển 
của một quốc gia. Cùng với sự phát triển của ngành công nghệ thông tin, Database (cơ sở 
dữ liệu) đóng một vai trò vô cùng quan trọng và là thành phần không thể thiếu trong hầu 
hết ứng dụng công nghệ hiện nay. Chúng không chỉ đơn thuần là nơi lưu trữ dữ liệu cho 
các ứng dụng như: Web, AI, Mobile, IOT, … mà còn là hệ thống quản lý thông tin và hỗ 
trợ quyết định kinh doanh. Từ việc lưu trữ thông tin về khách hàng, sản phẩm, đến việc 
phân tích xu hướng và dự đoán, database đóng vai trò không thể phủ nhận trong việc cung 
cấp thông tin chính xác, quan trọng cho các cá nhân, tổ chức và doanh nghiệp cũng như lưu 
trữ và quản lý những thông tin này 
Vì vậy, việc nắm bắt được các kiến thức nền tảng của Database hiện nay đang là 
điều trở nên vô cùng quan trọng cho những người muốn theo đuổi công nghệ, đặc biệt là 
cá nhân có định hướng phát triển liên quan đến công nghệ thông tin. Do đó, SQL Lab sinh 
ra nhằm để hỗ trợ những cá nhân đặc biệt là các bạn sinh viên có nhu cầu học tập, phát triển 
kiến thức chuyên môn và niềm đam mê với cơ sở dữ liệu có thể tìm hiểu, thực hành trực 
tuyến thông qua các bài tập liên quan đến các câu lệnh truy vấn đến Database từ cơ bản cho  đến nâng cao    II.  KHẢO SÁT 
Hiện nay, trên thế giới có rất nhiều trang web giúp chúng ta có thể luyện tập các câu 
lệnh về cơ sở dữ liệu (đa số về SQL) trực tuyến, nổi bật nhất như là: SQL Zoo, LeetCode,  HackerRank, CodeCademy. 
Các trang web trực tuyến đó đều có những bài tập đa dạng từ cơ bản đến nâng cao 
đi hết đa số các kiến thức, câu lệnh truy vấn thao tác với Database và có môi trường runtime 
giúp người dùng có thể chạy và chấm điểm các câu lệnh trên trang web. 
Chi tiết hơn, HackerRank đem đến người dùng một loạt bài luyện tập trực tuyến từ 
những bài toán đơn giản đến phức tạp đi qua hầu hết các kiến thức về câu lệnh truy vấn đến 
Database với SQL như: SELECT, SELECT DISTINCT, JOIN, WHERE Condition, 
GROUP, HAVING, ORDER, AGGEGATION, LIKE, IN, … Đa phần các bài toán hiện tại 
mang ý nghĩa đọc dữ liệu (SELECT) và không làm thay đổi dữ liệu, trạng thái của Database. 
Ngoài các bài tập liên quan đến câu lệnh truy vấn dữ liệu, các trang web lớn khác 
như SQL Zoo và LeetCode còn có thêm những bài tập liên quan đến việc thay đổi dữ liệu 
và cấu trúc dữ liệu như: CREATE, INSERT, UPDATE, DELETE, ALTER, … Tuy những 
bài tập liên quan đến câu lệnh này có độ khó thấp hơn và thường không có nhiều các bài 
toán phức tạp như các câu lệnh SELECT, nhưng đây cũng là những kiến thức cơ bản, vô 
cùng quan trọng khi thao tác với Database.        lOMoAR cPSD| 58815430 III. MỤC TIÊU  - Mục tiêu tối thiểu: 
+ Xây dựng được trang web với mô hình kiến trúc hướng dịch vụ 
+ Người dụng có thể chạy các câu lệnh và submit trực tiếp trên trang web 
+ Xây dựng và hoàn thiện được giải pháp cho các câu lệnh đọc dữ liệu   
- Mục tiêu mong muốn thực hiện thêm: Xây dựng và hoàn thiện được giải pháp cho các  câu lệnh ghi dữ liệu    IV. GIẢI PHÁP 
Để triển khai được ứng dụng SQL Lab đưa đến người dùng cuối, nhóm em đưa ra 
giải pháp sau. Đầu tiên, việc triển khai một trang web hay một ứng dụng là điều tất yếu. 
Trang web hoặc ứng dụng sẽ được triển khai dựa trên mô hình kiến trúc hướng dịch vụ, 
tách riêng ra: web front-end, server và database. Các thành phần trong hệ thống giao tiếp 
với nhau thông qua các API 
Về giải pháp đưa đến môi trường runtime và các bài tập giúp người dùng có thể 
luyện tập, thực hành, chấm điểm trực tiếp trên trang web được chia ra làm 2 trường hợp   
1. Với bài tập bao gồm các câu lệnh truy vấn dữ liệu  
Bài tập sẽ liên quan đến các kiến thức về các câu lệnh như: SELECT, SELECT DISTINCT, 
JOIN, WHERE Condition, GROUP, HAVING, ORDER, AGGEGATION, LIKE, IN, … 
- Đầu tiên, cần tham khảo các nội dung bài tập trên các trang web lớn khác. Từ đó, xây 
dựng các bài tập trên trang web 
- Xây dựng cơ sở dữ liệu có ý nghĩa, liên quan đến các bài tập bao gồm các bảng, quan 
hệ, dữ liệu để người dùng có thể truy vấn. Dữ liệu này sẽ được WRITE LOCK để nhằm  tránh các thay đổi. 
- Thiết kế, xây dựng những testcase cho từng bài tập. 
- Tạo một user trên Database chỉ có quyền đọc dữ liệu từ các dữ liệu có sẵn đã tạo. Web 
server sẽ dùng user này để đọc dữ liệu từ Database. 
- Khi người dùng có yêu cầu runtime hoặc submit bài, server sẽ query từ Database dựa 
trên câu lệnh người dùng nhập. Sau đó, kết quả sẽ lần lượt được so sánh với nội dung  test case đã tạo. 
- Nếu kết quả từ server trả về khớp với test case thì câu truy vấn của người dùng đã đúng.  Ngược lại thì không. 
- Ngoài ra, cần kiểm tra thời gian thực thi cho những bài toán phức tạp để kiểm tra xem 
câu lệnh người dùng đã tối ưu hay chưa dựa trên thời gian truy vấn của câu lệnh.            lOMoAR cPSD| 58815430
2. Với bài tập bao gồm các lệnh ghi dữ liệu và thay đổi cấu trúc của dữ liệu  
Bài tập sẽ liên quan đến các kiến thức về các câu lệnh như: CREATE, INSERT, 
UPDATE, DELETE, ALTER, … Với trường hợp này, giải pháp sẽ phức tạp hơn so với các 
bài tập ở trên. Tương tự ở những bước đầu ở giải pháp trên, ta cũng cần:  - 
Tham khảo các bài tập của các trang web lớn trên thế giới  - 
Tìm hiểu và xây dựng bài toán  -  Xây dựng testcase  - 
Tuy nhiên, luồng hoạt động ở dưới server và Database sẽ có điểm khác biệt:  - 
Khi người dùng có yêu cầu runtime hoặc submit các câu lệnh làm thay đổi dữ liệu 
CREATE, INSERT, UPDATE, DELETE, ALTER, …  - 
Khi server nhận yêu cầu sẽ tạo ra môi trường làm việc riêng cho từng session (user) 
thông qua các bảng tạm (lưu trữ trong Disk hoặc Memory?).  - 
Vì các câu lệnh trên không trả về dữ liệu nên khi thực thi xong, server sẽ thực hiện 
check lại bằng các câu lệnh khác như: SHOW COLUMN (trả về cấu trúc TABLE), 
SELECT, … để so sánh với các testcase.  - 
Sau khi server trả về kết quả đến người dùng. Session sẽ disconnect và các bảng tạm sẽ  được giải phóng.  V. 
TRIỂN KHAI HỆ THỐNG 
1. Kiến trúc hệ thống  
Hệ thống SQL Lab được triển khai theo kiến trúc dưới đây:     
Các thành phần và chức năng: 
- Triển khai Web Server dưới dạng 2-node chịu tải chính cho việc giao tiếp giữa các thành  phần trong hệ thống 
- Triển khai Load Balancer (HaProxy) để cân bằng tải giữa 2-node Web Server      lOMoAR cPSD| 58815430
- Database quản lý, lưu trữ các thông tin về người dùng, bài tập, bài test, ... được triển 
khai dưới dạng multi instance theo mô hình sao chép dữ liệu Master-Slave replication 
nhằm để dự phòng, chia tải khi cần thiết hoặc khi có sự cố xảy ra 
- Triển khai các hệ thống chấm bài dưới dạng Service tách biệt với nhau cho từng hệ quản  trị CSDL 
- Trên mỗi VM chạy các dịch vụ, dựng các Node Exporter để giám sát trạng thái hoạt  động và tải của VM 
- Triển khai Cadvisor trên VM chạy Webserver để giám sát hoạt động của các Container 
- Dựng Prometheus để query các thông số giám sát từ các Exporter và Cadvisor trên các  VM 
- Dựng Grafana để visualize dữ liệu giám sát dưới dạng đồ thị 
- Cảnh báo bằng việc gửi email đến Operator khi hệ thống cao tải hoặc gặp vấn đề   
2. Tự động triển khai bằng CICD Pipline  
- Mô tả: Triển khai tính năng tự động tích hợp, tự động triển khai 
cho Service chấm bài cho MySQL.  
- Công nghệ sử dụng: Jenkins, Github, Ansible - Luồng hoạt  động:  
+ Điều kiện trigger Pipeline: Khi có 1 tag mới release được push lên remote repository  trên Github  
+ Thực hiện build Docker Image dựa trên code mới nhất được release  
+ Thực hiện đánh tag cho Docker Image với tag mới được release  
+ Đẩy image lên repository trên DockerHub  
+ Sau khi image được push lên thành công, thực hiện trigger Ansible Playbook tự 
động triển khai code mới lên Virtual Machine được chỉ định + Ansible Playbook 
thực hiện các công việc sau:  
• Tạo user mới trên VM  
• Cài đặt Docker trên VM  
• Copy các files cần thiết từ Github Repository về VM  
• Pull các Docker Image cần thiết  
• Triển khai các container bằng Docker Compose  
+ Cuối cùng, hoàn tất việc triển khai Service chấm trên các VM bằng code mới nhất từ  Github Repository     
VI. KẾT QUẢ TRIỂN KHAI 
Hệ thống được triển khai trên 5 Virtual Machine bao gồm các Container, cụ thể: 
- VM1: Jenkins, Prometheus, Grafana  - VM2: Client, Haproxy      lOMoAR cPSD| 58815430
- VM3: Web Server 1, Web Server 2, Master Database, Slave Database, Node  Exporter, Cadvisor 
- VM4: MySQL Service Server, MySQL Database, Node Exporter 
- VM5: SQL Server Service Server, SQL Server Database, Node Exporter   
Hệ thống cảnh báo giám sát 
Các exporter trên các VM export ra các thông số giám sát:   
Prometheus tập trung collect các thông số giám sát từ các Exporter trên VM:      lOMoAR cPSD| 58815430  
Grafana visualize các thông số đó dưới dạng đồ thị:  - Node Exporter giám sát VM         
- Cadvisor giám sát các Container được cài trên VM      lOMoAR cPSD| 58815430  
Grafana gửi cảnh báo đến Operator khi hệ thống gặp cao tải (Sau khi thử nghiệm stress test  lên Database)   
Luồng CICD tự động tích hợp, tự động triển khai source code mới lên hệ thống 
Luồng CICD cho Server chấm bài MySQL 
(repo: https://github.com/crvt4722/CICD_MySQL_Judge_Service)   
Khi có một tag mới đẩy lên Github:      lOMoAR cPSD| 58815430      
Jenkins nhận được event và khởi động Pipeline:       
Docker image với tag mới được đẩy lên Dockerhub:      lOMoAR cPSD| 58815430   
Ansible triển khai hệ thống trên VM được chỉ định:    
Service chấm cho MySQL được triển khai trên VM được chỉ định:       
Hình ảnh kết quả trên giao diện người dùng - Đối với User là quyền student 
+ Tham gia contest trên hệ thống       lOMoAR cPSD| 58815430   
+ Xem danh sách issue trong contest kèm trạng thái     
+ Xem lịch sử nộp bài           
+ Submit lời giải issue với MySQL và SQL Server       lOMoAR cPSD| 58815430      
- Đối với User quyền Admin  + Quản lý contest      + Thêm issue vào contest      lOMoAR cPSD| 58815430   + Quản lý issue     
VII. PHƯƠNG HƯỚNG PHÁT TRIỂN 
Bên cạnh việc đáp ứng được những yêu cầu tối thiếu đối với một hệ thống SQL lab, trong 
tương lai, nhóm sẽ nghiên cứu và phát triển thêm những tính năng mới bổ sung để hoàn thiện 
hệ thống này. Các phương hướng sẽ phát triển trong tương lai bao gồm:      lOMoAR cPSD| 58815430 - 
Hệ thống có khả năng thao tác với các bài tập NoSQL  - 
Sử dụng Rabbit MQ trong quá trình chấm bài  - 
Block hoặc chặn User, IP trong một khoảng thời gian khi xuất hiện đấu hiệu bất 
thường như: Gửi request liên tục trong một thời gian ngắn,...  - 
Ứng dụng trí tuệ nhân tạo trong việc phát hiện tấn công, hoặc sao chép bài làm của  người dùng - ...