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. 说明:
文中部分内容从其他博客摘抄,如有侵权请及时告知,谢谢!