Thứ Năm, 2 tháng 2, 2017

Hướng dẫn cài đặt, cấu hình và vận hành cơ bản Rabbit MQ CentOS 6

Cài đặtcấu hình và quản lý cơ bản Rabbit MQ

1. Tham khảo hướng dẫn trực tiếp từ trang chủ của rabbitmq:
https://www.rabbitmq.com/install-rpm.html

Vì rabbitmq được lập trình bằng erlang nên bạn cần cài đặt erlang trước:
wget http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
yum install --enablerepo=epel erlang

Sau đó, cài tiếp rabbitmq:
Wget https://www.rabbitmq.com/releases/rabbitmq-server/v3.5.2/rabbitmq-server-3.5.2-1.noarch.rpm
rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
rpm -ivh rabbitmq-server-3.5.2-1.noarch.rpm

Việc cài đặt đến đây là xong. Bạn có thể start thử service của rabbitmq bằng cách:
service rabbitmq-server start     

Cấu hình mẫu của rabbitmq đi kèm gói cài đặt nằm ở:
/usr/share/doc/rabbitmq-server-3.5.2/
Tôi copy về khu vực đặt file cấu hình của rabbitmq rồi đổi tên:
cp /usr/share/doc/rabbitmq-server-3.5.2/rabbitmq.config.example /etc/rabbitmq/
mv /etc/rabbitmq/rabbitmq.config.example  /etc/rabbitmq/rabbitmq.config
   
Cấu hình của rabbitmq mặc định chạy khá ổn. Các bạn có thể sử dụng luôn mà không cần bận tâm tùy chỉnh cấu hình.

2. Rabiit Web Interface:
Rabbitmq có đi kèm một plugin cho phép quản trị hoạt động qua một web interface trông rất trực quan và thân thiện. Nhưng mặc định, plugin này không được enable. Để enable, bạn thực hiện lệnh sau:
rabbitmq-plugins enable rabbitmq_management

Tất cả các hoạt động quản trị qua web cũng có thể thực hiện qua một command line tool có tên là rabbitmqadmin. Tool này đi kèm trong management plugin. Bạn cũng chỉ có thể sử dụng nó sau khi đã enable management plugin.

Cách download rabbitmqadmin tool:
Tôi cài đặt rabbitmq trên một server có ip 192.168.3.252 nên địa chỉ download sẽ là:
http://192.168.3.252:15672/cli/rabbitmqadmin

Check lai server:
nameserver 172.16.4.254
nameserver 172.16.23.7
nameserver 172.16.3.61

HOME dir: /var/lib/rabbitmq
File ETC: /etc/rabbitmq/rabbitmq.config
LOG DEBUG ERROR: /var/log/rabbitmq/startup_err (log run tại: /var/log/rabbitmq/startup_log)
Web interface: http://172.16.9.169:15672/

%% Uncomment the following line if you want to allow access to the guest user from anywhere on the network.
          {loopback_users, []}

Thêm 1 user:
rabbitmqctl add_user test test
rabbitmqctl set_user_tags test administrator
rabbitmqctl set_permissions -p / test ".*" ".*" ".*"

Khi thay đổi cấu hình tại /etc/rabbitmq/rabbitmq.config cần stop start lại để ăn cấu hình
service rabbitmq-server start/stop

Nếu muốn dùng comman line: vào web interface tải file, sau đó copy vào /usr/local/bin: 


3. Cài python 3.3: 

Phần Cluster: https://kipalog.com/posts/Tim-hieu-RabbitMQ---Phan-2
   Điều kiện để thiết lập clustering:
Tất cả các node phải cùng erlang version và rabbitmq version
Các node liên kết qua LAN network
Tất cả các node chia sẻ cùng một erlang cookie

   Trong mô hình cluster, các node sử dụng phương thức trao đổi giữa của erlang. Khi sử dụng phương thức này, hai erlang node chỉ nói chuyện được với nhau khi có cùng erlang cookie. Erlang cookie chỉ là một chuỗi ký tự. Khi startup một rabbitmq server lần đầu tiên, mặc định một erlang cookie ngẫu nhiên được sinh ra nằm trong /var/lib/rabbitmq/.erlang.cookie
