Thứ năm, 01/05/2014 | 00:00 GMT+7

Cách cài đặt và sử dụng Memcache trên Ubuntu 14.04

Khi các trang web phát triển và tăng lưu lượng truy cập, một trong những thành phần thể hiện sự căng thẳng nhanh nhất là database backend . Nếu database của bạn không được phân phối và cấu hình để xử lý tải cao, nó có thể dễ dàng bị quá tải do lưu lượng truy cập tăng tương đối khiêm tốn.

Một cách để giải quyết vấn đề này là sử dụng hệ thống bộ nhớ đệm đối tượng bộ nhớ, như memcached . Memcached là một hệ thống bộ nhớ đệm hoạt động bằng cách lưu trữ tạm thời thông tin trong bộ nhớ thường được truy xuất từ database . Yêu cầu tiếp theo đối với thông tin trong bộ nhớ sau đó cực kỳ nhanh chóng mà không gây căng thẳng cho database backend .

Trong hướng dẫn này, ta sẽ thảo luận về cách cài đặt và sử dụng memcached trên server Ubuntu 14.04.

Yêu cầu

Trước khi ta bắt đầu, bạn nên có một regular user , không phải root trên server của bạn, người này có quyền truy cập vào các quyền sudo . Nếu bạn chưa tạo user như vậy, bạn có thể làm như vậy theo các bước từ 1-4 trong hướng dẫn cài đặt ban đầu cho Ubuntu 14.04 của ta .

Khi bạn đã cấu hình regular user của bạn , hãy tiếp tục với hướng dẫn này.

Cài đặt Memcached và các thành phần

Để bắt đầu, ta nên lấy tất cả các thành phần ta cần từ kho của Ubuntu. May mắn là mọi thứ ta cần đều có sẵn.

Vì đây là hoạt động đầu tiên của ta với apt trong phiên này, ta nên cập nhật index gói local của bạn . Sau đó, ta có thể cài đặt các chương trình của ta .

Ta sẽ cài đặt memcached cũng như chương trình backend database MySQL và PHP để xử lý tương tác. Ta cũng đang cài đặt phần mở rộng PHP để xử lý các tương tác memcached. Bạn có thể nhận được mọi thứ mình cần bằng lệnh :

sudo apt-get update sudo apt-get install mysql-server php5-mysql php5 php5-memcached memcached 

Lưu ý có sẵn * hai phần mở rộng PHP memcache. Một phần mở rộng có tên là php5-memcache và phần còn lại có tên là php5-memcached (lưu ý dấu “d” trong ví dụ thứ hai). Ta đang sử dụng phần mở rộng thứ hai vì nó ổn và triển khai nhiều tính năng hơn.

Nếu bạn chưa cài đặt MySQL, cài đặt sẽ nhắc bạn chọn và xác nhận password của administrator .

Điều này sẽ cài đặt và cấu hình mọi thứ bạn cần.

Kiểm tra cài đặt

Tin hay không thì tùy bạn, memcached đã được cài đặt hoàn chỉnh và sẵn sàng hoạt động. Ta có thể kiểm tra theo một số cách khác nhau.

Cách đầu tiên là khá đơn giản. Ta chỉ có thể hỏi PHP xem nó có biết về tiện ích mở rộng memcached của ta hay không và liệu nó có được kích hoạt hay không. Ta có thể làm điều này bằng cách tạo trang thông tin PHP phổ biến.

Điều này có thể dễ dàng thực hiện bằng cách tạo một file có tên là info.php trong tài liệu root của ta . Trong Apache trên Ubuntu 14.04, root tài liệu mặc định của ta là /var/www/html . Mở file tại đây với quyền root:

sudo nano /var/www/html/info.php 

Trong file này, hãy gõ cái này ra. Về cơ bản, điều này chỉ gọi một hàm PHP thu thập và in thông tin về server của ta vào một bố cục thân thiện với web.

<?php phpinfo(); ?> 

Bây giờ, bạn có thể truy cập vào domain hoặc địa chỉ IP công cộng của server , theo sau là /info.php và bạn sẽ thấy một trang thông tin.

<pre>
http: // <span class = “highlight”> tên domain hoặc IP server </span> /info.php
</pre>

