Thứ năm, 25/09/2014 | 00:00 GMT+7

Cách cấu hình một cụm Mesosphere sẵn sàng sản xuất trên Ubuntu 14.04

Mesosphere là một hệ thống kết hợp một số thành phần để quản lý hiệu quả việc phân cụm server và các triển khai có tính khả dụng cao trên lớp hệ điều hành hiện có. Không giống như các hệ thống như CoreOS, Mesosphere không phải là một hệ điều hành chuyên biệt và thay vào đó là một tập hợp các gói.

Trong hướng dẫn này, ta sẽ xem xét cách cấu hình một cụm khả dụng cao trong Mesosphere. Cấu hình này sẽ cài đặt cho ta khả năng chuyển đổi dự phòng trong trường hợp bất kỳ nút chính nào của ta gặp sự cố cũng như một group các server slaver để xử lý các việc được lên lịch.

Ta sẽ sử dụng server Ubuntu 14.04 cho hướng dẫn này.

Yêu cầu và Mục tiêu

Trước khi hoàn thành hướng dẫn này, bạn nên xem lại phần giới thiệu của ta về Mesosphere . Đây là một cách tốt để làm quen với các thành phần mà hệ thống bao gồm và hỗ trợ bạn xác định những gì mỗi đơn vị chịu trách nhiệm.

Trong hướng dẫn này, ta sẽ sử dụng sáu server Ubuntu. Điều này đáp ứng khuyến nghị của Apache Mesos về việc có ít nhất ba bản root cho môi trường production . Nó cũng cung cấp một group ba server công nhân hoặc server slaver , sẽ được giao công việc khi các nhiệm vụ được gửi đến cụm.

Sáu server mà ta sẽ sử dụng sẽ sử dụng zookeeper để theo dõi người đứng đầu hiện tại của các server chính. Lớp Mesos, được xây dựng trên lớp này, sẽ cung cấp đồng bộ hóa phân tán và xử lý tài nguyên. Nó chịu trách nhiệm quản lý cụm. Marathon, hệ thống init phân tán của cụm, được sử dụng để lên lịch tác vụ và chuyển giao công việc cho các server slaver .

Vì lợi ích của hướng dẫn này, ta sẽ giả định máy của ta có cấu hình sau:

Tên server Chức năng Địa chỉ IP
master1 Bậc thầy của Mesos 192.0.2.1
master2 Bậc thầy của Mesos 192.0.2.2
master3 Bậc thầy Mesos 192.0.2.3
slaver 1 Slaver Mesos 192.0.2.51
slaver 2 Slaver Mesos 192.0.2.52
slaver 3 Slaver Mesos 192.0.2.53

Mỗi máy này phải được cài đặt Ubuntu 14.04. Bạn cần hoàn thành các mục cấu hình cơ bản được liệt kê trong hướng dẫn cài đặt server ban đầu Ubuntu 14.04 của ta .

Khi bạn hoàn tất các bước trên, hãy tiếp tục với hướng dẫn này.

Cài đặt Mesosphere trên Server

Bước đầu tiên để cài đặt và chạy cụm của bạn là cài đặt phần mềm. May mắn là dự án Mesosphere duy trì một repository Ubuntu với các gói cập nhật dễ cài đặt.

Thêm Kho lưu trữ Mesosphere vào Server của bạn

Trên tất cả các server (chủ và slaver ), hãy hoàn thành các bước sau.

Đầu tiên, thêm repository Mesosphere vào danh sách nguồn của bạn. Quá trình này liên quan đến việc download khóa của dự án Mesosphere từ server khóa Ubuntu và sau đó tạo URL chính xác cho bản phát hành Ubuntu của ta . Dự án cung cấp một cách thuận tiện để làm điều này:

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]') CODENAME=$(lsb_release -cs) echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | sudo tee /etc/apt/sources.list.d/mesosphere.list 

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

Sau khi bạn đã thêm repository Mesosphere vào hệ thống của bạn , bạn phải cập nhật cache ẩn gói local để có quyền truy cập vào thành phần mới:

sudo apt-get -y update 

Tiếp theo, bạn cần cài đặt các gói cần thiết. Các thành phần bạn cần sẽ phụ thuộc vào role của server .

