Khóa luận tập trung tìm hiểu và nghiên cứu cách triển khai hệ thống cached lên một trang web cùng với việc sử dụng bộ nhớ Cache của MySQL nhằmnâng cao hiệu năng truy vấn tới cơ sở dữ liệ
Trang 1ĐẠ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
HÀ NỘI - 2012
Trang 2Lờ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ễnHải Châu, người đã tận tình hướng dẫn tôi trong quá trình thực hiệnkhó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 Đạihọc Công Nghệ đã tạo cho tôi những điều kiện thuận lợi nhất để họctậ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ôngTin đã 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
Trang 3NGHIÊ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 ThanhKhóa QH-2008-I/CQ , ngành Công nghệ Thông tinTó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áctrang mạng xã hội có tính chia sẽ cao như Facebook, Youtube, Twitter hoặc cáctrang 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 đề performanceluô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 đếnhiệu năng của toàn bộ hệ thống Và giải pháp data caching ra đời nhằm mục đíchgiả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 cached lên một trang web cùng với việc sử dụng bộ nhớ Cache của MySQL nhằmnâ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ácyêu cầu tới trang web
Mem-Khóa luận sử dựng Drupal CMS để xây dựng một trang web thử nghiệm Mem-Khóaluận cũng đã triển khai thành công việc sử dụng hệ thống Memcached và QueryCache 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ế
Trang 4Lờ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ấncủ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 trungthự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óaluậ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ệ, Đạihọc Quốc gia Hà Nội
Sinh Viên
Lê Duy Thanh
Trang 5Mục lục
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
Trang 6MỤ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
Trang 7Danh 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
Trang 8DANH 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
Trang 9Bả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
Trang 10Lờ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ệclư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 truycập gần đây nhất của bộ nhớ chính Kỹ thuật caching được thực hiện bởi cácnhà thiết kế hệ thống để cải thiện thời gian phản hồi của ứng dụng và giảmtải hệ thống Phương pháp caching từ lâu đã được sử dụng để cải thiện hiệusuất của các ứng dụng Internet Có rất nhiều phương pháp caching được cácnhà thiết kế cơ sở dữ liệu sử dụng như CPU cache, Web cache, Databasecache, 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 ứngdụng trên nền web Nó rất thích hợp để caching những dữ liệu được truycập nhiều nhưng ít bị thay đổi, nó giúp tăng tốc truy cập và giảm workloadvớ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ớinhiề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ùngtrê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ụngnhư 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 baogồm hàng ngàn servers với hàng chục terabytes dữ liệu được cached tại mỗithờ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ánperformance cho các ứng dụng web Memcached giúp nâng cao performancecho 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ấncủ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ệ
Trang 11thống Memcached đơn giản cùng với việc thiết lập một số thông số built-incaching của MySQL nhằm tăng tốc độ truy xuất, giảm thời gian phản hồicủ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ớigiú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ủaMemcached 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 Memcachedtrên hệ điều hành Ubuntu 11.10 Đồng thời tìm hiểu một số thao tácvới Memcached dùng telnet và dùng Memcached Linux Client Phầnsau sẽ đi nghiên cứu, tìm hiểu cách cài đặt và sử dụng built-in cachingMySQL Trong phần này sẽ trình bày chi tiết về một số thông số củaquery 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íchhợp trang web với Memcached kết hợp với sử dụng Query Cache củaMySQL 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ếtquả mà Memcached và Query Cache MySQL mang lại cho trang webthử 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ứutiếp theo của khóa luận
Trang 12Trong 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 DataCaching 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ựavà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ếpvào cơ sở dữ liệu gốc
Trang 13Hì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ượngtruy 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ẳngbao 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 truyvấn đang chờ đợi Nhược điểm này đã được mô hình Data Caching khắc phục Mỗikhi 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áychủ 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ờivà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ấntươ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
Trang 14Theo nghiên cứu của Qiong Luo và các cộng sự [9] việc sử dụng DatabaseCaching 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ừ backend1 tới nhiều
hệ thống front-end2 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ụ (QoS3), 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ệucủa khách hàng Platinum được lưu trữ trong khi dữ liệu của các khách hàngbì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à backendserver 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
Trang 15cơ 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 Saukhi cài đặt hoàn chỉnh memcached và đưa vào sử dụng, người ta đã thống kê đượcrằ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
Trang 16nhâ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ị (NVPs1) trong bộ nhớ.Giá trị trong cặp tên – giá trị có thể là bất cứ dữ liệu nào đó trong memcachednhư : 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 tabiế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 MemcachedMemcached 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 NVPvớ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ủakhó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 đượclưu không vượt quá 1 MB Ngoài ra, mỗi máy chủ memcached là một phần tử độclập Nó không biết và cũng không quan tâm tới bất kỳ một máy chủ memcachednà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
Trang 17nhiệ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ềunà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 truyvấn tới cơ sở dữ liệu Memcached đơn giản nhưng thực sự mạnh mẽ Thiết kế đơngiản của nó thúc đẩy triển khai nhanh chóng, dễ dàng phát triển và giải quyếtnhiề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ôngnghĩ 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 nhaucủ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ạntă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ểnkhai:
Hình 2.2: Mô hình không sử dụng Memcached
Trang 18Hình 2.3: Mô hình sử dụng Memcached
- Mỗi nút là hoàn toàn độc lập (Hình2.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ớ cachechỉ 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ảigiữ 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 trongcù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ốngcủ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ó trongMemcached hay không đấy là truy vấn tới máy chủ và tìm nó Điều này được thiết
Trang 19kế từ khi Memcached được tối ưu hóa cho một máy chủ lưu trữ tạm thời chứ khôngphả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ủ Memcachedhoà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 điquá 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 đượctớ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ôngphả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áyyê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áccổng xác định bởi IP Address hoặc IP Range Việc triển khai cụ thể các phươngphá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-availability2 Nếunhư 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ữngtruy 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 íchcho 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ắnMySQL 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 choserver, 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
Trang 20Tí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ínhnă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ăngnà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.
Trang 21Chương 3
Nghiên cứu cài đặt, sử dụng
memcached và built-in caching
và cài đặt memcached
1 Cài đặt Libevent
Memcached sử dụng libevent API2 Libevent cung cấp một cơ chế để thựcthi 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ênmá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
Trang 22là 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ó:
/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 memcachedtại http://memcached.org để tải về phiên bản mới nhất của nó Trong tài liệunà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 http://memcached.googlecode.com/files/memcached-1.4.13.tar.gztar zxvf memcached-1.4.13.tar.gz
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 đặtcho máy chủ memcached Ba tham số chính chúng ta cần lưu lý đấy là -p,
Trang 23-m và -d Để khởi động memcached với một số tùy chọn, chúng ta dùng lệnhsau:
ps -ef | grep memcached
Hình 3.1: Một số tùy chọn của memcached
Trang 24Mặ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 (http://www.danga.com/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 telnet3
để 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
Trang 26và khóa test3 Tuy nhiên chỉ khóa test1 đã tồn tại trong memcached,máy chủ sẽ thực hiện thay thế dữ liệu cũ và lưu trữ dữ liệu mới chokhóa này và nó không lưu trữ bất kỳ dữ liệu nào cho khóa test3 vì khóanày không tồn tại trong khi lệnh replace yêu cầu khóa phải tồn tại.
Khi chúng ta dùng lệnh get, memcached sẽ trả về hai dòng dữ liệu.Dòng thứ nhất được bắt đầu với từ khóa VALUE, nó cho biết đó là giá trịđược trả về Giá trị đầu tiên là từ khóa được yêu cầu, tiếp theo là giátrị trường cờ (flag) và cuối cùng là số byte memcached trả về Dòng thứhai là từ khóa END - thông báo dữ liệu trả về đã hoàn thành Nếu chúng
ta sử dụng lệnh get với khóa không tồn tại, như test3, thì sẽ không cóbất kỳ dữ liệu nào được trả về, khi đó memcached trả về từ khóa ENDxuất hiện ở dòng đầu tiên Nếu chúng ta muốn get nhiều khóa trongcùng một yêu cầu (request) thì mỗi từ khóa cách nhau một dấu cách.Khi đó, chúng ta chỉ nhận được thông tin của những khóa có dữ liệu.Nếu tất cả từ khóa chúng ta get đều không có dữ liệu, thì chúng ta sẽnhận được thông báo END
Ngoài bốn lệnh cơ bản trên, memcached còn cung cấp một số lệnh khác.Sau đây, chúng ta hãy cùng tìm hiểu qua về chúng:
• DELETE: Lệnh này sẽ xóa bỏ một giá trị được lưu trữ theo khóa củachúng Chúng ta sẽ tìm hiểu kỹ hơn về lệnh này trong mục 2 Xóa dữliệu từ memcached
• INCR: Tăng trường khóa lên một giá trị Chúng ta có thể sử dụng nó
Trang 27như một hàng đợi hoặc như một biến đếm.
• DECR: Giảm trường khóa xuống một giá trị Chúng ta có thể sử dụng
nó như một hàng đợi hoặc như một biến đếm
• STATS: Trả về các thông số trạng thái của máy chủ memcached.Chúng ta hãy tìm hiểu thêm một chút về lệnh INCR (Increment) và DECR(Decrement) thông qua ví dụ sau: Trên một trang web mà chúng ta triểnkhai memcached, chúng ta tiến hành lưu trữ một số kiểu dữ liệu khác nhautrong bộ nhớ cache Khi chúng ta thiết lập một trường cờ gỡ lỗi, nó sẽ bắtđầu sử dụng INCR trên hai khóa cho mỗi loại dữ liệu, một cho cache hits vàmột cho cache misses Điều này giúp chúng ta truy vấn tới bộ nhớ cache theođịnh kỳ để xem các kiểu dữ liệu cụ thể được lưu trữ như thế nào và nó cóthể cảnh báo trước cho chúng ta nơi mà có vấn đề gì đó xảy ra liên quan tới
dữ liệu Nhờ vậy mà chúng ta có thể kiểm soát được tốt hơn một số rủi ro
có thể xảy đến với dữ liệu trong memcached
Một nhược điểm của INCR và DECR là chúng yêu cầu NVP phải đã tồn tạitrước khi sử dụng Nếu chúng ta sử dụng chúng với một giá trị không tồntại, chúng ta sẽ nhận được thông báo ERROR Cấu trúc của lệnh này là:INCR/DECR key value
2 Xóa dữ liệu từ memcached
Có một cách để chúng ta có thể xóa bỏ dữ liệu từ memcached đó là chúng
ta dùng lệnh delete Cú pháp của lệnh delete rất đơn giản: delete key.Trong khi telnet tới máy chủ memcached, chúng ta có thể đánh lệnh sau đểxóa bỏ dữ liệu mà chúng ta muốn theo key của dữ liệu đó Ví dụ:
có thể làm việc tốt hơn, các chỉ mục sẽ không bị xóa khỏi bộ nhớ cho tới khi
bộ nhớ bị đầy và cần thêm không gian nhớ Việc làm này hiệu quả hơn rấtnhiều so với việc đi lần lượt qua từng chỉ mục một trong bộ nhớ và xóa bỏ
Trang 28chúng Điều này làm tốn rất nhiều thời gian Khi memcached cần bộ nhớ đểlưu những đối tượng mới mà không có những vùng nhớ đã hết hiệu lực hoặcnhững vùng nhớ đã bị xóa trước đó để sử dụng lại, khi đó memcached sẽ sửdụng thuật toán Least Recently Used (LRU) để xóa bỏ những chỉ mục ítđược sử dụng gần đây nhất, có nghĩa là những chỉ mục đã không được sửdụng lại trong thời gian dài nhất trong bộ nhớ và không có giá trị lưu trữlâu dài trong memcached, tức những chỉ mục có tần suất sử dụng thấp.
3.1.3 Một số lựa chọn lưu trữ dữ liệu
Trong phần này, chúng ta hãy cùng tìm hiểu về một số thông số được dùngtrong các lệnh lưu trữ, thao tác mà chúng ta đã biết trong các phần trước Với cáclệnh cơ bản set, add và replace mà chúng ta đã biết đều có bốn thông số cơ bản
mà chúng ta sẽ lần lượt xem xét sau đây:
• keyname: là khóa của các cặp tên giá trị, bất kỳ dữ liệu nào khi được thêmvào memcached sẽ được cấp một khóa tương tứng với dữ liệu đó Và khichúng ta lấy lại dữ liệu từ memcached sẽ dựa vào trường khóa này
• flag: là một số nguyên đi kèm với khóa Nó được dùng khi client muốn lưutrữ một số thông tin về khóa
• expiration time: Nếu tham số này được đặt là 0 thì đối tượng được lưu sẽkhông bao giờ bị xóa khi bộ nhớ vẫn còn trống hoặc người không dùng lệnhdelete Thời gian mà một đối tượng có thể được lưu trữ là 1 − 2, 592, 0003giây
• bytes: Số byte được lưu trữ
Trong các ví dự trước, chúng ta đã đặt các tham số flag và expiration time
là 0, tức là dữ liệu lưu trữ sẽ không bị mất nếu bộ nhớ chưa đầy Ví dụ sau đâychúng ta sẽ thiết lập thời gian hết hạn cho dữ liệu bằng cách đặt giá trị cho tham
số expiration time Trong ví dụ, chúng ta thiết lập thời gian hết hạn cho dữ liệu
là 10 giây Sau khi lưu trữ dữ liệu bạn có thể kiểm tra bằng cách dùng lệnh gettrong thời gian 10 giây đầu và sau 10 giây để xem sự khác biệt
set test1 0 10 10
testing001
Trang 29Ngoài các tham số lựa chọn trên, chúng ta còn có một tham số lựa chọn nữa đó
là noreply Với lựa chọn này, memcached sẽ không trả về các thông báo STOREDhoặc NOT_STORED Điều này sẽ giúp memcached xử lý được nhiều yêu cầu hơn do đãbớt đi được một thông điệp xác nhận Tuy vậy, khi có một yêu cầu tới memcached
sẽ xảy ra một trong hai trường hợp: dữ liệu được yêu cầu có hoặc không có trongmemcached Trường hợp dữ liệu không có trong memcached có thể là dữ liệu đó
đã hết thời hạn được lưu trữ hoặc nó đã được xóa bởi người quản trị, cũng có thể
là nó đã bị xóa khi bộ nhớ đầy và cần thêm không gian nhớ cho dữ liệu mới hoặc
có thể dữ liệu đó chưa bao giờ được lưu vào memcached Một số chương trình sửdụng memcached không thực sự quan tâm tới việc tại sao dữ liệu lại không cótrong memcached, nó chỉ cần có dữ liệu được trả về Nhưng cũng có những trườnghợp, chương trình cần biết xem dữ liệu đã được lưu trữ thành công hay chưa Vìthế mà tham số noreply thường không được sử dụng
3.1.4 Thao tác với dữ liệu dùng một thư viện memcached
Client
Trong phần trước, chúng ta đã đi tìm hiểu về làm thế nào để cài đặt và tươngtác với memcached sử dụng một telnet client Tuy nhiên, trong thực tế, việc sửdụng một telnet client để tương tác với máy chủ memcached là một việc khôngmấy thực tế Trong khi chúng ta hoàn toàn có thể viết mã chương trình của chínhmình sử dụng TCP hoặc UDP để tương tác với máy chủ Chúng ta may mắn là đã
có rất nhiều mã chương trình thực hiện điều này, và có rất nhiều thư viện trìnhkhách mà chúng ta có thể sử dụng để lập trình chương trình tương tác với máychủ Danh sách bao gồm:
Trang 303.1.5 Cài đặt memcached Linux client
Có một số trình khách sẵn có để sử dụng trên hệ thống Linux Trong tài liệunày, chúng ta sẽ đi cài đặt trình khách Perl memcached, nó sẵn có trên CPAN(Comprehensive Perl Archive Network) Để cài đặt nó, chúng ta cần phải đăngnhập vào hệ thống Linux như một siêu người dùng (super-user) và chắc chắn rằngPerl đã được cài đặt trên hệ thống Chúng ta mở terminal và đánh dòng lệnh sau:perl -MCPAN -e shell
Khi bạn đang ở dấu nhắc lệnh CPAN, đánh Cache::Memcached Khi CPAN hoànthành việc cài đặt và tạo module, bạn có thể thoát ra và bây giờ bạn đã thực sựsẵn sàng để dùng memcached
Bây giờ, chúng ta sẽ tìm hiểu việc dùng Perl Client như thế nào Bước đầu tiên
để sử dụng memcached Perl client, chúng ta khai báo: use Cache::Memcached.Tiếp theo, chúng ta định nghĩa danh sách các server sẽ dùng Dòng thứ 6 trongđoạn code bên dưới định nghĩa server mà chương trình Perl sẽ dùng, định dạngcủa khai báo này là Server:PortNumber Sau đó chúng ta thực hiện tải dữ liệu.Chúng ta có thể định nghĩa để sử dụng một hoặc nhiều server Trong trường hợpdùng nhiều server thì mỗi server được khai báo phân cách nhau bằng dấu ","
#memcachedHashTest.pl
#!/usr/bin/perl
Trang 31use Cache::Memcached;
# Set the server list up
my $memd = new Cache::Memcached {’servers’ => [ "127.0.0.1:11211"],};
#flush the servers to remove any unwanted data before testing
$memd->set(Name, Value);
Trong ví dụ này, chúng ta đã thực hiện lưu trữ dữ liệu vào memcached, bây giờchúng ta hãy lấy lại nó Có hai cách để nhận lại dữ liệu từ memcached dùng Perlclient Cách thứ nhất, chúng ta có thể dùng get để nhận lại dữ liệu Đoạn mã sau
sẽ thực hiện lấy dữ liệu có khóa 73EB7DE0-9452-4607-AAFC-8F7B625E75A3 trongmemcached và in ra kết quả
Trang 32Cách thứ hai để lấy lại dữ liệu dùng Perl client là sử dụng multi-get Perl clientcho phép chúng ta sử dụng hàm get_multi bằng cách đi qua một mảng các khóa
để tìm kiếm
#memcachedHashGetMulti.pl
#!/usr/bin/perl
use Cache::Memcached;
# Set the server list up
my $memd = new Cache::Memcached {’servers’ => [ "127.0.0.1:11211"],};
print $arrayref," = ", $hashref->{$arrayref},"\n";}
else {print $arrayref," DOES NOT EXIST!\n";}
}
Những lợi ích của việc sử dụng một Client
Ngoài việc đóng gói những truy cập của chúng ta tới memcached, một client còn
Trang 33cung cấp một số lợi ích sau:
• Nó sử dụng một thuật toán băm để xác định máy chủ NVP sẽ lưu trữ dữliệu hoặc nhận dữ liệu từ máy chủ đó
• Nó có thể cung cấp khả năng nén dữ liệu để chúng ta có thể lưu trữ NVPsvới kích thước vượt quá 1MB
3.2 Cài đặt và sử dụng built-in caching MySQL
3.2.1 Cài đặt Query Cache cho MySQL
Bản thân MySQL cũng cung cấp khả năng cache các truy vấn tới cơ sở dữ liệu
Hình 3.2: Danh sách các biến của hệ thống Query Cache
Để bật tính năng này của MySQL, chúng ta thêm hai dòng sau vào phần [mysqld]