Erlang+Rabbitmq+Haproxy
erlang安装
安装
sudo yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto -y
cd /u02
mkdir source-package
cd /u02/source-package
wget http://www.erlang.org/downloads/otp_src_22.0.tar.gz
tar -xzvf otp_src_22.0.tar.gz
cd otp_src_22.0/
./configure --prefix=/u02/erlang
make && make install
cd /u02/erlang/
配置Erlang环境变量
vi /etc/profile文件,增加下面的环境变量:
export PATH=$PATH:/u02/erlang/bin
source /etc/profile
rabbitmq安装
安装
wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz
xz -d rabbitmq-server-generic-unix-3.7.15.tar.xz
tar -xvf rabbitmq-server-generic-unix-3.7.15.tar -C /u02
cd /u02
ln -s rabbitmq_server-3.7.15/ rabbitmq
配置
配置erl的路径
vim /u02/rabbitmq/sbin/rabbitmq-defaults
### next line will be updated when generating a standalone release
ERL_DIR=/u02/erlang/bin/
配置环境变量
vi /etc/profile文件,增加下面的环境变量:
export PATH=$PATH:/u02/rabbitmq_server-3.7.15/sbin
source /etc/profile
启动
启动:
./sbin/rabbitmq-server -detached
查看状态:
./sbin/rabbitmqctl status
端口
5672
15672
启用管理界面
rabbitmq-plugins enable rabbitmq_management
vhost及用户管理
1. 列举所有虚拟主机
rabbitmqctl list_vhosts
添加虚拟主机
rabbitmqctl add_vhost <vhost_name>
删除虚拟主机
rabbitmqctl delete_vhost <vhost_name>
添加用户
rabbitmqctl add_user <username> <password>
设置用户标签
rabbitmqctl set_user_tags <username> <tag>
设置这个才能在页面上登录,tag可以为administrator, monitoring, management
设置权限
rabbitmqctl set_permissions [-p <vhost>] <user> <conf> <write> <read>
权限配置包括:
配置(队列和交换机的创建和删除)、
写(发布消息)、
读(有关消息的任何操作,包括清除这个队列)
conf:一个正则表达式match哪些配置资源能够被该用户访问。
write:一个正则表达式match哪些配置资源能够被该用户读。
read:一个正则表达式match哪些配置资源能够被该用户访问
权限配置是针对于vhost进行配置的,如果有多个vhost,如果某个用户需要相同的配置就要配置多次。
".":匹配任何队列和交换器,"checks-.":只匹配checks-开头的队列和交换器,"":不匹配队列和交换器
示例
rabbitmqctl add_user gj gj
rabbitmqctl set_user_tags gj administrator
rabbitmqctl add_vhost /vhost/XXX/gj/
rabbitmqctl set_permissions -p /vhost/XXX/gj/ gj ".*" ".*" ".*"
集群搭建
复制.erlang.cookie
将其中一台.erlang.cookie 复制到其他机器
1.找到.erlang.cookie 所在位置
1、进入目录: cd /u02/rabbitmq
2、后台启动: ./sbin/rabbitmq-server -detached
3、查看日志 vim ./vim var/log/rabbitmq/xxxxx.log
此行日志指明cookie的位置 home dir : /home/tkiot
4、cat .erlang.cookie
查看内容,如【RONVVDVRYXFLCEFMLXGG】
2. 将.erlang.cookie 内容复制到其他节点的同样位置【$homeDir】
#先关闭服务: ./sbin/rabbitmqctl stop
#进入cookie目录: cd $homeDir
#增加写权限: sudo chmod u+w .erlang.cookie
#修改内容为XXX: sudo echo 'RONVVDVRYXFLCEFMLXGG' > .erlang.cookie
#移除写权限: sudo chmod u-w .erlang.cookie
#再次后台启动: ./sbin/rabbitmq-server -detached
启动集群节点
1.第一个节点启动
rabbitmq-server -detached
查看节点状态,查找节点名称【rabbit@tkiot-mongodb1】
rabbitmqctl status
2.其他节点加入集群
rabbitmq-server -detached
rabbitmqctl stop_app
rabbitmqctl reset
#加入集群节点【rabbit@tkiot-mongodb1】
#指定--ram则作为内存节点,否则为磁盘节点 disc
rabbitmqctl join_cluster rabbit@tkiot-mongodb1
#rabbitmqctl join_cluster --ram rabbit@tkiot-mongodb1
rabbitmqctl start_app
ps:一个集群中至少有一个disc节点
3、 三台机器上查看集群状态
rabbitmqctl cluster_status
RabbitMQ 集群之镜像同步
如果做集群,那么集群是成功了,但是queue是如何存放的呢?消息又是怎么同步呢。
默认的,也就是什么也不配置,直接在某个节点中添加一个queue,那么它仅仅是属于这个节点的。其它节点有的只是它的影子。所以像断线重连、操作恢复是无法做到的,实验证明确实是这样的。声明queue的节点关闭那么是无法再进行发布消息与消费的。这自然失去了集群的意义.
所以default模式一般是不会进行使用的,我们的选择是 镜像节点.
queue mirror 也就是说,也就是 会有一个 master 对应零个或多个 slave.
也可以说成主从复制,每个节点都有着相同的数据,某个节点挂掉了,另一个可以立即顶上
有三种同步的方式,一般来说 all 是我们的最佳选择
all 所有的节点都将被同步
exactly 指定个数的节点被同步
nodes 指定的名称的节点被同步
set_operator_policy (设置或者覆盖一个operator的策略)
list_operator_policies (查看所有的operator的策略)
clear_operator_policy(清除一个operator的策略 )
set_policy (设置或者覆盖一个策略)
list_policies (列出所有的策略不包括operator策略)
clear_policy (清除一个策略)
policy策略设置
rabbitmqctl set_policy [-p Vhost] Name Pattern Definition [Priority]
-p Vhost: 可选参数,针对指定vhost下的queue进行设置
Name: policy的名称
Pattern: queue的匹配模式(正则表达式)
Definition: 镜像定义,包括三个部分ha-mode, ha-params, ha-sync-mode
ha-mode: 指明镜像队列的模式,有效值为 all/exactly/nodes
all: 表示在集群中所有的节点上进行镜像
exactly: 表示在指定个数的节点上进行镜像,节点的个数由ha-params指定
nodes: 表示在指定的节点上进行镜像,节点名称通过ha-params指定
ha-params: ha-mode模式需要用到的参数
ha-sync-mode: 进行队列中消息的同步方式,有效值为automatic和manual
priority: 可选参数,policy的优先级
以下示例声明名为ha-all的策略,它与名称以”ha”开头的队列相匹配,并将镜像配置到集群中的所有节点:
rabbitmqctl set_policy ha-all "^ha" '{"ha-mode":"all"}'
策略的名称以”two”开始的队列镜像到群集中的任意两个节点,并进行自动同步:
rabbitmqctl set_policy ha-two "^two." '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
以”node”开头的队列镜像到集群中的特定节点的策略:
rabbitmqctl set_policy ha-nodes "^nodes." '{"ha-mode":"nodes","ha-params":["rabbit@nodeA", "rabbit@nodeB"]}'
队列镜像到群集中的任意两个节点,并进行自动同步:
rabbitmqctl set_policy -p /vhost/XXX/gj/ ha-two "^" '{"ha-mode":"exactly","ha-params":2,"ha-sync-mode":"automatic"}'
HaProxy
ha配置blog
https://blog.csdn.net/genglei1022/article/details/83374188
https://blog.csdn.net/qq_28710983/article/details/82194404
ha安装
wget https://www.haproxy.org/download/1.8/src/haproxy-1.8.14.tar.gz
tar -xzvf haproxy-1.8.14.tar.gz
cd haproxy-1.8.16/
make TARGET=linux31 PREFIX=/u02/haproxy
make install PREFIX=/u02/haproxy
mkdir /u02/haproxy/conf
touch /u02/haproxy/conf/haproxy.cfg
这里需要使用uname -r查看系统版本centos6.X需要使用TARGET=linux26 centos7.x使用linux31
#查询系统内核版本,内核为【3.10.0-862.el7.x86_64】,所以TARGET=linux31
uname -r
> 3.10.0-862.el7.x86_64
ha配置
global
log 127.0.0.1 local0 info
log-tag haproxy
maxconn 4096
#user haproxy
#group haproxy
daemon
pidfile /u02/haproxy/conf/haproxy.pid
#stats socket /u02/haproxy/conf/haproxy.sock mode 600 level admin
stats timeout 2m
defaults
log global
mode http
timeout connect 5s
timeout server 5s
timeout client 30s
option dontlognull
option http-server-close
option redispatch
listen admin_stats
bind 0.0.0.0:25673
mode http
log 127.0.0.1 local3 err
stats refresh 60s
stats uri /haproxy/stats
stats realm welcom lgoin\ Haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE
listen rabbitmq_cluster
bind 0.0.0.0:5673
mode tcp
timeout server 168h
balance roundrobin
server rabbitnode1 XX.XX.XX.35:5672 check inter 1000 rise 2 fall 3 weight 1
server rabbitnode2 XX.XX.XX.36:5672 check inter 1000 rise 2 fall 3 weight 1
server rabbitnode3 XX.XX.XX.37:5672 check inter 1000 rise 2 fall 3 weight 1
#把RabbitMQ的管理界面也放在HAProxy后面了
listen rabbitmq_admin
bind 0.0.0.0:15673
mode http
timeout server 168h
balance roundrobin
server rabbitnode1 XX.XX.XX.35:15672 check inter 1000 rise 2 fall 3 weight 1
server rabbitnode2 XX.XX.XX.36:15672 check inter 1000 rise 2 fall 3 weight 1
server rabbitnode3 XX.XX.XX.37:15672 check inter 1000 rise 2 fall 3 weight 1
启动haproxy
sbin/haproxy -f conf/haproxy.cfg
ps:多次执行上述启动命令会运行多个实例
端口及访问
访问haproxy监听
http://XX.XX.XX.35:25673/haproxy/stats
admin/admin
访问rabbitmq管理员页面
ha代理
http://XX.XX.XX.35:15673
rabbit自带
http://XX.XX.XX.35:15672
rabbit的conntctionFactory配置
spring:
rabbitmq:
addresses: XX.XX.XX.35:5673,XX.XX.XX.35:5673,XX.XX.XX.35:5673
#addresses: XX.XX.XX.35:5672,XX.XX.XX.35:5672,XX.XX.XX.35:5672
username: gj
password: gj
virtual-host: /vhost/XXX/gj/