Thứ ba, 27/05/2014 | 00:00 GMT+7

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

Thu thập thông tin về hệ thống và ứng dụng của bạn có thể cung cấp cho bạn thông tin cần thiết để đưa ra quyết định sáng suốt về cơ sở hạ tầng, server và phần mềm của bạn.

Có nhiều cách khác nhau để thu nhận loại thông tin này và hiển thị nó theo cách cho phép dễ hiểu. Một trong những ứng dụng này được gọi là Graphite .

Graphite là một công cụ tuyệt vời để tổ chức và hiển thị các biểu diễn trực quan của dữ liệu được thu thập từ hệ thống của bạn. Nó rất linh hoạt và có thể được cấu hình để bạn có thể đạt được những lợi ích của cả trình bày chi tiết và tổng quan rộng rãi về hiệu suất và tình trạng của các chỉ số bạn đang theo dõi.

Trong hướng dẫn trước, ta đã xem xét tổng quan về các ứng dụng thu thập số liệu thống kê và đồ thị mà bạn có thể xâu chuỗi lại với nhau để tạo ra một hệ thống mạnh mẽ để hiển thị số liệu thống kê. Trong hướng dẫn này, ta sẽ chỉ cho bạn cách cài đặt Graphite trên server Ubuntu 14.04 của bạn. Trong một hướng dẫn tương lai, ta sẽ nói về cách nuôi stats Graphite từ collectdStatsd .

Cài đặt Graphite

Để bắt đầu, ta cần download và cài đặt các thành phần Graphite. Nếu bạn đã xem phần giới thiệu của ta về phần mềm vẽ đồ thị, bạn sẽ nhận thấy rằng Graphite được làm từ một số thành phần: ứng dụng web, phần backend lưu trữ có tên Carbon và thư viện database có tên thì thầm.

Graphite từng khá khó cài đặt. May mắn là trong Ubuntu 14.04, tất cả các thành phần mà ta cần đều có thể được tìm thấy trong repository lưu trữ mặc định.

Hãy cập nhật index gói local của ta và sau đó cài đặt các gói cần thiết:

sudo apt-get update sudo apt-get install graphite-web graphite-carbon 

Trong quá trình cài đặt, bạn sẽ được hỏi có muốn Carbon xóa các file database hay không nếu bạn quyết định xóa cài đặt. Chọn “Không” ở đây để bạn không phá hủy số liệu thống kê của bạn . Nếu bạn cần bắt đầu làm mới, bạn luôn có thể xóa các file theo cách thủ công (được lưu trong var/lib/graphite/whisper ).

Khi quá trình cài đặt hoàn tất, Graphite sẽ được cài đặt. Tuy nhiên, ta cần thực hiện một số cấu hình bổ sung để mọi thứ bắt đầu và hoạt động.

Cấu hình database cho Django

Mặc dù bản thân dữ liệu Graphite được xử lý bởi Carbon và thư viện database thì thầm, ứng dụng web là một ứng dụng Django Python và cần phải lưu trữ dữ liệu của nó ở đâu đó.

Theo mặc định, điều này được cấu hình để sử dụng file database SQLite3. Tuy nhiên, chúng không mạnh mẽ như một hệ thống quản lý database quan hệ chính thức, vì vậy ta sẽ cấu hình ứng dụng của bạn để sử dụng PostgreSQL thay thế. PostgreSQL nghiêm ngặt hơn nhiều với việc nhập dữ liệu và sẽ bắt các trường hợp ngoại lệ có thể dẫn đến các vấn đề trong quá trình thực hiện.

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

Ta có thể cài đặt phần mềm database và các gói trợ giúp mà ta cần bằng lệnh :

sudo apt-get install postgresql libpq-dev python-psycopg2 

Thao tác này sẽ cài đặt phần mềm database , cũng như các thư viện Python mà Graphite sẽ sử dụng để kết nối và giao tiếp với database .

Tạo user database và database

Sau khi phần mềm database của ta được cài đặt, ta cần tạo database và user PostgreSQL để Graphite sử dụng.

Ta có thể đăng nhập vào dấu nhắc PostgreSQL tương tác bằng cách sử dụng lệnh psql với quyền là user hệ thống postgres :

sudo -u postgres psql 

