RabbitMQ镜像模式:VMware(一)

环境

一、前言

RabbitMQ集群搭建,当前选择使用镜像模式。

技术架构:

  1. HaProxy:高可用负载
  2. KeepAlived:网络服务高可用(主从热备、秒级切换)
  3. 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 内存节点
  • HaProxyKeepAlived: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-gpg
wget 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 chinses
chmod -R 755 /usr/share/fonts/chinses/
vim /etc/fonts/fonts.conf

<dir prefix="xdg">fonts</dir> 这一行下面插入:

1
<dir>/usr/share/fonts/chinses</dir> 
1
2
# 拷贝本地字体
fc-cache

网络

需要安装 net-tools

1
yum -y install net-tools

查看网络

1
ifconfig

我这里的网络魏 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设置 一样才行。

重启网略

1
service network restart

测试网络

1
ping www.baidu.com

设置hostname

默认hostnamelocalhost,所以这里做区分

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
# 修改guest的密码
sudo rabbitmqctl change_password guest guest;
# 创建其他管理员账号比如test/test:
sudo rabbitmqctl add_user maxzhao maxzhao;
# 设置用户类型
sudo rabbitmqctl set_user_tags maxzhao administrator;
# /是 vhost的目录 Configure regexp Write regexp Read regexp
sudo rabbitmqctl set_permissions -p / maxzhao ".*" ".*" ".*";
# Sets user topic permissions for an exchange,默认使用 AMQP default 的exchange
# sudo rabbitmqctl set_topic_permissions

安装 Web 管理端

1
rabbitmq-plugins enable rabbitmq_management

查看系统服务

1
systemctl list-unit-files |grep rabbitmq-server

六、安装 HaProxy

1
yum install haproxy -y

这里安装后的版本为 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/tools
cd /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
#将keepalived配置文件拷贝到etc下
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
#将keepalived文件拷贝到etc下,加入网卡配置
cp /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 操作步骤

  1. 虚拟机关机
  2. 拷贝出5台设备
  3. 修改5台设备网络
    • 192.168.2.3
      • RabbitMQ master
    • 192.168.2.4
      • RabbitMQ
    • 192.168.2.5
      • RabbitMQ
    • 192.168.2.6
      • HaProxy
      • KeepAlived master
    • 192.168.2.7
      • HaProxy
      • KeepAlived slave

开放虚拟机端口或关闭防火墙

开放端口

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.default = 5672
listeners.tcp.1 = 192.168.2.3:5672
# 配置远程登录的账号
loopback_users.maxzhao = false

重启

1
2
systemctl restart rabbitmq-server
systemctl status rabbitmq-server

普通集群

$HOME/var/lib/rabbitmq中有一个 .erlang.cookie 文件。

1
2
ls -la $HOME|grep .erlang.cookie
ls -la /var/lib/rabbitmq|grep .erlang.cookie

RabbitMQ 集群是依赖 erlang集群的,erlang集群需要 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
rabbitmqctl status

这里会发现

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
# host4加入集群
ssh root@192.168.2.4 "rabbitmqctl stop_app;rabbitmqctl join_cluster --ram rabbit@host3;rabbitmqctl start_app;systemctl restart rabbitmq-server;"
# host5加入集群
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为匹配名称为qfeduexchanges或者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
# 下线的服务器执行,比如 host5
rabbitmqctl stop
# 任意集群中的节点服务器执行,比如 host4
rabbitmqctl forget_cluster_node rabbit@host5
# 或者 host5 上执行,这会清空该节点上所有历史数据,并主动通知集群中其它节点它将要离开集群。
rabbitmqctl reset

集群关闭与重启

没有一个直接的命令可以关闭整个集群,需要逐一进行关闭。

但是在重启时,最后关闭的节点最先被启动。如果第一个启动的不是最后关闭的节点,那么这个节点会等待最后关闭的那个节点启动,默认进行 10 次连接尝试,超时时间为 30 秒,如果依然没有等到,则该节点启动失败。

这带来的一个问题是,假设在一个三节点的集群当中,关闭的顺序为 host3host4host5,如果 host3 因为故障暂时没法恢复,此时 host4host5
就无法启动。想要解决这个问题,可以先将 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/haproxy
vim /etc/rsyslog.conf
#写入 local2.* /var/log/haproxy.log
systemctl restart rsyslog.service
systemctl restart haproxy

检查配置

1
2
haproxy -f /etc/haproxy/haproxy.cfg -c
#Configuration file is valid

启动

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
# 添加 net.ipv4.ip_nonlocal_bind=1
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
#写入 KEEPALIVED_OPTIONS="-D -d -S 0"
vim /etc/rsyslog.conf
#写入 local0.* /var/log/keepalived.log
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

1
2
# 在 `host6` 上执行
ip a

host7 上执行,是没有当前 VIP 的。

1
2
3
4
# 在 `host6` 上执行
systemctl stop keepalived
# 在 `host7` 上执行
ip a

这时候会发现 VIP 节点就到了 host7

1
2
3
4
# 在 `host6` 上执行
systemctl start keepalived
# 在 `host6` 上执行
ip a

会发现 VIP 节点又回来了,因为 host6priorityhost7大,所以会抢夺。