Đối với server tổng thể của bạn, bạn cần có mesosphere gói meta. Điều này bao gồm các ứng dụng quản lý sở zookeeper , mesos , marathonchronos :

sudo apt-get install mesosphere 

Đối với các server slaver của bạn, bạn chỉ cần gói mesos , gói này cũng kéo zookeeper coi zookeeper như một phụ thuộc:

sudo apt-get install mesos 

Cài đặt thông tin kết nối Zookeeper cho Mesos

Điều đầu tiên ta sẽ làm là cấu hình thông tin kết nối zookeeper của ta . Đây là lớp bên dưới cho phép tất cả các server của ta kết nối với đúng server chính, vì vậy, bắt đầu ở đây là hợp lý.

Server chính của ta sẽ là thành viên duy nhất trong cụm zookeeper của ta , nhưng tất cả các server của ta cần một số cấu hình để có thể giao tiếp bằng giao thức. Tệp xác định điều này là /etc/mesos/zk .

Trên tất cả các server của bạn, hãy hoàn thành bước sau. Mở file với quyền root:

sudo nano /etc/mesos/zk 

Bên trong, bạn sẽ thấy URL kết nối được đặt theo mặc định để truy cập một version local . Nó sẽ trông giống thế này:

zk://localhost:2181/mesos 

Ta cần sửa đổi điều này để trỏ đến ba server chính của ta . Điều này được thực hiện bằng cách thay thế localhost bằng địa chỉ IP của server chính Mesos đầu tiên của ta . Sau đó, ta có thể thêm dấu phẩy sau đặc điểm kỹ thuật cổng và sao chép định dạng để thêm bản chính thứ hai và thứ ba của ta vào danh sách.

Đối với hướng dẫn của ta , các bậc thầy của ta có địa chỉ IP là 192.0.2.1 , 192.168.2.2192.168.2.3 . Sử dụng các giá trị này, file của ta sẽ trông giống như sau:

zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/mesos 

Dòng phải bắt đầu bằng zk:// và kết thúc bằng /mesos . Ở giữa, địa chỉ IP của server chính và cổng của zookeeper ( 2181 theo mặc định) được chỉ định.

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

Sử dụng mục nhập giống hệt này trong mỗi chủ nhân và slaver của bạn. Điều này sẽ giúp từng server riêng lẻ kết nối với đúng server chính để giao tiếp với cụm.

Cấu hình Zookeeper của Server Chính

Trên server chính của bạn, ta cần thực hiện thêm một số cấu hình zookeeper .

Bước đầu tiên là xác định một số ID duy nhất, từ 1 đến 255, cho mỗi server chính của bạn. Điều này được lưu trong file /etc/zookeeper/conf/myid . Mở nó bây giờ:

sudo nano /etc/zookeeper/conf/myid 

Xóa tất cả thông tin trong file này và thay thế bằng một số duy nhất, từ 1 đến 255. Mỗi server chính của bạn phải có một số duy nhất. Vì đơn giản, dễ nhất là bắt đầu từ số 1 và làm việc theo cách của bạn. Ta sẽ sử dụng 1, 2 và 3 cho hướng dẫn của ta .

Server đầu tiên của ta sẽ chỉ có cái này trong file :

1 

Lưu file khi bạn hoàn tất. Thực hiện việc này trên từng server chính của bạn.

Tiếp theo, ta cần sửa đổi file cấu hình zookeeper của bạn để ánh xạ ID zookeeper của ta với các vật chủ thực tế. Điều này sẽ đảm bảo dịch vụ có thể phân giải chính xác từng server từ hệ thống ID mà nó sử dụng.

Mở file cấu hình zookeeper ngay bây giờ:

sudo nano /etc/zookeeper/conf/zoo.cfg 

Trong file này, bạn cần ánh xạ từng ID với một server . Thông số kỹ thuật của server sẽ bao gồm hai cổng, cổng thứ nhất để giao tiếp với người lãnh đạo và cổng thứ hai để xử lý các cuộc bầu cử khi cần có người lãnh đạo mới. Các server của zookeeper được xác định bằng “ server ”, theo sau là dấu chấm và số ID của chúng.