Cài đặt xong RabbitMQ, stop hoặc khoan start RabbitMQ, copy cokkie từ node chính qua node phụ. Vì node name của rabbitmq có dạng rabbit@hostname nên bạn cần chuẩn bị sẵn hostname cho mỗi node. 
Đặt hotsname, chỉnh resolve và reboot server. Sau đó đưa vào /etc/hosts của cả ba node:
192.168.3.241 rabbit1  ### gọi là node 1
192.168.3.242 rabbit2  ### gọi là node 2
192.168.3.252 rabbit3  ### gọi là node 3

Bước 1: Khởi động rabbitmq-server trên mỗi node: 
service rabbitmq-server start

Bước 2: On app trên rabbit 1 trước và check status cluster:
[root@rabbit2 root]# rabbitmqctl start_app 
[root@rabbit2 root]# rabbitmqctl cluster_status 
Cluster status of node rabbit@rabbit1... 
[{nodes,[{disc,[rabbit@rabbit1]}]},
{running_nodes,[rabbit@rabbit1]}, 
{cluster_name,<<"rabbit@rabbit1">>}, 
...

sau đó on tiếp các note phụ:
[root@rabbit1 ~]# rabbitmqctl stop_app 
Stopping node rabbit@rabbit1 ...
[root@rabbit1 ~]# rabbitmqctl join_cluster rabbit@rabbit2 
Clustering node rabbit@rabbit1 with rabbit@rabbit2 ... 
[root@rabbit1 ~]# rabbitmqctl start_app 
Starting node rabbit@rabbit1 ...

Check lại trên 3 node sẽ có cluster status giống nhau:
[root@rabbit1 ~]# rabbitmqctl cluster_status
rabbitmqctl cluster_status    #lệnh check cluster
rabbitmqctl start_app        #start/stop app   - chỉ dừng cluster, không có nghĩa dừng cả rabbitMQ server.

service rabbitmq-server start/stop hoặc Rabbitmqctl stop =>dừng cả rabbitMQ server.
rabbitmqctl join_cluster rabbit@rabbit1   #lệnh để john từ rabbit2 (slave) vào rabbit1 (master).

Có thể cấu hình cluster trong config. Trên mỗi node, bạn chỉ cần khai báo dòng sau trong /etc/rabbitmq/rabbitmq.config
{cluster_nodes, {['rabbit@rabbit1','rabbit@rabbit2','rabbit@rabbit3'], disc}}

Một node trong cluster có thể bị stop/start (dùng rabbitmqctl stop_app/start_app trên chính node đó) đồng nghĩa ngừng cung cấp dịch vụ trong cluster nhưng bản thân node đó vẫn không bị loại khỏi cluster


4. Các trường hợp lỗi xảy ra khi chạy Cluster
Trưng hợp thứ nhất: Tình huống xảy ra khi bạn cần restart cluster để upgrade cho rabbitmq hoặc erlang. Sau khi node 1, node 2 được bạn stop thì thảm họa xảy ra với node còn lại. Node còn lại bị down ngoài ý muốn. Trong trường hợp này việc khởi động lại cluster đòi hỏi thứ tự: Node cuối cùng bị down phải là node đầu tiên được start. Giả sử các node bị down theo thứ tự: node 3 -> node 1 -> node 2. Sau đó tôi cố gắng start các node 3 hoặc node 1 đầu tiên. Tôi sẽ không thành công. Rabbitmq để lại vài dòng log sau:
This cluster node was shut down while other nodes were still running.
To avoid losing data, you should start the other nodes first, thenstart this one. To force this node to start, first invoke"rabbitmqctl force_boot". If you do so, any changes made on other
cluster nodes after this one was shut down may be lost.
Để khởi động được cluster, bạn chỉ cần tuân theo nguyên tắc, start node 2 đầu tiên. Với các node sau, thứ tự không quan trọng. Bạn có thể dùng thứ tự node 2 - > node 1 -> node 3 hoặc node2 -> node 3 -> node1.


Rời một node khỏi cluster

Cách 1: Để cho bản thân node đó quên rằng nó đã từng ở trong cluster. Giả sử tôi muốn tách node 2 khỏi cluster hoàn toàn.
[root@rabbit2 root]# rabbitmqctl stop_app                                                                                                      
Stopping node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl reset
Resetting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl start_app
Starting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit2]},
 {cluster_name,<<"rabbit@rabbit2">>},
 {partitions,[]}]


