Tải bản đầy đủ (.pdf) (67 trang)

NGHIÊN CỨU ẢNH HƯỞNG CỦA CACHING ĐẾN HIỆU NĂNG TRUY VẤN CỦA CÁC ỨNG DỤNG WEB

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.42 MB, 67 trang )

ĐẠI HỌC QUỐC GIA HÀ NỘI
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ
Lê Duy Thanh
NGHIÊN CỨU ẢNH HƯỞNG CỦA
CACHING ĐẾN HIỆU NĂNG TRUY
VẤN CỦA CÁC ỨNG DỤNG WEB
KHÓA LUẬN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
Ngành: Công Nghệ Thông Tin
Cán bộ hướng dẫn: TS. Nguyễn Hải Châu
HÀ NỘI - 2012
Lời cảm ơn
Trước tiên, tôi xin gửi lời cảm ơn sâu sắc nhất đến thầy giáo TS. Nguyễn
Hải Châu, người đã tận tình hướng dẫn tôi trong quá trình thực hiện
khóa luận tốt nghiệp.
Tôi xin chân thành cảm ơn các thầy cô và các cán bộ của trường Đại
học Công Nghệ đã tạo cho tôi những điều kiện thuận lợi nhất để học
tập và nghiên cứu.
Tôi xin cảm ơn các thầy cô giáo trong bộ môn Các Hệ Thống Thông
Tin đã giúp đỡ, hỗ trợ tôi về kiến thức chuyên môn.
Tôi cũng xin gửi lời cảm ơn tới các bạn trong lớp K53CC đã ủng hộ,
khuyến khích và giúp đỡ tôi trong suốt quá trình học tập tại trường.
Cuối cùng, tôi muốn gửi lời cảm ơn vô hạn tới gia đình và bạn bè,
những người thân yêu luôn bên cạnh và động viên tôi trong suốt quá
trình học tập và thực hiện khóa luận tốt nghiệp.
Tôi xin chân thành cảm ơn!
Sinh Viên
Lê Duy Thanh
ii
NGHIÊN CỨU ẢNH HƯỞNG CỦA CACHING ĐẾN
HIỆU NĂNG TRUY VẤN CỦA CÁC ỨNG DỤNG WEB
Lê Duy Thanh


Khóa QH-2008-I/CQ , ngành Công nghệ Thông tin
Tóm tắt Khóa luận tốt nghiệp:
Hiện nay, với sự bùng nổ của mạng Internet và sự phát triển mạnh mẽ của các
trang mạng xã hội có tính chia sẽ cao như Facebook, Youtube, Twitter . . . hoặc các
trang tin tức lớn mà có hàng triệu lượt view mỗi ngày đều yêu cầu có một hệ thống
cơ sở dữ liệu rất lớn. Đối với những hệ thống lớn như vậy thì vấn đề performance
luôn là bài toán khó đối với những nhà thiết kế cơ sở dữ liệu. Bởi vì, với những hệ
thống cơ sở dữ liệu lớn thường rất dễ xảy ra tình trạng thắt cổ chai khi có một số
lượng lớn truy vấn đến cơ sở dữ liệu cùng lúc. Điều này gây ảnh hưởng rất lớn đến
hiệu năng của toàn bộ hệ thống. Và giải pháp data caching ra đời nhằm mục đích
giải quyết tình trạng thắt cổ chai này, giúp nâng cao performance của hệ thống,
và một công cụ được rất nhiều hệ thống lớn sử dụng đấy là Memcached.
Khóa luận tập trung tìm hiểu và nghiên cứu cách triển khai hệ thống Mem-
cached lên một trang web cùng với việc sử dụng bộ nhớ Cache của MySQL nhằm
nâng cao hiệu năng truy vấn tới cơ sở dữ liệu và giảm thời gian phản hồi của các
yêu cầu tới trang web.
Khóa luận sử dựng Drupal CMS để xây dựng một trang web thử nghiệm. Khóa
luận cũng đã triển khai thành công việc sử dụng hệ thống Memcached và Query
Cache của MySQL trên trang web này và bước đầu đã thu được những kết quả
thống kê ban đầu hết sức khả quan. Với hơn 90% các truy vấn được tìm thấy trong
bộ nhớ cache và thời gian phản hồi giảm đi một nửa, kết quả này cho thấy mô
hình đề xuất là đúng đắn và có thể triển khai thực tế.
Lời cam đoan
Tôi xin cam đoan Nghiên cứu ảnh hưởng của caching đến hiệu năng truy vấn
của các ứng dụng Web được trình bày trong khóa luận này do tôi thực hiện dưới
sự hướng dẫn của TS. Nguyễn Hải Châu.
Tất cả các số liệu, kết quả được trình bày trong khóa luận là hoàn toàn trung
thực và chưa từng được công bố trong bất kỳ một công trình nào khác. Trong khóa
luận, không có việc sao chép tài liệu hoặc công trình nghiên cứu của người khác
mà không chỉ rõ về tài liệu tham khảo.

