Rabbitmq+HAproxy+Keepalived 实践

1. 消息队列比较

Rabbitmq+HAproxy+Keepalived 实践_第1张图片

2. 具体安装步骤:

2.	RabbitMQ镜像集群简介
RabbitMQ镜像集群是通过在RabbitMQ服务器配置相应的规则,把交换器、队列的数据进行Node之间Copy,对内网流量要求较高。在生产者扔消息时,会在所有Node之间同步完毕之后才会响应扔消息成功。

3.	RabbitMQ镜像集群的安装

环境声明
修改三台服务器/etc/hosts配置分别为:
192.168.198.138 rabbit1
192.168.198.136 rabbit2
192.168.198.137 rabbit3


三台机器全部安装Erlang,RabbitMQ是基于Erlang开发
[root@rabbit1 tmp] wget http://www.rabbitmq.com/releases/erlang/erlang-21.1.2-1.el7.centos.x86_64.rpm
[root@rabbit1 tmp] rpm -ivh erlang-21.1.2-1.el7.centos.x86_64.rpm


三台机器全部安装RabbitMQ
[root@rabbit1 tmp] wget https://dl.bintray.com/rabbitmq/rabbitmq-server-rpm/rabbitmq-server-3.7.9-1.el7.noarch.rpm 
[root@rabbit1 tmp] rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc 
[root@rabbit1 tmp] yum install rabbitmq-server-3.7.9-1.el7.noarch.rpm


提示错误
依赖检测失败:
socat 被 rabbitmq-server-3.7.9-1.el7.noarch 需要


错误修正
// 建议更换为阿里云 yum 源 // 同步服务器的缓存 
[root@rabbit1 tmp] yum -y makecache 
// 安装所需组件 
[root@rabbit1 tmp] yum -y install socat 
// 继续安装 
[root@rabbit1 tmp] rpm -ivh rabbitmq-server-3.7.9-1.el7.noarch.rpm 
准备中... 
################################# [100%] 
正在升级/安装... 1:rabbitmq-server-3.7.9-1.el7 
################################# [100%]



启动服务查看状态
[root@rabbit1 tmp] systemctl start rabbitmq-server.service
[root@rabbit1 tmp] systemctl status rabbitmq-server.service


安装Web管理插件
// 查看插件列表
[root@rabbit1 tmp] rabbitmq-plugins list
// 开启Web管理插件 
[root@rabbit1 tmp] rabbitmq-plugins enable rabbitmq_management
//添加用户
[root@rabbit1 tmp] rabbitmqctl add_user admin admin
//用户授权
[root@rabbit1 tmp] sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"


以上步骤,在三台机器上操作相同

4.	普通集群配置
说明
Rabbitmq的集群是依附于Erlang的集群来工作的,所以必须先构建起Erlang的集群镜像。
Erlang的集群中各节点是经由过程一个magic cookie来实现的,
这个cookie存放在 $home/.erlang.cookie 中,
我的是用rpm安装的,所以.erlang.cookie就放在/var/lib/rabbitmq中


复制cookie
.erlang.cookie是Erlang实现分布式的必要文件,
Erlang分布式的每个节点上要保持相同的.erlang.cookie文件,
同时保证文件的权限是400,不然节点之间就无法通信。
打开文件然后需要先把其中的一台服务器的.erlang.cookie中的内容复制到别的机器上,
最好是复制内容,因为文件权限不对的话会出现问题,在最后退出保存的时候使用wq!,
用!来进行强制保存即可。也可是直接使用scp传过去,记得文件权限和用户属主属组,如:
scp .erlang.cookie [email protected]:/usr/local/tmp


.erlang.cookie复制完成后,逐个重启节点服务
//重启rabbit1节点
[root@rabbit1 tmp] systemctl restart rabbitmq-server.service

//重启rabbit2节点
[root@rabbit2 tmp] systemctl restart rabbitmq-server.service

//重启rabbit3节点
[root@rabbit3 tmp] systemctl restart rabbitmq-server.service