Bây giờ, ta cần tạo một account user database mà Django sẽ sử dụng để hoạt động trên database của ta . Ta sẽ gọi user là graphite . Chọn một password an toàn cho user này:

<pre>
TẠO graphite NGƯỜI DÙNG VỚI MẬT KHẨU '<span class = "highlight"> password </span>';
</pre>

Bây giờ, ta có thể tạo database và cấp cho user mới quyền sở hữu nó. Ta cũng sẽ gọi database là graphite để dễ dàng nhận ra sự liên kết của chúng:

CREATE DATABASE graphite WITH OWNER graphite; 

Khi bạn hoàn tất, ta có thể thoát khỏi phiên PostgreSQL:

\q 

Bạn có thể thấy một thông báo cho biết rằng Postgres không thể lưu lịch sử file . Đây không phải là vấn đề đối với ta , vì vậy ta có thể tiếp tục.

Cấu hình Ứng dụng Web Graphite

Bây giờ, ta có database và user của ta đã sẵn sàng để sử dụng. Tuy nhiên, ta vẫn cần sửa đổi cài đặt của Graphite để sử dụng các thành phần mà ta vừa cấu hình . Ngoài ra còn có một số cài đặt khác mà ta nên xem qua.

Mở file cấu hình ứng dụng web Graphite:

sudo nano /etc/graphite/local_settings.py 

Đầu tiên, ta nên cài đặt khóa bí mật sẽ được sử dụng như muối khi tạo băm. Bỏ ghi chú tham số SECRET_KEY và thay đổi giá trị thành giá trị dài và duy nhất.

<pre>
SECRET KEY = '<span class = "highlight"> a Salt_string </span>'
</pre>

Tiếp theo, ta nên chỉ định múi giờ. Điều này sẽ ảnh hưởng đến thời gian hiển thị trên đồ thị của ta , vì vậy điều quan trọng là phải đặt. Đặt nó thành múi giờ của bạn như được chỉ định bởi cột "TZ" trong danh sách này .

<pre>
TIME ZONE = '<span class = "highlight"> Châu Mỹ / New York </span>'
</pre>

Ta cũng muốn cấu hình xác thực để lưu dữ liệu biểu đồ. Khi ta đồng bộ database , ta sẽ có thể tạo account user , nhưng ta cần cài đặt xác thực bằng cách bỏ comment này:

USE_REMOTE_USER_AUTHENTICATION = True 

Tiếp theo, hãy tìm định nghĩa từ điển DATABASES . Ta muốn thay đổi các giá trị để phản ánh thông tin Postgres của ta . Bạn nên thay đổi các phím NAME , ENGINE , USER , PASSWORDHOST .

Khi bạn hoàn thành, nó sẽ trông giống như sau:

<pre>
DATABASES = {
'mặc định': {
'NAME': '<span class = "highlight"> graphite </span>',
'ENGINE': 'django.db.backends. <Span class = "highlight"> postgresql_psycopg2 </span>',
'USER': '<span class = "highlight"> graphite </span>',
'PASSWORD': '<span class = "highlight"> password </span>',
'HOST': '<span class = "highlight"> 127.0.0.1 </span>',
'HẢI CẢNG': "
}
}
</pre>

Các vùng có màu đỏ là các giá trị bạn cần thay đổi. Đảm bảo rằng bạn sửa đổi password thành password bạn đã chọn cho user graphite trong Postgres.

Ngoài ra, hãy đảm bảo bạn đặt thông số HOST . Nếu bạn để trống phần này, Postgres sẽ nghĩ rằng bạn đang cố gắng kết nối bằng xác thực ngang hàng, điều này sẽ không xác thực chính xác trong trường hợp của ta .

Lưu file khi bạn hoàn tất.

Đồng bộ hóa database

Bây giờ ta đã điền xong phần database , ta có thể đồng bộ database để tạo cấu trúc chính xác.

Bạn có thể thực hiện việc này bằng lệnh :

sudo graphite-manage syncdb 

Bạn cần tạo một account superuser cho database . Tạo user mới để bạn có thể đăng nhập vào giao diện. Bạn có thể gọi điều này bất cứ điều gì bạn muốn. Điều này sẽ cho phép bạn lưu đồ thị của bạn và sửa đổi giao diện.