Khóa luận được hoàn thành trong thời gian tôi là Sinh viên tại Bộ môn Các
hệ thống thông tin, Khoa Công nghệ Thông tin, Trường Đại học Công nghệ, Đại
học Quốc gia Hà Nội.
Sinh Viên
Lê Duy Thanh
iv
Mục lục
Tiêu đề i
Tóm tắt iii
Lời cam đoan iv
Danh sách hình vẽ viii
Danh sách các ký hiệu và từ viết tắt ix
1 Tổng quan về Caching 3
1.1 Caching là gì? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Data Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Database Caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Tìm hiểu về Memcached và built-in caching MySQL 6
2.1 Tìm hiểu về Memcached . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.1 Memcache là gì? . . . . . . . . . . . . . . . . . . . . . . . . 6
2.1.2 Memcached làm được những gì? . . . . . . . . . . . . . . . . 8
2.1.3 Memcached không dùng để làm gì? . . . . . . . . . . . . . . 9
2.2 Giới thiệu về built-in caching MySQL . . . . . . . . . . . . . . . . . 10
3 Nghiên cứu cài đặt, sử dụng memcached và built-in caching cho
MySQL 12
3.1 Cài đặt và sử dụng memcached . . . . . . . . . . . . . . . . . . . . 12
3.1.1 Cài đặt memcached . . . . . . . . . . . . . . . . . . . . . . . 12
3.1.2 Thao tác với dữ liệu dùng telnet . . . . . . . . . . . . . . . 15
3.1.3 Một số lựa chọn lưu trữ dữ liệu . . . . . . . . . . . . . . . . 19
3.1.4 Thao tác với dữ liệu dùng một thư viện memcached Client . 20
v

MỤC LỤC vi
3.1.5 Cài đặt memcached Linux client . . . . . . . . . . . . . . . . 21
3.2 Cài đặt và sử dụng built-in caching MySQL . . . . . . . . . . . . . 24
3.2.1 Cài đặt Query Cache cho MySQL . . . . . . . . . . . . . . . 24
3.2.2 Sử dụng Query Cache . . . . . . . . . . . . . . . . . . . . . 25
3.2.3 Sự phân mảnh bộ nhớ . . . . . . . . . . . . . . . . . . . . . 28
4 Cài đặt một ứng dụng thử nghiệm và đánh giá hiệu năng 31
4.1 Cài đặt drupal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.2 Cài đặt Module cho drupal . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.1 Tải module . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.2 Kích hoạt module . . . . . . . . . . . . . . . . . . . . . . . . 39
4.2.3 Sử dụng module Devel . . . . . . . . . . . . . . . . . . . . . 40
4.3 Thống kê, giám sát . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3.1 Cài đặt MRTG . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.3.2 Cấu hình MRTG . . . . . . . . . . . . . . . . . . . . . . . . 43
4.4 Đánh giá hiệu năng . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
4.4.1 Kết quả thống kê từ Memcached và MySQL . . . . . . . . . 47
4.4.2 Kết quả thời gian phản hồi sử dụng công cụ ab . . . . . . . 48
Kết luận 55
Tài liệu tham khảo 57
Danh sách hình vẽ
1.1 Mô hình cơ bản của Data Caching . . . . . . . . . . . . . . . . . . . 4
2.1 Mô hình hoạt động của Memcached . . . . . . . . . . . . . . . . . . 7
2.2 Mô hình không sử dụng Memcached . . . . . . . . . . . . . . . . . . 8
2.3 Mô hình sử dụng Memcached . . . . . . . . . . . . . . . . . . . . . 9
3.1 Một số tùy chọn của memcached . . . . . . . . . . . . . . . . . . . 14
3.2 Danh sách các biến của hệ thống Query Cache . . . . . . . . . . . . 24
3.3 Quá trình cấp phát các khối trong bộ nhớ để lưu trữ dữ liệu . . . . 26
3.4 Danh sách các biến trạng thái của Query Cache . . . . . . . . . . . 27
3.5 Nguyên nhân phân mảnh khi cấp phát bộ nhớ . . . . . . . . . . . . 29

4.1 Màn hình đăng nhập vào phpMyAdmin . . . . . . . . . . . . . . . . 32
4.2 Tạo cơ sở dữ liệu cho trang Web . . . . . . . . . . . . . . . . . . . 33
4.3 Chọn chế độ cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.4 Chọn ngôn ngữ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.5 Một số yêu cầu cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.6 Cấu hình cơ sở dữ liệu . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.7 Tiến trình cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.8 Thông tin về trang web . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.9 Thông tin về admin . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.10 Thiết lập múi giờ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.11 Cài đặt hoàn thành . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.12 Trang chủ cài đặt . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.13 Kích hoạt các module . . . . . . . . . . . . . . . . . . . . . . . . . . 39
4.14 Thống kê thông tin trạng thái của memcached . . . . . . . . . . . . 40
4.15 Cấu hình module . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.16 Sinh bài viết . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
vii
DANH SÁCH HÌNH VẼ viii
4.17 Thống kê cache hits - cache misses của bộ nhớ Cache MySQL . . . 47
4.18 Tỷ lệ phần trăm cache hits - cache misses của bộ nhớ Cache MySQL 47
4.19 Thống kê cache hits - cache misses của Memcached . . . . . . . . . 48
4.20 Tỷ lệ phần trăm cache hits - cache misses của Memcached . . . . . 48
4.21 Biểu đồ kết quả thống kê thời gian phản hồi trung bình . . . . . . . 53
Bảng ký hiệu và từ viết tắt
Ký hiệu Ý nghĩa
ab Apache Bench
API Application Programming Interface
CMS Content Management System
CPU Central Processing Unit
MRTG Multi Router Traffic Grapher