Đối với hướng dẫn của ta , ta sẽ sử dụng các cổng mặc định cho từng chức năng và ID của ta là 1-3. Tệp của ta sẽ trông như thế này:

server.1=192.168.2.1:2888:3888 server.2=192.168.2.2:2888:3888 server.3=192.168.2.3:2888:3888 

Thêm các ánh xạ tương tự này trong mỗi file cấu hình của server chính của bạn. Lưu và đóng từng file khi bạn hoàn tất.

Như vậy, cấu hình zookeeper của ta đã hoàn tất. Ta có thể bắt đầu tập trung vào Mesos và Marathon.

Cấu hình Mesos trên Server Chính

Tiếp theo, ta sẽ cấu hình Mesos trên ba server chính. Các bước này phải được thực hiện trên từng server chính của bạn.

Sửa đổi số đại biểu để phản ánh kích thước cụm của bạn

Đầu tiên, ta cần điều chỉnh túc số cần thiết để đưa ra quyết định. Điều này sẽ xác định số lượng server cần thiết để cụm ở trạng thái hoạt động.

Số đại biểu phải được cài đặt sao cho trên 50 phần trăm thành viên chính phải có mặt để đưa ra quyết định. Tuy nhiên, ta cũng muốn xây dựng trong một số khả năng chịu lỗi để nếu tất cả các master của ta không có mặt, cụm vẫn có thể hoạt động.

Ta có ba bậc thầy, vì vậy cài đặt duy nhất đáp ứng cả hai yêu cầu này là túc số hai. Vì cấu hình ban đầu giả định một cài đặt server duy nhất, số đại biểu hiện được đặt thành một.

Mở file cấu hình túc số:

sudo nano /etc/mesos-master/quorum 

Thay đổi giá trị thành “2”:

2 

Lưu và đóng file . Lặp lại điều này trên mỗi server chính của bạn.

Cấu hình Tên server và Địa chỉ IP

Tiếp theo, ta sẽ chỉ định tên server và địa chỉ IP cho từng server chính của ta . Ta sẽ sử dụng địa chỉ IP cho tên server để các version của ta không gặp sự cố khi phân giải chính xác.

Đối với server chính của ta , địa chỉ IP cần được đặt trong các file sau:

  • / etc / mesos-master / ip
  • / etc / mesos-master / hostname

Đầu tiên, thêm địa chỉ IP riêng của từng nút chính trong file /etc/mesos-master/ip . Hãy nhớ thay đổi điều này cho từng server để trùng với giá trị thích hợp:

echo 192.168.2.1 | sudo tee /etc/mesos-master/ip 

Bây giờ, ta có thể sao chép giá trị này vào file tên server :

sudo cp /etc/mesos-master/ip /etc/mesos-master/hostname 

Thực hiện việc này trên từng server chính của bạn.

Cấu hình Marathon trên Server Chính

Bây giờ Mesos đã được cấu hình, ta có thể cấu hình Marathon, triển khai hệ thống init được phân cụm của Mesosphere.

Marathon sẽ chạy trên mỗi server chính của ta , nhưng chỉ server chính hàng đầu mới có thể thực sự lên lịch công việc. Các version Marathon khác sẽ yêu cầu proxy một cách minh bạch đến server chính.

Đầu tiên, ta cần đặt lại tên server cho từng version Marathon của server . , ta sẽ sử dụng địa chỉ IP mà ta đã có trong một file . Ta có thể sao chép nó vào vị trí file ta cần.

Tuy nhiên, cấu trúc folder cấu hình Marathon ta cần không được tạo tự động. Ta sẽ phải tạo folder và sau đó ta có thể sao chép file qua:

sudo mkdir -p /etc/marathon/conf sudo cp /etc/mesos-master/hostname /etc/marathon/conf 

Tiếp theo, ta cần xác định danh sách các chủ sở zookeeper mà Marathon sẽ kết nối để biết thông tin và lên lịch. Đây là cùng một chuỗi kết nối của zookeeper mà ta đã sử dụng cho Mesos, vì vậy ta có thể sao chép file . Ta cần đặt nó vào một file có tên là master :

sudo cp /etc/mesos/zk /etc/marathon/conf/master 