Cấu hình carbon

Bây giờ ta đã có một database , ta có thể bắt đầu cấu hình Carbon, phần backend lưu trữ Graphite.

Đầu tiên, hãy kích hoạt dịch vụ carbon để bắt đầu khi server khởi động . Ta có thể thực hiện việc này bằng cách mở file cấu hình dịch vụ:

sudo nano /etc/default/graphite-carbon 

Điều này chỉ có một tham số, cho biết liệu dịch vụ có bắt đầu khi server khởi động hay không. Thay đổi giá trị thành "true":

    CARBON_CACHE_ENABLED=true 

Lưu và đóng file .

Tiếp theo, mở file cấu hình Carbon:

sudo nano /etc/carbon/carbon.conf 

Hầu hết file này đã được cấu hình chính xác cho các mục đích của ta . Tuy nhiên, ta sẽ thực hiện một thay đổi nhỏ.

Bật xoay vòng log bằng cách điều chỉnh cài đặt chỉ thị này thành true:

ENABLE_LOGROTATION = True 

Lưu và đóng file .

Cấu hình schemas lưu trữ

Bây giờ, hãy mở file giản đồ lưu trữ. Điều này cho Carbon biết thời gian lưu trữ các giá trị và các giá trị này phải chi tiết như thế nào:

sudo nano /etc/carbon/storage-schemas.conf 

Bên trong, bạn sẽ tìm thấy các mục giống như sau:

<pre>
[carbon]
mẫu = ^ cacbon.
retentions = 60: 90d

[ 1 phút mặc định trong_1 ngày]
mẫu =. *
retentions = 60s: 1d
</pre>

Tệp hiện có hai phần được xác định. Đầu tiên là để quyết định phải làm gì với dữ liệu đến từ chính Carbon. Carbon thực sự được cấu hình để lưu trữ một số chỉ số về hiệu suất của chính nó. Định nghĩa dưới cùng là một tóm tắt được thiết kế để áp dụng cho bất kỳ dữ liệu nào chưa được trùng với phần khác. Nó xác định một policy mặc định.

Các từ trong ngoặc là tiêu đề phần được sử dụng để xác định một định nghĩa mới. Dưới mỗi phần, có một định nghĩa mẫu và policy rút lui.

Định nghĩa mẫu là một biểu thức chính quy được sử dụng để trùng với bất kỳ thông tin nào được gửi đến Carbon. Thông tin được gửi tới Carbon bao gồm tên chỉ số, đây là thứ mà điều này sẽ kiểm tra. Trong ví dụ đầu tiên, mẫu kiểm tra xem chỉ số được đề cập có bắt đầu bằng chuỗi “ carbon. ”.

Chính sách lưu giữ được xác định bởi các bộ số. Mỗi tập hợp bao gồm một khoảng chỉ số (tần suất một chỉ số được ghi lại), theo sau là dấu hai chấm và sau đó là khoảng thời gian để lưu trữ các giá trị đó. Bạn có thể xác định nhiều bộ số được phân tách bằng dấu phẩy.

Để chứng minh, ta sẽ xác định một schemas mới sẽ trùng với một giá trị thử nghiệm mà ta sẽ sử dụng sau này.

Trước phần mặc định, hãy thêm một phần khác cho các giá trị thử nghiệm của ta . Làm cho nó trông như thế này:

<pre>
[kiểm tra]
mẫu = ^ kiểm tra.
rút lui = 10s: 10m, 1m: 1h, 10m: 1d
</pre>

Điều này sẽ trùng với bất kỳ chỉ số nào bắt đầu bằng “ test. ”. Nó sẽ lưu trữ dữ liệu mà nó thu thập ba lần, với nhiều chi tiết khác nhau. Định nghĩa lưu trữ đầu tiên ( 10s:10m ) sẽ tạo ra một điểm dữ liệu cứ sau mười giây. Nó sẽ lưu trữ các giá trị chỉ trong mười phút.