NVP Name Value Pair
SNMP Simple Network Management Protocol
SRAM Static Random Access Memory
TCP Transmission Control Protocol
UDP User Datagram Protocol
ix
Lời mở đầu
Trong thế giới khoa học máy tính, cache là một cơ chế đặc biệt giúp việc
lưu trữ và nhận dữ liệu đạt được tốc độ cao. Bộ nhớ cache là một bộ nhớ
nhỏ tốc độ cao thường là Static RAM (SRAM) có chứa những dữ liệu truy
cập gần đây nhất của bộ nhớ chính. Kỹ thuật caching được thực hiện bởi các
nhà thiết kế hệ thống để cải thiện thời gian phản hồi của ứng dụng và giảm
tải hệ thống. Phương pháp caching từ lâu đã được sử dụng để cải thiện hiệu
suất của các ứng dụng Internet. Có rất nhiều phương pháp caching được các
nhà thiết kế cơ sở dữ liệu sử dụng như CPU cache, Web cache, Database
cache, Object cache, data caching Trong phạm vi của tài liệu này, chúng
ta sẽ đi nghiên cứu, tìm hiểu về kỹ thuật Data Caching và Memcached chính
là một thể hiện đặc trưng của phương pháp này.
Memcached là một công cụ hỗ trợ data caching rất tốt và rất mạnh mẽ,
và dĩ nhiên ưu điểm hàng đầu của nó là hoàn toàn miễn phí. Nó thường
được sử dụng để tối ưu hóa việc tải dữ liệu từ cơ sở dữ liệu cho các ứng
dụng trên nền web. Nó rất thích hợp để caching những dữ liệu được truy
cập nhiều nhưng ít bị thay đổi, nó giúp tăng tốc truy cập và giảm workload
với database trong hệ thống. Ngoài ra Memcached cũng có điểm mạnh là
hỗ trợ việc phân tán rất tốt, cho nên chúng ta có thể dễ dàng triển khai với
nhiều server Memcached.
Vào lúc đầu, hệ thống Memcached được phát triển bởi Danga Interactive
và dùng cho LiveJournal. Sau đó Memcached trở nên phổ biến và được dùng
trên rất nhiều các website lớn khác như Youtube, Wikipedia, Flickr, Twitter,
Mixi

Đây cũng là một hệ thống bộ nhớ phân tán mà Facebook đã sử dụng
như một caching layer giữa web servers và MySQL server. Facebook đã tối
ưu hóa Memcached và các phần liên quan và xây dựng một hệ thống bao
gồm hàng ngàn servers với hàng chục terabytes dữ liệu được cached tại mỗi
thời điểm. Có thể coi đây là hệ thống Memcached lớn nhất thế giới tại thời
điểm này.
Có thể nói Memcached là một công cụ hữu dụng để giải quyết bài toán
performance cho các ứng dụng web. Memcached giúp nâng cao performance
cho các ứng dụng web và giúp tránh được tình trạng tắc nghẽn khi có một
số lượng lớn các truy vấn tới cơ sở dữ liệu cùng lúc.
Khóa luận Nghiên cứu ảnh hưởng của caching đến hiệu năng truy vấn
của các ứng dụng Web thực hiện nghiên cứu, tìm hiểu và triển khai một hệ
1
thống Memcached đơn giản cùng với việc thiết lập một số thông số built-in
caching của MySQL nhằm tăng tốc độ truy xuất, giảm thời gian phản hồi
của các yêu cầu tới một trang web.
Nội dung của khóa luận được chia thành các chương như sau:
Chương 1: Giới thiệu tổng quan về kỹ thuật Caching. Khái niệm về Caching
và một số phương pháp Caching được sử dụng phổ biến trên thế giới
giúp nâng cao hiệu suất truy vấn tới cơ sở dữ liệu của máy chủ.
Chương 2: Giới thiệu về Memcached và caching với MySQL. Tìm hiểu
đôi nét về lịch sử phát triển của Memcached và cấu trúc cơ bản của
Memcached. Phần cuối sẽ giới thiệu về Query Cache của MySQL.
Chương 3: Phần đầu của chương trình bày chi tiết về cài đặt Memcached
trên hệ điều hành Ubuntu 11.10. Đồng thời tìm hiểu một số thao tác
với Memcached dùng telnet và dùng Memcached Linux Client. Phần
sau sẽ đi nghiên cứu, tìm hiểu cách cài đặt và sử dụng built-in caching
MySQL. Trong phần này sẽ trình bày chi tiết về một số thông số của
query cache và một vấn đề kinh điển trong lưu trữ đấy là sự phân mảnh
bộ nhớ trong bộ nhớ cache của MySQL.