添加到集群
将rabbit@rabbit1作为集群主节点,
在节点rabbit2和节点rabbit3上面分别执行如下命令,以加入集群中

//rabbit2节点
[root@rabbit1 tmp] rabbitmqctl stop_app
[root@rabbit1 tmp] rabbitmqctl reset
[root@rabbit1 tmp] rabbitmqctl join_cluster rabbit@rabbit1
[root@rabbit1 tmp] rabbitmqctl start_app

//rabbit3节点同上


提示错误
错误修正
集群状态
//节点1查看
[root@rabbit1 tmp] rabbitmqctl cluster_status

添加账号
// 新增用户
[root@rabbit1 tmp] rabbitmqctl add_user admin admin
// 授予所有权限
[root@rabbit1 tmp] rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
// 设置用户为管理员
[root@rabbit1 tmp] rabbitmqctl set_user_tags admin administrator
// 查看当前用户列表
[root@rabbit1 tmp] rabbitmqctl list_users

普通节点完成,基本操作
RAM节点只将其元数据保存在内存中。由于RAM节点不必像光盘节点那样写入光盘,它们可以更好地执行。但是请注意,由于永久队列数据总是存储在磁盘上,因此性能改进将仅影响资源管理(例如添加/删除队列,交换或虚拟主机),但不会影响发布速度或消耗速度
RAM节点是高级用例; 设置你的第一个群集时,你应该不使用它们。您应该有足够的光盘节点来处理您的冗余要求,然后在需要时添加额外的RAM节点进行缩放
只包含RAM节点的集群是脆弱的; 如果群集停止,您将无法再次启动, 并将丢失所有数据。RabbitMQ将阻止在许多情况下创建RAM节点的群集,但是它不能完全阻止它
创建RAM节点
我们可以在首次加入集群时将节点声明为RAM节点。像之前一样,我们使用rabbitmqctl join_cluster来完成此 操作,但传递 --ram标志
[root@rabbit1 tmp] rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done
.
[root@rabbit1 tmp] rabbitmqctl join_cluster --ram rabbit@rabbit1
Clustering node rabbit@rabbit2 with [rabbit@rabbit1] ...done.
rabbit2$ rabbitmqctl start_app
Starting node rabbit@rabbit2 ...done.
 
RAM节点在集群状态中显示为:
[root@rabbit1 tmp] rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit1 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit2,rabbit@rabbit1]}]
...done.
 
[root@rabbit1 tmp] rabbitmqctl cluster_status
Cluster status of node rabbit@rabbit2 ...
[{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@rabbit2]}]},
 {running_nodes,[rabbit@rabbit1,rabbit@rabbit2]}]
...done.

更改节点类型
我们可以将节点的类型从ram更改为disc,反之亦然。假设我们想要颠倒rabbit @ rabbit2和rabbit @ rabbit1的类型 ,将前者从ram节点转换为disc节点,将后者从disc节点转换为ram节点。要做到这一点,我们可以使用 change_cluster_node_type命令。该节点必须先停止
[root@rabbit1 tmp] rabbitmqctl stop_app
Stopping node rabbit@rabbit2 ...done.
 
[root@rabbit1 tmp] rabbitmqctl change_cluster_node_type disc
Turning rabbit@rabbit2 into a disc node ...
...done.
Starting node rabbit@rabbit2 ...done.
 
[root@rabbit1 tmp] rabbitmqctl stop_app
Stopping node rabbit@rabbit1 ...done.
 
[root@rabbit1 tmp] rabbitmqctl change_cluster_node_type ram
Turning rabbit@rabbit1 into a ram node ...
 
[root@rabbit1 tmp] rabbitmqctl start_app
Starting node rabbit@rabbit1 ...done.


5.	集群镜像模式配置
//意思表示以ha.开头的queue都会复制到各个节点 ["^"匹配所有],也可以通过控制台实现
[root@rabbit1 tmp] rabbitmqctl set_policy ha-all "^ha\." '{"ha-mode":"all"}' 