Nếu bạn cuộn xuống hoặc tìm kiếm tiêu đề phần “memcached”, bạn sẽ tìm thấy một cái gì đó giống như sau:

Phần thông tin PHP trong Memcache

Điều này nghĩa là phần mở rộng memcached đã được kích hoạt và được tìm thấy bởi web server .

Ta cũng có thể kiểm tra xem dịch vụ memcached có đang chạy hay không bằng lệnh :

ps aux | grep memcached 

memcache  6584  0.0  0.0 327448  3004 ?        Sl   14:07   0:00 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 demouser  6636  0.0  0.0  11744   904 pts/0    S+   14:29   0:00 grep --color=auto memcached 

Bạn có thể truy vấn dịch vụ để biết số liệu thống kê bằng lệnh :

echo "stats settings" | nc localhost 11211 

Nếu bạn cần dừng, bắt đầu hoặc khởi động lại dịch vụ memcached, bạn có thể thực hiện việc này bằng lệnh thông tin như sau:

<pre>
sudo service memcached <span class = “highlight”> khởi động lại </span>
</pre>

Kiểm tra xem Memcached có thể lưu vào bộ nhớ cache dữ liệu hay không

Bây giờ ta đã xác minh memcached đang chạy và tiện ích mở rộng PHP của ta để kết nối với nó đã được bật, ta có thể cố gắng để nó lưu trữ dữ liệu.

Ta sẽ làm điều này bằng cách tạo một tập lệnh PHP khác. Lần này, nó sẽ phức tạp hơn.

Mở một file có tên cache_test.php trong root tài liệu của ta :

sudo nano /var/www/html/cache_test.php 

Bên trong, hãy bắt đầu bằng cách tạo các thẻ shell bọc PHP:

<pre>
<? php
?>
</pre>

Trong đó, ta sẽ tạo một version mới của đối tượng PHP Memcached và lưu trữ nó trong một biến. Ta sẽ xác định vị trí mà đối tượng PHP này có thể kết nối với dịch vụ memcached thực sự đang chạy trên server của ta . Memcached chạy trên cổng 11211 theo mặc định:

<pre>
<? php
<span class = “highlight”> $ mem = new Memcached (); </span>
<span class = “highlight”> $ mem-> addServer (“127.0.0.1”, 11211); </span>
?>
</pre>

Tiếp theo, ta sẽ yêu cầu version Memcached của ta truy vấn khóa từ bộ nhớ cache của ta . Khóa này có thể được gọi là bất cứ thứ gì, vì ta chưa tạo ra nó. Ta sẽ sử dụng "blah". Kết quả của yêu cầu này sẽ được lưu trữ thành một biến $result :

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

<span class = “highlight”> $ result = $ mem-> get (“blah”); </span>
?>
</pre>

Tiếp theo, ta chỉ cần kiểm tra xem có gì được trả lại hay không. Nếu memcached tìm thấy một khóa có tên “blah”, ta muốn nó in ra giá trị được liên kết với khóa đó. Nếu memcached không thể tìm thấy khóa phù hợp, ta nên in ra một thông báo như vậy.

Sau đó, ta nên đặt khóa với một giá trị để lần tiếp theo ta yêu cầu giá trị, memcached sẽ tìm thấy giá trị mà ta cung cấp cho nó:

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

$ result = $ mem-> get (“blah”);

<span class = “highlight”> if ($ result) {</span>
<span class = “highlight”> echo $ result; </span>
<span class = “highlight”>} khác {</span>
<span class = “highlight”> echo “Không tìm thấy khóa phù hợp. Tôi sẽ thêm nó ngay bây giờ! ”; </span>
<span class = “highlight”> $ mem-> set (“blah”, “Tôi là dữ liệu! Tôi bị giữ trong memcached!”) hoặc chết (“Không thể lưu bất kỳ thứ gì vào memcached…”); </span>
<span class = “highlight”>} </span>
?>
</pre>

Đến đây, kịch bản của ta đã xong. Nếu ta truy cập trang này trong trình duyệt web của bạn , ta có thể thấy cách hoạt động của trang này:

<pre>
http: // <span class = “highlight”> tên domain hoặc IP server </span> /cache_test.php
</pre>