Chương 4: Xây dựng một trang web thử nghiệm bằng Drupal CMS. Tích
hợp trang web với Memcached kết hợp với sử dụng Query Cache của
MySQL. Hướng dẫn cài đặt công cụ MRTG và cấu hình MRTG để
giám sát các thông số của Memcached và bộ nhớ Cache MySQL. Ngoài
ra, chương ngày cũng giới thiệu về công cụ ab dùng để kiểm tra kết
quả mà Memcached và Query Cache MySQL mang lại cho trang web
thử nghiệm.
Phần kết luận: Tổng kết, tóm lược nội dung chính của khóa luận và ý
nghĩa thực tiễn của khóa luận. Đồng thời đưa ra hướng nghiên cứu
tiếp theo của khóa luận.
2
Chương 1
Tổng quan về Caching
1.1 Caching là gì?
Caching theo [2] là một trong những kỹ thuật tối ưu để giảm thời gian truyền
thông tin liên lạc trong máy tính. Ngoài ra caching cũng được sử dụng với nhiều
hình thức khác nhau trong hệ thống, với cùng mục đích để giảm thời gian truyền
thông tin liên lạc. Trong một kiến trúc hướng dịch vụ, bao gồm nhiều hệ thống
phụ thuộc lẫn nhau, caching đóng vai trò quan trọng ảnh hưởng tới hiệu suất của
tòan bộ hệ thống. Trong hệ thống web-server, caching là kỹ thuật phổ biến được
dùng để lưu trữ tạm thời các dữ liệu đã được truy cập. Nó lưu trữ một phần bản
sao của cơ sở dữ liệu gốc. Điều này giúp các máy chủ đáp ứng nhanh hơn các yêu
cầu từ người dùng cuối. Caching giúp nâng cao hiệu suất truy vấn và giảm tải cho
server.
Trong khuôn khổ của tài liệu này, chúng ta sẽ đi nghiên cứu hai kỹ thuật caching
ảnh hưởng lớn tới hiệu năng truy vấn của các ứng dụng web đó là kỹ thuật Data
Caching và kỹ thuật Database Caching.
1.2 Data Caching
Data Caching là một kĩ thuật được cung cấp để lưu trữ và truy cập các phần
tử trong bộ nhớ một cách tạm thời nhằm cải thiện hiệu năng của hệ thống dựa

vào thời gian truy xuất nhanh hơn rất nhiều so với việc phải truy xuất trực tiếp
vào cơ sở dữ liệu gốc.
3
Hình 1.1: Mô hình cơ bản của Data Caching
Với mô hình yêu cầu dữ liệu truyền thống. Mỗi khi Client có một yêu cầu gửi
về Database server, sẽ tạo ra một kết nối tới cơ sở dữ liệu, thực hiện truy vấn và
trả lại kết quả tới Client. Điều này có thể hữu ích đối với những trang có lượng
truy cập thấp, ko đáng kể. Với những website có lượng truy cập lớn, điều này là
rất bất lợi. Cứ mỗi một truy vấn lại tạo ra một kết nối tới cơ sở dữ liệu. Chẳng
bao lâu sau mà Máy chủ chứa cơ sở dữ liệu sẽ bị treo, gây ảnh hưởng tới các truy
vấn đang chờ đợi. Nhược điểm này đã được mô hình Data Caching khắc phục. Mỗi
khi có một yêu cầu gửi tới từ Client, máy chủ web sẽ kiểm tra trong Cache xem
có kết quả lưu lại chưa, nếu chưa có (cache miss), sẽ thực hiện tạo kết nối tới máy
chủ cơ sở dữ liệu. Sau khi thực hiện truy vấn, kết quả trả lại sẽ được lưu tạm thời
vào Cache, rồi sẽ trả lại cho phía Client. Khi một Client khác có yêu cầu truy vấn
tương tự, máy chủ web sẽ tự động lấy kết quả mà nó đã lưu sẵn từ trong Cache
ra trả về cho Client đó (cache hit). Điều này giảm tải rất nhiều đối với máy chủ
database và tốc độ đáp ứng dữ liệu trong trường hợp này cũng cao hơn nhiều lần
so với việc phải lấy kết quả truy vấn từ cơ sở dữ liệu gốc. Và một công cụ hỗ trợ
rất tốt Data Caching đấy chính là Memcached.
4
1.3 Database Caching
Đối với những hệ thống sơ sở dữ liệu lớn phải đáp ứng cùng lúc rất nhiều các
truy vấn tới từ các ứng dụng thì việc xảy ra tình trạng quá tải và hiện tượng thắt
cổ chai là điều khó có thể tránh khỏi. Để giảm thiểu những rủi ro này, hiện nay
hấu hết các hệ quản trị cơ sở dữ liệu lớn trên thế giới như Oracle, PostgreSQL,
MySQL . . . đều cung cấp một tính năng nhằm cải thiện khả năng mở rộng và hiệu
suất của các ứng dụng truy cập tới cơ sở dữ liệu đấy chính là bộ nhớ tạm thời
(Cache).
Theo nghiên cứu của Qiong Luo và các cộng sự [9] việc sử dụng Database