6.	HAproxy负载
在192.168.198.138和192.168.198.136做负载
安装HAproxy
[root@rabbit1 tmp] tar -zxf haproxy-1.6.9.tar.gz -C /usr/local
[root@rabbit1 tmp] cd /usr/local
[root@rabbit1 tmp] ln -s haproxy-1.6.9 haproxy
//查看内核版本
[root@rabbit1 tmp] uname -r   
[root@rabbit1 tmp] cd haproxy
//指定编译的内核版本
[root@rabbit1 tmp] make TARGET=linux2628
[root@rabbit1 tmp] make install
//cfg内容参考haproxy.cfg
[root@rabbit1 tmp] vi /usr/local/haproxy/haproxy.cfg
//启动
[root@rabbit1 tmp] haproxy -f /usr/local/haproxy/haproxy.cfg


7.	Keepalived负载
在192.168.198.138和192.168.198.136做负载
安装HAproxy
[root@rabbit1 tmp] tar -xzf keepalived-2.0.10.tar.gz -C /usr/local
[root@rabbit1 tmp] cd /usr/local/
[root@rabbit1 tmp] ln -s keepalived-2.0.10 keepalived
//查看内核版本
[root@rabbit1 tmp] uname -r   
[root@rabbit1 tmp] cd keepalived
//指定编译的内核版本
[root@rabbit1 tmp] ./configure
//如果报错,则安装依赖包
[root@rabbit1 tmp] yum install openssl openssl-devel
[root@rabbit1 tmp] ./configure
//编译安装,如果configure没指定prefix时,
//安装后的配置文件位置:"/usr/local/etc/keepalived/keepalived.conf"
[root@rabbit1 tmp] make && make install
//cfg内容参考haproxy.cfg
[root@rabbit1 tmp] vi /usr/local/etc/keepalived/keepalived.conf
//启动
[root@rabbit1 tmp] keepalived -f /usr/local/etc/keepalived/keepalived.conf

3. 附上keepalived.conf


###########全局配置#########
global
  log 127.0.0.1 local0 #[日志输出配置,所有日志都记录在本机,通过local0输出]
  log 127.0.0.1 local1 notice #定义haproxy 日志级别[error warringinfo debug]
  daemon #以后台形式运行harpoxy
  nbproc 1 #设置进程数量
  maxconn 4096 #默认最大连接数,需考虑ulimit-n限制
  #user haproxy #运行haproxy的用户
  #group haproxy #运行haproxy的用户所在的组
 #pidfile /var/run/haproxy.pid #haproxy 进程PID文件
 #ulimit-n 819200 #ulimit 的数量限制
 #chroot /usr/share/haproxy #chroot运行路径
 #debug #haproxy 调试级别,建议只在开启单进程的时候调试
 #quiet

########默认配置############
defaults
  log global
  mode http #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
  option httplog #日志类别,采用httplog
  option dontlognull #不记录健康检查日志信息
  retries 2 #两次连接失败就认为是服务器不可用,也可以通过后面设置
  #option forwardfor #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
  option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
  #option redispatch #当serverId对应的服务器挂掉后,强制定向到其他健康的服务器,以后将不支持
  option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
  maxconn 4096 #默认的最大连接数
  timeout connect 5000ms #连接超时
  timeout client 30000ms #客户端超时
  timeout server 30000ms #服务器超时
  #timeout check 2000 #心跳检测超时
  #timeout http-keep-alive10s #默认持久连接超时时间
  #timeout http-request 10s #默认http请求超时时间
  #timeout queue 1m #默认队列超时时间
  balance roundrobin #设置默认负载均衡方式,轮询方式
  #balance source #设置默认负载均衡方式,类似于nginx的ip_hash
  #balnace leastconn #设置默认负载均衡方式,最小连接数