Kho lưu trữ thứ hai ( 1m:1h ) sẽ tạo một điểm dữ liệu mỗi phút. Nó sẽ thu thập tất cả dữ liệu từ phút trước (sáu điểm, vì bản lưu trữ trước đó tạo ra một điểm sau mỗi mười giây) và tổng hợp lại để tạo ra điểm. Theo mặc định, nó thực hiện điều này bằng cách lấy trung bình các điểm, nhưng ta có thể điều chỉnh điều này sau. Nó lưu trữ dữ liệu ở mức độ chi tiết này trong một giờ.

Bản lưu trữ cuối cùng sẽ được tạo ( 10m:1d ) sẽ tạo một điểm dữ liệu sau mỗi 10 phút, tổng hợp dữ liệu theo cách tương tự như bản lưu trữ thứ hai. Nó sẽ lưu trữ dữ liệu trong một ngày.

Khi ta yêu cầu thông tin từ Graphite, nó sẽ trả về thông tin từ repository chi tiết nhất đo khung thời gian mà ta yêu cầu. Vì vậy, nếu ta yêu cầu các chỉ số trong năm phút qua, thông tin từ bản lưu trữ đầu tiên sẽ được trả lại. Nếu ta yêu cầu một biểu đồ của 50 phút qua, dữ liệu sẽ được lấy từ repository thứ hai.

Lưu file khi bạn hoàn tất.

Giới thiệu về các phương pháp tổng hợp lưu trữ

Cách mà Carbon quyết định tổng hợp dữ liệu khi thu thập thông tin chi tiết hơn thành một con số tổng quát là rất quan trọng để hiểu nếu bạn muốn có số liệu chính xác. Điều này áp dụng mỗi khi Graphite tạo version số liệu ít chi tiết hơn, như trong bản lưu trữ thứ hai và thứ ba trong schemas thử nghiệm mà ta đã tạo ở trên.

Như ta đã đề cập ở trên, hành vi mặc định là lấy giá trị trung bình khi tổng hợp. Điều này nghĩa là , ngoài bản lưu trữ chi tiết nhất, Carbon sẽ tính trung bình các điểm dữ liệu mà nó nhận được để tạo ra con số.

Tuy nhiên, điều này không phải lúc nào cũng mong muốn. Ví dụ: nếu ta muốn tổng số lần một sự kiện xảy ra trong các khoảng thời gian khác nhau, ta muốn cộng các điểm dữ liệu để tạo điểm dữ liệu tổng quát thay vì lấy trung bình chúng.

Ta có thể xác định cách ta muốn tổng hợp xảy ra trong một file có tên là storage-aggregation.conf . Sao chép file từ folder Các ví dụ về Carbon vào folder Cấu hình Carbon của ta :

sudo cp /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example /etc/carbon/storage-aggregation.conf 

Mở file trong editor của bạn:

sudo nano /etc/carbon/storage-aggregation.conf 

Điều này trông hơi giống với file cuối cùng. Bạn sẽ tìm thấy các mục giống như sau:

<pre>
[phút]
mẫu = .min $
xFilesFactor = 0,1
tổng hợpMethod = phút
</pre>

Tên và mẫu phần giống hệt như file lưu trữ-giản đồ. Nó chỉ là một tên tùy ý và một mẫu để phù hợp với các số liệu bạn đang xác định.

XFilesFactor là một tham số thú vị ở chỗ nó cho phép bạn chỉ định tỷ lệ phần trăm giá trị tối thiểu mà Carbon phải có để tổng hợp. Theo mặc định, tất cả các giá trị được đặt thành 0.5 , nghĩa là 50% số điểm dữ liệu chi tiết hơn phải có sẵn nếu một điểm tổng hợp được tạo.

Điều này được dùng đảm bảo rằng bạn không tạo ra các điểm dữ liệu có thể làm sai lệch tình hình thực tế. Ví dụ: nếu 70% dữ liệu bị mất do sự cố mạng, bạn có thể không muốn tạo một điểm chỉ thể hiện trung thực 30% dữ liệu.

Phương pháp tổng hợp được xác định tiếp theo. Các giá trị có thể là trung bình, tổng, cuối cùng, tối đa và tối thiểu. Chúng khá tự giải thích, nhưng rất quan trọng. Việc chọn sai giá trị sẽ khiến dữ liệu được ghi lại theo cách không chính xác. Lựa chọn chính xác hoàn toàn phụ thuộc vào chỉ số mà bạn đang thực sự theo dõi.