Caching có một số lợi ích sau đây:
• Khả năng mở rộng: Phân phối khối lượng truy vấn từ backend
1
tới nhiều
hệ thống front-end
2
giúp giảm tải công việc cho máy chủ cơ sở dữ liệu.
• Tính linh hoạt: Đạt được chất lượng phục vụ (QoS
3
), kiểm soát bộ nhớ
cache, nơi lưu trữ các phần khác nhau của dữ liệu backend, ví dụ, dữ liệu
của khách hàng Platinum được lưu trữ trong khi dữ liệu của các khách hàng
bình thường khác thì không.
• Tính sẵn sàng: Có khả năng tiếp tục phục vụ cho các ứng dụng mà kết quả
của yêu cầu chỉ phụ thuộc trên các bảng được lưu trữ tạm khi mà backend
server không có khả năng phục vụ.
• Hiệu suất: Có khả năng đáp ứng nhanh chóng các kết quả đã được lưu trữ
và giúp cân bằng tải.
1
Ám chỉ công việc thao tác với hệ quản trị cơ sở dữ liệu
2
Hệ thống các giao diện người dùng (GUI)
3
Quality of Service
5
Chương 2
Tìm hiểu về Memcached và
built-in caching MySQL
2.1 Tìm hiểu về Memcached
2.1.1 Memcache là gì?

Memcached là viết tắt của Memory Cache Daemon. Memcached [8] được phát
triển bởi Brad Fitzgerald để tăng tốc trang LiveJournal.com - là một trang mạng
xã hội có hơn 20 triệu lượt view mỗi ngày với hơn 1 triệu người dùng. Vào mùa
xuân năm 2003, rất nhiều người dùng đã phàn nàn về tốc độ của trang web ngày
một chậm đi. Trong một bài báo cáo tổng quan về cơ sở hạ tầng của LiveJournal,
Brad Fitzgerald, người sáng lập của LiveJournal đã chỉ ra rằng một trong những
nguyên nhân lớn gây nên tình trạng tắc nghẽn là việc đọc dữ liệu trực tiếp từ trong
cơ sở dữ liệu (database). Và do đó các nhà phát triển của LiveJournal đã bắt đầu
sử dụng memcached như là biện pháp để làm tăng hiệu năng cho LiveJournal. Sau
khi cài đặt hoàn chỉnh memcached và đưa vào sử dụng, người ta đã thống kê được
rằng: gần 95% các lần đọc dữ liệu được thực hiện trong memcached và các nút cổ
chai lớn nhất trong hệ thống đã được loại bỏ.
Memcached là một hệ thống caching đối tượng trên bộ nhớ phân tán, là một
hệ thống mã nguồn mở, miễn phí, có hiệu năng cao được sử dụng để tăng tốc các
ứng dụng Web động nhờ việc giảm tải sự truy cập đến cơ sở dữ liệu. Chính vì lý
do này mà ngày nay Memcached được hầu hết các trang web có tính chia sẻ lớn
6
nhât thế giới đang sử dụng như Facebook, YouTube, Flickr, Twitter, Wikipedia,
Mixi
Memcached là một máy chủ lưu trữ các cặp tên - giá trị (NVPs
1
) trong bộ nhớ.
Giá trị trong cặp tên – giá trị có thể là bất cứ dữ liệu nào đó trong memcached
như : các hàng của dữ liệu, các phân mảnh HTML, các giá trị nhị phân. Chúng ta
biết rằng tốc độ đọc dữ liệu từ bộ nhớ (SRAM, DRAM) là nhanh hơn rất nhiều
so với việc đọc dữ liệu từ đĩa cứng. Vì vậy, việc nhận giá trị lưu trữ từ bộ nhớ là
hiệu quả hơn nhiều so với lấy chúng từ ổ đĩa. Memached được lưu trữ trong bộ
nhớ (RAM) và dĩ nhiên một ứng dụng sử dụng Memcached sẽ mang lại hiệu quả
cao hơn rất nhiều so với việc không sử dụng nó.
Hình 2.1: Mô hình hoạt động của Memcached