Ban đầu bạn sẽ thấy một trang trông như thế này:

Tin nhắn chưa được lưu trong bộ nhớ cache

Tuy nhiên, nếu ta làm mới trang, ta sẽ thấy một thông báo khác:

Tin nhắn đã lưu trong bộ nhớ cache

Như bạn thấy , dịch vụ memcached của ta hiện đang lưu trữ dữ liệu mà tập lệnh của ta đã đặt.

Kiểm tra giá trị database tạm thời lưu vào bộ nhớ đệm

Bây giờ ta đã kiểm tra khả năng lưu trữ dữ liệu trong memcached, ta có thể chứng minh một kịch bản thực tế hơn: tạm thời lưu trữ các kết quả từ một truy vấn database .

Tạo dữ liệu mẫu trong MySQL

Để làm điều này, trước tiên ta cần lưu trữ một số thông tin trong database của bạn .

Kết nối với version MySQL của bạn với quyền là admin-user bằng lệnh vào đây. Bạn sẽ phải nhập password root MySQL mà bạn đã đặt trong quá trình cài đặt:

mysql -u root -p 

Sau đó, bạn sẽ nhận được một dấu nhắc MySQL.

Đầu tiên, ta muốn tạo một database để thử nghiệm. Sau đó, ta sẽ chọn database :

CREATE DATABASE mem_test; USE mem_test; 

Hãy tạo một user được gọi là test với password testing123 có quyền truy cập vào database mà ta đã tạo:

GRANT ALL ON mem_test.* TO test@localhost IDENTIFIED BY 'testing123'; 

Bây giờ, ta sẽ tạo một bảng thực sự cơ bản và chèn một bản ghi vào đó. Bảng sẽ được gọi là sample_data và nó sẽ chỉ có một index và một trường chuỗi:

CREATE TABLE sample_data (id int, name varchar(30)); INSERT INTO sample_data VALUES (1, "some_data"); 

Bây giờ, ta đã tạo cấu trúc và dữ liệu được chèn vào. Ta có thể thoát khỏi MySQL:

exit 

Tạo tập lệnh PHP để lưu vào bộ nhớ đệm dữ liệu MySQL

Bây giờ ta đã có dữ liệu trong MySQL, ta có thể tạo một tập lệnh PHP khác sẽ hoạt động theo cách tương tự như một ứng dụng PHP production .

Nó sẽ tìm kiếm dữ liệu trong memcached và trả về nếu nó tìm thấy dữ liệu. Nếu nó không tìm thấy dữ liệu, nó sẽ truy vấn từ chính database và sau đó lưu trữ kết quả trong memcached cho các truy vấn sau này.

Để bắt đầu, hãy tạo một tập lệnh PHP khác trong root tài liệu của ta . Ta sẽ gọi script này là database_test.php :

sudo nano /var/www/html/database_test.php 

Bắt đầu theo cách tương tự như kịch bản cuối cùng của ta . Ta sẽ tạo một version PHP memcached và sau đó cho nó biết vị trí của dịch vụ memcached đang chạy trên server của ta , giống như ta đã làm lần trước:

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);
?>
</pre>

Tiếp theo, trong lần khởi hành đầu tiên từ tập lệnh cuối cùng, ta sẽ phải xác định cách PHP có thể kết nối với database MySQL của ta . Ta cần chỉ định thông tin đăng nhập cho user mà ta đã tạo và sau đó ta cần cho người đó biết database nào sẽ sử dụng:

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

<span class = “highlight”> mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ()); </span>
<span class = “highlight”> mysql select db (“mem test”) or die (mysql error ()); </span>
?>
</pre>

Tiếp theo, ta sẽ phải thiết kế truy vấn mà ta cần để tìm nạp dữ liệu mà ta đã chèn vào bảng của bạn . Ta sẽ lưu trữ điều này vào một biến $query .

Sau đó, ta sẽ tạo một biến $querykey để lưu trữ khóa mà memcached sẽ sử dụng để tham chiếu thông tin của ta .

