Cách cài đặt và cấu hình NATS trên Ubuntu 16.04
NATS là một hệ thống nhắn tin hiệu suất cao open-souce , thường được mô tả là "một hệ thống thần kinh trung ương cho cloud ". Nó có khả năng định tuyến hàng triệu tin nhắn mỗi giây, lý tưởng cho việc kết nối các thiết bị microservices và IoT (Internet of Things).NATS là một hệ thống nhắn tin PubSub . Trong loại hệ thống này, một hoặc nhiều nhà xuất bản gửi tin nhắn với một chủ đề nhất định đến người message broker và người message broker sẽ gửi những tin nhắn này cho bất kỳ khách hàng hoặc người đăng ký nào của chủ đề nhất định. Các nhà xuất bản không biết hoặc thậm chí không quan tâm đến người đăng ký và ngược lại. Kiến trúc này giúp dễ dàng mở rộng quy mô hệ thống và thêm các khả năng mới vì ta có thể thêm nhà xuất bản và người đăng ký mà không ảnh hưởng đến phần còn lại của hệ thống. Loại hệ thống này hoàn hảo để giám sát server và thiết bị; thiết bị có thể gửi tin nhắn và ta có thể đăng ký các tin nhắn đó để gửi thông báo qua email hoặc các phương tiện khác.
Trong hướng dẫn này, ta sẽ cài đặt gnatsd
, server NATS chính thức, như một dịch vụ và làm cho nó có thể truy cập một cách an toàn. Ta cũng sẽ tạo một hệ thống cảnh báo quá tải server cơ bản để gửi email khi tải server quá cao, sử dụng gnatsd
làm nhà broker thư của nó.
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Server Ubuntu 16.04 mới.
- Một account user tiêu chuẩn với các quyền
sudo
. Bạn có thể cài đặt một account tiêu chuẩn theo Cài đặt Server Ban đầu với Ubuntu 16.04 .
Bước 1 - Download Server NATS
Hãy bắt đầu bằng cách download server gnatsd
và đảm bảo nó chạy trên hệ thống của ta mà không gặp sự cố nào .
Bản phát hành gnatsd
ổn định mới nhất là version 0.9.4 tại thời điểm hướng dẫn này được viết. Bạn có thể kiểm tra trang download NATS để biết version mới hơn và điều chỉnh các lệnh bên dưới nếu cần nếu bạn muốn sử dụng version mới hơn.
Đầu tiên, đăng nhập vào server của bạn bằng account không phải root của bạn:
- ssh sammy@your_server_ip
Sau đó, hãy đảm bảo bạn đang ở trong folder chính của user :
- cd
Tiếp theo, sử dụng wget
để tải gnatsd
xuống server của bạn:
- wget https://github.com/nats-io/gnatsd/releases/download/v0.9.4/gnatsd-v0.9.4-linux-amd64.zip
Tệp lưu trữ bạn vừa download là file nén, vì vậy bạn cần cài đặt unzip
để extract các file . Bạn có thể cài đặt nó bằng apt
:
- sudo apt-get install -y unzip
Sau đó sử dụng unzip
để extract gnatsd
:
- unzip -p gnatsd-v0.9.4-linux-amd64.zip gnatsd-v0.9.4-linux-amd64/gnatsd > gnatsd
Sau đó làm cho gnatsd
có thể thực thi để bạn có thể chạy nó:
- chmod +x gnatsd
Hãy kiểm tra xem ta có thể chạy gnatsd
bằng cách chạy nó từ folder hiện tại. Sử dụng lệnh sau để bắt đầu gnatsd
:
- ./gnatsd --addr 127.0.0.1 --port 4222
Đầu ra bạn thấy sẽ tương tự như ví dụ này:
Output[1851] 2016/09/23 05:20:02.247420 [INF] Starting nats-server version 0.9.4 [1851] 2016/09/23 05:20:02.248182 [INF] Listening for client connections on 127.0.0.1:4222 [1851] 2016/09/23 05:20:02.248626 [INF] Server is ready
Theo mặc định, gnatsd
lắng nghe trên cổng 4222
trên địa chỉ 0.0.0.0
tương ứng với tất cả các giao diện. Sử dụng đối số --port
, bạn có thể thay đổi cổng và với --addr
bạn có thể thay đổi địa chỉ mà nó lắng nghe. Ta đã chạy gnatsd
với --addr 127.0.0.1
, để nó chỉ khả dụng trong server của ta và không thể truy cập bởi các client bên ngoài. Ở phần sau của hướng dẫn, ta sẽ bảo mật gnatsd
và mở nó ra với thế giới.
Nhấn CTRL+C
để tắt gnatsd
.
Đến đây bạn đã biết mọi thứ hoạt động, hãy sắp xếp mọi thứ theo cách chính thức hơn.
Bước 2 - Tạo cấu trúc folder và file cấu hình
Trên Linux, bên thứ ba, phần mềm liên quan đến dịch vụ thường được lưu trong folder /srv
. Ta sẽ tuân theo quy ước đó và giữ các file liên quan đến NATS dưới /srv/nats
. Ta sẽ đặt file thực thi gnatsd
trong /srv/nats/bin
.
Đầu tiên, tạo folder /srv/nats/bin
:
- sudo mkdir -p /srv/nats/bin
Sau đó di chuyển gnatsd
vào folder /srv/nats/bin
:
- sudo mv ~/gnatsd /srv/nats/bin
Server có thể tải cấu hình của nó từ một file , điều này sẽ rất hữu ích khi ta cần sửa đổi cài đặt server trong phần sau của hướng dẫn. Tạo file /srv/nats/gnatsd.config
:
- sudo nano /srv/nats/gnatsd.config
Và thêm các nội dung sau vào file :
port: 4222 net: '127.0.0.1'
Tệp cấu hình này yêu cầu server gnatsd
lắng nghe trên cổng 4222
trên địa chỉ 127.0.0.1
, giống như trước đây, nhưng lần này ta sẽ không phải chỉ định các tùy chọn đó trên dòng lệnh.
Hãy chạy lại server đảm bảo rằng ta đã cấu hình mọi thứ một cách chính xác. Thực thi lệnh sau để chạy gnatsd
bằng file cấu hình mới:
- /srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config
Đầu ra tương tự như những gì bạn đã thấy trước đây:
Output[1869] 2016/06/18 05:30:55.988856 [INF] Starting nats-server version 0.9.4 [1869] 2016/06/18 05:30:55.989190 [INF] Listening for client connections on 127.0.0.1:4222 [1869] 2016/06/18 05:30:55.989562 [INF] Server is ready
, nhấn CTRL+C
để tắt gnatsd
và quay lại dấu nhắc của bạn. Bây giờ hãy tạo một user sẽ chạy dịch vụ này.
Bước 3 - Tạo User Dịch vụ
Thực hành bảo mật tốt là chạy mỗi dịch vụ bằng account user của chính nó để hạn chế thiệt hại trong trường hợp dịch vụ bị xâm phạm. Hãy tạo một user và group sở hữu dịch vụ NATS và các file liên quan đến NATS.
Đầu tiên, hãy tạo một user hệ thống và group có tên nats
:
- sudo adduser --system --group --no-create-home --shell /bin/false nats
OutputAdding system user `nats' (UID 106) ... Adding new group `nats' (GID 114) ... Adding new user `nats' (UID 106) with group `nats' ... Not creating home directory `/home/nats'.
Ta đã gán /bin/false
shell cho user hệ thống nats
để tắt thông tin đăng nhập cho user này và ngăn chặn việc tạo folder chính. Ta cũng đã tạo một group nats
.
Hãy thay đổi chủ sở hữu của folder /srv
thành user và group nats
:
- sudo chown -R nats:nats /srv
Bây giờ ta đã tạo user và group nats
, hãy tiếp tục tạo dịch vụ NATS.
Bước 4 - Chạy gnatsd như một Dịch vụ
Ta muốn gnatsd
bắt đầu khi hệ thống khởi động và khởi động lại nếu nó bị lỗi. Ta sẽ sử dụng systemd để xử lý việc này.
systemd là một trình quản lý dịch vụ cho các hệ thống Linux. Nó chịu trách nhiệm khởi động các dịch vụ khi khởi động, khởi động lại chúng khi cần thiết và dừng chúng theo cách có kiểm soát khi tắt hệ thống.
Ta cần tạo cấu hình dịch vụ để xác định cách thức và thời điểm khởi động dịch vụ NATS. Tệp dịch vụ do user tạo nằm trong /etc/systemd/system
, vì vậy hãy tạo file /etc/systemd/system/nats.service
:
- sudo nano /etc/systemd/system/nats.service
Và trong file , hãy đặt tập lệnh này để xác định cách gnatsd
sẽ khởi động:
[Unit] Description=NATS messaging server [Service] ExecStart=/srv/nats/bin/gnatsd -c /srv/nats/gnatsd.config User=nats Restart=on-failure [Install] WantedBy=multi-user.target
- Phần
[Unit]
chứa thông tin chung về dịch vụ, chẳng hạn nhưDescription
tả mô tả dịch vụ. - Phần
[Service]
chứa cấu hình liên quan đến dịch vụ.ExecStart
là lệnh để chạy server . Ta sử dụng đường dẫn tuyệt đối của file thực thignatsd
ở đây.Restart=on-failure
nghĩa là dịch vụ phải được khởi động lại nếu nó bị treo hoặc kết thúc do lỗi. Nó sẽ không được khởi động lại nếu nó bị dừng bởi systemd. - Phần
[Install]
chứa thông tin cài đặt về dịch vụ.WantedBy=multi-user.target
yêu cầu systemd khởi động dịch vụ khi khởi độngmulti-user.target
. Đây là một cách chung để khởi động các dịch vụ khi khởi động hệ thống.
Khi mô tả dịch vụ đã có, ta có thể bắt đầu nó bằng lệnh sau:
- sudo systemctl start nats
Hãy xác nhận gnatsd
đang chạy bằng cách gửi tin nhắn PING
:
- printf "PING\r\n" | nc 127.0.0.1 4222
Ta vừa sử dụng nc
để giao tiếp với gnatsd
. nc
là một tiện ích dòng lệnh để giao tiếp với các server TCP hoặc UDP. Lệnh ta đã sử dụng in ra kết quả tương tự như sau:
OutputINFO {"server_id":"Os7xI5uGlYFJfLlfo1vHox","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":false,"tls_required":false,"tls_verify":false,"max_payload":1048576} PONG
Phản hồi PONG
cho ta biết server đang lắng nghe và hoạt động như mong đợi. Ta cần chạy một lệnh cuối cùng để làm cho server NATS của ta bắt đầu khi server khởi động :
- sudo systemctl enable nats
Bạn sẽ thấy kết quả sau xác nhận dịch vụ đã được cài đặt:
OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/nats.service to /etc/systemd/system/nats.service.
Ta đã cấu hình thành công gnatsd
để chạy như một dịch vụ. Bây giờ hãy bảo mật nó và làm cho nó có thể truy cập được đối với các client bên ngoài.
Bước 5 - Bảo mật kết nối với Dịch vụ NATS
Nếu tất cả các nhà xuất bản và người đăng ký mà ta muốn sử dụng với gnatsd
chạy trên cùng một server , ta có thể gọi là xong và tiếp tục nhưng điều đó hiếm khi xảy ra hiện nay. Ta cần cho phép khách hàng bên ngoài kết nối và xuất bản tin nhắn lên gnatsd
một cách an toàn.
gnatsd
hỗ trợ truyền tải TLS, vì vậy ta sẽ sử dụng điều đó đảm bảo giao tiếp giữa gnatsd
và client NATS.
Đầu tiên, ta cần một certificate . Bạn có thể mua certificate thương mại, lấy một certificate từ Let's Encrypt hoặc tạo certificate tự ký. Ta sẽ sử dụng cách tiếp cận thứ hai, vì việc có được certificate nằm ngoài phạm vi của bài viết này.
Tạo một folder để lưu giữ certificate tạm thời:
- mkdir ~/priv
Sau đó, tạo certificate tự ký bằng lệnh sau:
- openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
- -keyout priv/gnatsd.key -out priv/gnatsd.crt \
- -subj "/C=US/ST=Texas/L=Austin/O=AwesomeThings/CN=www.example.com"
Lệnh này tạo certificate RSA với 2048 bit và hiệu lực 10 năm. Lưu ý ta đã sử dụng một domain tùy ý vì ta sẽ không bật xác minh TLS cho server gnatsd
trong bài viết này.
Đến đây bạn sẽ có các file gnatsd.key
và gnatsd.crt
trong folder ~/priv
. Hãy di chuyển các file đó theo cấu trúc folder /srv/nats/
của ta để mọi thứ đều ở một nơi. Thực hiện lệnh sau:
- sudo mv ~/priv /srv/nats
Bây giờ, làm cho /srv/nats/priv
có thể truy cập cho user và group nats
:
- sudo chmod 440 /srv/nats/priv/*
- sudo chmod 550 /srv/nats/priv
- sudo chown -R nats:nats /srv/nats/priv
Bây giờ ta cập nhật /srv/nats/gnatsd.config
để chứa certificate và khóa ta vừa tạo. Mở lại file cấu hình:
- sudo nano /srv/nats/gnatsd.config
Và thêm phần sau để gnatsd
sử dụng certificate và khóa của bạn:
. . . tls { cert_file: "/srv/nats/priv/gnatsd.crt" key_file: "/srv/nats/priv/gnatsd.key" timeout: 1 }
Lưu file và thoát khỏi editor . Sau đó, khởi động lại dịch vụ để nó có thể nhận các thay đổi.
- sudo systemctl restart nats
Hãy kiểm tra xem các certificate của ta có hoạt động không. Chạy lệnh này:
- printf "PING\r\n" | nc localhost 4222
Lần này, lệnh xuất ra thông báo sau:
OutputINFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} -ERR 'Secure Connection - TLS Required'
Server trả về thông báo -ERR 'Secure Connection - TLS Required'
xác nhận cấu hình mới đã được chọn và yêu cầu kết nối an toàn, mà nc
không biết phải làm thế nào.
Để có thể giao tiếp với dịch vụ NATS của ta mà không cần cài đặt ứng dụng client NATS hoàn chỉnh, ta sẽ sử dụng một công cụ có tên là catnats . Hãy download trước:
- wget https://github.com/yuce/catnats/raw/0.1.2/catnats.py
Và làm cho nó có thể thực thi được:
- chmod +x catnats.py
Cuối cùng, di chuyển catnats.py
vào folder /srv/nats/bin
và đổi tên nó thành catnats
:
- sudo mv catnats.py /srv/nats/bin/catnats
Hãy kiểm tra xem ta có thể giao tiếp với dịch vụ NATS của bạn bằng catnats
, bằng cách gửi cùng một tin nhắn PING
mà ta đã gửi trước đây:
- printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222
Bạn sẽ thấy kết quả này cho biết kết nối của ta là an toàn:
OutputINFO {"server_id":"npkIPrCE5Kp8O3v1EfV8dz","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":false,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} PONG
Bây giờ ta đã bảo mật thông tin liên lạc, hãy cài đặt xác thực để tên user và password được yêu cầu để kết nối với NATS.
Bước 6 - Yêu cầu xác thực
Dịch vụ NATS của ta không yêu cầu xác thực theo mặc định. Điều này là tốt khi dịch vụ chỉ có thể truy cập được trên mạng riêng, nhưng ta muốn dịch vụ NATS của bạn có thể truy cập được trên internet, vì vậy ta nên cài đặt xác thực . gnatsd
hỗ trợ xác thực tên user và password và rất dễ kích hoạt.
Mở file /srv/nats/gnatsd.config
:
- sudo nano /srv/nats/gnatsd.config
Thêm phần authorization
mới chỉ định thông tin đăng nhập. Ta sẽ sử dụng user1
làm tên user và pass1
làm password cho hướng dẫn này. Bạn nên sử dụng password dài hơn, phức tạp hơn trong môi trường production :
. . . authorization { user: user1 password: pass1 }
Lưu file , sau đó thay đổi chủ sở hữu của /srv/nats/gnatsd.config
thành nats
và làm cho user đó có thể đọc được để bảo vệ tên user và password khỏi những user khác trên hệ thống:
- sudo chown nats /srv/nats/gnatsd.config
- sudo chmod 400 /srv/nats/gnatsd.config
Sau đó, khởi động lại dịch vụ để các thay đổi có hiệu lực:
- sudo systemctl restart nats
Hãy gửi tin nhắn PING
đến gnatsd
để kiểm tra xem mọi thứ có ổn không. , hãy sử dụng catnats
để gửi tin nhắn:
- printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222
Bạn sẽ thấy kết quả sau:
OutputNFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} -ERR 'Authorization Violation'
Điều này cho ta biết rằng các thay đổi đã được áp dụng thành công và bây giờ ta cần gửi tên user và password chính xác để kết nối với dịch vụ. Hãy thử lại, lần này cung cấp tên user user1
và password pass1
:
- printf "PING\r\n" | /srv/nats/bin/catnats --addr 127.0.0.1:4222 --user user1 --pass pass1
Lần này nó hoạt động, như bạn thấy từ kết quả sau:
OutputINFO {"server_id":"sY0SSJBNbEw53HxzS9mH1t","version":"0.9.4","go":"go1.6.3","host":"127.0.0.1","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} +OK PONG
Bây giờ ta đã giới hạn dịch vụ này cho các khách hàng biết tên user và password , ta có thể cấu hình lại dịch vụ để các khách hàng bên ngoài có thể kết nối.
Bước 7 - Mở dịch vụ ra thế giới
Ta đã cấu hình server NATS của bạn để lắng nghe trên 127.0.0.1
, đây là giao diện local . Nếu ta làm cho nó lắng nghe trên 0.0.0.0
, thì nó sẽ có sẵn trên toàn thế giới. Hãy cập nhật /srv/nats/gnatsd.config
lần cuối:
- sudo nano /srv/nats/gnatsd.config
Sau đó, thay đổi địa chỉ IP được liên kết với cài đặt net
:
. . . net: '0.0.0.0' . . .
Lưu file và khởi động lại dịch vụ:
- sudo systemctl restart nats
Và bây giờ dịch vụ NATS của ta đã sẵn sàng cho các kết nối client bên ngoài. Để tìm hiểu cách sử dụng nó, hãy tạo một dịch vụ giám sát đơn giản sử dụng server NATS của ta làm message broker .
Bước 8 - (Tùy chọn) Cấu hình thông báo khi server quá tải
Trong phần này, bạn sẽ tạo một hệ thống giám sát quá tải đơn giản để sử dụng dịch vụ NATS của bạn. Hệ thống sẽ nhận mức trung bình tải của các server và gửi email đến administrator nếu bất kỳ server nào bị quá tải.
Dự án mẫu sẽ bao gồm các thành phần sau:
- Dịch vụ NATS bạn vừa cấu hình .
- Một màn hình , công bố tên server , tải trung bình và số bộ xử lý của server cho chủ đề
stats.loadaverage
sau mỗi 60 giây. Bạn cần chạy thành phần này trên bất kỳ server nào bạn muốn theo dõi tải. - Trình thông báo , đăng ký chủ đề
stats.loadaverage
và nhận tên server lưu trữ, tải trung bình và số bộ xử lý của server . Nếu trung bình tải của server lưu trữ trên một ngưỡng nhất định, trình thông báo sẽ gửi email đến địa chỉ được định nghĩa thông qua server SMTP.
Ta sẽ chạy tất cả các thành phần này trên cùng một server để đơn giản hơn, nhưng bạn có thể thử chạy từng thành phần trong một server khác khi bạn đã hoàn thành hướng dẫn này.
Cài đặt màn hình
Bạn có thể đọc tải trung bình trên hệ thống Linux từ /proc/loadavg
. Đối với dự án này, ta chỉ quan tâm đến mức trung bình tải của phút cuối cùng, là trường đầu tiên của kết quả . Sử dụng lệnh này để nhận giá trị đó:
- cat /proc/loadavg | cut -f1 -d" "
Bạn sẽ thấy kết quả sau:
Output0.11
Mức trung bình tải bạn nhận được bằng cách đọc /proc/loadavg
phụ thuộc vào số lượng bộ xử lý, vì vậy bạn phải chuẩn hóa nó bằng cách chia mức trung bình tải cho số bộ xử lý. Bạn có thể sử dụng lệnh sau để lấy số lượng bộ xử lý của server của bạn:
- getconf _NPROCESSORS_ONLN
Bạn sẽ thấy kết quả được hiển thị trong terminal của bạn :
Output1
Vì shell mặc định của server của ta không thể xử lý số học số động, ta sẽ gửi cả trung bình tải và số bộ xử lý cùng với tên server lưu trữ dưới dạng trọng tải của thông báo của ta và thực hiện phân chia trong trình thông báo sau đó. Đây là lệnh ta sẽ sử dụng để tạo tải trọng:
- echo $(hostname) `cat /proc/loadavg | cut -f1 -d" "` `getconf _NPROCESSORS_ONLN`
Lệnh hiển thị tên server , trung bình tải và số bộ xử lý, tương ứng:
Outputyour_hostname 0.28 1
Hãy tạo một tập lệnh shell xuất bản tên server , tải trung bình và số lượng bộ xử lý cho server NATS của ta với chủ đề stats.loadaverage
. Ta sẽ cấu hình hệ thống của bạn để chạy tập lệnh này theo định kỳ. Tạo một file mới có tên ~/publish_load_average.sh
:
- nano ~/publish_load_average.sh
Trong file , hãy thêm tập lệnh này:
NATS_ADDR=127.0.0.1:4222 LOADAVG=$(cat /proc/loadavg | cut -f1 -d" ") NPROC=$(getconf _NPROCESSORS_ONLN) SUBJECT="stats.loadaverage" PAYLOAD=$(echo $(hostname) $LOADAVG $NPROC) MESSAGE="PUB $SUBJECT ${#PAYLOAD}\r\n${PAYLOAD}\r\n" printf "$MESSAGE" | /srv/nats/bin/catnats -q --raw --addr $NATS_ADDR --user user1 --pass pass1
Tập lệnh này tạo ra thông báo và sau đó chuyển nó đến các catnats
, nơi xuất bản thông báo tới dịch vụ NATS. Ta chạy catnats
với -q
switch để ngăn chặn bất kỳ kết quả , và ta sử dụng --raw
switch để catnats
không cố gắng để giải thích nội dung của các đầu vào. Bạn có thể thay đổi giá trị của biến $NATS_ADDR
nếu dịch vụ NATS nằm trên các server khác nhau.
Hãy kiểm tra xem kịch bản có gửi trung bình tải tới NATS không.
Lệnh sau chạy ~/publish_load_average.sh
cứ sau 5 giây. Lưu ý ta sử dụng ký tự &
ở cuối dòng để chạy lệnh trong nền:
- while true; do sh ~/publish_load_average.sh; sleep 5; done &
Bạn sẽ thấy kết quả hiển thị rằng lệnh đang chạy trong nền với một ID tiến trình:
Output[1] 14123
Lưu ý : Ghi lại ID tiến trình ở đâu đó, vì bạn cần sử dụng ID để dừng lệnh sau này.
Bây giờ hãy kết nối với NATS và đăng ký chủ đề stats.loadaverage
để truy xuất mức trung bình tải:
- printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
Ta sử dụng cờ --no-exit
để tắt tính năng tự động thoát và --pong
để duy trì kết nối của ta với NATS. Nếu mọi thứ đều chính xác, bạn sẽ nhận được kết quả tương tự như sau sẽ cập nhật sau mỗi 5 giây:
OutputINFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} +OK +OK MSG stats.loadaverage 0 27 your_hostname 0.08 1
Nhấn CTRL+C
để thoát khỏi catnats
. Ta hãy dừng vòng lặp có tên là publish_load_average.sh
vì ta sẽ có một cách tốt hơn để chạy publish_load_average.sh
:
- kill 14123
Phương pháp ta vừa thực hiện rất hiệu quả để thử nghiệm, nhưng nó không phải là thứ ta muốn sử dụng vĩnh viễn. Ta muốn hệ thống chạy publish_load_average.sh
chạy mỗi phút. Để thực hiện điều đó, ta có thể thêm một mục crontab . Hệ thống Linux sử dụng cron
, một hệ thống có thể chạy các lệnh, hay còn gọi là “công việc”, theo lịch trình mà ta chỉ định. Lệnh crontab
cho phép ta quản lý các công việc này. Bạn có thể tìm hiểu tất cả về Cron trong hướng dẫn Cách sử dụng Cron để tự động hóa công việc trên VPS .
Để tạo một mục nhập mới, hãy thực hiện lệnh:
- crontab -e
Nếu bạn chưa bao giờ chạy lệnh trên, bạn có thể thấy dấu nhắc sau sẽ yêu cầu bạn chọn một editor để quản lý các mục nhập:
Outputno crontab for demo - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/ed 2. /bin/nano <---- easiest 3. /usr/bin/vim.basic 4. /usr/bin/vim.tiny Choose 1-4 [2]:
Nhập số tương ứng với editor mà bạn thấy phù hợp nhất và nhấn ENTER
. Một file sẽ được hiển thị trong editor bạn đã chọn.
Ở cuối file đã mở, hãy thêm dòng sau, nhưng hãy thay thế tên user của bạn nếu bạn đã sử dụng thứ gì đó không phải sammy
:
*/1 * * * * bash /home/sammy/publish_load_average.sh
Mục ở trên yêu cầu cron
chạy tập lệnh publish_load_average.sh
của ta mỗi phút. Lưu file và đóng editor .
Bây giờ, hãy kiểm tra xem xuất bản định kỳ của mức trung bình tải có hoạt động không:
- printf "SUB stats.loadaverage 0\r\n" | /srv/nats/bin/catnats --raw --no-exit --pong --user user1 --pass pass1
Chờ trong vài phút và kết quả bạn thấy sẽ tương tự như sau:
OutputINFO {"server_id":"A8qJc7mdTy8AWBRhPWACzW","version":"0.8.1","go":"go1.6.2","host":"0.0.0.0","port":4222,"auth_required":true,"ssl_required":true,"tls_required":true,"tls_verify":false,"max_payload":1048576} +OK +OK MSG stats.loadaverage 0 27 your_hostname 0.01 1 MSG stats.loadaverage 0 27 your_hostname 0.00 1
Nhấn CTRL+C
để thoát catnats
.
Ta đã cài đặt thành công màn hình và nó đang gửi thông báo đến server NATS của ta . Tiếp theo, ta sẽ cài đặt trình thông báo sử dụng dữ liệu này.
Tạo trình thông báo
Hãy tạo trình thông báo kết nối với dịch vụ NATS của ta và lắng nghe các thông báo stats.loadaverage
. Khi nào chương trình của ta nhận được một thông báo, nó sẽ tính toán mức tải trung bình trên mỗi bộ xử lý. Nếu nó cao hơn 0,6 hoặc 60% sử dụng CPU trên mỗi bộ xử lý, nó sẽ đặt cờ cảnh báo cho server lưu trữ đã xuất bản thông báo và gửi email đến một địa chỉ được định nghĩa . Nếu mức trung bình tải trên mỗi bộ xử lý nhỏ hơn 0,4, cờ cảnh báo cho server sẽ bị xóa. Để tránh làm tràn hộp thư đến, ta sẽ gửi một email khi cờ cảnh báo được đặt.
Ta sẽ sử dụng Node.JS để tạo trình thông báo, vì có một ứng dụng client NATS tuyệt vời cho Node.js. Vì vậy, hãy cài đặt Node.js trước:
- sudo apt-get install -y npm
Tiếp theo, tạo folder cho trình thông báo và chuyển sang nó:
- mkdir ~/overload_notifier && cd ~/overload_notifier
Các dự án Node.js sử dụng một file có tên là package.json
chứa thông tin về dự án và các phụ thuộc của nó. Thực thi lệnh sau để tạo file đó:
- npm init -y
Sau đó, cài đặt ứng dụng client NATS cho Node.js, cũng như module nodemailer
mà ta sẽ sử dụng trong dự án này để gửi email cảnh báo:
- npm install nodemailer@2.4.2 nats@0.6.4 --save-exact
Bây giờ ta có thể tạo trình thông báo. Tạo file notifier.js
:
- nano notifier.js
Sau đó, thêm mã sau vào file :
var NATS_URL = 'nats://127.0.0.1:4222'; var NATS_USER = 'user1'; var NATS_PASS = 'pass1'; var EMAIL_TO = 'admin@example.com';
Đảm bảo bạn thay đổi các tùy chọn này để trùng với tên user và password cho dịch vụ NATS, cũng như địa chỉ email của bạn.
Tiếp theo, thêm mã này để nhập ứng dụng Node.js NATS và kết nối với dịch vụ gnatsd
:
var tlsOptions = { rejectUnauthorized: false, }; var nats = require('nats').connect({url: NATS_URL, tls: tlsOptions, user: NATS_USER, pass: NATS_PASS});
Sau đó, thêm mã này để cài đặt phong bì và kết nối với server SMTP sẽ gửi email. Ta sẽ sớm cài đặt server này:
var nodemailer = require('nodemailer'); var transport = nodemailer.createTransport('smtp://localhost:2525');
Sau đó, thêm phần còn lại của mã để tính toán mức trung bình tải và xác định xem ta có cần gửi email thông báo hay không:
// keep the state of warnings for each host var warnings = {}; function sendEmail(subject, text) { transport.sendMail({ to: EMAIL_TO, subject: subject, text: text }); } function processMessage(message) { // message fields: host load processor_count var fields = message.split(" "); var host = fields[0]; var loadAverage = parseFloat(fields[1]) / parseInt(fields[2]); if (loadAverage > 0.6) { if (!warnings[host]) { // send warning email if one wasn't already sent var res = sendEmail('Warning! Server is Overloaded: ' + host, 'Load average: ' + loadAverage); // set warning for the host warnings[host] = true; } } else if (loadAverage < 0.4) { if (warnings[host]) { // clear the warning warnings[host] = false; } } } nats.subscribe('stats.loadaverage', processMessage);
Ta đăng ký nhận tin nhắn và mỗi khi ta nhận được tin nhắn, ta thực hiện hàm processMessage
, hàm này sẽ phân tích trọng lượng mà ta đã gửi và xác định mức trung bình tải. Nếu nó quá cao, ta sẽ gửi tin nhắn và theo dõi xem trước đây ta đã gửi tin nhắn hay chưa bằng cách đặt cờ dựa trên tên server . Bằng cách này, ta có thể theo dõi thông báo trên cơ sở từng server . Nếu mức trung bình tải dưới ngưỡng của ta , ta xóa cờ đó.
Với màn hình và trình thông báo tại chỗ, đã đến lúc kiểm tra dự án mẫu của ta .
Kiểm tra dự án
Hãy lấy cái này để lái thử. Ta sẽ tạo một số tải nhân tạo và kiểm tra xem trình thông báo có gửi email cảnh báo khi tải quá cao hay không.
Hãy cài đặt công cụ stress
để tạo tải CPU trên server của ta :
- sudo apt-get install -y stress
Tiếp theo, ta cần cài đặt một server SMTP để gửi thư từ trình thông báo của ta . Việc cài đặt và cấu hình một server SMTP toàn diện sẽ là quá mức cần thiết cho thử nghiệm này, vì vậy ta sẽ sử dụng một server SMTP đơn giản chỉ hiển thị các email được gửi đến nó thay vì thực sự gửi chúng. Ngôn ngữ lập trình Python có một module DebuggingServer
mà ta có thể tải để loại bỏ các email mà nó nhận được, nhưng hiển thị chúng ra màn hình để ta có thể đảm bảo mọi thứ hoạt động. Python đã được cài đặt trên server Ubuntu của ta , vì vậy đây là một giải pháp hoàn hảo.
Hãy bắt đầu gỡ lỗi server SMTP trong nền. Ta sẽ làm cho nó lắng nghe trên cổng localhost
2525
, trùng với địa chỉ SMTP mà ta đã cấu hình trong mã notifier.js
của ta . Thực thi lệnh này để khởi động server SMTP:
- python -m smtpd -n -c DebuggingServer localhost:2525 &
Sau đó, khởi động trình thông báo trong nền bằng lệnh này:
- nodejs ~/overload_notifier/notifier.js &
Và cuối cùng, hãy tạo một số tải trên tất cả các bộ xử lý của server của ta . Thực hiện lệnh stress
với các tùy chọn sau:
- stress --cpu $(getconf _NPROCESSORS_ONLN)
Sau một vài phút, bạn sẽ thấy kết quả tương tự như sau, khi server SMTP bắt đầu hiển thị các thông báo được gửi bởi trình thông báo:
Output---------- MESSAGE FOLLOWS ---------- Content-Type: text/plain To: admin@example.com Subject: Warning! Server is Overloaded: your_hostname Message-Id: <1466354822129-04c5d944-0d19670b-780eee12@localhost> X-Mailer: nodemailer (2.4.2; +http://nodemailer.com/; SMTP/2.5.0[client:2.5.0]) Content-Transfer-Encoding: 7bit Date: Sun, 19 Jun 2016 16:47:02 +0000 MIME-Version: 1.0 X-Peer: 127.0.0.1 Load average: 0.88 ------------ END MESSAGE ------------
Điều này cho bạn biết bạn đã gửi email thành công khi tải quá cao trên server .
Nhấn CTRL+C
để ngừng tạo tải. Bạn đã hoàn thành dự án mẫu và bây giờ nên có một ý tưởng tốt về cách làm cho dự án này hoạt động cho bạn trong môi trường của bạn .
Kết luận
Trong bài viết này, bạn đã tìm hiểu về hệ thống nhắn tin NATS PubSub, cài đặt nó một cách an toàn như một dịch vụ và thử nghiệm nó trong một dự án mẫu. Dự án mẫu đã sử dụng ứng dụng client Node.JS, nhưng NATS có ứng dụng client cho nhiều ngôn ngữ và khuôn khổ hơn mà bạn có thể tìm thấy được liệt kê trên trang download NATS . Bạn có thể tìm hiểu thêm về NATS trong tài liệu chính thức của nó.
Các tin liên quan
Cách kết nối Internet of Things của bạn với Node-RED trên Ubuntu 16.042016-09-23
Cách cài đặt R trên Ubuntu 16.04
2016-09-19
Cách cài đặt Gói R bằng cách sử dụng devtools trên Ubuntu 16.04
2016-09-17
Cách cài đặt Gói R bằng cách sử dụng devtools trên Ubuntu 16.04
2016-09-17
Cách sử dụng LVM để quản lý thiết bị lưu trữ trên Ubuntu 16.04
2016-09-14
Cách cài đặt và cấu hình PostGIS trên Ubuntu 14.04
2016-09-01
Cách thiết lập vsftpd cho Tải xuống ẩn danh trên Ubuntu 16.04
2016-08-25
Cách triển khai ứng dụng Node.js bằng Terraform trên Ubuntu 14.04
2016-08-25
Cách cấu hình Cụm Galera với MariaDB 10.1 trên server Ubuntu 16.04
2016-08-19
Cách tạo Mảng RAID với mdadm trên Ubuntu 16.04
2016-08-16