Memcached server lưu trữ các giá trị bằng môt khóa tra cứu (tên) trong bộ
nhớ. Server sẽ tiến hành lưu trữ và nhận lại dữ liệu đã được lưu trữ là các NVP
với một khóa (key). Việc lưu và nhận lại dữ liệu theo key làm cho chương trình trở
nên rất nhanh và rất đơn giản. Điều hạn chế của việc làm này đấy là độ dài của
khóa không cho phép vượt quá 250 ký tự và kích thước của các phần dữ liệu được
lưu không vượt quá 1 MB. Ngoài ra, mỗi máy chủ memcached là một phần tử độc
lập. Nó không biết và cũng không quan tâm tới bất kỳ một máy chủ memcached
nào khác, và việc nhận biết xem máy chủ nào chứa NVP đang được yêu cầu là
1
Name Value Pairs
7
nhiệm vụ của Client. Vì vậy, chúng ta có thể thêm nhiều máy chủ nếu muốn để
đạt được hiệu quả mong muốn.
Do thời gian đọc dữ liệu từ Memcached nhanh hơn rất nhiều so với việc lấy
dữ liệu trực tiếp từ cơ sở dữ liệu (database) được lưu trên ổ cứng máy tính, điều
này cho phép server phân phối được nhiều trang web hơn so với lần nào cũng truy
vấn tới cơ sở dữ liệu. Memcached đơn giản nhưng thực sự mạnh mẽ. Thiết kế đơn
giản của nó thúc đẩy triển khai nhanh chóng, dễ dàng phát triển và giải quyết
nhiều vấn đề phải đối mặt với các lưu trữ dữ liệu lớn. Hiện nay, API của nó đã
hộ trợ cho tất cả các ngôn ngữ phổ biến nhất như Perl, PHP, Python, Ruby, Java,
.NET/C#, C . . . Về cơ bản, việc triển khai Memcached cho một trang web là khá
dễ dàng, tuy nhiên đối với một số người lần đầu sử dụng Memcached, họ không
nghĩ rằng sẽ dễ dàng triển khai Memcached lên trang web của họ.
Về cơ bản, theo Patrick Galbraith [10] mô hình hoạt động của Memcached (Hình
2.1) tương đối giống với mô hình hoạt động của Data Caching (Hình 1.1).
2.1.2 Memcached làm được những gì?
Memcached cho phép bạn có một bộ nhớ kết hợp từ nhiều vùng nhớ khác nhau
của hệ thống, đấy là những vùng nhớ có dung lượng trống nhiều hơn bạn cần và
những vùng trống có dung lượng ít hơn bạn cần. Memcached cũng cho phép bạn
tăng hiệu suất sử dụng bộ nhớ. Hình 2.2 và 2.3 cho thấy hai ngữ cảnh khi triển

khai:
Hình 2.2: Mô hình không sử dụng Memcached
8
Hình 2.3: Mô hình sử dụng Memcached
- Mỗi nút là hoàn toàn độc lập (Hình 2.2).
- Mỗi nút có thể sử dụng bộ nhớ từ các nút khác (Hình 2.3).
Kịch bản đầu tiên minh họa cho chiến lược triển khai cổ điển, tuy nhiên bạn
sẽ thấy rằng nó là sẽ gây lãng phí trong trường hợp tổng kích thước bộ nhớ cache
chỉ là một phần nhỏ so với kích thước bộ nhớ của máy chủ Web, nhưng vẫn phải
giữ vùng nhớ cần thiết cho từng nút.
Với Memcached, bạn có thể thấy rằng tất cả các máy chủ đều tìm kiếm trong
cùng một vùng nhớ ảo. Điều này có nghĩa rằng một mục luôn luôn được lưu trữ
và nhận lại từ cùng một vị trí trong toàn bộ cụm máy chủ web của bạn.
Sự khác biệt giữa hai mô hình được thể hiện một cách rõ ràng khi hệ thống
của bạn phát triển đến một mức nào đó và bạn cần phải có thêm nhiều server để
có thể đáp ứng được yêu cầu phát triển đó. Giả sử nếu bạn có 50 máy chủ server,
trong trường hợp không sử dụng Memcached, bạn vẫn chỉ có 64MB cache để sử
dụng. Còn với trường hợp bạn sử dụng Memcached, bạn sẽ có tới tận 3.2GB bộ
nhớ Cache để sử dụng.
2.1.3 Memcached không dùng để làm gì?
Thứ nhất, Memcached không được dùng để lưu trữ những dữ liệu lâu dài và
ổn định. Chúng ta không thể dùng truy vấn để lấy ra danh sách của tất cả các giá
trị có trong Memcached. Chỉ có duy nhất một cách để biết được dữ liệu có trong
Memcached hay không đấy là truy vấn tới máy chủ và tìm nó. Điều này được thiết
9
kế từ khi Memcached được tối ưu hóa cho một máy chủ lưu trữ tạm thời chứ không
phải là một máy chủ lưu trữ dữ liệu lâu dài.
Thứ hai, trong Memcached không có cơ chế bảo mật. Các máy chủ Memcached
hoàn toàn không có mô hình chứng thực. Bất kỳ ai cũng có thể kết nối tới máy chủ
thông qua cổng TCP hoặc UDP để lấy dữ liệu. Đây hoàn toàn là do thiết kế có