Lưu ý : Điều quan trọng cần nhận ra là nếu bạn gửi điểm dữ liệu Graphite thường xuyên hơn độ dài khoảng thời gian lưu trữ ngắn nhất, một số dữ liệu sẽ bị mất!

Điều này là do Graphite chỉ áp dụng tính năng tổng hợp khi đi từ repository chi tiết đến repository tổng quát. Khi tạo điểm dữ liệu chi tiết, nó chỉ ghi dữ liệu mới nhất được gửi đến nó khi khoảng thời gian đã trôi qua. Ta sẽ thảo luận về StatsD trong một hướng dẫn khác, có thể giúp giảm bớt vấn đề này bằng cách lưu vào bộ nhớ đệm và tổng hợp dữ liệu đến với tần suất thường xuyên hơn.

Lưu và đóng file .

Khi bạn hoàn thành, bạn có thể bắt đầu Carbon bằng lệnh :

sudo service carbon-cache start 

Cài đặt và cấu hình Apache

Để sử dụng giao diện web, ta sẽ cài đặt và cấu hình web server Apache. Graphite bao gồm các file cấu hình cho Apache, vì vậy việc lựa chọn khá dễ dàng.

Cài đặt các thành phần bằng lệnh :

sudo apt-get install apache2 libapache2-mod-wsgi 

Khi quá trình cài đặt hoàn tất, ta nên vô hiệu hóa file server ảo mặc định, vì nó xung đột với file mới của ta :

sudo a2dissite 000-default 

Tiếp theo, sao chép file server ảo Graphite Apache vào folder các trang có sẵn:

sudo cp /usr/share/graphite-web/apache2-graphite.conf /etc/apache2/sites-available 

Sau đó, ta có thể kích hoạt file server ảo bằng lệnh :

sudo a2ensite apache2-graphite 

Reload dịch vụ để áp dụng các thay đổi :

sudo service apache2 reload 

Kiểm tra giao diện web

Bây giờ ta đã cấu hình mọi thứ, ta có thể kiểm tra giao diện web.

Trong trình duyệt web , hãy truy cập vào domain hoặc địa chỉ IP của server :

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

Bạn sẽ thấy một màn hình giống như sau:

Màn hình mặc định Graphite

Trước khi tiếp tục, bạn nên đăng nhập để có thể lưu cài đặt biểu đồ nào bạn có thể thực hiện. Nhấp vào nút “Đăng nhập” trên thanh menu trên cùng và nhập tên user và password bạn đã cấu hình khi đồng bộ hóa database Django.

Tiếp theo, Nếu bạn mở cây cho Graphite ở khung bên trái, bạn sẽ thấy mục nhập cho Carbon. Đây là nơi bạn có thể tìm thấy các biểu đồ dữ liệu mà Carbon đã ghi lại về chính nó. Nhấp vào một số tùy chọn. Tại đây, tôi đang vẽ đồ thị các chỉ số nhận được và cập nhật các chỉ số hoạt động:

Dữ liệu than chì

Bây giờ, hãy thử gửi một số dữ liệu đến Graphite. Khi bạn thực hiện các bước này, hãy lưu ý bạn hầu như không bao giờ gửi số liệu thống kê đến Graphite như thế này. Có nhiều cách tốt hơn để làm điều này, nhưng điều này sẽ giúp chứng minh những gì đang diễn ra trong nền và cũng sẽ giúp bạn hiểu những hạn chế của cách Graphite xử lý dữ liệu. Ta sẽ nói về cách vượt qua những điều này với các dịch vụ đồng hành sau.

Thông báo chỉ số cần phải chứa tên chỉ số, giá trị và dấu thời gian. Ta có thể làm điều này trong terminal của ta . Hãy tạo một giá trị phù hợp với giản đồ lưu trữ test mà ta đã tạo. Ta cũng sẽ so khớp một trong các định nghĩa sẽ cộng các giá trị khi nó tổng hợp. Ta sẽ sử dụng lệnh date để tạo dấu thời gian của ta . Kiểu:

echo "test.count 4 `date +%s`" | nc -q0 127.0.0.1 2003 