Cách 2: Làm cho các node còn lại trong cluster hắt hủi node cần được tách khỏi cluster
[root@rabbit2 root]# rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...
[root@rabbit3 root]# rabbitmqctl forget_cluster_node rabbit@rabbit2
Removing node rabbit@rabbit2 from cluster ...
Lúc này các node còn lại trong cluster đều đã không coi node 2 nằm trong cluster nhưng node2 vẫn không chịu chấp nhận thực tế phũ phàng đó. Nếu bạn start_app node 2
Error: {error,{inconsistent_cluster,"Node rabbit@rabbit2 thinks it's clustered with node rabbit@rabbit3, but rabbit@rabbit3 disagrees"}}
Để node 2 hoạt động được bình thường, bạn phải làm nó quên đi nó từng thuộc về cluster.
[root@rabbit2 root]# rabbitmqctl reset
Resetting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl start_app
Starting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit2]},
 {cluster_name,<<"rabbit@rabbit2">>},
 {partitions,[]}]

Thêm một RAM nodeSo sánh RAM node với disc node
Sự khác biệt lớn nhất là ram node chỉ giữ metadata của nó trong memory còn bản thân các queue data vẫn lưu xuống disk. Sự khác biệt này cho phép ram node ít tạo ra các hoạt động IO hơn nên performance tốt hơn disc node. Một cluster hoàn toàn chỉ có ram node thì rất có nguy cơ mất metadata. Giải pháp an toàn hơn cả là trộn lẫn ram node và disc node. Trong cluster, phần metadata được replicate giữa các node (disc node lưu metadata trên disk) nên sẽ không lo mất sạch metadata.

[root@rabbit2 root]# rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl join_cluster --ram rabbit@rabbit3
Clustering node rabbit@rabbit2 with rabbit@rabbit3 ...
[root@rabbit2 root]# rabbitmqctl start_app
Starting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},
 {cluster_name,<<"rabbit@rabbit2">>},
 {partitions,[]}]

Thay đổi node type

[root@rabbit2 root]# rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl change_cluster_node_type disc
Turning rabbit@rabbit2 into a disc node ...
[root@rabbit2 root]# rabbitmqctl start_app
Starting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1,rabbit@rabbit2,rabbit@rabbit3]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},
 {cluster_name,<<"rabbit@rabbit2">>},
 {partitions,[]}]
[root@rabbit2 root]# rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl change_cluster_node_type ram
Turning rabbit@rabbit2 into a ram node ...
[root@rabbit2 root]# rabbitmqctl start_app
Starting node rabbit@rabbit2 ...
[root@rabbit2 root]# rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit3,rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit3,rabbit@rabbit2]},
 {cluster_name,<<"rabbit@rabbit2">>},
 {partitions,[]}]


Lỗi khi Queue của Rabbit MQ có vấn đề, cảnh báo này báo trên nagios:
Notification Type: PROBLEM
Service: Check ha_qu_contact_upload Queue
Host: DC_RabbitMQ_14.27
Address: 172.16.14.27
State: CRITICAL
Info: RABBITMQ_QUEUE CRITICAL - Received 500 read timeout : http://eb2.momo.vn:15672/api/queues///ha_qu_contact_upload


Nguồn: sưu tầm và tổng hợp.

Không có nhận xét nào:

Đăng nhận xét