Professional Documents
Culture Documents
LỜI CẢM ƠN
Việc tham gia đề án “High Availability Cluster” là một kinh nghiệm quý báu đối với
nhóm chúng tôi. Đặc biệt, chúng tôi muốn bày tỏ lòng biết ơn của mình đến thầy Lê
Mạnh Hải, giảng viên hướng dẫn, đã tận tình hướng dẫn, khuyên bảo và giúp đỡ chúng
tôi. Xin cảm ơn thầy về những lời chỉ dẫn, nhắc nhở và động viên đã giúp chúng tôi
hoàn thành đề tài tốt nghiệp, cũng như thầy đã vạch ra cho chúng tôi hướng đi tiếp
theo cho mục đích học tập sau này.
Chúng tôi xin chân thành cảm ơn Ban Giám Hiệu và khoa Công nghệ thông tin đã mở
ra cho nhóm một cơ hội mới về hướng đi trong tương lai của mình.
Một lần nữa chúng tôi xin chân thành cảm ơn với tất cả tấm lòng.
LỜI MỞ ĐẦU
Hiện nay, các máy chủ ứng dụng thường phục vụ cho rất nhiều người dùng nên phải có
khả năng tự động chia tải cho nhau, tính sẵn sàng cao mà vẫn đảm bảo sự đồng nhất
dữ liệu giữa các máy chủ.
Khả năng tự động chia tải sẽ giúp cho các máy chủ có thể tự phân chia cho nhau yêu
cầu phục vụ từ phía người dùng, từ đó giúp hệ thống có khả năng phục vụ nhiều người
dùng hơn.
Tính sẵn sàng cao là khả năng đảm bảo các máy chủ hoạt động liên tục xuyên suốt,
nếu có sự cố xảy ra làm gián đoạn việc phục vụ thì thời gian gián đoạn đó sẽ là rất
nhỏ.
Mục tiêu của đề tài này là xây dựng một hệ thống máy chủ Web phục vụ nhiều người
dùng có khả năng tự động chia tải và tính sẵn sàng cao mà vẫn đảm bảo sự đồng nhất
dữ liệu giữa các máy chủ.
Trong đề tài này chúng tôi sẽ sử dụng công nghệ Clustering để giải quyết vấn đề trên.
Clustering là phương pháp nhóm các máy chủ thật lại thành một máy chủ ảo.
Trong đó việc phân tải giữa các máy chủ trong Cluster sẽ được thực hiện bằng công
nghệ chuyển mạch IP ở lớp 4 mô hình OSI. Để đáp ứng tính sẵn sàng cao, Cluster sẽ
có một trình quản lý giám sát hoạt động của các máy chủ.
Với việc áp dụng công nghệ Clustering và các phương pháp đồng bộ dữ liệu, chúng tôi
đã thực hiện thành công mục tiêu của đề tài này.
MỤC LỤC
2.3.3 Khác biệt của High Availability Cluster và High Performance Cluster.29
3.2.1 Xây dựng máy chủ chia tải giữa các máy chủ Web................................32
3.2.2 Xây dựng máy chủ dự phòng cho việc chia tải giữa các máy chủ Web. .35
3.2.3 Xây dựng máy chủ chia tải cho các máy chủ MySQL.............................36
3.2.4 Xây dựng đồng bộ dữ liệu giữa các máy chủ Web..................................37
3.2.5 Xây dựng đồng bộ dữ liệu giữa các máy chủ MySQL............................38
CHƯƠNG 4: NHỮNG VẤN ĐỀ ĐẠT ĐƯỢC, KẾT QUẢ, HẠN CHẾ VÀ HƯỚNG
PHÁT TRIỂN ĐỀ TÀI.................................................................................................53
4.2 Kết quả quá trình triển khai mô hình thực tiễn..............................................54
Công nghệ Clustering là phương pháp nhóm các máy chủ thật thành một máy chủ ảo,
để thực hiện công nghệ này có rất nhiều phương pháp, tuy nhiên trong đề tài này thì
phương pháp được chọn phải bảo đảm được việc chia tải giữa các máy chủ Web cũng
như máy chủ cơ sở dữ liệu, và tính sẵn sàng của hệ thống mà vẫn đảm bảo sự đồng
nhất dữ liệu giữa các máy chủ.
Xây dựng một hệ thống máy chủ Web phục vụ nhiều người dùng có khả năng tự động
chia tải và tính sẵn sàng cao mà vẫn đảm bảo sự đồng nhất dữ liệu giữa các máy chủ.
Để thực hiện đề tài thì cần xây dựng các máy chủ như sau: 3 máy chủ phân chia tải, 2
máy chủ Web, 2 máy chủ MySQL, 2 Firewall
Xây dựng máy chủ chia tải giữa các máy chủ Web.
Xây dựng máy chủ chia tải giữa các máy chủ MySQL.
Xây dựng máy chủ dự phòng cho việc chia tải giữa các máy chủ Web.
Trình bày tổng quan về đề tài “Triển khai hệ thống High Availability Cluster trên hệ
điều hành Ubuntu 10.04”, nhiệm vụ và cấu trúc của đề tài.
Giới thiệu về Cluster, các dạng Cluster và các phần mềm. Đồng thời trình bày về chức
Triển khai mô hình thực nghiệm xây dựng hệ thống High Availability Cluster.
Chương 4: Những vấn đề đạt được, những hạn chế và hướng phát triển đề tài
Trình bày những vấn đề đạt được sau khi tìm hiểu về công nghệ Cluster và triển khai
mô hình thực nghiệm. Đồng thời cũng đề cập đến những hạn chế sau quá trình làm đề
tài, hướng phát triển của đề tài và các tài liệu tham khảo đã sử dụng trong quá trình
thực hiện đề tài.
Cluster là một nhóm các máy tính liên kết với nhau, thông thường là qua mạng LAN,
làm việc chung với nhau như là một máy đơn. Cluster được sử dụng để tăng khả năng
xử lý hoặc mức độ sẵn sàng của hệ thống (nếu so sánh với một máy đơn cùng tốc độ
thì sử dụng Cluster hiệu quả hơn).
Luôn sẵn sàng cho các ứng dụng và các dịch vụ ngay cả khi phần cứng hay
phần mềm của một máy chủ bị lỗi
Khi các máy chủ vượt quá khả năng xử lý, ta có thể dễ dàng thêm node vào
Cluster để đáp ứng nhu cầu xử lý.
Ta có thể dùng các công cụ quản trị Cluster để quản lý một Cluster như là quản
lý một máy đơn.
Có thể chuyển đổi lượng công việc giữa các máy chủ hay đặt máy chủ ở trạng
thái không hoạt động cho kế hoạch bảo trì.
Có thể giám sát trạng thái của Cluster, tất cả các node và tài nguyên từ bất kỳ
nơi nào trong mạng
Failover Cluster cung cấp tính sẵn sàng của các dịch vụ bằng cách chuyển các yêu cầu
đến một node Cluster sang một node khác trong trường hợp node đó không hoạt động.
Mô hình này thông thường có 2 node, một node sẽ hoạt động còn node còn lại sẽ ở
trạng thái chờ, khi node đang hoạt động xảy ra sự cố thì node ở trạng thái chờ sẽ tự
động tiếp nhận các yêu cầu thay cho node kia. Ứng dụng hỗ trợ Failover: Heartbeat,
High-availability Service Management trong Red Hat Cluster Suite.
Các yêu cầu khi cấu hình một hệ thống High Availability Cluster:
Mặc dù có nhiều sự khác nhau giữa các mô hình High Availability nhưng sau đây là
các yêu cầu cấu hình chung
Dễ dàng khởi động và tắt chương trình quản lý Cluster: việc này có thể làm
bằng tay hoặc thông qua một chương trình khác.
Khả năng lưu trữ trạng thái: Trạng thái sau cùng của node phải được lưu lại.
Điều này đảm bảo hệ thống hoạt động lại ngay khi có sự cố.
Heartbeat
Từ phiên bản 2.1.4 trở về trước, Heartbeat là tên của dự án High Availability Cluster
trên nền Linux. Nhưng từ phiên bản 2.1.4 trở về sau, dự án này đổi tên là Linux-HA,
và Heartbeat là một thành phần trong đó, đóng vai trò thông báo, gửi thông tin giữa
các máy trạm (Cluster Messaging Layer).
Heartbeat là một chương trình cho phép máy trạm biết về sự hiện diện (hoặc biến
mất!) của các tiến trình (process) mà nó quản lý trên các máy, và giúp các máy trạm dễ
dàng trao đổi thông tin với nhau.
Cluster Glue
Resource Agent
Pacemaker
Và thành phần phụ DRBD dùng để đồng bộ ổ đĩa giữa các máy.
Để được hữu ích hơn cho người dùng, chương trình Heartbeat cần phải được kết hợp
với một phần mềm quản lý tài nguyên Cluster như Pacemaker, có nhiệm vụ khởi động
và dừng các dịch vụ (địa chỉ IP, các máy chủ Web, …) mà Cluster sẽ cung cấp cho tính
sẵn sàng cao. Pacemaker là phần mềm quản lý tài nguyên Cluster mà Heartbeat đề
nghị sử dụng. Các thành phần của Heartbeat:
Communication module: cung cấp việc chứng thực và gửi thông tin giữa các
máy trạm (chủ yếu là bằng UDP trên nền IPv4).
Cluster Consensus Membership: Giúp cho các node có cùng là thành viên của
một nhóm có thể giao tiếp được với nhau.
Cluster Plumbing Library: một bộ thư viện cung cấp nhiều tính năng hữu ích
như: quản lý bộ nhớ, trigger, quản lý theo thời gian thực…
IPC Library: một bộ thư viện giúp giao tiếp giữa các tiến trình với nhau.
Non-blocking logging daemon: là một chương trình ghi nhật ký của Heartbeat
tên là logd.
Pacemaker
Là một Cluster Resource Manager, thực hiện việc quản lý tài nguyên trên Cluster, cho
phép ra lệnh tắt, mở, đóng hoặc xem hiện trạng của một tài nguyên.
Load balancing Cluster là một nhóm các máy tính được kết nối với nhau, cùng làm
nhiệm vụ giống nhau để chia sẽ các công việc, nhằm gia tăng khả năng sẵn sàng của
hệ thống.
Load balancing là một dạng của High Availability Cluster. Thường được sử dụng trong
các công ty, tổ chức có yêu cầu cao về độ sẵn sàng của dịch vụ, ví như ngân hàng;
công ty mua bán, thanh toán trực tuyến, hay một nhà cung cấp game trực tuyến chẳng
hạn. Đối với những nơi này, họ thường tiếp nhận một lượng lớn yêu cầu từ phía khách
hàng, và việc chậm trễ hay trì hoãn cung cấp các dịch vụ ở các công ty, tổ chức này sẽ
gây ra các tổn thất rất lớn. Vì vậy, việc hư hỏng thiết bị, hoặc một lỗi phần mềm...dẫn
đến việc không đáp ứng được các yêu cầu từ phía khách hàng là điều không thể chấp
nhận. Đây là điều mà một máy đơn lẻ không thể đáp ứng được.
Load balancing đảm bảo tính sẵn sàng của hệ thống bằng cách chia sẽ công việc xử lý,
chia sẽ các yêu cầu từ phía khách hàng cho tất cả các node trong Cluster. Khi một node
xảy ra sự cố, các công việc của node đó sẽ được chuyển cho các node còn lại.
Một trong các ưu điểm của Load balancing Cluster chính là khả năng chịu được việc
tấn công DoS. Tấn công DoS là kiểu tấn công tạo ra một lượng lớn các yêu cầu giả
mạo, làm quá tải hệ thống, hoặc gây tắt nghẽn đường truyền...
SVTH: Bùi Nam Hải & Trương Minh Khôi 11
GVHD: Thầy Lê Mạnh Hải High Availability Cluster
Việc này sẽ không thể xảy ra nếu khi hệ thống gần quá tải, ta lại thêm vào một node
mới để tăng khả năng xử lý của hệ thống.
Tuy nhiên, nhược điểm của Load balancing Cluster chính là chi phí dành cho việc mua
thiết bị. Một số người coi đây là nhược điểm, một số khác lại không, bởi vì đối với các
công ty lớn thì chi phí cho việc này không ảnh hưởng bao nhiêu nếu so với chi phí cho
việc hư hỏng dịch vụ.
Linux Virtual Server (LVS) là một dự án được khởi xướng bởi Wensong Zhang.
LVS là mộ trong những ứng dụng thực tế của Load balancing Cluster. Thành phần
chính của dự án là phần mềm IPVS được cài trên máy Load balancer. Load balancer là
switch lớp 4 đóng vai trò như một router. Máy trạm sẽ gởi lời yêu cầu dịch vụ tới Load
balancer thông qua một IP ảo, sau đó Load balancer sẽ chuyển lời yêu cầu tới các máy
chủ thật.
Lưu ý: Các máy chủ thật cùng đặt trên một mạng vật lý.
Mô tả hoạt động:
Khi người dùng truy cập dịch vụ, gói tin yêu cầu sẽ có địa chỉ IP đích là địa chỉ IP ảo
của Load balancer (đây là IP đại diện cho Cluster, nằm ở card mạng kết nối với mạng
ngoài của Load balancer).
Load balancer sau khi nhận được gói tin yêu cầu, sẽ kiểm tra địa chỉ đích và port đích
của gói tin. Nếu cả hai trùng với thông tin đang chứa trong bảng rule của Load
balancer thì nó sẽ chọn ra một máy chủ thật để phục vụ cho yêu cầu này và tạo thành
một kết nối (việc chọn lựa máy chủ thật nào sẽ phục vụ dựa vào thuật toán
Scheduling), sau đó kết nối này sẽ được Load balancer thêm vào bảng hash như là một
kết nối đang mở (bảng hash này dùng để quản lý các kết nối). Trước khi chuyển gói tin
cho máy chủ thật, Load balancer sẽ chuyển địa chỉ MAC trong gói tin thành địa chỉ
MAC của máy chủ thật. Vì vậy đó là lý do mà Load balancer và máy chủ thật phải
được đặt trong cùng một mạng vật lý.
IP Tunneling hay còn gọi là IP Encapsulation là một kỹ thuật đóng gói IP datagram
này vào trong IP datagram khác. IP Tunneling thường được dùng trong mạng riêng ảo
VPN, hoặc các mạng Mobile IP.
Mô tả hoạt động:
Khi người dùng truy cập dịch vụ, gói tin yêu cầu sẽ mang địa chỉ IP đích là địa chỉ IP
ảo của Load balancer (đây là IP đại diện cho Cluster, nằm ở card mạng kết nối với
mạng ngoài của Load balancer)
Load balancer sau khi nhận được gói tin yêu cầu, sẽ kiểm tra địa chỉ đích và port đích
của gói tin. Nếu cả hai trùng với thông tin đang chứa trong bảng rule của Load
balancer thì nó sẽ chọn ra một máy chủ thật để phục vụ cho yêu cầu này và tạo thành
một kết nối (việc chọn lựa máy chủ thật nào sẽ phục vụ dựa vào thuật toán
Scheduling), sau đó kết nối này sẽ được Load balancer thêm vào bảng hash như là một
kết nối đang mở (bảng hash này dùng để quản lý các kết nối). Trước khi chuyển gói tin
cho máy chủ thật, Load balancer sẽ đóng gói gói tin lại rồi mới chuyển.
Gói tin yêu cầu sau khi được chuyển đến cho máy chủ thật sẽ được mở gói và xử lý,
sau đó máy chủ thật sẽ hồi đáp lại bằng gói tin trả lời và gửi thẳng đến máy trạm.
Khi một kết nối bị ngắt hoặc hết hạn thì Load balancer sẽ loại bỏ khỏi bảng hash.
Lưu ý: Port dịch vụ trên máy chủ ảo và máy chủ thật phải giống nhau.
202.103.106.3 2
NAT là gì?
NAT hay còn gọi là Network Address Translation là một tính năng cho phép chuyển
đổi từ địa chỉ này sang địa chỉ khác. Người ta thường dùng NAT để chuyển đổi giữa
địa chỉ public và địa chỉ private. NAT có ba loại:
NAT tĩnh (static NAT): Chuyển đổi từ một địa chỉ sang một địa chỉ (N<->N)
NAT động (dynamic NAT): Chuyển đổi từ M địa chỉ sang N địa chỉ với M nhỏ
hơn N.
NAT port hay còn gọi là PAT (port address translation): chuyển đồi từ N địa chỉ
sang một địa chỉ. Virtual Server thông qua NAT sử dụng loại này.
Mô tả hoạt động:
Bước 2: Load balancer nhận và xử lý gói tin sau đó gửi gói tin cho máy chủ thật
Bước 4: Máy chủ thật hồi đáp gói tin đến Load balancer và được Load balancer xử lý
tiếp
Khi người dùng truy cập dịch vụ, gói tin yêu cầu sẽ mang địa chỉ IP đích là địa chỉ IP
ảo của Load balancer (đây là IP đại diện cho Cluster, nằm ở card mạng kết nối với
mạng ngoài của Load balancer)
Load balancer sau khi nhận được gói tin yêu cầu, sẽ kiểm tra địa chỉ đích và port đích
của gói tin. Nếu cả hai trùng với thông tin đang chứa trong bảng rule của Load
balancer thì nó sẽ chọn ra một máy chủ thật để phục vụ cho yêu cầu này và tạo thành
một kết nối (việc chọn lựa máy chủ thật nào sẽ phục vụ dựa vào thuật toán
Scheduling), sau đó kết nối này sẽ được Load balancer thêm vào bảng hash như là một
kết nối đang mở (bảng hash này dùng để quản lý các kết nối). Trước khi chuyển gói tin
cho máy chủ thật, Load balancer sẽ chỉnh lại địa chỉ IP đích và port đích của gói tin
cho phù hợp với máy chủ thật đã được chọn, sau đó Load balancer mới chuyển gói tin.
Gói tin yêu cầu sau khi được chuyển đến cho máy chủ thật sẽ được xử lý và hồi đáp lại
bằng gói tin trả lời. Khi Load balancer nhận được gói tin trả lời từ máy chủ thật, nó sẽ
chỉnh lại địa chỉ IP nguồn và port nguồn của gói tin, sau đó mới gửi trả về lại cho máy
trạm.
Khi một kết nối bị ngắt hoặc hết hạn thì Load balancer sẽ loại bỏ nó khỏi bảng hash.
172.16.0.3 8000 2
Tất cả lưu lượng đến địa chỉ 202.103.106.5 port 80 sẽ được chuyển qua cho máy chủ
thật 172.16.0.2 với port là 80 và máy chủ thật 172.16.0.3 với port là 8000.
Tất cả lưu lượng đến địa chỉ 202.103.106.5 port 21 sẽ được chuyển qua cho máy chủ
thật 172.16.0.3 với port là 21.
Các gói tin yêu cầu cho dịch vụ Web sẽ có dạng sau
Sau khi nhận được gói tin yêu cầu trên, Load balancer sẽ chọn một máy chủ thật để xử
lý gói tin này, trong trường hợp nào là máy chủ thật 172.16.0.3 với port là 8000. Do đó
gói tin sẽ được đổi lại địa chỉ đích và port đích.
Sau khi máy chủ thật 172.16.0.3 xử lý xong gói tin, nó sẽ gửi về gói tin phản hồi như sau
Load balancer nhận được gói tin phản hồi của máy chủ thật, sẽ sửa lại địa chỉ nguồn và
port nguồn của gói tin và gửi lại cho máy trạm như sau:
Lợi thế của phương pháp Virtual Server thông qua NAT là các máy chủ thật có thể
chạy tất cả các hệ điều hành có hỗ trợ giao thức TCP/IP.
Bất lợi là khả năng mở rộng của máy chủ ảo bị hạn chế. Hiện tượng thắt cổ chai sẽ xảy
ra khi số lượng các máy chủ thật tăng lên 20 máy hoặc nhiều hơn, bởi vì các gói yêu
cầu và trả lời luôn đi qua Load balancer.
Tuy nhiên phương pháp này vẫn có thể đáp ứng yêu cầu về hiệu suất ngay cả khi hiện
tượng thắt cổ chai xảy ra, ta có hai cách giải quyết vấn đề trên, một là DNS Hybrid
Approach sử dụng cách thức Round-Round DNS, hai là kết hợp với phương pháp
Virtual Server thông qua IP Tunneling hoặc phương pháp Virtual Server thông qua
Direct Routing.
Trong phương pháp này, Load balancer chỉ chuyển các yêu cầu tới các máy chủ thật,
máy chủ thật sẽ trả lời yêu cầu trực tiếp tới người sử dụng mà không qua Load
balancer. Chính vì điều này Load balancer có chuyển yêu câu phục vụ đến trên 100
máy chủ thật mà không xảy ra hiện tượng thắt cổ chai. Phương pháp này sẽ giúp tăng
tối đa số lượng máy chủ thật. Lưu lượng tối đa cho máy chủ ảo có thể lên tới hơn
1Gbps cho dù giới hạn lưu lượng Card mạng của Load balancer chỉ là 100Mbps.
Chức năng IP Tunneling được sử dụng để xây dựng một máy chủ ảo hiệu suất cao. Nó
rất hiệu quả để xây dựng một máy chủ ảo proxy, bởi vì những máy chủ proxy kết nối
trực tiếp tới Internet chỉ để truy tìm thông tin và trả lời về cho người dùng.
Phương pháp này cũng như phương pháp Virtual Server thông qua Tunneling, Load
Balancer chỉ chuyển các yêu cầu tới các máy chủ thật, máy chủ thật sẽ trả lời yêu cầu
trực tiếp tới người sử dụng mà không qua Load balancer.
Phương pháp này không có Tunneling Overhead nhưng nó yêu cầu Load balancer và
các máy chủ thật phải cùng một mạng vật lý. Vì nó dùng địa chỉ MAC để xác định
máy chủ thật.
Round-Robin
Thuật toán sắp xếp Round-Robin sẽ gửi mỗi yêu cầu từ máy trạm đến từng máy chủ
trong danh sách của Load balancer. Ví dụ ta có ba máy chủ A, B, C. Khi có yêu cầu
đến Load balancer thì yêu cầu 1 sẽ được chuyển cho máy chủ A, yêu cầu 2 cho máy
chủ B, yêu cầu 3 cho máy chủ C và yêu cầu 4 sẽ quay vòng lại cho máy chủ A.
Ở thuật toán này, nó xem mọi máy chủ là như nhau, ưu điểm của thuật toán này là nó
đơn giản, có thể áp dụng ở các máy chủ có cùng hoặc tốc độ xử lý tương đương nhau.
Weighted Round-Robin
Đây là thuật toán tương tự như thuật toán Round-Robin, tuy nhiên nó có sự phân biệt
giữa các máy chủ, nó đặt ra một trọng số riêng cho từng máy chủ, máy chủ nào có
trọng số cao thì sẽ được nhận yêu cầu đầu tiên và lượng yêu cầu cũng nhiều hơn các
máy chủ còn lại. Ví dụ ta có 3 máy chủ A, B, C lần lượt có các trọng số là 4, 3, 2. Vậy
thứ tự phục vụ sẽ là AABABCABC.
Thuật toán này sẽ tốt hơn thuật toán round-robin nếu như tốc độ giữa các máy chủ có
sự chênh lệch với nhau, tuy nhiên nó cũng có khuyết điểm khi tải luôn cao và các máy
chủ có tốc độ ngang nhau, khi đó sẽ dẫn đến tình trạng máy chủ có trọng số cao phải
phục vụ một lượng lớn yêu cầu so với các máy chủ khác.
Least-Connection
Thuật toán sắp xếp Least-Connection sẽ lựa chọn máy chủ nào đang có số kết nối ít
nhất và chuyển yêu cầu của máy trạm cho máy chủ đó. Đây là một thuật toán sắp xếp
“động”, bởi vì nó đếm các kết nối của các máy chủ một cách tự động, và dựa vào đó
mà phân bổ các yêu cầu từ máy trạm. Thích hợp với các máy chủ có tốc độ xử lý
SVTH: Bùi Nam Hải & Trương Minh Khôi 24
GVHD: Thầy Lê Mạnh Hải High Availability Cluster
tương tự nhau, trong trường hợp tải cao nó sẽ linh hoạt chọn máy chủ có kết nối thấp
mà chuyển yêu cầu đến cho máy chủ đó.
Tuy nhiên nó lại không mang lại hiệu quả cao khi các máy chủ có tốc độ khác nhau
bởi vì trong các kết nối TCP có trạng thái chờ TIME_WAIT, thông thường trạng thái
này kéo dài khoảng 2 phút, trong 2 phút một máy chủ có tải cao (ví dụ máy chủ web)
có thể tiếp nhận hàng ngàn kết nối. Để rõ hơn, ví dụ máy chủ A có tốc độ gấp đôi máy
chủ B, dĩ nhiên ta mong muốn máy chủ A sẽ xử lý nhiều kết nối hơn máy chủ B. Trong
trường hợp máy chủ A đang xử lý 1000 kết nối và đang ở trang thái chờ TIME_WAIT,
còn máy chủ B thì vừa kết thúc xử lý các kết nối hiện tại, theo thuật toán Least-
connection thì số yêu cầu mới từ máy khách sẽ được gửi hết cho máy chủ B cho đến
khi lượng kết nối ở máy chủ B nhiều hơn máy chủ A thì các yêu cầu mới được chuyển
qua cho A -> điểu này ta không hề mong muốn.
Weighted Least-Connection
Đây là thuật toán tương tự như thuật toán Least-Connection tuy nhiên nó có đặt trọng
số cho mỗi máy chủ. Máy chủ nào có trọng số lớn sẽ có số lượng kết nối lớn hơn các
máy chủ còn lại tại cùng một thời điểm. Thuật toán này dùng khi các máy chủ có tốc
độ xử lý khác nhau.
Locality-Based Least-Connection
Đây là thuật toán cân bằng tải dựa trên IP đích. Nó thường được sử dụng trong Cache
Cluster. Thuật toán này hướng gói tin có địa chỉ IP đích xác định đến máy chủ xác định
nếu máy chủ đó vẫn còn sống và chưa quá tải. Nếu máy chủ đó quá tải (số lượng kết
nối hiện tại lớn hơn trọng số của nó) và có một máy chủ đang có tải thấp thì nó xác
định lại trọng số cho máy chủ đang có tải thấp này và chuyển hướng các yêu cầu đến
máy chủ này.
Đây cũng là thuật toán cân bằng tải dựa trên đỉa chỉ IP đích và cũng thường được dùng
cho Cache Cluster. Nhưng nó khác với Locality-Based Least-Connection ở chỗ : Load
balancer sẽ giữ một sơ đồ bao gồm một tập các máy chủ sẽ nhận yêu cầu từ địa chỉ IP
xác định. Khi có một yêu cầu từ máy trạm gửi đến địa chỉ IP xác định đó, Load
balancer sẽ dùng thuật toán Least-Connection để chọn ra một máy chủ trong tập hợp
các máy chủ này phục vụ. Nếu tất cả các máy chủ trong tập hợp này đều quá tải, Load
balancer sẽ lấy một máy chủ khác ( máy chủ này là một máy chủ trong Cluster nhưng
không nằm trong tập hợp máy chủ) và gắn nó vào tập hợp máy chủ. Trong một khoảng
thời gian nhất định, nếu tập hợp các máy chủ không có thay đổi gì thêm, máy chủ nào
có tải cao nhất sẽ bị loại ra khỏi tập hợp các máy chủ.
Destination Hashing
Đây là thuật toán cân bằng tải dựa trên IP đích, nó phân bổ các kết nối thông qua một
bảng hash được xác định sẵn dựa trên địa chỉ IP đích.
Source Hashing
Đây là thuật toán cân bằng tải dựa trên IP nguồn, nó phân bổ các kết nối thông qua một
bảng hash được xác định sẵn dựa trên địa chỉ IP nguồn.
Thuật toán này phân bổ kết nối dựa trên độ trễ, máy chủ nào có độ trễ ít nhất sẽ nhận
được yêu cầu từ máy trạm.
Never Queue
Thuật toán này hoạt động như sau: Nếu có một máy chủ đang rảnh rỗi thì yêu cầu sẽ
được gửi đến máy chủ đó thay vì phải chờ đợi một máy chủ khác có tốc độ nhanh hơn.
Nếu không có máy chủ nào rảnh rỗi thì yêu cầu sẽ được gửi đến cho máy chủ có độ trễ
thấp nhất (dựa theo thuật toán Shortest Expected Delay)
Các High Performance Cluster sử dụng các node để thực thi các tính toán cùng một
lúc. High Performance Cluster có 2 dạng:
Compute Cluster là một nhóm các máy tính được kết nối với nhau nhằm gia tăng khả
năng xử lý, tính toán. Trong đó các node (một máy tính được xem như một node) được
kết nối chặt chẽ với nhau, thông thường là qua mạng LAN tốc độ cao. Một việc tính
toán sẽ được chuyển từ node này sang node khác thông qua một ứng dụng quản lý.
Compute Cluster hay còn gọi là Supercomputer là một dạng của High Performance
Cluster, thường được sử dụng cho mục đích khoa học, nghiên cứu.
Compute Cluster được sử dụng khi người ta cần tính toán một phép toán phức tạp, hay
một xử lý nào đó mà một máy đơn lẻ không thể hoàn thành hết được, ví dụ như việc
tính toán dự báo thời tiết hoặc tính toán lực của một vụ va chạm...
Tuy nhiên, điểm bất lợi của của Compute Cluster là sự ổn định. Khi một node trong
Cluster xảy ra sự cố sẽ gây nguy hại đến việc hoạt động của Cluster (bởi vì các node
của Cluster gắn kết chặt chẽ với nhau, hoạt động phụ thuộc lẫn nhau.) Vì thế việc bảo
trì định kì , thường xuyên luôn là vấn đề hàng đầu với loại Cluster này.
Grid Computing là một dạng Cluster phát triển từ Compute Cluster, nhưng điểm khác
biệt cơ bản là các node của Grid Computing không nhất thiết phải liên kết chặt chẽ với
nhau, chúng có thể nằm ở nhiều nơi khác nhau và liên lạc với nhau thông qua mạng
Internet.
Các node của Grid Computing sẽ nhận được các yêu cầu tính toán từ một máy chủ
trung gian, sau đó sẽ gửi trả kết quả trở về cho máy chủ này, sau đó nhận tiếp các yêu
cầu khác. Vì việc tính toán, xử lý được phân phối ra nhiều node khác nhau nên Grid
Computing còn được gọi là Distributed Cluster.
Nếu so sánh Grid Computing với Compute Cluster thì Grid Computing đa công dụng
hơn, từ một ứng dụng Web đơn giản đến một phép tính phức tạp, trong khi đó
Compute Cluster chỉ phục vụ cho một số mục đích nhất định. Việc bảo trì Grid
Computing cũng dễ dàng hơn, vì các node không nhất thiết phải liên kết chặt chẽ, khi
một node bị hư, phép tính sẽ được chuyển cho node khác xử lý.
Tuy nhiên, bởi vì các node của Grid Computing khác nhau về cấu hình cũng như tốc
độ đường truyền giữa các node với máy chủ trung gian, vì thế việc xử lý có thể bị kéo
dài nếu một node có tốc độ xử lý chậm, hoặc đường truyền tốc độ thấp, và tốc độ của
Grid Computing thì cũng không nhanh bằng Compute Cluster
2.3.3 Khác biệt của High Availability Cluster và High Performance Cluster
HAC chú trọng sự ổn định, trong khi đó HPC chú trọng việc nâng cao khả năng xử lý.
Để hoạt động, HPC cần các phần mềm riêng biệt cung cấp các tính năng riêng biệt,
thông thường dùng để điều khiển các node của HPC. Ngược lại các cấu hình của HAC
thường liên quan đến việc kết nối giữa các node, và người dùng có thể chạy thêm các
phần mềm khác của riêng mình.
HPC được sử dụng với các tính năng đã được định sẵn, trong khi đó HAC được sử
dụng với nhiều tính năng hơn.
Ngày nay, công nghệ ảo hóa đã rất phổ biến. Công nghệ này có thể được ứng dụng
trong Cluster. Các node ảo đều có tính năng như các node thật. Nếu đưa ra các giải
pháp tốt thì ứng dụng ảo hóa trong Cluster có được sự ổn định và tính năng được nâng
cao.
Host System là phần cứng mà các node được cài đặt lên và phần mềm ảo hóa
Guest System là phần mềm chạy trên hệ thống. Đôi khi được gọi là máy ảo, nhưng các
nhà sản xuất có tên gọi khác nhau
Cluster Manager là phần mềm xác định các dịch vụ cho các node ảo khác nhau
Cluster Service là ứng dụng được dùng điều khiển trạng thái của các node
Khi ảo hóa Cluster, người quản trị hệ thống không cần quan tâm đến việc bổ sung
thêm phần cứng khi muốn có thêm một máy chủ với nhiều node chạy trên đó. Người
quản trị hệ thống có thể cắt giảm chi phí bằng cách nâng cấp phần cứng trên một máy
chủ và tiến hành cài đặt nhiều node trên máy chủ đó thay vì triển khai nâng cấp phần
cứng trên nhiều node.
Người quản trị hệ thống được cung cấp công cụ quản lý Cluster một cách dễ dàng .
Công cụ này giúp cho việc điều khiển và giám sát rất dễ dàng trong ảo hóa. Dữ liệu có
thể truy cập dễ dàng, điều khiển trên các node khác nhau và khắc phục sự cố trở nên
dễ dàng hơn.
Khả năng khắc phục sự cố là một lý do giúp cho việc ảo hóa Cluster trở nên dễ dàng.
Khi gặp vấn đề trong việc khắc phục kết nối giữa các node ảo với nhau, người quản trị
hệ thống có thể xóa node đi và tạo node mới.
Vấn đề máy ảo trong Cluster là phần cứng. Khi các node ảo được được khởi động trên
một máy đơn thì độ bền vững không được đảm bảo. Khi máy thật bị sự cố thì kéo theo
nó là các node ảo cũng bị sự cố theo. Nếu không có sao lưu phần cứng sẽ gây nguy
Khi muốn xây dựng Cluster với các máy ảo, người ta thường đề nghị kết hợp với việc
xây dựng mô hình High Availability. Mỗi máy tính sẽ gồm nhiều node ảo giống nhau.
Trong trường hợp gặp sự cố, máy tính thứ 2 sẽ tiếp quản quyền điều khiển với cùng số
node như nhau.
Máy ảo Cluster đem lại hiệu quả về chi phí. Tuy nhiên sự tin tưởng vào mức độ sẵn
sàng của quá trình vận hành là không cao. Chính vì lẽ đó, nên có một máy chủ thật ở
chế độ chờ thay thế để phòng ngừa sự cố.
3.2Cấu hình
3.2.1 Xây dựng máy chủ chia tải giữa các máy chủ Web
Bật chức năng packer forwarding trong file /etc/sysctl.conf trên load 1
net.ipv4.ip_forward = 1
/sbin/sysctl –p
net.ipv4.ip_forward = 1
Chỉnh sửa file ldirectord.cf trong thư mục /etc/ha.d/ trên load 1
checktimeout=10
checkinterval=2
autoreload=no
logfile=”/var/log/ldirectord.log”
quiescent=yes
virtual=192.168.192.168:80
real=192.168.192.21:80 gate
real=192.168.192.22:80 gate
fallback=127.0.0.1:80 gate
service=http
monitorfile=”/var/log/monitor.log”
request=”a.html”
receive=”Welcome”
scheduler=rr
protocol=tcp
checktype=connect
checkport=80
crm respawn
logfile /var/log/ha-log
keepalive 2
deadtime 10
warntime 10
initdead 20
udpport 694
node load1.dyndns.org
node load2.dyndns.org
auth 3
3 md5 h@1kh01
Bật các chế độ hoạt động cho Heartbeat và tắt chế độ hoạt động cho
Ldirectord vì Ldirectord phụ thuộc vào Heartbeat
Cấu hình pacemaker để quản lý quá trình hoạt động của Hearbeat và
Ldirectord
3.2.2 Xây dựng máy chủ dự phòng cho việc chia tải giữa các máy chủ Web
Bật chức năng packer forwarding trong file /etc/sysctl.conf trên load 2
net.ipv4.ip_forward = 1
Chỉnh sửa file ldirectord.cf trong thư mục /etc/ha.d/ trên load 2
checktimeout=10
checkinterval=2
autoreload=no
logfile=”/var/log/ldirectord.log”
quiescent=yes
virtual=192.168.192.168:80
real=192.168.192.21:80 gate
real=192.168.192.22:80 gate
fallback=127.0.0.1:80 gate
service=http
monitorfile=”/var/log/monitor.log”
request=”a.html”
receive=”Welcome”
scheduler=rr
protocol=tcp
checktype=connect
checkport=80
crm respawn
logfile /var/log/ha-log
keepalive 2
deadtime 10
warntime 10
initdead 20
udpport 694
node load1.dyndns.org
node load2.dyndns.org
auth 3
3 md5 h@1kh01
Bật các chế độ hoạt động cho Heartbeat và tắt chế độ hoạt động cho
Ldirectord vì Ldirectord phụ thuộc vào Heartbeat
3.2.3 Xây dựng máy chủ chia tải cho các máy chủ MySQL
Bật chức năng packer forwarding trong file /etc/sysctl.conf trên loadlan
net.ipv4.ip_forward = 1
Cấu hình file ldirectord.cf trong thư mục /etc/ha.d/ trên loadlan
checktimeout=10
checkinterval=2
autoreload=no
logfile=”/var/log/ldirectord.log”
quiescent=yes
virtual=192.168.46.168:3306
real=192.168.46.31:3306 gate 10
real=192.168.46.32:3306 gate 10
service=mysql
scheduler=rr
protocol=tcp
checktype=negotiate
login=”test1”
passwd=”123456”
database=”dailocphat_mysql”
monitorfile=”/var/log/monitor.log”
3.2.4 Xây dựng đồng bộ dữ liệu giữa các máy chủ Web
Cấu hình sao lưu dữ liệu từ máy chủ Web1 sang máy chủ Web2 :
Cấu hình kết nối ssh khi đăng nhập không cần điền username và
password:
#ssh-keygen
# ssh-copy-id –i web2
#crontab –e
Cấu hình sao lưu dữ liệu từ máy chủ Web2 sang máy chủ Web1 :
Cấu hình kết nối ssh không cần điền username và password:
#ssh-keygen
# ssh-copy-id –i web1
#crontab –e
3.2.5 Xây dựng đồng bộ dữ liệu giữa các máy chủ MySQL
Sao lưu dữ liệu từ Data1 đến Data2, Data1 là master- Data2 là slave
Tạo user trên data1 để data2 sử dụng trong quá trình sao chép.
server-id = 1
Log_bin = /var/log/mysql/mysql-bin.log
Binlog_do_db = dailocphat_mysql
server-id =2
master-host = 192.168.46.31
master-user = slave1
master-password = 123456
master-port = 3306
master-connect-retry = 60
replicate-do-db = dailocphat_mysql
report-host = data2
+----------------------+----------+-----------------------+------------------------+
+----------------------+----------+-----------------------+------------------------+
+----------------------+----------+-----------------------+------------------------+
Lưu lại thông số của File và Position (trong trường hợp này là mysql-bin.000283 và
106)
>master_log_file=’ mysql-bin.000283’,
>master_log_pos=’106’;
Master_Host : 192.168.46.31
Master_User : slave1
Master_Port : 3306
Connect_Retry : 60
Master_Log_File : mysql-bin.000283
Read_Master_Log_Pos : 106
Relay_Log_File : data2-relay-bin.000382
Relay_Log_Pos : 251
Relay_Master_Log_File : mysql-bin.000283
Slave_IO_Running : Yes
Slave_SQL_Running : Yes
Replicate_Do_DB : dailocphat_mysql
Replicate_Ignore_DB :
Replicate_Do_Table :
Replicate_Ignore_Table :
Replicate_Wild_Do_Table :
Replicate_Wild_Ignore_Table :
Last_Errno :0
Last_Error :
Skip_Counter :0
Exec_Master_Log_Pos : 106
Relay_Log_Space : 548
Until_Condition : None
Until_Log_File :
Until_Log_Pos :0
Master_SSL_Allowed : No
Master_SSL_CA_File :
Master_SSL_CA_Path :
Master_SSL_Cert :
Master_SSL_Cipher :
Master_SSL_Key :
Seconds_Behind_Master :0
Master_SSL_Verify_Máy chủ_Cert: No
Last_IO_Errno :0
Last_IO_Error :
Last_SQL_Errno :0
Last_SQL_Error :
Sao lưu dữ liệu từ Data2 đến Data1, Data2 là master- Data1 là slave
server-id = 2
Log_bin = /var/log/mysql/mysql-bin.log
Binlog_do_db = dailocphat_mysql
server-id =1
master-host = 192.168.46.31
master-user = slave2
master-password = 123456
master-port = 3306
master-connect-retry = 60
replicate-do-db = dailocphat_mysql
report-host = data1
+----------------------+----------+-----------------------+------------------------+
+----------------------+----------+-----------------------+------------------------+
+----------------------+----------+-----------------------+------------------------+
Lưu lại thông số của File và Position (trong trường hợp này là mysql-bin.000283 và
106)
>master_log_file=’ mysql-bin.000283’,
>master_log_pos=’106’;
Master_Host : 192.168.46.32
Master_User : slave2
Master_Port : 3306
Connect_Retry : 60
Master_Log_File : mysql-bin.000283
Read_Master_Log_Pos : 106
Relay_Log_File : data1-relay-bin.000382
Relay_Log_Pos : 251
Relay_Master_Log_File : mysql-bin.000283
Slave_IO_Running : Yes
Slave_SQL_Running : Yes
Replicate_Do_DB : dailocphat_mysql
Replicate_Ignore_DB :
Replicate_Do_Table :
Replicate_Ignore_Table :
Replicate_Wild_Do_Table :
Replicate_Wild_Ignore_Table :
Last_Errno :0
Last_Error :
Skip_Counter :0
Exec_Master_Log_Pos : 106
Relay_Log_Space : 548
Until_Condition : None
Until_Log_File :
Until_Log_Pos :0
Master_SSL_Allowed : No
Master_SSL_CA_File :
Master_SSL_CA_Path :
Master_SSL_Cert :
Master_SSL_Cipher :
Master_SSL_Key :
Seconds_Behind_Master :0
Master_SSL_Verify_Máy chủ_Cert: No
Last_IO_Errno :0
Last_IO_Error :
Last_SQL_Errno :0
Last_SQL_Error :
Firewall External
#!/bin/sh
ETHIN=eth2
ETHOUT=eth1
external_ip=192.168.157.157
webserver_ip=192.168.192.168
LOG_LEVEL="debug"
LOG_LIMIT=3/m
LOG_LIMIT_BURST=1
PING_LIMIT=1/s
PING_LIMIT_BURST=100
SYN_LIMIT=200/s
SYN_LIMIT_BURST=2000
UDP_LIMIT=200/s
UDP_LIMIT_BURST=2000
modprobe iptable_nat
iptables -N CHECK_PINGFLOOD
iptables -N REJECT_PORTSCAN
iptables -N DETECT_NMAP
iptables -N CHECK_SYNFLOOD
iptables -N TCP_INCOMING
iptables -N CHECK_UDPFLOOD
iptables -N UDP_INCOMING
Sau đó ta cho file này chạy vào mỗi lần khởi động máy.
Firewall Internal
#!/bin/sh
ETHIN=eth2
ETHOUT=eth1
external_ip=192.168.192.46
mysqlserver_ip=192.168.46.168
modprobe iptable_nat
Xây dựng một hệ thống máy chủ Web phục vụ nhiều người dùng có khả năng tự động
chia tải và tính sẵn sàng cao mà vẫn đảm bảo sự đồng nhất dữ liệu giữa các máy chủ.
Xây dựng máy chủ chia tải giữa các máy chủ Web.
Xây dựng máy chủ dự phòng cho việc chia tải giữa các máy chủ Web.
Xây dựng máy chủ chia tải giữa các máy chủ MySQL.
4.2 Kết quả quá trình triển khai mô hình thực tiễn
Ta cho máy trạm tiến hành truy cập vào Website và xem hiện trạng tại máy chủ Load
balance đang hoạt động, cụ thể ở đây là load1.
Nhìn vào hình trên ta thấy các gói tin yêu cầu dịch vụ từ máy trạm 115.75.33.160 được
phân chia xử lý lần lượt cho hai máy chủ là 192.168.192.21 và 192.168.192.22.
Failover:
Tại load1 ta kiểm tra hiện trạng của load1 và load2 bằng lệnh crm_mon
Nhìn vào hình ta thấy hiện tại việc phân chia tải cho các máy chủ Web đang được
load1 đảm nhận, load2 đang ở trang thái chờ.
Sau khi tắt load1 việc phân chia tải được chuyển sang cho load2, do load1 đã tắt nên ta
thấy load1 đang ở trạng thái OFFLINE.
load1 sau khi được bật lên sẽ ở trong trạng thái chờ, công việc phân chia tải vẫn do
load2 phụ trách.
Nhìn vào hình trên ta thấy các yêu cầu truy cập cơ sở dữ liệu từ hai máy chủ Web
192.168.192.22 và 192.168.192.21 được phân chia đều cho hai máy chủ MySQL
192.168.46.31 và 192.168.46.32.
Để kiểm tra việc đồng bộ có xảy ra hay không ta tiến hành xem file crontab.log
Nhìn vào hình trên ta thấy máy chủ Web1 sẽ tiến hành đồng bộ dữ liệu với máy chủ
Web2 vào các phút thứ 0, 10, 20, 30, 40, 50 trong mỗi giờ. Trong file crontab.log hiện
ghi lại việc đồng bộ vừa được tiến hành xong vào lúc 00:50:02.
Trên máy chủ data1 ta dùng các lệnh show master status và show slave hosts để kiểm
tra các server có kết nối với nhau hay không, nếu có là thành công.
Nhìn hình ta thấy data1 có 1 slave đang kết nối vào là data2
Firewall External
Ta dùng lệnh iptables –L để tiến hành kiểm tra các rule hiện có của iptables
Firewall Internal
Quá trình thực hiện đề tài đều thực hiện trên máy ảo nên máy chạy chậm, không ổn
định.
Đề tài có thể phát triển bằng việc gắn thêm firewall dự phòng cho hai firewall ngoài và
trong, máy chủ dự phòng cho máy chủ chia tải MySQL.
Đề tài chỉ mới xây dựng hệ thống cho dịch vụ Web, nên phát triển thêm trên các dịch
vụ khác như Mail…
Với những hệ thống lớn lưu lượng truy cập database nhiều ta có thể thay thế hệ thống
máy chủ chia tải và máy chủ MySQL bằng hệ thống MySQL Cluster.
www.linuxvirtualserver.org.
www.linux-ha.org.
www.ultramonkey.org.
http://www.thegeekstuff.com/2009/06/15-practical-crontab-examples/
http://www.thegeekstuff.com/2010/09/rsync-command-examples/
http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-
password-using-ssh-keygen-ssh-copy-id/
http://dev.mysql.com/doc/refman/5.1/en/server-administration.html
http://dev.mysql.com/doc/refman/5.1/en/ha-overview.html
http://dev.mysql.com/doc/refman/5.1/en/replication.html