Điều này sẽ cho phép dịch vụ Marathon của ta kết nối với cụm Mesos. Tuy nhiên, ta cũng muốn Marathon lưu trữ thông tin trạng thái của chính nó trong zookeeper . Đối với điều này, ta sẽ sử dụng file kết nối zookeeper khác làm cơ sở và chỉ cần sửa đổi điểm cuối.

Đầu tiên, sao chép file vào vị trí của người giữ vườn thú Marathon:

sudo cp /etc/marathon/conf/master /etc/marathon/conf/zk 

Tiếp theo, mở file trong editor :

sudo nano /etc/marathon/conf/zk 

Phần duy nhất ta cần sửa đổi trong file này là điểm cuối. Ta sẽ thay đổi nó từ /mesos thành /marathon :

zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/marathon 

Đây là tất cả những gì ta cần làm cho cấu hình Marathon của bạn .

Cấu hình Luật Init Dịch vụ và Khởi động lại Dịch vụ

Tiếp theo, ta sẽ khởi động lại các dịch vụ của server chính để sử dụng các cài đặt mà ta đã cấu hình .

Trước tiên, ta cần đảm bảo các server chính của ta chỉ đang chạy quy trình chính của Mesos và không chạy quy trình slaver . Ta có thể dừng bất kỳ quy trình slaver hiện đang chạy nào (điều này có thể không thành công, nhưng không sao vì điều này chỉ đảm bảo quy trình được dừng lại). Ta cũng có thể đảm bảo server không bắt đầu quá trình slaver khi khởi động bằng cách tạo file overrides :

sudo stop mesos-slave echo manual | sudo tee /etc/init/mesos-slave.override 

Bây giờ, tất cả những gì ta cần làm là khởi động lại zookeeper , việc này sẽ cài đặt cuộc bầu cử tổng thể của ta . Sau đó, ta có thể bắt đầu các quy trình Mesos master và Marathon:

sudo restart zookeeper sudo start mesos-master sudo start marathon 

Để đạt được đỉnh cao với những gì bạn vừa cài đặt , hãy truy cập một trong các server chính của bạn trong trình duyệt web tại cổng 5050 :

http://192.168.2.1:5050 

Bạn sẽ thấy giao diện Mesos chính. Bạn có thể được thông báo rằng bạn đang được chuyển hướng đến chủ hoạt động tùy thuộc vào việc bạn có kết nối với người lãnh đạo được bầu hay không. Dù bằng cách nào, màn hình sẽ trông giống như sau:

Giao diện chính của Mesos

Đây là chế độ xem cụm của bạn hiện tại. Không có nhiều thứ để xem vì không có sẵn các node slaver và không có tác vụ nào được bắt đầu.

Ta cũng đã cấu hình Marathon, bộ điều khiển tác vụ hoạt động lâu dài của Mesosphere. Điều này sẽ có sẵn ở cổng 8080 trên bất kỳ trang chủ nào của bạn:

Giao diện chính của Marathon

Ta sẽ giới thiệu sơ qua về cách sử dụng các giao diện này sau khi ta cài đặt slaver của bạn .

Cấu hình server slaver

Bây giờ ta đã cấu hình các server chính, ta có thể bắt đầu cấu hình các server phụ của bạn .

Ta đã cấu hình slaver của bạn với thông tin kết nối zookeeper của server chính. Bản thân các slaver không điều hành các version quản lý zookeeper của riêng họ.

Ta có thể dừng bất kỳ quy trình quản lý zookeeper nào hiện đang chạy trên các node slaver của ta và tạo file overrides để nó không tự động khởi động khi server khởi động lại:

sudo stop zookeeper echo manual | sudo tee /etc/init/zookeeper.override 

Tiếp theo, ta muốn tạo một file overrides khác đảm bảo quy trình tổng thể Mesos không bắt đầu trên các server slaver của ta . Ta cũng sẽ đảm bảo nó hiện đang dừng (lệnh này có thể không thành công nếu quá trình đã dừng. Đây không phải là vấn đề):

echo manual | sudo tee /etc/init/mesos-master.override sudo stop mesos-master 

Tiếp theo, ta cần đặt địa chỉ IP và tên server , giống như ta đã làm cho các server chính của bạn . Điều này liên quan đến việc đưa địa chỉ IP của mỗi nút vào một file , lần này là trong folder /etc/mesos-slave . Ta cũng sẽ sử dụng tên này làm tên server để dễ dàng truy cập vào các dịch vụ thông qua giao diện web:

