Cách tạo một cụm RethinkDB được chia nhỏ trên Ubuntu 14.04
RethinkDB là một database NoSQL. Nó có một API dễ sử dụng để tương tác với database . RethinkDB cũng giúp đơn giản hóa việc cài đặt các cụm database ; nghĩa là, các group server phục vụ cùng một database và bảng. Các cụm là một cách dễ dàng mở rộng quy mô database của bạn mà không cần bất kỳ thời gian chết nào.Hướng dẫn này sẽ xem xét cách cài đặt một cụm, nhập dữ liệu và bảo mật nó. Nếu bạn chưa quen với RethinkDB, hãy xem những điều cơ bản trong hướng dẫn này trước khi đi sâu vào quá trình cấu hình cụm phức tạp hơn.
Yêu cầu
Hướng dẫn này yêu cầu ít nhất 2 Server chạy Ubuntu 14.04 LTS, có tên là rethink1 & rethink2 (Các tên này sẽ được sử dụng trong suốt hướng dẫn này). Bạn nên cài đặt user sudo không phải root trên mỗi Server trước khi cài đặt RethinkDB - làm như vậy là một phương pháp bảo mật tốt.
Hướng dẫn này cũng tham khảo trình điều khiển client Python, được giải thích trong hướng dẫn này .
Cài đặt nút
Các cụm trong RethinkDB không có các node đặc biệt; nó là một mạng ngang hàng thuần túy. Trước khi có thể cấu hình cụm, ta cần cài đặt RethinkDB. Trên mỗi server , từ folder chính của bạn, thêm khóa và repository RethinkDB vào apt-get:
source /etc/lsb-release && echo "deb http://download.rethinkdb.com/apt $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list wget -qO- http://download.rethinkdb.com/apt/pubkey.gpg | sudo apt-key add -
Sau đó cập nhật apt-get và cài đặt RethinkDB:
sudo apt-get update sudo apt-get install rethinkdb
Tiếp theo, ta cần cài đặt RethinkDB để chạy khi khởi động. RethinkDB cung cấp một tập lệnh để chạy khi khởi động, nhưng tập lệnh đó cần được bật:
sudo cp /etc/rethinkdb/default.conf.sample /etc/rethinkdb/instances.d/cluster_instance.conf
Tập lệnh khởi động cũng đóng role như một file cấu hình. Hãy mở file này:
sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf
Tên của máy (tên trong console quản lý web và các file log ) được đặt trong file này. Hãy đặt tên này giống với tên server của máy bằng cách tìm dòng (ở dưới cùng):
# machine-name=server1
Và thay đổi nó thành:
machine-name=rethink1
(Lưu ý: Nếu bạn không đặt tên trước khi bắt đầu RethinkDB lần đầu tiên, nó sẽ tự động đặt tên theo chủ đề DOTA.)
Đặt RethinkDB để nó có thể truy cập được từ tất cả các network interface bằng cách tìm dòng:
# bind=127.0.0.1
Và thay đổi nó thành:
bind=all
Lưu cấu hình và đóng nano (bằng cách nhấn Ctrl-X
, rồi Y
, rồi Enter
). Bây giờ ta có thể bắt đầu RethinkDB với file cấu hình mới:
sudo service rethinkdb start
Bạn sẽ thấy kết quả này:
rethinkdb: cluster_instance: Starting instance. (logging to `/var/lib/rethinkdb/cluster_instance/data/log_file')
RethinkDB hiện đã được cài đặt và chạy.
Bảo mật RethinkDB
Ta đã bật tùy chọn bind=all
, giúp RethinkDB có thể truy cập từ bên ngoài server . Điều này là không an toàn. Vì vậy, ta cần phải chặn RethinkDB khỏi Internet. Nhưng ta cần cho phép truy cập vào các dịch vụ của nó từ các máy tính được phép.
Đối với cổng cụm, ta sẽ sử dụng firewall để bao quanh cụm của ta . Đối với console quản lý web và cổng trình điều khiển, ta sẽ sử dụng tunnel SSH để truy cập chúng từ bên ngoài server . Đường hầm SSH chuyển hướng các yêu cầu trên client đến máy tính từ xa qua SSH, cấp cho client quyền truy cập vào tất cả các dịch vụ chỉ có sẵn trên không gian tên server local của server từ xa.
Lặp lại các bước này trên tất cả các server RethinkDB của bạn.
Đầu tiên, chặn tất cả các kết nối bên ngoài:
# The Web Management Console sudo iptables -A INPUT -i eth0 -p tcp --dport 8080 -j DROP sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 8080 -j ACCEPT # The Driver Port sudo iptables -A INPUT -i eth0 -p tcp --dport 28015 -j DROP sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 28015 -j ACCEPT # The Cluster Port sudo iptables -A INPUT -i eth0 -p tcp --dport 29015 -j DROP sudo iptables -I INPUT -i eth0 -s 127.0.0.1 -p tcp --dport 29015 -j ACCEPT
Để biết thêm thông tin về cách cấu hình IPTables, hãy xem hướng dẫn này .
Hãy cài đặt “iptables-dai dẳng” để lưu các luật của ta :
sudo apt-get update sudo apt-get install iptables-persistent
Bạn sẽ thấy một menu như sau:
Chọn tùy chọn Yes
(nhấn Enter
) để lưu các luật firewall . Bạn cũng sẽ thấy một menu tương tự về các luật IPv6, bạn cũng có thể lưu lại.
Cài đặt user quản lý
Để truy cập console quản lý web của RethinkDB và giao diện trình điều khiển, ta cần cài đặt tunnel SSH. Hãy tạo một user mới cho tunnel ssh trên rethink1 :
sudo adduser ssh-to-me
Sau đó, cài đặt file khóa được ủy quyền cho user mới của ta :
sudo mkdir /home/ssh-to-me/.ssh sudo touch /home/ssh-to-me/.ssh/authorized_keys
Nếu bạn đang sử dụng SSH để kết nối với server cloud , hãy mở một terminal trên máy tính local của bạn . Nếu chưa, bạn có thể cần tìm hiểu thêm về SSH key . Lấy public key của bạn và sao chép nó vào clipboard :
cat ~/.ssh/id_rsa.pub
Sau đó, thêm khóa đó vào account mới bằng cách mở file ủy quyền_có trên server :
sudo nano /home/ssh-to-me/.ssh/authorized_keys
Dán khóa của bạn vào file . Sau đó lưu và đóng nano ( Ctrl-X
, rồi Y
, rồi Enter
).
Bạn cần lặp lại tất cả các bước này cho các node cụm khác của bạn .
Nhập hoặc tạo database
Bạn có thể cần nhập một database đã có từ trước vào cụm của bạn . Điều này chỉ cần thiết nếu bạn đã có sẵn database trên một server khác hoặc trên server này; nếu không, RethinkDB sẽ tự động tạo database trống.
Nếu bạn cần nhập database bên ngoài:
Nếu database bạn muốn nhập không được lưu trữ trên rethink1
, bạn cần sao chép nó. Đầu tiên, hãy tìm đường dẫn của database RethinkDB hiện tại của bạn. Đây sẽ là folder rethinkdb_data
được tạo tự động nếu bạn sử dụng lệnh rethinkdb
để khởi động database cũ của bạn . Sau đó, sao chép nó bằng cách sử dụng scp
trên rethink1 :
sudo scp -rpC From Server User@From Server IP:/RethinkDB Data Folder/* /var/lib/rethinkdb/cluster_instance/data
Ví dụ:
sudo scp -rpC root@111.222.111.222:/home/user/rethinkdb_data/* /var/lib/rethinkdb/cluster_instance/data
Sau đó khởi động lại RethinkDB:
sudo service rethinkdb restart
Nếu bạn có một database hiện có trên rethink1:
Nếu bạn có database RethinkDB hiện có trên rethink1 , thì quy trình sẽ khác. Đầu tiên hãy mở file cấu hình trên rethink1 :
sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf
Sau đó, tìm đường dẫn của database RethinkDB mà bạn muốn nhập. Đây sẽ là folder rethinkdb_data
được tạo tự động nếu bạn sử dụng lệnh rethinkdb
để khởi động database cũ của bạn . Chèn đường dẫn đó vào file cấu hình bằng cách thêm dòng:
directory=/home/user/rethink/rethinkdb_data/
Đóng file để lưu các thay đổi (sử dụng Ctrl-X
, rồi Y
, rồi Enter
). Bây giờ khởi động lại RethinkDB:
sudo service rethinkdb restart
Điều quan trọng cần lưu ý là việc nhập một database có sẵn sẽ nghĩa là rethink1 sẽ kế thừa tên của máy cũ của database . Bạn cần biết điều này khi quản lý sharding database sau này.
Tạo một cụm
Để tạo một cụm, bạn cần cho phép tất cả các máy trong cụm thông qua firewall của nhau. Trên máy rethink1 của bạn, hãy thêm luật IPTables để cho phép các node khác thông qua firewall . Trong ví dụ này, bạn nên thay thế rethink2 IP
bằng địa chỉ IP của server đó:
sudo iptables -I INPUT -i eth0 -s rethink2 IP -p tcp --dport 29015 -j ACCEPT
Lặp lại lệnh cho bất kỳ nút nào khác mà bạn muốn thêm.
Sau đó lưu các luật firewall :
sudo sh -c "iptables-save > /etc/iptables/rules.v4"
Sau đó, lặp lại các bước này cho các node khác của bạn. Đối với cài đặt hai server , bây giờ bạn nên kết nối với rethink2 và bỏ chặn IP của rethink1 .
Đến đây bạn cần kết nối tất cả các node để tạo một cụm. Sử dụng SSH để kết nối với rethink2 và mở file cấu hình:
sudo nano /etc/rethinkdb/instances.d/cluster_instance.conf
Tùy chọn join
chỉ định địa chỉ của cụm để tham gia. Tìm join
dòng trong file cấu hình:
# join=example.com:29015
Và thay thế nó bằng:
join=rethink1 IP
Lưu file cấu hình (sử dụng Ctrl-X
, rồi Y
, rồi Enter
). Sau đó khởi động lại RethinkDB:
sudo service rethinkdb restart
Nút đầu tiên, rethink1 , KHÔNG cần cập nhật join
. Lặp lại chỉnh sửa file cấu hình trên tất cả các node khác, ngoại trừ rethink1 .
Đến đây bạn có một cụm RethinkDB hoạt động đầy đủ!
Kết nối với Control panel quản lý web
Control panel quản lý web là một giao diện trực tuyến dễ sử dụng cho phép truy cập vào các chức năng quản lý cơ bản của RethinkDB. Control panel này hữu ích khi bạn cần xem trạng thái của cụm, chạy các lệnh RethinkDB đơn lẻ và thay đổi cài đặt bảng cơ bản.
Mọi version RethinkDB trong cụm đang cung cấp console quản lý, nhưng điều này chỉ có sẵn từ không gian tên localhost của server , vì ta đã sử dụng các luật firewall để chặn nó khỏi phần còn lại của thế giới. Ta có thể sử dụng một tunnel SSH để chuyển hướng các yêu cầu của ta đối với localhost:8080
thành rethink1 , sẽ gửi yêu cầu đến localhost:8080
bên trong không gian tên của nó. Điều này sẽ cho phép bạn truy cập console quản lý web. Bạn có thể thực hiện việc này bằng SSH trên máy tính local của bạn :
ssh -L 8080:localhost:8080 ssh-to-me@rethink1 IP
Nếu bạn truy cập localhost: 8080 trong trình duyệt của bạn , bây giờ bạn sẽ thấy console quản lý web RethinkDB của bạn .
Nếu bạn nhận được bind: Address already in use
Lỗi bind: Address already in use
, bạn đang sử dụng cổng 8080 trên máy tính của bạn . Bạn có thể chuyển tiếp console quản lý web sang một cổng khác, một cổng có sẵn trên máy tính của bạn. Ví dụ: bạn có thể chuyển tiếp nó đến cổng 8081 và đi tới localhost: 8081 :
ssh -L 8081:localhost:8080 ssh-to-me@rethink1 IP
Nếu bạn thấy xung đột về việc có hai database thử nghiệm, bạn có thể đổi tên một trong số chúng.
Kết nối với Cluster bằng Trình điều khiển Python
Trong cài đặt này, tất cả các server RethinkDB ( control panel quản lý web, cổng trình điều khiển và cổng cụm) đều bị chặn khỏi thế giới bên ngoài. Ta có thể sử dụng một tunnel SSH để kết nối với cổng trình điều khiển, giống như với console quản lý web. Cổng trình điều khiển là cách trình điều khiển API RethinkDB (những trình điều khiển mà bạn xây dựng ứng dụng) kết nối với cụm của bạn.
Đầu tiên, hãy chọn một nút để kết nối. Nếu bạn có nhiều client (ví dụ: server ứng dụng web) kết nối với cụm, bạn cần cân bằng chúng trên toàn cụm. Sẽ là một ý kiến hay nếu bạn viết một danh sách các khách hàng của bạn, sau đó phân bổ một server cho mỗi client . Cố gắng group các client để các client cần các bảng tương tự kết nối với cùng một server cloud hoặc một group server để không có server nào trở nên quá tải với nhiều client .
Trong ví dụ này, ta sẽ sử dụng rethink2 làm server kết nối của bạn . Tuy nhiên, trong một hệ thống lớn hơn, nơi server database và ứng dụng web của bạn tách biệt, bạn muốn thực hiện việc này từ server ứng dụng web thực sự thực hiện lệnh gọi database .
Sau đó, trên server kết nối , tạo SSH key :
ssh-keygen -t rsa
Và sao chép nó vào clipboard của bạn:
cat ~/.ssh/id_rsa.pub
Sau đó, cấp quyền cho khóa mới trên nút cụm (trong ví dụ này là rethink1 ) bằng cách mở file authorized_keys
quyền_key và dán khóa vào một dòng mới:
sudo nano /home/ssh-to-me/.ssh/authorized_keys
Đóng nano và lưu file ( Ctrl-X
, rồi Y
, rồi Enter
).
Tiếp theo, sử dụng tunnel SSH để truy cập cổng trình điều khiển, từ server kết nối :
ssh -L 28015:localhost:28015 ssh-to-me@Cluster Node IP -f -N
Trình điều khiển hiện có thể truy cập từ localhost: 28015. Nếu bạn nhận được bind: Address already in use
Lỗi bind: Address already in use
, bạn có thể thay đổi cổng. Ví dụ: sử dụng cổng 28016:
ssh -L 28016:localhost:28015 ssh-to-me@Cluster Node IP -f -N
Cài đặt trình điều khiển Python trên server kết nối . Có một bản chạy nhanh các lệnh ở đây và bạn có thể đọc chi tiết hơn về chúng trong hướng dẫn này .
Cài đặt môi trường ảo Python:
sudo apt-get install python-virtualenv
Tạo folder ~/rethink
:
cd ~ mkdir rethink
Di chuyển vào folder và tạo cấu trúc môi trường ảo mới:
cd rethink virtualenv venv
Kích hoạt môi trường (bạn phải kích hoạt môi trường mọi lúc trước khi bắt đầu giao diện Python, nếu không bạn sẽ gặp lỗi về việc thiếu module ):
source venv/bin/activate
Cài đặt module RethinkDB:
pip install rethinkdb
Bây giờ bắt đầu Python từ server kết nối :
python
Kết nối với database , đảm bảo thay thế 28015
bằng cổng bạn đã sử dụng, nếu cần:
import rethinkdb as r r.connect("localhost", 28015).repl()
Tạo test
bảng:
r.db("test").table_create("test").run()
Chèn dữ liệu vào bảng test
:
r.db("test").table("test").insert({"hello":"world"}).run() r.db("test").table("test").insert({"hello":"world number 2"}).run()
Và in ra dữ liệu:
list(r.db("test").table("test").run())
Bạn sẽ thấy kết quả tương tự như sau:
[{u'hello': u'world number 2', u'id': u'0203ba8b-390d-4483-901d-83988e6befa1'}, {u'hello': u'world', u'id': u'7d17cd96-0b03-4033-bf1a-75a59d405e63'}]
Cài đặt độ sắc nét
Trong RethinkDB, bạn có thể cấu hình một bảng được chia nhỏ (chia nhỏ) trên nhiều server cloud . Sharding là một cách dễ dàng để có các tập dữ liệu lớn hơn những gì phù hợp với RAM của một máy hoạt động tốt, vì có nhiều RAM hơn cho bộ nhớ đệm. Vì sharding cũng chia nhỏ tập dữ liệu trên nhiều máy, bạn có thể có các bảng lớn hơn, hiệu suất thấp hơn, vì có nhiều dung lượng đĩa hơn cho bảng. Điều này có thể được thực hiện thông qua Control panel quản lý web.
Để thực hiện việc này, hãy chuyển đến tab Bảng trong Control panel Quản lý Web.
Nhấp vào bảng kiểm tra (bảng mà ta đã tạo trong phần trước) để vào cài đặt của nó. Cuộn xuống thẻ cài đặt Sharding .
Nhấp vào nút Chỉnh sửa . Tại đó, bạn có thể nhập số lượng server để chia bảng. Nhập 2 cho ví dụ này. Nhấp vào nút Cân bằng lại để lưu cài đặt.
Bạn có thể nhận thấy rằng có tối đa số lượng mảnh mà bạn có thể có. Con số này bằng với số lượng tài liệu trong database của bạn. Nếu bạn đang cố gắng cài đặt sharding cho một bảng mới, bạn cần phải đợi thêm dữ liệu hoặc thêm dữ liệu giả để cho phép mình thêm nhiều phân đoạn hơn.
Mài nâng cao
Về nội bộ, RethinkDB có các phân đoạn dựa trên phạm vi, dựa trên ID tài liệu. Điều này nghĩa là nếu ta có tập dữ liệu với các ID A, B, C và D, RethinkDB có thể chia nó thành 2 phân đoạn: A, B (-infinity thành C) và C, D (C to + infinity). Nếu bạn chèn một tài liệu có ID A1, thì tài liệu đó sẽ nằm trong phạm vi của phân đoạn đầu tiên (-vô cùng đến C), vì vậy nó sẽ nằm trong phân đoạn đó. Ta có thể đặt ranh giới của các phân đoạn, điều này có thể tối ưu hóa cấu hình database của bạn.
Trước khi ta có thể làm điều đó, ta sẽ muốn thêm một tập dữ liệu để chơi cùng. Trong tab Data Explorer của console quản lý web, ta có thể tạo bảng bằng cách chạy lệnh này (bấm Chạy sau khi nhập):
r.db('test').tableCreate('testShards')
Sau đó, chèn dữ liệu thử nghiệm của ta :
r.db("test").table("testShards").insert([ {id:"A"}, {id:"B"}, {id:"C"}, {id:"D"}, {id:"E"}])
Bây giờ ta có thể cấu hình chi tiết các phân đoạn. Để làm như vậy, ta cần nhập shell quản trị. Shell quản trị là một cách nâng cao hơn để kiểm soát cụm của bạn, cho phép bạn tinh chỉnh cài đặt của bạn . Trên máy rethink1 , mở shell quản trị:
rethinkdb admin
Sau đó, ta có thể xem một số thông tin về bảng của ta :
ls test.testShards
Sản lượng mong đợi:
table 'testShards' b91fda27-a9f1-4aeb-bf6c-a7a4211fb674 ... 1 replica for 1 shard shard machine uuid name primary -inf-+inf 91d89c12-01c7-487f-b5c7-b2460d2da22e rethink1 yes
Trong RethinkDB có nhiều cách đặt tên cho bảng. Bạn có thể sử dụng database.name
( test.testShards
), tên ( testShards
) hoặc uuid bảng ( e780f2d2-1baf-4667-b725-b228c7869aab
). Tất cả đều được dùng thay thế cho nhau.
Hãy chia mảnh này. Ta sẽ tạo 2 phân đoạn: -infinity thành C và C thành + infinity:
split shard test.testShards C
Dạng chung của lệnh là:
split shard TABLE SPLIT-POINT
Chạy ls testShards
cho thấy phân đoạn đã được tách. Bạn có thể cần di chuyển phân đoạn mới từ máy này sang máy khác. Đối với ví dụ này, ta có thể ghim (di chuyển) phân -inf-C
(-infinty thành C) để máy suy nghĩ lại2 :
pin shard test.testShards -inf-C --master rethink2
Dạng chung của lệnh là:
pin shard TABLE SHARD-RANGE --master MACHINE-NAME
Nếu bạn lại ls testShards
, bạn sẽ thấy rằng phân đoạn đã chuyển sang một server khác.
Ta cũng có thể hợp nhất 2 mảnh nếu ta biết ranh giới chung. Hãy hợp nhất các mảnh mà ta vừa tạo (-infinity thành C và C thành + infinity):
merge shard test.testShards C
Dạng chung của lệnh là:
merge shard TABLE COMMON-BOUNDARY
Để thoát khỏi shell , hãy nhập exit
Tháo máy an toàn
Khi một tài liệu được chia thành nhiều máy, một máy sẽ luôn giữ index chính của nó. Nếu server cloud có index chính cho một tài liệu cụ thể được đưa vào offline , tài liệu sẽ bị mất. Vì vậy, trước khi xóa một máy, bạn nên di chuyển tất cả các phân đoạn chính trên máy ra khỏi nó.
Trong ví dụ này, ta sẽ cố gắng di chuyển dữ liệu khỏi nút rethink2 để để lại rethink1 làm nút duy nhất.
Nhập shell quản trị RethinkDB trên rethink1 :
rethinkdb admin
Trước tiên, hãy liệt kê các phân đoạn ( group tài liệu) mà rethink2 chịu trách nhiệm:
ls rethink2
Đầu ra của bạn sẽ trông giống như sau:
machine 'rethink2' bc2113fc-efbb-4afc-a2ed-cbccb0c55897 in datacenter 00000000-0000-0000-0000-000000000000 hosting 1 replicas from 1 tables table name shard primary b91fda27-a9f1-4aeb-bf6c-a7a4211fb674 testShards -inf-+inf yes
Điều này cho thấy rằng rethink2 chịu trách nhiệm về phân đoạn chính của bảng có id “bdfceefb-5ebe-4ca6-b946-869178c51f93”. Tiếp theo, ta sẽ di chuyển phân đoạn này để suy nghĩ lại1 . Điều này được gọi là ghim:
pin shard test.testShards -inf-+inf --master rethink1
Dạng chung của lệnh là:
pin shard TABLE SHARD-RANGE --master MACHINE-NAME
Nếu bây giờ bạn chạy ls rethink1
bạn sẽ thấy rằng phân đoạn đã được chuyển đến máy đó. Khi mọi phân đoạn đã được chuyển từ rethink2 sang rethink1 , bạn nên thoát khỏi shell quản trị:
exit
Bây giờ có thể an toàn để dừng RethinkDB trên server không mong muốn. Quan trọng: chạy phần này trên máy bạn muốn xóa . Trong ví dụ này, ta sẽ chạy điều này trên rethink2 :
sudo service rethinkdb stop
Lần tiếp theo bạn truy cập console quản lý web, RethinkDB sẽ hiển thị cảnh báo màu đỏ tươi. Nhấp vào Giải quyết vấn đề .
Nếu sự cố hiển thị giống như sự cố ở trên và không có trách nhiệm chính nào được liệt kê, hãy nhấp vào Xóa vĩnh viễn . Thao tác này sẽ xóa máy khỏi cụm. Nếu nó liệt kê bất kỳ trách nhiệm chính nào, hãy bật lại RethinkDB ( sudo service rethinkdb start
) và đảm bảo bạn di chuyển mọi phân đoạn chính khỏi server đó.
Lưu ý: Nếu bạn cố gắng thêm lại máy vào cụm, bạn sẽ thấy thông báo về máy zombie. Bạn có thể xóa folder dữ liệu để khắc phục sự cố này:
sudo rm -r /var/lib/rethinkdb/cluster_instance/ sudo service rethinkdb restart
Các tin liên quan
Cách cấu hình Varnish Cache 4.0 với SSL Termination trên Ubuntu 14.042014-08-07
Giới thiệu về Ganglia trên Ubuntu 14.04
2014-08-05
Cách thực hiện chấm dứt SSL với HAProxy trên Ubuntu 14.04
2014-07-10
Cách sử dụng WP Super Cache và Jetpack Photon để tối ưu hóa hiệu suất WordPress trên Ubuntu 14.04
2014-06-27
Cách cài đặt Tinc và thiết lập VPN cơ bản trên Ubuntu 14.04
2014-06-18
Cách cài đặt và sử dụng OTPW cho mật khẩu SSH dùng một lần trên Ubuntu 14.04
2014-06-17
Cách cài đặt và cấu hình Syncthing để đồng bộ hóa các thư mục trên Ubuntu 14.04
2014-06-16
Cách sử dụng Icinga để giám sát server và dịch vụ của bạn trên Ubuntu 14.04
2014-06-13
Cách sử dụng Logstash và Kibana để tập trung log trên Ubuntu 14.04
2014-06-11
Cách cài đặt Graylog2 và tập trung log trên Ubuntu 14.04
2014-06-06