Nếu bạn làm mới trang và sau đó nhìn vào cây Graphite ở bên trái, bạn sẽ thấy số liệu thử nghiệm mới của ta . Gửi lệnh trên một vài lần, chờ ít nhất 10 giây giữa các lần. Lưu ý , Graphite ném tất cả trừ giá trị cuối cùng khi có nhiều hơn một giá trị được gửi trong repository ảng thời gian nhỏ nhất của nó.

Bây giờ, trong giao diện web, yêu cầu Graphite hiển thị cho bạn 8 phút vừa qua. Trên biểu đồ của chỉ số thử nghiệm, hãy nhấp vào biểu tượng hình chữ nhật màu trắng với mũi tên màu xanh lục. Nó sẽ thông báo “Chọn dữ liệu gần đây” khi bạn di chuột qua nó:

Graphite dữ liệu gần đây

Chọn 8 phút từ cửa sổ bật lên. Nhấp vào biểu tượng có nội dung “Cập nhật đồ thị” để nhận dữ liệu mới nhất . Bạn sẽ thấy một biểu đồ hầu như không có bất kỳ thông tin nào. Điều này là do bạn chỉ gửi cho nó một vài giá trị, mỗi giá trị là "4", vì vậy nó không có biến thể.

Tuy nhiên, nếu bạn xem biểu đồ của 15 phút qua (giả sử rằng bạn đã gửi lệnh một vài lần khác nhau, cách nhau lớn hơn 10 giây nhưng ít hơn một phút), bạn sẽ thấy điều gì đó khác biệt:

Kết hợp than chì

Điều này là do file lưu trữ đầu tiên của ta không lưu dữ liệu trong mười lăm phút, vì vậy Graphite sẽ tìm đến file lưu trữ thứ hai của ta để tìm dữ liệu kết xuất. Nó có vẻ khác vì ta đã gửi cho Graphite một chỉ số "số lượng", phù hợp với một trong các định nghĩa tổng hợp của ta .

Tổng hợp số lượng yêu cầu Graphite cộng các giá trị mà nó nhận được trong repository ảng thời gian lớn hơn thay vì tính trung bình. Như bạn thấy, phương pháp tổng hợp mà ta chọn rất quan trọng vì nó xác định cách một điểm dữ liệu tổng quát được tạo ra từ các điểm chi tiết hơn.

Kết luận

Đến đây bạn đã cài đặt và cài đặt Graphite, nhưng nó vẫn còn khá hạn chế về những gì nó có thể làm. Ta không muốn lúc nào cũng phải cung cấp dữ liệu theo cách thủ công và ta muốn nó không vứt bỏ dữ liệu nếu ta có nhiều hơn một chỉ số trong repository ảng thời gian nhỏ nhất. Ta cần những công cụ đồng hành để giúp ta giải quyết những vấn đề này.

Trong hướng dẫn tiếp theo, ta sẽ thảo luận làm thế nào để cài đặt collectd một hệ thống thống kê thu thập daemon được dùng để cung cấp dữ liệu Graphite và làm việc xung quanh những hạn chế này. Trong các hướng dẫn tương lai, ta cũng sẽ trình bày cách cấu hình StatsD với Graphite và cách sử dụng giao diện Graphite chuyên sâu hơn.

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


Tags:

Các tin liên quan

Cách cài đặt và sử dụng Ack, một sự thay thế Grep cho các nhà phát triển, trên Ubuntu 14.04
2014-05-27
Cách sử dụng BitTorrent Sync để đồng bộ hóa các thư mục trong Ubuntu 14.04
2014-05-19
Cách sử dụng HAProxy làm bộ cân bằng tải lớp 4 cho server ứng dụng WordPress trên Ubuntu 14.04
2014-05-16
Cách sử dụng kpcli để quản lý tệp mật khẩu KeePass2 trên server Ubuntu 14.04
2014-05-16
Cách khởi chạy trang web của bạn trên server Ubuntu 14.04 mới với LAMP, SFTP và DNS
2014-05-13
Cách cài đặt Node.js trên server Ubuntu 14.04
2014-05-12
Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 14.04
2014-05-07
Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 14.04
2014-05-07
Cách cài đặt ISPConfig3 trên server Ubuntu 14.04
2014-05-05
Cách cài đặt và sử dụng Memcache trên Ubuntu 14.04
2014-05-01