mục đích, bởi vì quá trình chứng thực sẽ làm chậm đi đáng kể quá trình xử lý dữ
liệu. Nhưng điều đó không có nghĩa rằng Memcached không có tính bảo mật. Có
một số phương pháp làm tăng độ bảo mật cho Memcached mà không làm chậm đi
quá trình xử lý dữ liệu. Cách thứ nhất là giới hạn truy cập tới máy chủ. Các cổng
đang hoạt động trên Memcached nên chặn những truy cập từ bên ngoài. Cách thứ
hai đấy là xáo trộn các khóa của bạn. Với cách này, bất cứ ai có thể truy cập được
tới máy chủ nhưng không phải dễ dàng có thể tìm được dữ liệu. Một số Client đã
được xử lý điều này bằng cách băm khóa của bạn hoặc nén dữ liệu, vì vậy không
phải dễ dàng một ai đó có thể đọc được.
Cách tốt nhất là giới hạn truy cập tới máy chủ Memcached, giới hạn cổng các máy
yêu cầu truy cập. Điều này có thể được thực hiện bằng cách sử dụng định tuyến
(routing) và tường lửa (firewall) để cho phép hoặc không cho phép truy cập tới các
cổng xác định bởi IP Address hoặc IP Range. Việc triển khai cụ thể các phương
pháp này là điều vượt ra ngoài phạm vi của tài liệu này.
Cuối cùng, Memcached không hỗ trợ các cơ chế fail-over/high-availability
2
. Nếu
như máy chủ Memcached bị hỏng và ngừng hoạt động thì toàn bộ dữ liệu cũng sẽ
bị mất. Nhưng điều đó không phải là một vấn đề quan trọng, bởi vì Memcached
là một bộ nhớ tạm thời, không phải là bộ nhớ lưu trữ những dữ liệu gốc. Những
truy vấn liên quan tới dữ liệu đã mất hoàn toàn có thể tìm thấy trong cơ sở dữ
liệu gốc.
2.2 Giới thiệu về built-in caching MySQL
MySQL có một tính năng tuyệt vời được gọi là "Query Cache", nó rất hữu ích
cho công việc tối ưu hóa hiệu suất của MySQL. Khi cơ sở dữ liệu của bạn lớn và
số lượng các truy cập tới cơ sở dữ liệu tại cùng một thời điểm là cao, chắc chắn
MySQL sẽ chiếm rất nhiều tài nguyên và khiến tải của server lớn. Để giảm tải cho
server, chúng ta có thể cache lại kết quả của các lần truy vấn vào bộ nhớ RAM.
2
Cơ chế dự phòng lỗi và khả năng sẵn sàng cao

10
Tính năng này [15] được MySQL hỗ trợ từ phiên bản 4.0.1 trở lên. Mặc định tính
năng này sẽ không được kích hoạt. Chi tiết làm thế nào để kích hoạt tính năng
này và một số thông số cấu hình sẽ được trình bày chi tiết trong mục 3.1.
11
Chương 3
Nghiên cứu cài đặt, sử dụng
memcached và built-in caching
cho MySQL
3.1 Cài đặt và sử dụng memcached
3.1.1 Cài đặt memcached
Cách tốt nhất để cài đặt máy chủ memcached trên một phiên bản Linux
đấy là chúng ta tiến hành tải và biên dịch mã nguồn của nó (source code). Trong
tài liệu này chúng ta sẽ sử dụng hệ điều hành Ubuntu. Sau đây, chúng ta sẽ từng
bước cài đặt và cấu hình một máy chủ memcached trên hệ điều hành Ubuntu.
Nhưng trước tiên bạn cần phải cài đặt gcc - là một tập hợp các trình biên dịch
được thiết kế cho nhiều ngôn ngữ lập trình khác nhau và là trình biên dịch chính
thức của hệ thống GNU
1
. Thứ hai, bạn cần có đặc quyền root để có thể biên dịch
và cài đặt memcached.
1. Cài đặt Libevent
Memcached sử dụng libevent API
2
. Libevent cung cấp một cơ chế để thực
thi tính năng gọi lại khi có một sự kiện xác định nào đó xảy ra. Có thể trên
máy tính của bạn đã được cài đặt libevent trước đó, nhưng bạn cần ít nhất
1
GNU’s Not Unix
2

Application Programming Interface
12
là phiên bản libevent 1.3. Sau đây, chúng ta sẽ tải phiên bản libevent 1.3 và
tiến hành cài đặt nó:
cd /usr/local/src
wget provos/libevent-1.3b.tar.gz
tar zxvf libevent-1.3b.tar.gz
cd libevent-1.3b
./configure
make
make install
Bây giờ, chúng ta cần mở file /etc/ld.so.conf.d/libevent-i386.conf và thêm
thông tin về đường dẫn cho libevent. Bạn có thể dùng một trình soạn thảo văn
bản bất kỳ trong Linux như gedit hay vim để mở file /etc/ld.so.conf.d/libevent-
i386.conf và thêm dòng dưới vào cuối file nếu nó chưa có trong file:
/usr/local/lib/
2. Cài đặt Memcached
Sau khi libevent được cài đặt, chúng ta có thể vào trang chủ của memcached
tại để tải về phiên bản mới nhất của nó. Trong tài liệu
này tôi dùng memcached phiên bản 1.4.13 là phiên bản mới nhất. Sau đây,
chúng ta sẽ đi tải và cài đặt memcached:
cd /usr/local/src
wget />tar zxvf memcached-1.4.13.tar.gz
cd memcached-1.4.13
./configure
make
make install
Vậy là bạn đã cài đặt xong máy chủ memcached. Bây giờ bạn đã được cung
cấp một kịch bản memcached trong /etc/init.d và bạn có thể dùng kịch bản
này để khởi động memcached bằng lệnh /etc/init.d/memcached start. Nó

