一、系统功能概述
Rabbitmq:
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
Haproxy:
HAProxy 是一款提供高可用性、负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。 HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的 并发连接。
Keepalived:
Keepalived是一个免费开源的,用C编写的类似于layer3, 4 & 7交换机制软件,具备我们平时说的第3层、第4层和第7层交换机的功能。主要提供loadbalancing(负载均衡)和 high-availability(高可用)功能,负载均衡实现需要依赖Linux的虚拟服务内核模块(ipvs),而高可用是通过VRRP协议实现多台机器之间的故障转移服务。
二、应用/系统拓扑图
三、系统部署安装
部署环境
主机 | 角色 | 操作系统 | 软件版本 | 备注 |
---|---|---|---|---|
mq-01(172.16.2.70) | haproxy,keepalived,rabbitmq(disk) | CentOS Linux release 7.3.1611 (Core) | haproxy-1.5.18-3.el7_3.1.x86_64,keepalived-1.2.13-9.el7_3.x86_64,rabbitmq3.6.5 | haproxy + keepalived 主节点,rabbitmq磁盘节点 |
mq-02(172.16.2.47) | haproxy,keepalived,rabbitmq(memory) | CentOS Linux release 7.3.1611 (Core) | haproxy-1.5.18-3.el7_3.1.x86_64,keepalived-1.2.13-9.el7_3.x86_64,rabbitmq3.6.5 | haproxy + keepalived 备节点,rabbitmq内存节点 |
mq-03(172.16.2.118) | rabbitmq(memory) | CentOS Linux release 7.3.1611 (Core) | rabbitmq3.6.5 | rabbitmq内存节点 |
mq-04(172.16.2.160) | rabbitmq(disk) | CentOS Linux release 7.3.1611 (Core) | rabbitmq3.6.5 | rabbitmq磁盘节点 |
四、Haproxy + keepalived部署安装
Haproxy安装及配置
- Haproxy安装
[root@mq1]#yum install haproxy
- Haproxy配置
[root@mq1]#vim /etc/haproxy/haproxy.cfg
global
# log /yougo/haproxy/home/log local0
# log /yougo/haproxy/home/log local1 notice
# chroot /yougo/haproxy # 改变当前工作目录
# stats socket /yougo/haproxy/home/admin.sock mode 660 level admin # 创建监控所用的套接字目录
pidfile /var/run/haproxy.pid # haproxy的pid存放路径,启动进程的用户必须有权限访问此文件
maxconn 4000 # 最大连接数,默认4000
# user haproxy # 默认用户
# group haproxy # 默认用户组
daemon # 创建1个进程进入deamon模式运行。此参数要求将运行模式设置为"daemon
# Default SSL material locations
# ca-base /etc/ssl/certs
# crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
# ssl-default-bind-options no-sslv3
###########默认配置#########
defaults
log global
mode http # 默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
option httplog # 采用http日志格式
option dontlognull # 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,
# 需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;
# 官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用
# 该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
timeout connect 5000 # 连接超时时间
timeout client 50000 # 客户端连接超时时间
timeout server 50000 # 服务器端连接超时时间
option httpclose # 每次请求完毕后主动关闭http通道
option httplog # 日志类别http日志格式
#option forwardfor # 如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
option redispatch # serverId对应的服务器挂掉后,强制定向到其他健康的服务器
timeout connect 10000 # default 10 second timeout if a backend is not found
maxconn 60000 # 最大连接数
retries 3 # 3次连接失败就认为服务不可用,也可以通过后面设置
# errorfile 400 /yougo/haproxy/home/errors/400.http
# errorfile 403 /yougo/haproxy/home/errors/403.http
# errorfile 408 /yougo/haproxy/home/errors/408.http
# errorfile 500 /yougo/haproxy/home/errors/500.http
# errorfile 502 /yougo/haproxy/home/errors/502.http
# errorfile 503 /yougo/haproxy/home/errors/503.http
# errorfile 504 /yougo/haproxy/home/errors/504.http
####################################################################
listen http_front
bind 0.0.0.0:8888 #监听端口
stats refresh 30s #统计页面自动刷新时间
stats uri /haproxy?stats #统计页面url
stats realm Haproxy Manager #统计页面密码框上提示文本
stats auth admin:admin #统计页面用户名和密码设置
#stats hide-version #隐藏统计页面上HAProxy的版本信息
#####################RabbitMQ的管理界面也放在HAProxy后面了###############################
#listen rabbitmq_admin
# bind 0.0.0.0:8004
# server node1 192.168.0.31:15672
# server node2 192.168.0.32:15672
# server node3 192.168.0.33:15672
####################################################################
listen rabbitmq_cluster
bind 0.0.0.0:8889 #rabbitmq集群调用的端口
option tcplog
mode tcp
timeout client 3h
timeout server 3h
option clitcpka
balance roundrobin #负载均衡算法(#banlance roundrobin 轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数)
#balance url_param userid
#balance url_param session_id check_post 64
#balance hdr(User-Agent)
#balance hdr(host)
#balance hdr(Host) use_domain_only
#balance rdp-cookie
#balance leastconn
#balance source //ip
server rabbitmq1 172.16.2.70:5672 check inter 5s rise 2 fall 3 #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
server rabbitmq2 172.16.2.47:5672 check inter 5s rise 2 fall 3
server rabbitmq3 172.16.2.118:5672 check inter 5s rise 2 fall 3
server rabbitmq4 172.16.2.160:5672 check inter 5s rise 2 fall 3
mq2操作一致。
五、Keepalived安装及配置
- 配置VIP
[root@mq1]#ifconfig eth0:0 172.16.2.243 netmask 255.255.255.0 up
- Keepalived安装
[root@xx]#yum install keepalived
- Keepalived配置
[root@xx]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
vrrp_script chk_http_port {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight 2
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER #mq-02上改为BACKUP
interface eth0
virtual_router_id 51
priority 150 #mq-02上改为120
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_http_port
}
virtual_ipaddress {
172.16.2.243
}
}
}
- 监控haproxy运行脚本
#!/bin/bash
A=`ps -C haproxy --no-header |wc -l`
if [ $A -eq 0 ];then
systemctl restart haproxy
sleep 3
if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi
五、rabbitmq 安装配置
- rabbitmq环境及服务安装
# 因为rabbitmq基于erl,所以要先安装erl环境
# https://pan.baidu.com/s/11gvOqe7DumS_nDlYtUuc2w 密码:lr2u rabbimq_server下载地址
# https://pan.baidu.com/s/1L_gpZBAfTkI3ymOJqFtGRA 密码:k9ih erlang下载地址
# 下载之后解压就可以用了,然后再配置环境变量
# vim /etc/profile
ERL_HOME=/usr/local/bin/erlang
PATH=$ERL_HOME/bin:$PATH
export ERL_HOME
export RABBIT_HOME=/yougo/rabbitmq_server-3.6.5/
export PATH=/$RABBIT_HOME/sbin:$PATH:$ERL_HOME/bin
# source /etc/profile
rabbitmq集群配置
设置 Erlang Cookie
RabbitMQ节点之间和命令行工具 (e.g. rabbitmqctl)是使用Cookie互通的,Cookie是一组随机的数字+字母的字符串。当RabbitMQ服务器启动的时候,Erlang VM会自动创建一个随机内容的Cookie文件。如果是通过源安装RabbitMQ的话,Erlang Cookie 文件在/var/lib/rabbitmq/.erlang.cookie。如果是通过源码安装的RabbitMQ,Erlang Cookie文件$HOME/.erlang.cookie。
本文演示的实例是用源码安装,由于这个文件权限是 400,所以需要先修改所有mq节点中的该文件权限为 777:
[root@xx]#chmod 777 /root/.erlang.cookie
# 然后将.erlang.cookie复制到其他节点。并在所有节点上执行此命令,完成后将所有节点的权限更改回原来的,并确认所有节点的cookie内容一致:
[root@xx]#scp -r root@mq-01:/root/.erlang.cookie /root
[root@xx]#chmod 400 .erlang.cookie
[root@xx]#cat /root/.erlang.cookie
DZXTQGRNIMJQMSAHLZMK
- 使用detached参数,在后台启动Rabbit Node,每个节点都一样
[root@xx]#rabbitmqctl stop #停止先有的rabbitmq
[root@xx]#rabbitmq-server -detached #mq在后台启动
[root@xx]#rabbitmqctl cluster_status #查看集群状态
- 将所有节点组成集群
# 因为rabbitmq-server启动时,会一起启动节点和应用,它预先设置RabbitMQ应用为standalone模式。
要将一个节点加入到现有的集群中,你需要停止这个应用并将节点设置为原始状态,然后就为加入集群准备好了。
如果使用rabbitmqctl stop,应用和节点都将被关闭。所以使用rabbitmqctl stop_app仅仅关闭应用。
[root@xx]#rabbitmqctl stop_app #关闭应用
[root@xx]#rabbitmqctl join_cluster rabbit@hz01-qa-base-mq-01 #默认以磁盘节点方式加入集群
[root@xx]#rabbitmqctl start_app #开启应用
[root@xx]#rabbitmqctl join_cluster --ram rabbit@hz01-qa-base-mq-01 #以内存节点方式加入集群
- 查看控制台,我们把域名绑定vip然后访问控制台。
六、操作手册
- rabbitmq权限管理
[root@xx]#rabbitmqctl add_user username passwd #添加mq账号密码
[root@xx]#rabbitmqctl add_vhost /vhostname #添加vhost
[root@xx]#rabbitmqctl set_permissions -p /vhostname username '.*' '.*' '.*' #将vhost权限赋予某个用户
[root@xx]#rabbitmqctl set_user_tags username management #设置用户权限
[root@xx]#rabbitmqctl list_users #查看用户列表
[root@xx]#rabbitmqctl list_user_permissions username #查看用户权限
[root@xx]#rabbitmqctl change_password username Newpassword #重置账号密码
- rabbitmq插件管理
[root@xx]#rabbitmq-plugins enable {插件名} #开启某个插件
[root@xx]#rabbitmq-plugins enable {插件名} #关闭某个插件
有关插件名可以在rabbitmq的安装目录下的plugins目录中查看:$RABBITMQ_HOME/plugins
举例:
[root@xx]#rabbitmq-plugins enable rabbitmq_management
[root@xx]#rabbitmq-plugins list
- rabbitmq集群管理
[root@xx]#rabbitmqctl stop_app # 关闭mq应用
[root@xx]#rabbitmqctl reset # 使用此命令会将节点信息清空,然后再执行加入集群的相关操作。
[root@xx]#rabbitmqctl join_cluster {rabbit_node_name} #以磁盘节点方式加入集群
[root@xx]#rabbitmqctl join_cluster --ram rabbit@hz01-qa-base-mq-01 #以内存节点方式加入集群
[root@xx]#rabbitmqctl start_app #开启mq应用
[root@xx]#rabbitmqctl cluster_status #查看集群状态
[root@xx]#rabbitmqctl forget_cluster_node {rabbit_node_name} #剔除某个节点
- rabbitmq自动分区后处理方式
[root@hz01-qa-base-mq-01]# cd /yougo/rabbitmq_server-3.6.5/etc/rabbitmq
[root@hz01-qa-base-mq-01]# vim rabbitmq.config
[
{rabbit,[{cluster_partition_handling,pause_minority}]}
].
#添加此配置参数,当出现分区情况下,会将集群中节点数较多的对外提供服务。
#配置添加完成后需要执行:
[root@hz01-qa-base-mq-01]# rabbitmqctl stop
[root@hz01-qa-base-mq-01]# rabbitmq-server -detached
[root@hz01-qa-base-mq-01]# rabbitmqctl environment
.....
{rabbit,
[{auth_backends,[rabbit_auth_backend_internal]},
{auth_mechanisms,['PLAIN','AMQPLAIN']},
{backing_queue_module,rabbit_priority_queue},
{**cluster_partition_handling,pause_minority**},
{channel_max,0},
.....
文中的配置文件及代码的地址我放在git上了:https://github.com/jinyuchen724/rabbitmq.git
有什么问题可以直接加我微信hiyun9!
喜欢的话支付宝扫个赏金,,谢谢各位老板