Ta tạo khóa này bằng cách sử dụng chuỗi “KEY” và sau đó thêm tổng kiểm tra md5 (một phương pháp băm) của truy vấn của ta vào cuối. Điều này sẽ đảm bảo mỗi khóa là duy nhất nếu ta sử dụng kỹ thuật này trên một tập dữ liệu lớn hơn. Nó cũng đảm bảo một truy vấn phù hợp sẽ tạo ra cùng một khóa cho các yêu cầu tiếp theo.

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
mysql select db (“mem test”) or die (mysql error ());

<span class = “highlight”> $ query = “CHỌN ID TỪ dữ liệu mẫu WHERE name = 'some data'”; </span>
<span class = “highlight”> $ querykey = “KEY”. md5 ($ query); </span>
?>
</pre>

Tiếp theo, ta sẽ tạo một biến $result , giống như tập lệnh cuối cùng của ta . Điều này sẽ giữ kết quả từ truy vấn đã ghi nhớ của ta , giống như trước đây. Ta đang yêu cầu memcached cho khóa truy vấn mà ta đã tạo để xem liệu nó có bản ghi được xác định bởi khóa đó trong hệ thống của nó hay không.

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
mysql select db (“mem test”) or die (mysql error ());

$ query = “CHỌN tên TỪ dữ liệu mẫu WHERE id = 1”;
$ querykey = “KEY”. md5 ($ truy vấn);

<span class = “highlight”> $ result = $ mem-> get ($ querykey); </span>
?>
</pre>

Bây giờ ta đã sẵn sàng thực hiện logic kiểm tra thực tế sẽ xác định điều gì sẽ xảy ra khi kết quả được tìm thấy trong memcached. Nếu kết quả được tìm thấy, ta muốn in dữ liệu mà ta đã lấy ra và cho user biết rằng ta có thể truy xuất trực tiếp từ memcached:

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
mysql select db (“mem test”) or die (mysql error ());

$ query = “CHỌN tên TỪ dữ liệu mẫu WHERE id = 1”;
$ querykey = “KEY”. md5 ($ truy vấn);

$ result = $ mem-> get ($ querykey);

<span class = “highlight”> if ($ result) {</span>
<span class = “highlight”> print “<p> Dữ liệu là:”. $ kết quả [0]. “</p>”; </span>
<span class = “highlight”> print “<p> Lưu vào bộ nhớ đệm thành công! </p> <p> Dữ liệu được truy xuất từ bộ nhớ đệm! </p>”; </span>
<span class = “highlight”>} </span>
?>
</pre>

Bây giờ, hãy thêm logic cho kịch bản thay thế. Nếu kết quả không được tìm thấy, ta muốn sử dụng truy vấn mà ta đã tạo để yêu cầu MySQL cung cấp dữ liệu. Ta sẽ lưu trữ điều này vào biến $result mà ta đã thực hiện. Điều này sẽ ở dạng một mảng.

Sau khi ta có kết quả của truy vấn, ta cần thêm kết quả đó vào memcached để dữ liệu sẽ ở đó vào lần tiếp theo ta làm điều đó. Ta có thể thực hiện việc này bằng cách cung cấp khóa memcached mà ta muốn sử dụng để tham chiếu dữ liệu ( ta đã tạo khóa này với biến $querykey ), bản thân dữ liệu (được lưu trữ trong biến $result từ truy vấn MySQL) và thời gian để bộ nhớ cache dữ liệu trong vài giây.

Ta sẽ lưu nội dung của bạn vào bộ nhớ cache trong 10 giây. Trong thế giới thực, rất có thể sẽ có lợi khi lưu nội dung vào bộ nhớ cache lâu hơn. Có lẽ gần 10 phút (600 giây) nếu nội dung của bạn không thay đổi nhiều. Để thử nghiệm, một giá trị nhỏ hơn cho phép ta xem những gì đang xảy ra nhanh hơn mà không cần khởi động lại dịch vụ bộ nhớ đệm của ta .

Sau đó, ta sẽ in ra một thông báo tương tự với kết quả truy vấn và cho user biết điều gì đã xảy ra. Ta nên thêm toàn bộ khối này làm khối else cho khối trước của ta if :

<pre>
<? php
$ mem = new Memcached ();
$ mem-> addServer (“127.0.0.1”, 11211);