echo 192.168.2.51 | sudo tee /etc/mesos-slave/ip sudo cp /etc/mesos-slave/ip /etc/mesos-slave/hostname 

, sử dụng địa chỉ IP riêng của từng server slaver cho lệnh đầu tiên. Điều này sẽ đảm bảo nó đang được liên kết với giao diện chính xác.

Bây giờ, ta có tất cả các phần để bắt đầu slaver Mesos của ta . Ta chỉ cần bật dịch vụ:

sudo start mesos-slave 

Làm điều này trên mỗi máy slaver của bạn.

Để xem liệu các slaver của bạn có tự đăng ký thành công trong cụm của bạn hay không, hãy quay lại một trong các server chính của bạn tại cổng 5050 :

http://192.168.2.1:5050 

Bạn sẽ thấy số lượng slaver đang hoạt động ở mức “3” ngay bây giờ trong giao diện:

Mesos ba  slaver

Bạn cũng có thể thấy rằng các tài nguyên có sẵn trong giao diện đã được cập nhật để phản ánh tài nguyên tổng hợp của các máy phụ của bạn:

Tài nguyên Mesos

Để biết thêm thông tin về từng máy slaver của bạn, bạn có thể nhấp vào liên kết “Máy slaver ” ở đầu giao diện. Điều này sẽ cung cấp cho bạn cái nhìn tổng quan về đóng góp tài nguyên của từng máy, cũng như các liên kết đến một trang cho mỗi máy slaver :

Trang  slaver  Mesos

Bắt đầu dịch vụ trên Mesos và Marathon

Marathon là tiện ích của Mesosphere để lên lịch cho các việc chạy dài. Có thể dễ dàng nghĩ Marathon là hệ thống init cho một cụm Mesosphere vì nó xử lý các dịch vụ bắt đầu và dừng, lên lịch tác vụ và đảm bảo các ứng dụng sẽ hoạt động trở lại nếu chúng gặp sự cố.

Bạn có thể thêm các dịch vụ và nhiệm vụ vào Marathon theo một vài cách khác nhau. Ta sẽ chỉ bao gồm các dịch vụ cơ bản. Vùng chứa Docker sẽ được xử lý trong một hướng dẫn trong tương lai.

Bắt đầu một Dịch vụ thông qua Giao diện Web

Cách dễ dàng nhất để dịch vụ chạy nhanh trên cụm là thêm ứng dụng thông qua giao diện web Marathon.

Đầu tiên, hãy truy cập giao diện web Marathon trên một trong những server chính của bạn. Lưu ý , giao diện Marathon có trên cổng 8080 :

http://192.168.2.1:8080 

Từ đây, bạn có thể nhấp vào nút “Ứng dụng mới” ở góc trên bên phải. Thao tác này sẽ bật lên một lớp phủ nơi bạn có thể thêm thông tin về ứng dụng mới của bạn :

Marathon ứng dụng mới

Điền vào các trường với các yêu cầu cho ứng dụng của bạn. Các trường duy nhất bắt buộc là:

  • ID : Một ID duy nhất được user chọn để xác định một quy trình. Đây có thể là bạn muốn , nhưng phải là duy nhất.
  • Lệnh : Đây là lệnh thực tế sẽ được chạy bởi Marathon. Đây là quá trình sẽ được theo dõi và khởi động lại nếu nó không thành công.

Sử dụng thông tin này, bạn có thể cài đặt một dịch vụ đơn giản chỉ in “xin chào” và ngủ trong 10 giây. Ta sẽ gọi điều này là “xin chào”:

Ứng dụng đơn giản Marathon

Khi bạn quay lại giao diện, dịch vụ sẽ chuyển từ “Đang triển khai” sang “Đang chạy”:

Chạy ứng dụng Marathon

Cứ sau 10 giây hoặc lâu hơn, số đọc “Công việc / Sự việc” sẽ chuyển từ “1/1” thành “0/1” khi thời lượng ngủ trôi qua và dịch vụ dừng lại. Marathon sau đó sẽ tự động khởi động lại nhiệm vụ . Ta có thể thấy quá trình này rõ ràng hơn trong giao diện web Mesos ở cổng 5050 :

