环境 一、前言 RabbitMQ
集群搭建,当前选择使用镜像模式。
技术架构:
HaProxy
:高可用负载
KeepAlived
:网络服务高可用(主从热备、秒级切换)
RabiitMQ
:消息队列
镜像模式,需要3台RabbitMQ
服务器,一台HaProxy
服务器,一台 keepAlived
服务器。
二、准备 镜像模式架构图
概述 RabbitMQ
集群RabbitMQ
集群本身不是高可用的,宕机就会丢失。
RabbitMQ
集群本身没有负载均衡,需要通过负载均衡实现。
RabbitMQ
节点类型:
内存节点:将元数据(metadata)放在内存
磁盘节点:将元数据(metadata)放在磁盘(默认方式)
镜像模式中的 RabbitMQ
节点类型 镜像模式中节点至少要有一个磁盘节点,用来永久持久化元数据。
为了更好的性能,可以设置多个内存节点。
磁盘节点挂掉之后,消息路由机制可以运行,一下事情不能做
create queues
create exchanges
create bindings
add users
change permissions
add or remove cluster nodes
Haproxy
负载均衡这里使用 HaProxy
实现负载均衡,这里使用两台 HaProxy
服务器,能够自动进行故障转移,当前解决方案为 Keepalived
。
Keepalived
高可用Keepalived
具有高可用、主从热备、秒级切换等特点。KeepAlived
采用 VRRP
(Virtual Router Redundancy Protocol
,虚拟路由冗余协议) 来解决单点失效的问题,它通常由一组一备两个节点组成,同一时间内只有主节点会提供对外服务,并同时提供一个虚拟的 IP
地址 (Virtual Internet Protocol Address
,简称 VIP
) 。 如果主节点故障,那么备份节点会自动接管 VIP
并成为新的主节点 ,直到原有的主节点恢复。
服务器部署方案
mq3
:192.168.2.3 master
磁盘节点
mq4
:192.168.2.4 slave
磁盘节点
mq5
:192.168.2.5 slave
内存节点
HaProxy
、KeepAlived
:192.168.2.6/192.168.2.7
192.168.2.6 KeepAlived master
192.168.2.7KeepAlived slave
三、虚拟机安装 虚拟机网络配置
虚拟机系统网络
虚拟机CD设置
四、Centos7
系统设置 源 1 2 sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak vim /etc/yum.repos.d/CentOS-Base.repo
详情请看附
1 2 3 4 5 6 7 8 9 10 11 12 13 14 yum clean all yum repolist yum -y install epel-release sed -e 's!^metalink=!#metalink=!g' \ -e 's!^#baseurl=!baseurl=!g' \ -e 's!//download\.fedoraproject\.org/pub!//mirrors.tuna.tsinghua.edu.cn!g' \ -e 's!http://mirrors\.tuna!https://mirrors.tuna!g' \ -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/epel/6/x86_64/epel-release-6-8.noarch.rpm
报错 RPM-GPG-KEY-EPEL-7
先设置 CentOS-Base.repo
中的 gpgcheck=0
1 2 cd /etc/pki/rpm-gpgwget https://archive.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
国内 1 2 3 4 5 6 7 8 sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \ -e 's|^#baseurl=http://mirror.centos.org|baseurl=https://mirrors.tuna.tsinghua.edu.cn|g' \ -i.bak \ /etc/yum.repos.d/CentOS-*.repo sudo yum clean all sudo yum makecache sudo yum -y update
关闭防火墙 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 systemctl status firewalld systemctl stop firewalld systemctl disable firewalld firewall-cmd --zone=public --add-port=80/tcp --add-port=3306/tcp --permanent firewall-cmd --reload firewall-cmd --zone=public --query-port=80/tcp firewall-cmd --zone=public --list-all firewall-cmd --zone=public --remove-port=80/tcp --permanent
中文字体 方式1 1 2 3 4 yum -y install fonts-chinese yum -y install fonts-ISO8859 fc-cache -fv reboot
方式2 1 2 3 4 yum -y install fontconfig mkdir chinseschmod -R 755 /usr/share/fonts/chinses/vim /etc/fonts/fonts.conf
在 <dir prefix="xdg">fonts</dir>
这一行下面插入:
1 <dir >/usr/share/fonts/chinses</dir>
网络 需要安装 net-tools
1 yum -y install net-tools
查看网络
我这里的网络魏 ens33
编辑网络 1 vim /etc/sysconfig/network-scripts/ifcfg-ens33
1 2 3 4 5 6 7 BOOTPROTO=static #开机协议,有dhcp及static; ONBOOT=yes #设置为开机启动; DNS1=114.114.114.114 #这个是国内的DNS地址,是固定的; IPADDR=192.168.2.2 #你想要设置的固定IP,理论上192.168.2.2-255之间都可以,请自行验证; NETMASK=255.255.255.0 #子网掩码,不需要修改; GATEWAY=192.168.2.254 #网关,这里应该和你“2.配置虚拟机的NAT模式具体地址参数”中的(2)选择VMnet8--取消勾选使用本地DHCP--设置子网IP--网关IP设置 一样才行。
重启网略
测试网络
设置hostname
默认hostname
为 localhost
,所以这里做区分
1 2 3 4 5 ssh root@192.168.2.3 "hostnamectl set-hostname host3;echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;" ssh root@192.168.2.4 "hostnamectl set-hostname host4;echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;" ssh root@192.168.2.5 "hostnamectl set-hostname host5;echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;" ssh root@192.168.2.6 "hostnamectl set-hostname host6;echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;" ssh root@192.168.2.7 "hostnamectl set-hostname host7;echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;"
五、安装 RabbitMQ
Yum
安装配置源 rabbitmq.repo
1 vim /etc/yum.repos.d/rabbitmq.repo
附录中的repo
写进入就好了
1 2 3 4 5 6 yum clean all yum repolist yum update -y
安装 1 2 yum install socat logrotate -y yum install erlang rabbitmq-server -y
启动 您可以通过运行以下命令启动RabbitMQ服务器进程。
1 systemctl start rabbitmq-server
要在引导时自动启动RabbitMQ,请运行以下命令。
1 systemctl enable rabbitmq-server
要检查RabbitMQ服务器的状态,请运行:
1 systemctl status rabbitmq-server
用户管理 查看所有用户
1 sudo rabbitmqctl list_users;
添加用户
1 2 3 4 5 6 7 8 9 10 sudo rabbitmqctl change_password guest guest; sudo rabbitmqctl add_user maxzhao maxzhao; sudo rabbitmqctl set_user_tags maxzhao administrator; sudo rabbitmqctl set_permissions -p / maxzhao ".*" ".*" ".*" ;
安装 Web
管理端 1 rabbitmq-plugins enable rabbitmq_management
查看系统服务 1 systemctl list-unit-files |grep rabbitmq-server
六、安装 HaProxy
这里安装后的版本为 haproxy-1.5.18
查看系统服务 1 systemctl list-unit-files |grep haproxy
这里不启动
启动 1 2 3 systemctl status haproxy systemctl start haproxy systemctl enable haproxy
七、安装 KeepAlived
下载 官方下载地址
这里选择 2.2.2
版本
1 2 3 mkdir /root/toolscd /root/tools/wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz
安装
VMware
中注意,需要挂载ISO镜像,参考 VMWare配置CentOS7网络
1 2 3 4 5 6 yum -y install openssl-devel gcc gcc-c++ tar -xvf keepalived-2.2.2.tar.gz cd keepalived-2.2.2./configure --prefix=/usr/local/keepalived make && make install mkdir /etc/keepalived
安装后的目录 1 2 yum install tree -y tree -l /usr/local/keepalived/etc
输出
1 2 3 4 5 6 7 8 9 10 11 /usr/local/keepalived/etc ├── keepalived │ ├── keepalived.conf │ └── samples │ ├── client.pem │ ├── dh1024.pem │ ├── keepalived.conf.conditional_conf │ ├── *********************************** │ └── sample_notify_fifo.sh └── sysconfig └── keepalived
分别对应
1 2 /etc/keepalived/keepalived.conf /etc/sysconfig/keepalived
创建启动文件 1 2 3 4 5 6 cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.confcp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin
查看系统服务 1 systemctl list-unit-files |grep keepalived
这里先不启动
八、拷贝虚拟机 我这里用的虚拟机,如果使用 Docker
,直接启动 Docker
容器就可以了。
虚拟机 VMware
操作步骤
虚拟机关机
拷贝出5台设备
修改5台设备网络
192.168.2.3
192.168.2.4
192.168.2.5
192.168.2.6
HaProxy
KeepAlived master
192.168.2.7
开放虚拟机端口或关闭防火墙 开放端口 1 2 3 4 5 ssh root@192.168.2.3 "firewall-cmd --zone=public --add-port=80/tcp --add-port=3306/tcp --add-port=5672/tcp --add-port=15672/tcp --permanent;firewall-cmd --zone=public --list-all" ssh root@192.168.2.4 "firewall-cmd --zone=public --add-port=80/tcp --add-port=3306/tcp --add-port=5672/tcp --add-port=15672/tcp --permanent;firewall-cmd --zone=public --list-all" ssh root@192.168.2.5 "firewall-cmd --zone=public --add-port=80/tcp --add-port=3306/tcp --add-port=5672/tcp --add-port=15672/tcp --permanent;firewall-cmd --zone=public --list-all" ssh root@192.168.2.6 "firewall-cmd --zone=public --add-port=80/tcp --add-port=3306/tcp --add-port=5672/tcp --add-port=15672/tcp --permanent;firewall-cmd --zone=public --list-all" ssh root@192.168.2.7 "firewall-cmd --zone=public --add-port=80/tcp --add-port=3306/tcp --add-port=5672/tcp --add-port=15672/tcp --permanent;firewall-cmd --zone=public --list-all"
关闭防火墙 1 2 3 4 5 ssh root@192.168.2.3 "systemctl stop firewalld;systemctl disable firewalld;" ssh root@192.168.2.4 "systemctl stop firewalld;systemctl disable firewalld;" ssh root@192.168.2.5 "systemctl stop firewalld;systemctl disable firewalld;" ssh root@192.168.2.6 "systemctl stop firewalld;systemctl disable firewalld;" ssh root@192.168.2.7 "systemctl stop firewalld;systemctl disable firewalld;"
配置 一、配置 RabbitMQ
配置文件 1 2 rabbitmq-diagnostics status
找到 Config files
部分
1 2 3 4 Config files * /etc/rabbitmq/advanced.config * /etc/rabbitmq/rabbitmq.conf
修改配置文件
1 vim /etc/rabbitmq/rabbitmq.conf
配置
1 2 3 4 5 listeners.tcp.1 = 192.168.2.3:5672 loopback_users.maxzhao = false
重启
1 2 systemctl restart rabbitmq-server systemctl status rabbitmq-server
普通集群 寻找 erlang cookie
在 $HOME
或 /var/lib/rabbitmq
中有一个 .erlang.cookie
文件。
1 2 ls -la $HOME |grep .erlang.cookiels -la /var/lib/rabbitmq|grep .erlang.cookie
RabbitMQ
集群是依赖 erlang
集群的,erlang
集群需要 cookie
通讯认证,必须要同一个 cookie
才可以通讯。
复制 cookie
在 192.168.2.3
服务器上执行
1 2 3 4 5 6 7 8 ssh root@192.168.2.4 "systemctl stop rabbitmq-server" scp /var/lib/rabbitmq/.erlang.cookie root@192.168.2.4:/var/lib/rabbitmq/ ssh root@192.168.2.4 "chmod 600 /var/lib/rabbitmq/.erlang.cookie ;systemctl start rabbitmq-server" ssh root@192.168.2.5 "systemctl stop rabbitmq-server" scp /var/lib/rabbitmq/.erlang.cookie root@192.168.2.5:/var/lib/rabbitmq/ ssh root@192.168.2.5 "chmod 600 /var/lib/rabbitmq/.erlang.cookie ;systemctl start rabbitmq-server"
查看集群节点状态 在 192.168.2.3
服务器上执行
这里会发现
1 Starting node rabbit@localhost ...
这里需要设置服务器名称之后就没有当前问题
1 2 3 4 5 6 7 ssh root@192.168.2.3 "hostnamectl set-hostname host3;systemctl restart rabbitmq-server;rabbitmqctl status|head" ssh root@192.168.2.4 "hostnamectl set-hostname host4;systemctl restart rabbitmq-server;rabbitmqctl status|head" ssh root@192.168.2.5 "hostnamectl set-hostname host5;systemctl restart rabbitmq-server;rabbitmqctl status|head" ssh root@192.168.2.3 "echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;" ssh root@192.168.2.4 "echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;" ssh root@192.168.2.5 "echo -e \"192.168.2.3 host3\\n192.168.2.4 host4\\n192.168.2.5 host5\\n192.168.2.6 host6\\n192.168.2.7 host7\" >> /etc/hosts;"
查看集群状态 在 192.168.2.3
服务器上执行
1 rabbitmqctl cluster_status
结果只有当前一个节点
添加集群节点 在 192.168.2.3
上执行当前操作
join_cluster
参数
–disc new node should be a disk one default
– ram new node should be a RAM one
1 2 3 4 5 6 ssh root@192.168.2.4 "rabbitmqctl stop_app;rabbitmqctl join_cluster --ram rabbit@host3;rabbitmqctl start_app;systemctl restart rabbitmq-server;" ssh root@192.168.2.4 "rabbitmqctl stop_app;rabbitmqctl join_cluster --ram rabbit@host3;rabbitmqctl start_app;systemctl restart rabbitmq-server;" rabbitmqctl cluster_status
打开 web 端
镜像集群 策略policy
镜像集群依赖于 policy
模块.
策略用于设置Exchanges
或者queue
的数据复制、同步。
1 rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
ha-all
:策略名称。
^:为匹配符,只有一个代表匹配所有,^qfedu
为匹配名称为qfedu
的exchanges
或者queue
。
ha-mode
:为匹配类型,他分为3种模式:
all
:所有(所有的 queue),
exctly
:部分(需配置ha-params
参数,此参数为int
类型, 比如3,众多集群中的随机3台机器),
nodes
:指定(需配置ha-params
参数,此参数为数组类型比如[“rabbit@F”,“rabbit@G”]这样指定为F与G这2台机器。)
节点下线 1 2 3 4 5 6 rabbitmqctl stop rabbitmqctl forget_cluster_node rabbit@host5 rabbitmqctl reset
集群关闭与重启 没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。
但是在重启时,最后关闭的节点最先被启动。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。
这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 host3
,host4
,host5
,如果 host3
因为故障暂时没法恢复,此时 host4
和 host5
就无法启动。想要解决这个问题,可以先将 host3
节点进行剔除,命令如下:
1 rabbitmqctl forget_cluster_node rabbit@host3 -offline
-offline
参数:允许节点在自身没有启动的情况下将其他节点剔除。
二、配置 HaProxy
配置 基本配置haproxy.cfg
参考附录 /etc/haproxy/haproxy.cfg
1 vim /etc/haproxy/haproxy.cfg
日志配置 rsyslog
1 2 3 4 5 mkdir /var/log/haproxyvim /etc/rsyslog.conf systemctl restart rsyslog.service systemctl restart haproxy
检查配置 1 2 haproxy -f /etc/haproxy/haproxy.cfg -c
启动 1 2 systemctl start haproxy systemctl enable haproxy
测试访问
问题 rabbitmq_cluster: cannot bind socket [0.0.0.0:5672]
设置策略 1 2 3 4 5 6 setsebool -P haproxy_connect_any=1 vim /etc/sysctl.conf sysctl -p
重新启动就可以了.
三、配置KeepAlived
Keepalived
启动时,不会检查配置文件的语法。
配置文件修改 1 vim /etc/keepalived/keepalived.conf
master 192.168.2.6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 global_defs { ## 全局定义块 router_id host6 ## 标识本节点的字条串,通常为hostname } vrrp_script check_haproxy { script "/etc/keepalived/haproxy_chk.sh" #执行脚本位置 interval 5 ##检查时间间隔 weight -20 ##如果条件成立则权重减20 } vrrp_instance VI_1 { #VRRP 实例定义块 state MASTER ##主节点为MASTER,备份节点为BACKUP interface ens33 ##绑定虚拟ip的网络接口(网卡) virtual_router_id 80 ##虚拟路由id号,主备节点相同 mcast_src_ip 192.168.2.6 ##本机ip地址 priority 100 ##优先级(0-254) advert_int 1 ##组播信息发送间隔,两个节点必须一致,默认1s authentication { ##认证匹配 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.8/24 ##虚拟ip,可以指定多个 } track_script { check_haproxy } }
slave 192.168.2.7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 global_defs { ## 全局定义块 router_id host7 ## 标识本节点的字条串,通常为hostname } vrrp_script check_haproxy { script "/etc/keepalived/haproxy_chk.sh" #执行脚本位置 interval 5 ##检查时间间隔 weight -20 ##如果条件成立则权重减20 } vrrp_instance VI_1 { #VRRP 实例定义块 state MASTER ##主节点为MASTER,备份节点为BACKUP interface ens33 ##绑定虚拟ip的网络接口(网卡) virtual_router_id 80 ##虚拟路由id号,主备节点相同 mcast_src_ip 192.168.2.7 ##本机ip地址 priority 50 ##优先级(0-254) advert_int 1 ##组播信息发送间隔,两个节点必须一致,默认1s authentication { ##认证匹配 auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.8/24 ##虚拟ip,可以指定多个 } track_script { check_haproxy } }
日志配置 1 2 3 4 5 6 vim /etc/sysconfig/keepalived vim /etc/rsyslog.conf systemctl restart rsyslog.service systemctl restart keepalived
健康检查脚本 1 vim /etc/keepalived/haproxy_chk.sh
1 2 3 4 5 6 7 8 9 systemctl status haproxy.service &>/dev/null if [ $? -ne 0 ];then systemctl start haproxy.service &>/dev/null sleep 5 systemctl status haproxy.service &>/dev/null if [ $? -ne 0 ];then systemctl stop keepalived fi fi
1 chmod 755 /etc/keepalived/haproxy_chk.sh
启动 1 2 3 4 useradd keepalived_script systemctl start keepalived systemctl enable keepalived systemctl status keepalived
测试 查看进程 keepalived
正常运行后,会启动2个进程,其中一个是父进程,负责监控其子进程。一个是vrrp
子进程。
1 2 root 2607 1 0 15:35 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D root 2608 2607 0 15:35 ? 00:00:00 /usr/local/keepalived/sbin/keepalived -D
IP
在 host7
上执行,是没有当前 VIP
的。
1 2 3 4 systemctl stop keepalived ip a
这时候会发现 VIP
节点就到了 host7
1 2 3 4 systemctl start keepalived ip a
会发现 VIP
节点又回来了,因为 host6
的priority
比 host7
大,所以会抢夺。
禁用抢夺策略:
1 2 3 4 vrrp_instance VI_1 { ##************** nopreempt }
正常测试 1 2 3 4 5 6 7 curl 192.168.2.6 curl 192.168.2.7
关闭 master
后测试 1 systemctl stop keepalived
附 推荐文档
RabbitMQ 官方文档 —— 集群指南 RabbitMQ 官方文档 —— 高可用镜像队列 HAProxy 官方配置手册 KeepAlived 官方配置手册
清华大学 repo
配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [base] name =CentOS-$releasever - Base baseurl =https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/ enabled =1 gpgcheck =1 gpgkey =file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7 [updates] name =CentOS-$releasever - Updates baseurl =https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/ enabled =1 gpgcheck =1 gpgkey =file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7 [extras] name =CentOS-$releasever - Extras baseurl =https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/ enabled =1 gpgcheck =1 gpgkey =file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7 [centosplus] name =CentOS-$releasever - Plus baseurl =https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/ gpgcheck =1 enabled =0 gpgkey =file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7
rabbitmq.conf
/etc/rabbitmq/rabbitmq.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 listeners.tcp.1 = 192.168.2.3:5672 num_acceptors.tcp = 10 handshake_timeout = 10000 num_acceptors.ssl = 10 ssl_options = none ssl_handshake_timeout = 5000 vm_memory_high_watermark.relative = 0.6 vm_memory_calculation_strategy = allocated channel_max = 2047 channel_operation_timeout = 15000 heartbeat = 60 default_user = guest default_pass = guest default_user_tags.administrator = true default_permissions.configure = .* default_permissions.read = .* default_permissions.write = .* loopback_users.maxzhao = false cluster_name = rabbit@192.168.2.3
RabbitMQ-repo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [rabbitmq_erlang] name =rabbitmq_erlang baseurl =https://packagecloud.io/rabbitmq/erlang/el/7/$basearch repo_gpgcheck =1 gpgcheck =1 enabled =1 gpgkey =https://packagecloud.io/rabbitmq/erlang/gpgkey https ://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc sslverify =1 sslcacert =/etc/pki/tls/certs/ca-bundle.crt metadata_expire =300 [rabbitmq_erlang-source] name =rabbitmq_erlang-source baseurl =https://packagecloud.io/rabbitmq/erlang/el/7/SRPMS repo_gpgcheck =1 gpgcheck =0 enabled =1 gpgkey =https://packagecloud.io/rabbitmq/erlang/gpgkey sslverify =1 sslcacert =/etc/pki/tls/certs/ca-bundle.crt metadata_expire =300 [rabbitmq_server] name =rabbitmq_server baseurl =https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch repo_gpgcheck =1 gpgcheck =1 enabled =1 gpgkey =https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey https ://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc sslverify =1 sslcacert =/etc/pki/tls/certs/ca-bundle.crt metadata_expire =300 [rabbitmq_server-source] name =rabbitmq_server-source baseurl =https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/SRPMS repo_gpgcheck =1 gpgcheck =0 enabled =1 gpgkey =https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey sslverify =1 sslcacert =/etc/pki/tls/certs/ca-bundle.crt metadata_expire =300
haproxy
/etc/haproxy/haproxy.cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 global log 127.0.0.1 local2 info chroot /var/lib/haproxy pidfile /var/run/haproxy.pid user haproxy group haproxy daemon maxconn 4096 stats socket /var/lib/haproxy/stats defaults log global mode http option httplog option dontlognull retries 3 maxconn 2000 timeout connect 5s timeout client 120s timeout server 120s listen rabbitmq_cluster bind *:5672 option tcplog mode tcp balance roundrobin server rabbitmq1 192.168.2.3:5672 check inter 5000 rise 2 fall 3 weight 1 server rabbitmq2 192.168.2.4:5672 check inter 5000 rise 2 fall 3 weight 1 server rabbitmq3 192.168.2.5:5672 check inter 5000 rise 2 fall 3 weight 1 listen monitor bind *:8100 mode http option httplog stats enable stats uri /stats stats refresh 5s
Keepalived
/etc/keepalived/keepalived.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 global_defs { router_id host6 } vrrp_script check_haproxy { script "/etc/keepalived/haproxy_chk.sh" interval 5 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 80 mcast_src_ip 192.168.2.6 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.2.8/24 } track_script { check_haproxy } }
VRRP实例定义块
vrrp_sync_group :同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
group :至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
vrrp_instance:vrrp 实例名 1> state :实例状态,只有MASTER 和 BACKUP两种状态,并且需要全部大写。抢占模式下,其中MASTER为工作状态,BACKUP为备用状态。当MASTER所在的服务器失效时,BACKUP所在的服务会自动把它的状态由BACKUP切换到MASTER状态。当失效的MASTER所在的服务恢复时,BACKUP从MASTER恢复到BACKUP状态。 2> interface :对外提供服务的网卡接口,即VIP绑定的网卡接口。如:eth0,eth1。当前主流的服务器都有2个或2个以上的接口(分别对应外网和内网),在选择网卡接口时,一定要核实清楚。 3> ** mcast_src_ip:本机IP地址 4> virtual_router_id :虚拟路由的ID号,每个节点设置必须一样,可选择IP最后一段使用,相同的 VRID 为一个组,他将决定多播的 MAC 地址。 5> ** priority :节点优先级,取值范围0~254,MASTER要比BACKUP高 6> advert_int: MASTER与BACKUP节点间同步检查的时间间隔,单位为秒 7> ** lvs_sync_daemon_inteface:负载均衡器之间的监控接口,类似于 HA HeartBeat 的心跳线。但它的机制优于 Heartbeat,因为它没有“裂脑”这个问题,它是以优先级这个机制来规避这个麻烦的。在 DR 模式中,lvs_sync_daemon_inteface与服务接口interface使用同一个网络接口 8> authentication :验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用PASS类型,据说AH使用时有问题。验证密码为明文,同一vrrp 实例MASTER与BACKUP使用相同的密码才能正常通信。 9> smtp_alert :有故障时是否激活邮件通知 10> ** nopreempt :禁止抢占服务。默认情况,当MASTER服务挂掉之后,BACKUP自动升级为MASTER并接替它的任务,当MASTER服务恢复后,升级为MASTER的BACKUP服务又自动降为BACKUP,把工作权交给原MASTER。当配置了nopreempt,MASTER从挂掉到恢复,不再将服务抢占过来。 11> virtual_ipaddress :虚拟IP地址池,可以有多个IP,每个IP占一行,不需要指定子网掩码。注意:这个IP必须与我们的设定的vip保持一致。
虚拟服务器virtual_server定义块
virtual_server :定义一个虚拟服务器,这个ip是virtual_ipaddress中定义的其中一个,后面一个空格,然后加上虚拟服务的端口号。 1> delay_loop:健康检查时间间隔,单位:秒 2> lb_algo:负载均衡调度算法,互联网应用常用方式为wlc或rr 3> lb_kind:负载均衡转发规则。包括DR、NAT、TUN 3种,一般使用路由(DR)转发规则。 4> persistence_timeout:http服务会话保持时间,单位:秒 5> protocol:转发协议,分为TCP和UDP两种
real_server :真实服务器IP和端口,可以定义多个 1> weight:负载权重,值越大,转发的优先级越高 2> notify_down:服务停止后执行的脚本 3> TCP_CHECK:服务有效性检测 * connect_port:服务连接端口 * connect_timeout:服务连接超时时长,单位:秒 * nb_get_retry:服务连接失败重试次数 * delay_before_retry:重试连接间隔,单位:秒
配置日志文件
RabbitMQ
集群常用命令1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 五、集群常用命令 1、加入集群[--ram添加内存模式 默认disk模式] rabbitmqctl join_cluster --ram rabbit@mq01 2、查看集群状态 rabbitmqctl cluster_status 3、更改节点模式[顺序 关闭运用-〉更改类型->开启运用] rabbitmqctl stop_app –停止运用服务 rabbitmqctl change_cluster_node_type disc/ram –更改节点为磁盘或内存节点 rabbitmqctl start_app –开启运用服务 4、创建策略(集群同步策略……) set_policy [-p vhostpath] {name} {pattern} {definition} [priority] 5、查看策略 rabbitmqctl list_policies 6、移除远程offline的节点 1.节点2停掉应用 rabbitmqctl stop_app 2.节点1执行删除 rabbitmqctl forget_cluster_node rabbit@host5 7、设置集群名称 rabbitmqctl set_cluster_name cluster_name 8、设置镜像模式 Rabbit提供镜像功能,需要基于rabbitmq策略来实现,政策是用来控制和修改群集范围的某个vhost队列行为和Exchange行为 set_policy [-p vhostpath] {name} {pattern} {definition} [priority] rabbitmqctl set_policy ha-all "^ha." "{" "ha-mode" ":" "all" "}" rabbitmqctl set_policy ha-all "^" "{" "ha-mode" ":" "all" "," "ha-sync-mode" ":" "automatic" "}" rabbitmqctl set_policy -p demo ha-all "^" "{" "ha-mode" ":" "all" "," "ha-sync-mode" ":" "automatic" "}" 9、手动同步queue rabbitmqctl sync_queue name 10、取消queue同步 rabbitmqctl cancel_sync_queue name 11、查看所有队列信息 rabbitmqctl list_queues 12、获取队列信息 rabbitmqctl list_queues[-p vhostpath] [queueinfoitem ...] Queueinfoitem可以为:name,durable,auto_delete,arguments,messages_ready,messages_unacknowledged,messages,consumers,memory。 13、获取Exchange信息 rabbitmqctl list_exchanges[-p vhostpath] [exchangeinfoitem ...] Exchangeinfoitem有:name,type ,durable,auto_delete,internal,arguments。 14、获取Binding信息 rabbitmqctl list_bindings[-p vhostpath] [bindinginfoitem ...] Bindinginfoitem有:source_name,source_kind,destination_name,destination_kind,routing_key,arguments。 15、获取Connection信息 rabbitmqctl list_connections [connectioninfoitem ...] Connectioninfoitem有:recv_oct,recv_cnt,send_oct,send_cnt,send_pend等。 16、获取Channel信息 rabbitmqctl list_channels[channelinfoitem ...] Channelinfoitem有consumer_count,messages_unacknowledged,messages_uncommitted,acks_uncommitted,messages_unconfirmed,prefetch_count,client_flow_blocked。
本文地址: https://github.com/maxzhao-it/blog/post/33972/