mysql connect (“localhost”, “test”, “testing123”) hoặc chết ( lỗi mysql ());
mysql select db (“mem test”) or die (mysql error ());

$ query = “CHỌN tên TỪ dữ liệu mẫu WHERE id = 1”;
$ querykey = “KEY”. md5 ($ truy vấn);

$ result = $ mem-> get ($ querykey);

if ($ kết quả) {
print “<p> Dữ liệu là:”. $ kết quả [0]. “</p>”;
print “<p> Lưu vào bộ nhớ đệm thành công! </p> <p> Dữ liệu được truy xuất từ bộ nhớ đệm! </p>”;
} <span class = “highlight”> else {</span>
<span class = “highlight”> $ result = mysql tìm nạp mảng ( truy vấn mysql ($ query)) hoặc chết ( lỗi mysql ()); </span>
<span class = “highlight”> $ mem-> set ($ querykey, $ result, 10); </span>
<span class = “highlight”> print “<p> Dữ liệu là:”. $ kết quả [0]. “</p>”; </span>
<span class = “highlight”> print “<p> Không tìm thấy dữ liệu trong memcached. </p> <p> Dữ liệu được truy xuất từ MySQL và được lưu trữ trong memcached cho lần sau. </p>”; </span>
<span class = “highlight”>} </span>
?>
</pre>

Đây là kịch bản đã hoàn thành của ta . Nó sẽ cố gắng lấy dữ liệu từ memcached và trả về. Nếu không, nó sẽ truy vấn trực tiếp từ MySQL và lưu kết quả vào bộ nhớ cache trong 10 giây.

Kiểm tra tập lệnh

Bây giờ ta đã viết tập lệnh, ta có thể chạy nó bằng cách truy cập vị trí file trong trình duyệt web của ta :

<pre>
http: // <span class = “highlight”> tên domain hoặc IP server </span> /database_test.php
</pre>

Lần đầu tiên ta truy cập trang, ta sẽ thấy kết quả giống như sau:

Truy vấn database  chưa được lưu trong bộ nhớ cache

Nếu ta làm mới điều này (trong vòng 10 giây kể từ lần truy cập cuối cùng của ta ), trang sẽ hiển thị một thông báo khác:

Truy vấn database  đã lưu trong bộ nhớ đệm

Nếu ta đợi một chút nữa, nội dung đã lưu trong bộ nhớ đệm sẽ hết hạn và lại bị xóa khỏi bộ nhớ đệm. Ta có thể làm mới tại thời điểm này để nhận lại thông báo đầu tiên, vì server phải quay lại database để nhận các giá trị thích hợp.

Kết luận

Bây giờ, bạn đã hiểu rõ về cách hoạt động của memcached và cách bạn có thể tận dụng nó để giữ cho web server của bạn không đánh database liên tục cho cùng một nội dung.

Mặc dù các tập lệnh PHP mà ta tạo trong hướng dẫn này chỉ là ví dụ, chúng sẽ cung cấp cho bạn một ý tưởng tốt về cách hệ thống hoạt động. Nó cũng sẽ cung cấp cho bạn một ý tưởng tốt về cách cấu trúc mã của bạn để bạn có thể kiểm tra memcached và quay lại database nếu cần.

<div class = “author”> Bởi Justin Ellingwood </div>


Tags:

Các tin trước

Cách thiết lập NFS Mount trên Ubuntu 14.04 2014-04-30
Cách cài đặt và cấu hình Postfix trên Ubuntu 14.04 2014-04-29
Cách cài đặt và cấu hình Postfix trên Ubuntu 14.04 2014-04-29
Cách thêm swap trên Ubuntu 14.04 2014-04-28
Cách cài đặt WordPress trên Ubuntu 14.04 2014-04-24
Cách cài đặt và bảo mật phpMyAdmin trên Ubuntu 14.04 2014-04-23
Cách cài đặt Solr trên Ubuntu 14.04 2014-04-23
Cách cài đặt Git trên Ubuntu 14.04 2014-04-23
Cách thêm và xóa người dùng trên VPS Ubuntu 14.04 2014-04-22
Cách cài đặt và cấu hình Slim Framework trên Ubuntu 14.04 2014-04-22