http://192.168.2.1:5050 

Tại đây, bạn có thể thấy quá trình kết thúc và được khởi động lại:

Tác vụ khởi động lại Mesos

Nếu bạn nhấp vào “Sandbox” và sau đó “stdout” trên bất kỳ tác vụ nào, bạn có thể thấy kết quả “hello” đang được tạo:

Đầu ra Mesos

Bắt đầu một Dịch vụ thông qua API

Ta cũng có thể gửi các dịch vụ thông qua API của Marathon. Điều này liên quan đến việc truyền một đối tượng JSON chứa tất cả các trường mà lớp phủ chứa.

Đây là một quá trình tương đối đơn giản. , các trường bắt buộc duy nhất là id cho mã định danh quy trình và cmd chứa lệnh thực để chạy.

Vì vậy, ta có thể tạo một file JSON có tên hello.json với thông tin sau:

nano hello.json 

Bên trong, thông số kỹ thuật tối thiểu trần sẽ trông như thế này:

{     "id": "hello2",     "cmd": "echo hello; sleep 10" } 

Dịch vụ này sẽ hoạt động tốt. Tuy nhiên, nếu ta thực sự muốn mô phỏng dịch vụ mà ta đã tạo trong giao diện user web, ta phải thêm một số trường bổ sung. Chúng đã được mặc định trong giao diện user web và ta có thể sao chép chúng tại đây:

{     "id": "hello2",     "cmd": "echo hello; sleep 10",     "mem": 16,     "cpus": 0.1,     "instances": 1,     "disk": 0.0,     "ports": [0] } 

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

Tiếp theo, ta có thể gửi nó bằng cách sử dụng API Marathon. Mục tiêu là một trong những dịch vụ Marathon bậc thầy của ta ở cổng 8080 và điểm cuối là /v2/apps . Tải trọng dữ liệu là file JSON của ta , ta có thể đọc thành curl bằng cách sử dụng cờ -d với cờ @ để chỉ ra file .

Lệnh để gửi sẽ giống như sau:

curl -i -H 'Content-Type: application/json' -d@hello2.json 192.168.2.1:8080/v2/apps 

Nếu nhìn vào giao diện Marathon, ta có thể thấy rằng nó đã được thêm thành công. Nó dường như có các thuộc tính giống hệt như dịch vụ đầu tiên của ta :

Marathon hai dịch vụ

Dịch vụ mới có thể được giám sát và truy cập theo cách giống hệt như dịch vụ đầu tiên.

Kết luận

Đến đây, bạn sẽ có một cụm Mesosphere sẵn sàng production và đang chạy. Ta mới chỉ đề cập đến cấu hình cơ bản tại thời điểm này, nhưng bạn có thể thấy các khả năng tận dụng hệ thống Mesosphere.

Trong các hướng dẫn trong tương lai, ta sẽ trình bày cách triển khai containers Docker trên cụm của bạn và cách sử dụng một số công cụ chuyên sâu hơn.


Tags:

Các tin liên quan

Cách thiết lập DNSSEC trên server tên NSD trên Ubuntu 14.04
2014-09-25
Cách triển khai ứng dụng Meteor.js trên Ubuntu 14.04 với Nginx
2014-09-22
Cách cài đặt Drupal trên server Ubuntu 14.04 với Apache
2014-09-19
Cách sử dụng Reprepro cho Kho lưu trữ Gói Bảo mật trên Ubuntu 14.04
2014-09-10
Cách cài đặt Discourse trên Ubuntu 14.04
2014-09-10
Cách sử dụng Foreman để quản lý các node puppet trên Ubuntu 14.04
2014-09-08
Cách sử dụng phân phối giám sát mở với Check_MK trên Ubuntu 14.04
2014-09-08
Cách cài đặt và cấu hình một Daemon và Ứng dụng khách SNMP trên Ubuntu 14.04
2014-08-18
Giới thiệu về cách sử dụng Consul, Hệ thống khám phá dịch vụ, trên Ubuntu 14.04
2014-08-15
Cách cấu hình Lãnh sự trong Môi trường Sản xuất trên Ubuntu 14.04
2014-08-15