作为微服务的消息中心,单节点一定支撑不住庞大的压力,本节,笔者带大家去搭建一套rabbitmq集群,以及用HaProxy去代理集群节点。
一、erlang环境
别去搞什么yum安装了,很慢很慢,这是最新的源码地址
http://erlang.org/download/otp_src_19.3.tar.gz
建议迅雷或者其他工具先下载下来,然后用rz(没有安装的同学可以yum install lrzsz -y)上传到服务器。
/* 安装依赖 */
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel
/* 编译安装 */
tar -xzvf otp_src_19.3.tar.gz
cd ./otp_src_19.3
./configure --prefix=/usr/erlang --without-javac
make && make install
二、rabbitmq单节点安装
/* rabbitmq下载地址 */
https://dl.bintray.com/rabbitmq/rabbitmq-server-rpm/rabbitmq-server-3.6.14-1.el7.noarch.rpm
/* 导入 */
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
/* 安装 */
yum install rabbitmq-server-3.6.14-1.el7.noarch.rpm
/* 开启web管理界面 */
rabbitmq-plugins enable rabbitmq_management
/* 开启15672 web端口 */
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd —reload
/* 用户命令相应的命令 */
(1) 新增一个用户rabbitmqctl add_user Username Password
(2) 删除一个用户rabbitmqctl delete_user Username
(3) 修改用户的密码rabbitmqctl change_password Username Newpassword
(4) 查看当前用户列表rabbitmqctl list_users
/* 允许用户远程访问 */
rabbitmqctl set_permissions -p "/" User ".*" ".*" ".*"
/* 设置用户角色的命令 */
rabbitmqctl set_user_tags User Tag
User为用户名, Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。
三、rabbitmq集群搭建
建议将1节点虚拟机复制两份 这样可以保证rabbitmq cookie一致,不用做变更。然后再分别编辑三台节点的hosts文件,三台节点hosts文件一致。
vi /etc/hosts
/* 加入三个节点 */
192.168.41.140 rabbitmq-node1.com rabbitmq-node1
192.168.41.141 rabbitmq-node2.com rabbitmq-node2
192.168.41.142 rabbitmq-node3.com rabbitmq-node3
重启三台服务器
/* 分别以detached方式启动三台rabbitmq */
rabbitmq-server -detached
// 如果提示PID FILE不能写入,可以关闭应用,直接以服务方式启动,关闭之后重启仍然提示有实例正在运行可以强制杀死线程
ps aux | grep rabbitmq
kill -9 xxxx
/* 启动服务 */
service rabbitmq-server start
让node2、node3加入集群
/* 将node2节点加入node1 作为RAM类型节点 */
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1 --ram
rabbitmqctl start_app
/* 将node3节点加入node1 作为disc类型节点 */
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbitmq-node1
rabbitmqctl start_app
/* 查看集群信息 */
rabbitmqctl cluster_status
打开web管理界面查看,三台节点已经成功启动
安装HAProxy来代理三台节点
/* haproxy下载链接 */
http://www.haproxy.org/download/1.7/src/haproxy-1.7.9.tar.gz
/* 根据平台选择编译参数 */
uname -r
/* 安装c/c++ */
yum install gcc gcc-c++
/* 笔者平台 */
3.10.0-693.5.2.el7.x86_64
// 所以编译参数为
make TARGET=linux2628 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy
/* 添加环境变量 */
vi /etc/profile
export PATH=$PATH:/usr/local/haproxy/sbin
source /etc/profile
/* 复制bin文件,后续启动需要 */
cp /usr/local/haproxy/sbin/haproxy /usr/sbin/
haproxy -v 后显示如下则表示成功
HA-Proxy version 1.7.9 2017/08/18
Copyright 2000-2017 Willy Tarreau
/* 拷贝启动文件 */
cp examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy
/* 创建系统账号 */
groupadd haproxy
useradd -g haproxy -M -s /sbin/nologin haproxy
/* 创建配置文件 */
mkdir /etc/haproxy
vi /etc/haproxy/haproxy.cfg
====
global
#设置日志
log 127.0.0.1 local3 info
chroot /usr/local/haproxy
#用户与用户组
user haproxy
group haproxy
#守护进程启动
daemon
#最大连接数
maxconn 4000
listen rabbitmq_local_cluster
bind 0.0.0.0:5672
#配置TCP模式
mode tcp
option tcplog
#简单的轮询
balance roundrobin
#rabbitmq集群节点配置
# inter 2000 健康检查时间间隔2秒
# rise 3 检测多少次才认为是正常的
# fall 3 失败多少次才认为是不可用的
# weight 30 权重
# 需要转发的ip及端口
server rabbitmq-node1 192.168.41.140:5672 check inter 2000 rise 3 fall 3 weight 30
server rabbitmq-node2 192.168.41.141:5672 check inter 2000 rise 3 fall 3 weight 30
server rabbitmq-node3 192.168.41.142:5672 check inter 2000 rise 3 fall 3 weight 30
#配置haproxy web监控,查看统计信息
listen private_monitoring
bind :1080
mode http
option httplog
stats enable
#设置haproxy监控地址为http://localhost:8100/stats
stats uri /stats
stats refresh 30s
#添加用户名密码认证
stats auth admin:admin
/* 编辑rsyslog */
vi /etc/rsyslog.conf
// 去掉下面两行前的#
$ModLoad imudp
$UDPServerRun 514
// 添加下面一行保存
local3.* /var/log/haproxy.log
// 重启rsyslog
systemctl restart rsyslog
启动haproxy
service haproxy start
/* 开放1080端口 */
firewall-cmd --zone=public --add-port=1080/tcp --permanent
firewall-cmd --reload
访问http://ip:1080/stats,输入账号密码 admin admin 如下图
用我们上一节搭建的微服务去链接HaProxy
这是配置信息
module.exports = Object.assign({
rabbitMq_host: '192.168.41.140', // 替换成haproxy的ip
rabbitMq_port: '5672', // haproxy代理端口
rabbitMq_user: '***', // 这里替换成自己rabbitmq-server上的用户
rabbitMq_password: '*****', // 这里替换成自己rabbitmq-server上的密码
// server_host: '106.14.77.183',
server_host: '127.0.0.1',
server_port: 8889,
rabbitMq_queue: {
logic01: 'server',
logic02: 'server_test'
}
});