多机多集群部署:
环境虚拟机:
CentOs7:
192.168.56.101 node-001(部署RabbitMQ)
192.168.56.110 node-002(部署RabbitMQ)
192.168.56.111 node-003(部署RabbitMQ)
192.168.56.112 node-004(部署HAProxy+Keepalive)
192.168.56.113 node-005(部署HAProxy+Keepalive)
RabbitMQ依赖环境:
yum -y install make gcc gcc-c++ m4 ncurses-devel openssl-devel unixODBC-devel java java-devel
yum -y install glibc-devel ncurses-devel openssl-devel xmlto
一.安装erlang:
https://pan.baidu.com/s/1gj3IF6L_omJ45kYHwr4n7Q 提取码:dv76
# wget http://erlang.org/download/otp_src_22.2.tar.gz
# tar -zxvf otp_src_22.2.tar.gz
# cd otp_src_22.2
# //这里我们将他统一装到/usr/local/erlang中,方便查找和使用。
# mkdir -p /usr/local/erlang
# ./configure --prefix=/usr/local/erlang
# make && make install
//安装后,在/usr/local/erlang中就会出现如下:
// 将/usr/local/erlang/bin 添加环境变量
# vi /etc/profile
//添加如下内容保存
export PATH=$PATH:/usr/local/erlang/bin
# source /etc/profile #重载配置
//成功如下:
- 安装rabbitmq
https://pan.baidu.com/s/12XPQwucFwKOsDtpfjTRMdg 提取码:fdov
# tar -xvf rabbitmq-server-generic-unix-3.8.3.tar.xz -C /usr/local/
# vi /etc/profile //添加环境变量
//添加如下内容:
PATH=$PATH:/usr/local/rabbitmq_server-3.8.3/sbin
export LC_ALL=en_US.UTF-8
# source /etc/profile //重载一下环境变量
# rabbitmq-plugins enable rabbitmq_management // 添加web管理插件
# rabbitmq-server -detached // 后台启动rabbitmq服务
Warning: PID file not written; -detached was passed. 启动服务这个警告,忽略它。实际是已经启动了
#ps aux | grep rabbitmq //成功如下
// 登陆rabbitmq控制面板 IP:15627
// 添加用户:
rabbitmqctl add_user user1 user1 //添加用户
rabbitmqctl set_permissions -p "/" user1 ".*" ".*" ".*" //添加权限
rabbitmqctl set_user_tags user1 administrator //修改用户角色
- 安装rabbitmq-c
https://github.com/alanxz/rabbitmq-c/releases
# wget https://github.com/alanxz/rabbitmq-c/archive/v0.10.0.tar.gz
# tar zxvf v0.10.0.tar.gz
# cd rabbitmq-c-0.10.0/
# mkdir build && cd build
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c ..
# cmake --build . --target install
# ln -s /usr/local/rabbitmq-c/lib64/ /usr/local/rabbitmq-c/lib
四.安装rabbitmq扩展
http://pecl.php.net/package/amqp
# wget http://pecl.php.net/get/amqp-1.9.4.tgz
# tar zxvf amqp-1.9.4.tgz
# cd amqp-1.9.4
# phpize
// 对应php路径与rabbitmq-c
./configure --with-php-config=/opt/phre/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c
# make && make install
vi /opt/phre/php/etc/php.ini //添加扩展
添加: extension=amqp.so
//重启php-fpm
// 如phpinfo()无扩展信息,可在php安装目录vi /opt/phre/php/etc/conf.d下创建文件amqp.ini 写入:extension=amqp.so
动态添加rabbitmq扩展
(前提已经在一台虚拟中安装过rb/rb-c扩展,且PHP版本需一致)
- 将安装过的扩展下载至本地
①# find -name amqp.so //查看扩展位置
②# cd /usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/
③# sz amqp.so //下载至本地到未安装扩展服务器中
①# cd /usr/local/php/lib/php/extensions/no-debug-non-zts-20131226/
②# rz //上传扩展
③# chmod 755 amqp.so //赋予权限
④# ldd amqp.so //查看so扩展依赖库
//提示没有 livrabbitmq.so.4 这个依赖
⑤# find -name librabbitmq.so.4 到安装过扩展的服务器上
⑥# sz librabbitmq.so.4 //进入目录下载扩展至本地
⑦# mkdir -p mkdir -p /usr/local/rabbitmq-c//lib/ //至新服务器上创建rb-c文件夹
⑧# rz //上传扩展至目录下
⑨# ldd amqp.so //再次查看依赖
⑩# vi /usr/local/php7/lib/php/php.ini //ini中添加扩展
[amqp]
extension=amqp.so
//保存退出
php -m 查看扩展
五.Rabbitmq镜像集群搭建
192.168.56.101 node-001 (主节点)
192.168.56.110 node-002 //将node-002节点加入node-001
192.168.56.111 node-003 //将node-003节点加入node-001
1. //在需要部署集群的主机上修改hosts,要包含每个节点信息,保持信息一致(node-001/node-002/node-003 需要部署集群都要配置下列信息,修改参数)。
① [root@node-001 local]# vi /etc/hosts
192.168.56.101 node-001
192.168.56.110 node-002
192.168.56.111 node-003
② [root@node-001 local]# vi /etc/hostname
node-001
③ [root@node-001 local]# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node-001
④ [root@node-001 local]# service network restart
⑤ [root@node-001 local]# reboot //重启
⑥ [root@node-001 local]# hostname //是否生效
node-001
- rabbitmq集群是基于erlang同步,所以先配置使各个节点 中 .erlang.cookie文件一致。(以主节点配置为主,发送至其它子节点.)
① [root@node-001 local]# find / -name .erlang.cookie
/root/.erlang.cookie
② [root@node-001 local]# scp /root/.erlang.cookie root@node-002:/root
③ [root@node-001 sbin]# cd /usr/local/rabbitmq_server-3.8.3/sbin
④ [root@node-001 sbin]# ./rabbitmq-server -detached //启动rabbitmq
⑤ [root@node-001 sbin]# ps aux|grep rabbitmq
3. 切换到node-002服务器, 确定下两台服务器互相能否ping通,ping node-001
① [root@node-002 local]# cd /usr/local/rabbitmq_server-3.8.3/sbin
② [root@node-002 sbin]# ./rabbitmq-server -detached
③ [root@node-002 sbin]# ps aux|grep rabbitmq
④ [root@node-002 sbin]# ./rabbitmqctl stop_app
//node-002加入主节点node-001(磁盘节点/内存节点,集群中必须存在一个磁盘节点
主节点是默认磁盘节点)
内存节点: ./rabbitmqctl join_cluster --ram rabbit@node-001
磁盘节点: ./rabbitmqctl join_cluster rabbit@node-001
⑤ [root@node-002 sbin]# ./rabbitmqctl join_cluster rabbit@node-001
⑥ [root@node-002 sbin]# rabbitmqctl start_app //启动
⑦ [root@node-002 sbin]# ./rabbitmqctl cluster_status //查看集群状态
4.因为两台服务器host已经改掉了,已经部署localhost了,所以需要加上对应的用户,先前的username用户已经登录不上控制台了。添加一个admin用户如下:(其它集群也可以用添加的用户访问)
[root@node-001 local]#./rabbitmqctl -n rabbit@node-001 add_user admin 123456
[root@node-001 local]#./rabbitmqctl -n rabbit@node-001 set_user_tags admin administrator
[root@node-001 local]#./rabbitmqctl -n rabbit@node-001 set_permissions -p / admin '.*' '.*' '.*'
[root@node-001 local]#./rabbitmq-plugins enable rabbitmq_management
- 部署镜像模式(以上的配置是只是普通集群)
只有设置policy策略才能算得上是镜像模式,(两种配置方法,后台OR命令行)
①后台配置:
//集群宕机后数据不一致:
两种同步方式:
1.手动同步
3.策略配置自动同步(未设置是默认是手动同步)
②命令行(任意节点执行)
//表示同步所以的队列消息
rabbitmqctl set_policy ha-all “^” ‘{“ha-mode”:“all”}’
// 表示同步以rqmessage开头的消息
rabbitmqctl set_policy -p /test ha-allqueue “^rqmessage” ‘{“ha-mode”:“all”}’
//现在192.168.56.101:15672 /192.168.56.110:15672/192.168.56.111:15672
都可以登陆admin 123456
5: 对节点的操作:
// ①集群节点删除:
例:删除node-002子节点
node-002中操作:
1.关闭应用:rabbitmqctl stop_app
2.重置信息:rabbitmqctl reset //删除集群节点残留数据
node-001中操作:
- rabbitmqctl forget_cluster_node rabbit@node-002
- 回到node-002 rabbitmqctl start_app
// ②节点后删除节点数据(如移除节点后,未执行rabbitmqctl reset。节点会无法启动,错误信息:{error,{inconsistent_cluster,"Node rabbit@node1 thinks it's clustered with node rabbit@node2, but rabbit@node2 disagrees"}})
- find / -name mnesia
- mv /usr/local/rabbitmq_server-3.8.3/var/lib/rabbitmq/mnesia/ /tmp/
rm -rf /usr/local/rabbitmq_server-3.8.3/var/lib/rabbitmq/mnesia
//修改节点类型(需要修改的集群下)
#rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type disc //磁盘节点
rabbitmqctl change_cluster_node_type ram //内存节点
#rabbitmqctl start_app
集群重启顺序
集群重启的顺序是固定的,并且是相反的。 如下所述:
启动顺序:磁盘节点 => 内存节点 。关闭顺序:内存节点 => 磁盘节点 最后关闭必须是磁盘节点,不然可能回造成集群启动失败、数据丢失等异常情况。
六:HAProxy +Keepalive高可用负载均衡
环境:192.168.56.112 node-004
环境:192.168.56.113 node-005
1.安装HAProyx
[root@node-003 local]# yum -y install haproxy
#haproxy 查看状态
2.配置文件
[root@node-003 local]# vi /etc/haproxy/haproxy.cfg
①需要修改的片段
注释这两个option,否则启动会报错
②增加以下配置:
注意点:1.配置完成后访问rabbitmq web面板的变成15670。
2.代码请求rabbitmq的端口变成5673
3.启动
[root@node-003 local]# haproxy -f /etc/haproxy/haproxy.cfg
访问 192.168.56.112:8090/stats / 192.168.56.113:8090/stats
访问 192.168.56.112:15670 / 192.168.56.113:15670/
二:安装Keepalive
1.yum -y install keepalived
chkconfig --add keepalived #设置开机启动,可以不用设置
2.修改/etc/keepalived/keepalived.conf配置文件(主机和备机稍有不同,已经在配置文件中声明,请详细阅读)
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
# vrrp_strict # 一定要注释掉,否则无法启动keepalived
vrrp_garp_interval 0
vrrp_gna_interval 0}
# 集群资源监控,组合track_script进行
vrrp_script check_haproxy {
script "killall -0 haproxy"
interval 2
}
vrrp_instance HAPROXY_HA {
# 设置当前主机为主节点,如果是备用节点,则设置为BACKUP(设置非抢占模式主被机都需要设置成BACKUP)
# 备用节点时,设置为:
state BACKUP
#state MASTER
# 指定HA监测网络接口,可以用ifconfig查看来决定设置哪一个
interface eth1
# 虚拟路由标识,同一个VRRP实例要使用同一个标识,主备机
virtual_router_id 90
# 因为当前环境中VRRP组播有问题,改为使用单播发送VRRP报文
# 可配置多个子节点,需要在下列加上IP
# 主节点时,内容为:
unicast_src_ip 192.168.56.112
unicast_peer {
192.168.56.113
}
# 备节点时,内容为:
#unicast_src_ip 192.168.56.111
#unicast_peer {
#192.168.1.101
#}
# 设置优先级,确保主节点的优先级高过备用节点
# 主节点时,设置为:
priority 100
# 备节点时,设置为:
#priority 80
# 用于设定主备节点间同步检查时间间隔
advert_int 2
# 设置高可用集群中不抢占功能,在主机down后,从机接管,当主机重新恢复后,设置此功能,备机将继续提供服务,从而避免因切换导致的隐患
nopreempt
# 设置主备节点间的通信验证类型及密码,同一个VRRP实例中需一致
authentication {
auth_type PASS
auth_pass 12345
}
# 集群资源监控,组合vrrp_script进行
track_script {
check_haproxy
}
# 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中
# 当状态切换到BACKUP时,此IP会自动从系统中删除
# 可以通过命令ip add查看切换后的状态
virtual_ipaddress {
192.168.56.188 #虚拟ip配置完之后就用它访问
}
}
注意点:(这边默认网卡是eth0,查看本机是否存在ifconfig)
3.启动服务
因为是为了实现haproxy的高可用,启动时需要顺序启动:
(1) 启动两个节点的haproxy: haproxy -f /etc/haproxy/haproxy.cfg
(2) 启动keeepalived:先启动master节点,后启动BACKUP节点
# service keepalived start //开启
# killall keepalived //关闭
(3) 通过配置的虚拟IP(VIP)访问。(代码请求也是通过VIP+配置的5673端口访问
------------------------------------------------------------------------------------------------------------------------------------------------------
单机多集群部署:
环境虚拟机:
CentOs7:
192.168.56.112 node-004
(部署RabbitMQ+HAProxy+Keepalive)
192.168.56.113 node-005
(部署RabbitMQHAProxy+Keepalive)
一:环境:
node004/node005
已经安装erlang/rabbitmq/HAProxy/Keepalive
(按照上列方法安装,配置可暂时不配置)
二:开始搭建单机多集群
- 进入rabbitmq服务sbin对应目录
# cd /usr/local/rabbitmq_server-3.8.3/sbin/
①:启动第一节点 # 未指定面板启动默认15672端口
RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-001 ./rabbitmq-server
②:启动第二节点 # 指定面板启动,不然会报错.
RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit-002 rabbitmq-server -detached
③:如想继续增加节点依次操作,端口不要冲突。(node004/node005 同是这般操作)
- 加入集群
!!此处设置node-004虚拟机中rabbt-001为集群主节点,node-004/nodd-005其他节点加入!
①将需要加入主节点的子节点停止应用程序
# ./rabbitmqctl -n rabbit-002 stop_app
②清除节点元数据
# ./rabbitmqctl -n rabbit-002 reset
③加入主节点node004下的rabbit001
(两种情况1:node004本机下的集群加入节点。2:node005虚拟机下节点加入node004虚拟机中的主节点)
// node004本机集群节点rabbit002加入rabbit001
# ./rabbitmqctl -n rabbit-002 join_cluster --ram rabbit-001
//node005虚拟机集群加入node004中rabbit001节点
# ./rabbitmqctl -n rabbit-002 join_cluster --ram rabbit-001@node-004
rabbit-001@node-004 该节点名称可在node004面板查看
④启动节点
# ./rabbitmqctl -n rabbit-002 start_app
⑤查看集群状态
# ./rabbitmqctl cluster_status -n rabbit-001
# ./rabbitmqctl cluster_status -n rabbit-001@node-004 //005中查看004集群
3.配置HAProxy
node004/node005 配置信息。注意IP与端口号
4.配置Keepalive
node004/node005 配置信息。注意IP与端口号
与多机部署集群配置文件相同。