sẽ tự động chạy mỗi khi máy chủ của bạn khởi động lại.
3. Cấu hình memcached
Chúng ta có thể dùng tham số dòng lệnh để tùy chỉnh các thông số cài đặt
cho máy chủ memcached. Ba tham số chính chúng ta cần lưu lý đấy là -p,
13
-m và -d. Để khởi động memcached với một số tùy chọn, chúng ta dùng lệnh
sau:
memcached -d -l 127.0.0.1 -p 11211 -m 64
Trong đó:
• d = daemon
• m = memory
• l = IP to listen to
• p = port
Chúng ta có thể kiểm tra xem máy chủ memcached đã chạy thành công hay
chưa bằng lệnh:
ps -ef | grep memcached
Hình 3.1: Một số tùy chọn của memcached
14
Mặc định, memcached sẽ có bộ nhớ là 64 MB và lắng nghe trên cổng 11211.
Chúng ta có thể thay đổi cổng lắng nghe của memcached với tham số -p
và liền sau là cổng mà chúng ta muốn thay đổi trong lệnh khởi động mem-
cached ở trên. Tương tự nếu như chúng ta muốn thay đổi độ lớn của bộ
nhớ memcached với tham số -m. Sau tham số -l là địa chỉ máy chủ web mà
chúng ta muốn sử dụng memcached. Trong tài liệu này chúng ta sẽ triển khai
memcached trên localhost. Cuối cùng, tham số -d sẽ chạy memcached như
một daemon. Nếu máy tính của bạn có nhiều bộ vi xử lý hoặc dung lượng
bộ nhớ RAM lớn, bạn có thể cài đặt để chạy nhiều phiên memcached trên
nhiều server web với các vùng bộ nhớ khác nhau.
Bạn có thể xem danh sách các tham số một cách đầy đủ bằng lệnh memached
-h (xem Hình 3.1). Bạn cũng có thể tìm thêm thông tin hướng dẫn cách dùng

các tham số khác trên trang web memcached ( ).
3.1.2 Thao tác với dữ liệu dùng telnet
1. Một số thao tác cơ bản với dữ liệu
Memcached chỉ có bốn lệnh cơ bản liên quan đến lưu trữ và nhận dữ liệu.
Trong phần này, chúng ta sẽ lần lượt tìm hiểu từng lệnh một xem cách thức
mà chúng làm việc như thế nào. Tương tác với máy chủ thông thường diễn
ra trên một kết nối TCP hoặc UDP. Vì thế, chúng ta có thể dùng telnet
3
để tương tác với máy chủ và thực hiện một số lệnh cơ bản. Bây giờ, chúng
ta sẽ tìm hiểu việc dùng telnet để lưu trữ và nhận dữ liệu bằng bốn lệnh cơ
bản mà chúng ta đã nói tới ở trên. Khi chúng ta thực hiện lưu trữ thông tin
gì đó vào trong cache, chúng ta sẽ nhận được một trong hai thông báo xác
nhận: STORED - tức thông tin đã được lưu trữ thành công vào cache, hoặc
NOT_STORED - tức thông tin lưu trữ chưa thành công.
Sau đây, chúng ta sẽ đi tìm hiểu về bốn lệnh cơ bản hay sử dụng trong
memcached:
• SET: Thêm một mục mới vào memcached hoặc nếu mục thêm vào đã
tồn tại thì dữ liệu sẽ được thay thế bằng dữ liệu mới.
3
TErminaL NETwork: là một chương trình truy cập máy tính từ xa dùng dòng lệnh
15
set test1 0 0 10
testing001
STORED
• ADD: Dữ liệu chỉ được lưu trữ nếu khóa (key) không tồn tại trong
memcached. Nếu khóa đã tồn tại, chúng ta sẽ nhận được thông tin xác
nhận NOT_STORED. Ví dụ:
add test1 0 0 10
testing002
NOT_STORED

add test2 0 0 10
testing002
STORED
• REPLACE: Dữ liệu chỉ được lưu trữ nếu khóa đã tồn tại trong mem-
cached. Nếu khóa không tồn tại, chúng ta sẽ nhận được thông tin phản
hồi NOT_STORED. Ví dụ:
replace test1 0 0 10
testing003
STORED
replace test3 0 0 10
testing003
NOT_STORED
• GET: Trả lại dữ liệu. Khi bạn nhận được dữ liệu từ bộ nhớ cache, thông
tin trả về có định dạng như sau: tên của khóa, giá trị của trường cờ mà
bạn đã đặt và số byte sẽ được hiển thị trên một dòng, dữ liệu thực sẽ
trên dòng tiếp theo và cuối cùng trả về END ở dòng cuối. Nếu khóa không
tồn tại trong memcached, nó sẽ trả về END ở dòng đầu tiên. Ví dụ:
get test1
VALUE test1 0 10
testing003
END
get test4
END
get test1 test2
16

×