5. Phương pháp nghiên cứu
3.4.1 Vì sao nên sử dụng:
Docker chạy cách li trên môi trưởng ảo hóa, giúp cho việc cài đặt giữa các môi trường, giữa các version không bị conflict với nhau.
Với một dự án cài đặt docker thì chỉ cần config đúng 1 lần duy nhất , sau đó có thể đem project đi bất cư hệ điều hành nào vẫn có thể chạy bình thường mà không cần cài đặt rườm rà.
25 3.4.2 Quá trình hình thành:
Containerlization là gì?
Thời trước mô hình máy chủ thường là:
Máy chủ vật lý (physical server) + hệ điểu hành (operating system) + ứng dụng.
Hình 15: Tổng quan máy chủ vật lý [5] Vấn đề gặp phải ở đây là lãng phí tài nguyên:
• Một máy chủ chỉ cài được một OS
• Cho dù có ổ cứng khủng, ram khủng thì cũng không tận dụng hết lợi thế. • Có thể bạn đã nghe tới cái tên Vituralbox hay VMware rồi đúng không, đó đó
chính nó đó.
• Với công nghệ này, trên một máy chủ vật lý mình có thể cài đặt được nhiều OS tận dụng tài nguyên đã tốt hơn.
26 Sau đó ra đời công nghệ ảo hóa virtualization:
Hình 16: Sơ đồ cấu trúc Docker [5] Vấn đề gặp phải:
• Về tài nguyên:
o Khi bạn bật máy ảo trên VitualBox chẳng hạn, bạn cần cấu hình để cung cấp ngay từ đầu tài nguyên ổ cứng và ram từ máy thật cho máy ảo.
o Bật máy ảo lên rồi để đó không làm gì thì máy thật cũng không thể tái sử dụng tài nguyên đã cho đi.
o Ví dụ khi tạo một máy ảo ram 2GB trên máy thật ram 6GB, lúc này máy thật sẽ chỉ còn tối đa 6 - 2 = 4 GB ram, kể cả khi máy ảo không dùng hết 2GB ram được cấp, đó là một sự lãng phí.
27 • Về thời gian: Việc khởi động, tắt máy ảo khá lâu, có thể lên tới hàng phút.
Ở bước tiến hóa tiếp theo, người ta sinh ra công nghệ containerlization: Với công nghệ này, trên một máy chủ vật lý, ta sẽ cài đặt được nhiều máy ảo (giống với công nghệ ảo hóa virtualization), nhưng tốt hơn ở chỗ là các máy con này (Guess OS) đều dùng chung phần nhân của máy mẹ (Host OS) và chia sẻ với nhau tài nguyên máy mẹ.
Có thể nói là khi nào cần tài nguyên thì được cấp, cần bao nhiêu thì cấp bấy nhiêu, như vậy việc tận dụng tài nguyên đã tối ưu hơn. Điểm nổi bật nhất của containerlization là nó sử dụng các container.
3.4.3 Container là gì?
Các phần mềm, chương trình sẽ được Container Engine ( là một công cụ ảo hóa tinh gọn được cài đặt trên host OS) đóng gói thành các container.
Thế Container là gì, nó là một giải pháp để chuyển giao phần mềm một cách đáng tin cậy giữa các môi trường máy tính khác nhau bằng cách:
• Tạo ra một môi trường chứa mọi thứ mà phần mềm cần để có thể chạy được. • Không bị các yếu tố liên quan đến môi trường hệ thống làm ảnh hưởng tới. • Cũng như không làm ảnh hưởng tới các phần còn lại của hệ thống.
Bạn có thể hiểu là ruby, rails, mysql ... kia được bỏ gọn vào một hoặc nhiều cái thùng (container), ứng dụng của bạn chạy trong những chiếc thùng đó, đã có sẵn mọi thứ cần thiết để hoạt động, không bị ảnh hưởng từ bên ngoài và cũng không gây ảnh hưởng ra ngoài.
28 Các tiến trình (process) trong một container bị cô lập với các tiến trình của các container khác trong cùng hệ thống tuy nhiên tất cả các container này đều chia sẻ kernel của host OS (dùng chung host OS).
Đây một nền tảng mở dành cho các lập trình viên, quản trị hệ thống dùng để xây dựng, chuyển giao và chạy các ứng dụng dễ dàng hơn. Ví dụ, bạn có một app java, bạn sẽ không cần cài đặt JDK vào máy thật để chạy app đó, chỉ cần kiếm container đã được setting tương ứng cho app về, bật nó lên, cho app chạy bên trong môi trường container đó, vậy là ok. Khi không sài nữa thì tắt hoặc xóa bỏ container đó đi, không ảnh hưởng gì tới máy thật của bạn.
Ưu điểm:
• Linh động: Triển khai ở bất kỳ nơi đâu do sự phụ thuộc của ứng dụng vào tầng OS cũng như cơ sở hạ tầng được loại bỏ.
• Nhanh: Do chia sẻ host OS nên container có thể được tạo gần như một cách tức thì. Điều này khác với vagrant - tạo môi trường ảo ở level phần cứng, nên khi khởi động mất nhiều thời gian hơn.
• Nhẹ: Container cũng sử dụng chung các images nên cũng không tốn nhiều disks.
• Đồng nhất :Khi nhiều người cùng phát triển trong cùng một dự án sẽ không bị sự sai khác về mặt môi trường.
• Đóng gói: Có thể ẩn môi trường bao gồm cả app vào trong một gói được gọi là container. Có thể test được các container. Việc bỏ hay tạo lại container rất dễ dàng.
29 Nhược điểm:
Xét về tính an toàn:
• Do dùng chung OS nên nếu có lỗ hổng nào đấy ở kernel của host OS thì nó sẽ ảnh hưởng tới toàn bộ container có trong host OS đấy.
• Ngoài ra hãy thử tưởng tượng với host OS là Linux, nếu trong trường hợp ai đấy hoặc một ứng dụng nào đấy có trong container chiếm được quyền superuser, điều gì sẽ xảy ra? Về lý thuyết thì tầng OS sẽ bị crack và ảnh hưởng trực tiếp tới máy host bị hack cũng như các container khác trong máy đó.
3.3.4 Các câu lệnh trong Docker? [3] Pull một image từ Docker Hub: Pull một image từ Docker Hub: sudo docker pull image_name
Tạo mới container bằng cách chạy image, kèm theo các tùy chọn: sudo docker run -v <forder_in_computer>:<forder_in_container> -p <port_in_computer>:<port_in_container> -it <image_name> /bin/bash Một vài câu lệnh khác:
docker images: Liệt kê các images hiện có docker rmi {image_id/name}: Xóa một image docker ps: Liệt kê các container đang chạy docker ps -a: Liệt kê các container đã tắt
docker rm -f {container_id/name}: Xóa một container
docker start {new_container_name}: Khởi động một container
30
3.5 Redis
3.5.1 Redis là gì?
Redis (Remote Dictionary Server) là một mã nguồn mở được dùng để lưu trữ dữ liệu
có cấu trúc, có thể sử dụng như một database, bộ nhớ cache hay một message broker. Nó là hệ thống lưu trữ dữ liệu với dạng KEY-VALUE rất mạnh mẽ và phổ biến hiện nay. Redis nổi bật bởi việc hỗ trợ nhiều cấu trúc dữ liệu cơ bản như:hash, list, set, sorted set, string… Tất cả dữ liệu được ghi và lưu trên ram, do đó tốc độ đọc ghi dữ liệu rất là nhanh.
Hình 17: Tổng quan cấu trúc redis [4]
3.5.2 Các ứng dụng của Redis
Redis ngoài tính năng lưu trữ KEY-VALUE trên RAM thì Redis còn hỗ trợ tính năng xắp xếp, query, backup dữ liệu trên đĩa cứng cho phép bạn có thể phục hồi dữ liệu khi hệ thống gặp sự cố…và có thể nhân bản (Chạy nhiều Server Redis cùng lúc).
• Caching: Sử dụng làm bộ nhớ đệm. Chính tốc độ đọc ghi nhanh mà Redis có
thể làm bộ nhớ đệm, nơi chia sẻ dữ liệu giữa các ứng dụng hoặc làm database tạm thời. Ngoài ra Redis có thể sử dụng để làm Full Page Cache cho website. Cũng vì tính nhất quán của Redis, cho dù restart Redis thì người dùng cũng không có cảm nhận chậm khi tải trang.
31
• Counter: Sử dụng làm bộ đếm. Với thuộc tính tăng giảm thông số rất nhanh
trong khi dữ liệu được lưu trên RAM, sets và sorted sets được sử dụng thực hiện đếm lượt view của một website, các bảng xếp hạng trong game chẳng hạng. Redis hỗ trợ thread safe do đó nó có thể đồng bộ dữ liệu giữa các request.
• Publish/Suscribe (Pub/Sub): Tạo kênh chia sẻ dữ liệu. Redis hỗ trợ tạo các
channel để trao đổi dữ liệu giữa publisher và subscriber giống như channel trong Socket Cluster hay topic trong Apache Kafka. Ví dụ: Pub/Sub được sử dụng theo dõi các kết nối trong mạng xã hội hoặc các hệ thống chat.
• Queues: Tạo hàng đợi để xử lý lần lượt các request. Redis cho phép lưu trữ
theo list và cung cấp rất nhiều thao tác với các phần tử trong list, vì vậy nó còn được sử dụng như một message queue.
3.5.3 Các kiểu dữ liệu trong Redis
Khác với RDMS như MySQL, hay PostgreSQL, Redis không có table (bảng). Redis lưu trữ data dưới dạng key-value. Thực tế thì memcache cũng làm vậy, nhưng kiểu dữ liệu của memcache bị hạn chế, không đa dạng được như Redis, do đó không hỗ trợ được nhiều thao tác từ phía người dùng. Dưới đây là sơ lược về các kiểu dữ liệu Redis dùng để lưu value.
– STRING: string, integer hoặc float. Redis có thể làm việc với cả string, từng phần của string, cũng như tăng/giảm giá trị của integer, float.
– LIST: List là một danh sách của strings, sắp xếp theo thứ tự insert. Redis có thể thêm một phần tử vào đầu hoặc cuối list. List phù hợp cho các bài toán cần thao tác với các phần tử gần đầu và cuối vì việc truy xuất này là cực nhanh, cho dù insert cả triệu phần tử. Tuy nhiên nhược điểm là việc truy cập vào các phần tử ở giữa list rất chậm.
32
– SET: tập hợp các string (không được sắp xếp). Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, kiểm tra sự xuất hiện của phần tử trong tập hợp. Ngoài ra Redis còn hỗ trợ các phép toán tập hợp, gồm intersect/union/difference.
– HASH: lưu trữ hash table của các cặp key-value, trong đó key được sắp xếp ngẫu nhiên, không theo thứ tự nào cả. Redis hỗ trợ các thao tác thêm, đọc, xóa từng phần tử, cũng như đọc tất cả giá trị.
– SORTED SET (ZSET): là 1 danh sách, trong đó mỗi phần tử là map của 1 string (member) và 1 floating-point number (score), danh sách được sắp xếp theo score này. Các phần tử của zset được sắp xếp theo thứ tự từ score nhỏ tới lớn.
Ngoài ra, Redis còn hỗ trợ các data types khác như: Bit arrays, HyperLogLogs, Streams. Để cài đặt bạn tham khảo docs của Redis.
Để có thể quản lý được Redis bằng giao diện web các bạn có thể sử dụng công cụ phpRedisAdmin: https://github.com/erikdubbelboer/phpRedisAdmin để quản lý các database.
Persistent redis
Bên cạnh việc lưu key-value trên bộ nhớ RAM, Redis có 2 background threads chuyên làm nhiệm vụ định kỳ ghi dữ liệu lên đĩa cứng.
Có 2 loại file được ghi xuống đĩa cứng: RDB (Redis DataBase file)
RDB thực hiện tạo và sao lưu snapshot của DB vào ổ cứng sau mỗi khoảng thời gian nhất định.
33
Ưu điểm
RDB cho phép người dùng lưu các version khác nhau của DB, rất thuận tiện khi có sự cố xảy ra.
Bằng việc lưu trữ data vào 1 file cố định, người dùng có thể dễ dàng chuyển data đến các data centers, máy chủ khác nhau.
RDB giúp tối ưu hóa hiệu năng của Redis. Tiến trình Redis chính sẽ chỉ làm các công việc trên RAM, bao gồm các thao tác cơ bản được yêu cầu từ phía client như
thêm/đọc/xóa, trong khi đó 1 tiến trình con sẽ đảm nhiệm các thao tác disk I/O. Cách tổ chức này giúp tối đa hiệu năng của Redis.
Khi restart server, dùng RDB làm việc với lượng data lớn sẽ có tốc độ cao hơn là dùng AOF.
Nhược điểm
RDB không phải là lựa chọn tốt nếu bạn muốn giảm thiểu tối đa nguy cơ mất mát dữ liệu. Thông thường người dùng sẽ set up để tạo RDB snapshot 5 phút 1 lần (hoặc nhiều hơn). Do vậy, trong trường hợp có sự cố, Redis không thể hoạt động, dữ liệu trong những phút cuối sẽ bị mất.
RDB cần dùng fork() để tạo tiến trình con phục vụ cho thao tác disk I/O. Trong trường hợp dữ liệu quá lớn, quá trình fork() có thể tốn thời gian và server sẽ không thể đáp ứng được request từ client trong vài milisecond hoặc thậm chí là 1 second tùy thuộc vào lượng data và hiệu năng CPU.
AOF (Append Only File)
AOF lưu lại tất cả các thao tác write mà server nhận được, các thao tác này sẽ được chạy lại khi restart server hoặc tái thiết lập dataset ban đầu.
34
Ưu điểm
Sử dụng AOF sẽ giúp đảm bảo dataset được bền vững hơn so với dùng RDB. Người dùng có thể config để Redis ghi log theo từng câu query hoặc mỗi giây 1 lần. Redis ghi log AOF theo kiểu thêm vào cuối file sẵn có, do đó tiến trình seek trên file có sẵn là không cần thiết. Ngoài ra, kể cả khi chỉ 1 nửa câu lệnh được ghi trong file log (có thể do ổ đĩa bị full), Redis vẫn có cơ chế quản lý và sửa chữa lối đó (redis-check-aof). Redis cung cấp tiến trình chạy nền, cho phép ghi lại file AOF khi dung lượng file quá lớn. Trong khi server vẫn thực hiện thao tác trên file cũ, 1 file hoàn toàn mới được tạo ra với số lượng tối thiểu operation phục vụ cho việc tạo dataset hiện tại. Và 1 khi file mới được ghi xong, Redis sẽ chuyển sang thực hiện thao tác ghi log trên file mới.
Nhược điểm
File AOF thường lớn hơn file RDB với cùng 1 dataset.
AOF có thể chậm hơn RDB tùy theo cách thức thiết lập khoảng thời gian cho việc sao lưu vào ổ cứng. Tuy nhiên, nếu thiết lập log 1 giây 1 lần có thể đạt hiệu năng tương đương với RDB.
Developer của Redis đã từng gặp phải bug với AOF (mặc dù là rất hiếm), đó là lỗi AOF không thể tái tạo lại chính xác dataset khi restart Redis. Lỗi này chưa gặp phải khi làm việc với RDB bao giờ.
35
CHƯƠNG 4: PHÂN TÍCH VÀ THIẾT KẾ ỨNG DỤNG 4.1 Mô hình hoá yêu cầu
Người dùng (User) là khách hàng sử dụng ứng dụng:
+ Đăng nhập vào ứng dụng để sử dụng các tính năng của ứng dụng + Đăng ký tài khoản người dùng mới
+ Người dùng có các học phần, chủ đề cho từng người dùng riêng
36
4.2 Thiết kế dữ liệu
4.2.1 Lược đồ cơ sở dữ liệu
Hình 19: Lược đồ CSDL của ứng dụng 4.2.2 Mô tả các bảng dữ liệu
+ User: mô tả những thông tin của user.
+ Avatar: chứa tất cả những ảnh đại diện đã được upload.
+ Room: chứa những thông tin của user trong room bao gồm câu hỏi, câu trả lời. + Course: chứa tất cả thông tin khóa học và tự vựng do người dùng tạo.
+ Topic: chứa thông tin của topic bao gồm link video.
+ Vocabulary: chưa tất thông thông tin Từ vựng của topic và Course. + History: lịch sử học tập theo dạng quiz của user.
37 4.2.3 Các ràng buộc dữ liệu
+ User quan hệ 1-1 với Avatar, quan hệ 1- nhiều với Room, quan hệ 1 - nhiều với Course.
+ Course và Topic quan hệ 1- nhiều với Vocabulary. + Topic quan hệ 1-1 với History.
+ Bảng nào có ảnh đại diện sẽ quan hệ 1-1 với Avatar. 4.2.4 Luồng xử lý của ứng dụng
Sequence diagram đăng nhập:
38 Sequence diagram học từ vựng:
39 4.2.5 Lược đồ usecase từng chức năng
System Functions Main Use Cases Use Case #
Authentication
Register UC_1.1
Login UC_1.2
Logout UC_1.3
Room
Join room UC_2.1
Play game quiz UC_2.2
Course
Add course UC_3.1
Remove course UC_3.2
Update course UC_3.3
View course UC_3.4
Learn course UC_3.5
Flashcards UC_3.6
Topic
Learn by video UC_4.2
Learn by game UC_4.3
Flashcards UC_4.4
News
View News UC_5.1
User
View information UC_6.1
Update avatar UC_6.2
Update username UC_6.3
40 Hình 22: Lược đồ use case của ứng dụng
41
Use case 1 – Register
Use case Id UC_1.1 Name Register
Goal Đăng ký tài khoản Actors Guest
Pre-conditions User chưa có tài khoản trong hệ thống Main Flow 1.Click vào nút đăng ký
2.Hiện thị màn hình đăng ký 3.Điền thông tin và ấn submit Exception Email đăng ký phải là email thật
Username đăng ký là ký tự thường và số ( lớn hơn hoặc bằng 8 ký tự)
Open Issues N/A
Exception -Nếu tìm không thấy , show thông báo không tìm thấy sách Open Issues N/A
42
Use case 2 – Login
Use case Id UC_1.2
Name Register
Goal Đăng ký tài khoản
Actors Guest
Pre-conditions User chưa có tài khoản trong hệ thống
Post-conditions
Main Flow 1.Click vào nút đăng ký
2.Hiện thị màn hình đăng ký 3.Điền thông tin và ấn submit
Exception Email đăng ký phải là email thật
Username đăng ký là ký tự thường và số ( lớn hơn hoặc bằng 8 ký tự)