########统计页面配置########
listen stats
  bind 0.0.0.0:1080 #设置Frontend和Backend的组合体,监控组的名称,按需要自定义名称
  mode http #http的7层模式
  option httplog #采用http日志格式
  #log 127.0.0.1 local0 err #错误日志记录
  maxconn 10 #默认的最大连接数
  stats refresh 30s #统计页面自动刷新时间
  stats uri /stats #统计页面url
  stats realm XingCloud\ Haproxy #统计页面密码框上提示文本
  stats auth admin:admin #设置监控页面的用户和密码:admin,可以设置多个用户名
  stats auth Frank:Frank #设置监控页面的用户和密码:Frank
  stats hide-version #隐藏统计页面上HAProxy的版本信息
  stats admin if TRUE #设置手工启动/禁用,后端服务器(haproxy-1.4.9以后版本)

########设置haproxy 错误页面#####
#errorfile 403 /home/haproxy/haproxy/errorfiles/403.http
#errorfile 500 /home/haproxy/haproxy/errorfiles/500.http
#errorfile 502 /home/haproxy/haproxy/errorfiles/502.http
#errorfile 503 /home/haproxy/haproxy/errorfiles/503.http
#errorfile 504 /home/haproxy/haproxy/errorfiles/504.http

#####################RabbitMQ管理界面###############################
listen rabbitmq_admin
  bind 0.0.0.0:15673
  server node1 192.168.198.136:15672
  server node2 192.168.198.137:15672
  server node3 192.168.198.138:15672

#####################RabbitMQ服务###############################
listen rabbitmq_cluster
  bind 0.0.0.0:5673
  mode tcp
  stats enable
  balance roundrobin
  option tcpka
  option tcplog
  timeout client 3h
  timeout server 3h
  timeout connect 3h
  #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
  #check inter 2000 是检测心跳频率,rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用
  server node1 192.168.198.136:5672 check inter 5s rise 2 fall 3
  server node2 192.168.198.137:5672 check inter 5s rise 2 fall 3
  server node3 192.168.198.138:5672 check inter 5s rise 2 fall 3

########frontend前端配置##############
#frontend main
#  bind *:80 #这里建议使用bind *:80的方式,要不然做集群高可用的时候有问题,vip切换到其他机器就不能访问了。
#  acl web hdr(host) -i www.abc.com  #acl后面是规则名称,-i为忽略大小写,后面跟的是要访问的域名,如果访问www.abc.com这个域名,就触发web规则,。
#  acl img hdr(host) -i img.abc.com  #如果访问img.abc.com这个域名,就触发img规则。
#  use_backend webserver if web #如果上面定义的web规则被触发,即访问www.abc.com,就将请求分发到webserver这个作用域。
#  use_backend imgserver if img #如果上面定义的img规则被触发,即访问img.abc.com,就将请求分发到imgserver这个作用域。
#  default_backend dynamic #不满足则响应backend的默认页面

########backend后端配置##############
#backend webserver #webserver作用域
#  mode http
#  balance roundrobin #balance roundrobin 负载轮询,balance source 保存session值,支持static-rr,leastconn,first,uri等参数
#  option httpchk /index.html HTTP/1.0 #健康检查, 检测文件,如果分发到后台index.html访问不到就不再分发给它
#  server web1 10.16.0.9:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3
#  server web2 10.16.0.10:8085 cookie 2 weight 3 check inter 2000 rise 2 fall 3
#  #cookie 1表示serverid为1,check inter 1500 是检测心跳频率
#  #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

#backend imgserver
#  mode http
#  option httpchk /index.php
#  balance roundrobin
#  server img01 192.168.137.101:80 check inter 2000 fall 3
#  server img02 192.168.137.102:80 check inter 2000 fall 3

#backend dynamic
#  balance roundrobin
#  server test1 192.168.1.23:80 check maxconn 2000
#  server test2 192.168.1.24:80 check maxconn 2000


#listen tcptest
#  bind 0.0.0.0:5222
#  mode tcp
#  option tcplog #采用tcp日志格式
#  balance source
#  #log 127.0.0.1 local0 debug
#  server s1 192.168.100.204:7222 weight 1
#  server s2 192.168.100.208:7222 weight 1

4. 说明:

文中部分内容从其他博客摘抄,如有侵权请及时告知,谢谢!

你可能感兴趣的:(Rabbitmq+HAproxy+Keepalived 实践)