禁用抢夺策略:

1
2
3
4
vrrp_instance VI_1 {
##**************
nopreempt
}

正常测试

1
2
3
4
5
6
7
curl 192.168.2.6
#this is master
#root@centos7[14:46:07]:~
curl 192.168.2.7
#this is master
#root@centos7[15:03:29]:~
#1.2.3.4.5.6.

关闭 master 后测试

1
systemctl stop keepalived
1
2
3
curl 192.168.2.7
#this is slave
#root@centos7[15:03:59]:/etc/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
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client. You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#


[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7



#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-7



#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
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.default = 5672
listeners.tcp.1 = 192.168.2.3:5672
# 接受 TCP 侦听器连接的 Erlang 进程的数目
num_acceptors.tcp = 10
# 握手的最大时间(在套接字连接和 TLS 握手之后) ,以毫秒为单位
handshake_timeout = 10000
#listeners.ssl
# 接受客户端 TLS 连接的 Erlang 进程数量
num_acceptors.ssl = 10
# TLS 配置 TLS guide 指南. https://www.rabbitmq.com/ssl.html#enabling-ssl
ssl_options = none
#TLS 握手超时,以毫秒为单位
ssl_handshake_timeout = 5000
# 触发流控制的内存阈值。可以是操作系统可用 RAM 的绝对值或相对值:
vm_memory_high_watermark.relative = 0.6
#vm_memory_high_watermark.absolute = 2GB
#内存使用报告策略。可以是下列策略之一:
#allocated : 使用 Erlang 内存分配器统计信息
#rss : 使用操作系统 RSS 内存报告。这使用特定于操作系统的方法,并可能启动短命的子进程
#legacy : 使用遗留内存报告(认为运行时使用了多少内存)。这种策略是相当不准确的
#erlang : 与legacy 相似, 保存为向后兼容
vm_memory_calculation_strategy = allocated
#与客户端协商的最大允许信道数,不包括协议中使用的特殊信道0。设置为0意味着“无限”,这是一个危险的值,因为应用程序有时会有通道泄漏。使用更多的通道会增加代理的内存占用
channel_max = 2047
#道操作超时(以毫秒为单位)(在内部使用,由于消息传递协议的差异和限制,不会直接暴露给客户端)
channel_operation_timeout = 15000
#表示服务器在连接参数协商期间建议的心跳超时。如果两端设置为0,则禁用心跳(不建议这样做)
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
#后端要联系的节点列表。例如,在第一次启动时使用节点‘ rabbit@hostname1’和‘ rabbit@hostname2’进行集群:
#cluster_formation.classic_config.nodes.1 = rabbit@hostname1
#cluster_formation.classic_config.nodes.2 = rabbit@hostname2
#集群名称 每个都不一样
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
##
## Zero dependency Erlang
##
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
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
##
[rabbitmq_server]
name=rabbitmq_server
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
# PackageCloud's repository key and RabbitMQ package signing key
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
#设置日志 local为本地
log 127.0.0.1 local2 info
#当前工作目录
chroot /var/lib/haproxy
#pid 文件地址
pidfile /var/run/haproxy.pid
#用户与用户组
user haproxy
group haproxy
#运行进程ID
#uid 99
#gid 99
#守护进程启动
daemon
#最大连接数
maxconn 4096
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#默认配置
defaults
#应用全局的日志配置
log global
#默认的模式mode {tcp|http|health}
#TCP是4层,HTTP是7层,health只返回OK
mode http
#日志类别tcplog/httplog
option httplog
#不记录健康检查日志信息
option dontlognull
#3次失败则认为服务不可用
retries 3
#每个进程可用的最大连接数
maxconn 2000
#连接超时
timeout connect 5s
#客户端超时
timeout client 120s
#服务端超时
timeout server 120s

# RabbitMQ 集群绑定配置
listen rabbitmq_cluster
bind *:5672
option tcplog
#配置TCP模式
mode tcp
#轮询算法
balance roundrobin
#RabbitMQ集群节点配置
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

#haproxy监控页面地址
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 {
## 标识本节点的字条串,通常为hostname
router_id host6
}
vrrp_script check_haproxy {
#执行脚本位置
script "/etc/keepalived/haproxy_chk.sh"
##检查时间间隔
interval 5
##如果条件成立则权重减20
weight -20
}
#VRRP 实例定义块
vrrp_instance VI_1 {
##主节点为MASTER,备份节点为BACKUP
state MASTER
##绑定虚拟ip的网络接口(网卡)
interface ens33
##虚拟路由id号,主备节点相同
virtual_router_id 80
##本机ip地址
mcast_src_ip 192.168.2.6
##优先级(0-254),
priority 100
##组播信息发送间隔,两个节点必须一致,默认1s
advert_int 1
##认证匹配
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
##虚拟ip,可以指定多个
192.168.2.8/24
}
track_script {
check_haproxy
}
}

VRRP实例定义块

  1. vrrp_sync_group:同步vrrp级,用于确定失败切换(FailOver)包含的路由实例个数。即在有2个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪
  2. group:至少要包含一个vrrp实例,vrrp实例名称必须和vrrp_instance定义的一致
  3. 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定义块

    1. 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两种
    2. 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/