RabbitMQ集群研究配置文档20150705 v1.0

集群中有两种节点:

1>内存节点:只保存状态到内存(一个例外的情况是:持久的queue的持久内容将被保存到disk)
2>磁盘节点:保存状态到内存和磁盘。
内存节点虽然不写入磁盘 但是它执行比磁盘节点要好 集群中 只需要一个磁盘节点来保存状态 就足够了
如果集群中只有内存节点 那么不能停止它们 否则所有的状态 消息等都会丢失。


一:基础信息
1>地址和主机名对应信息
echo '''
192.168.1.197 chn-bj-yj-rabbitmq-01
192.168.1.198 chn-bj-yj-rabbitmq-02
192.168.1.199 chn-bj-yj-rabbitmq-03
''' >> /etc/hosts

2>时间同步
/usr/sbin/ntpdate pool.ntp.org
clock -w
echo " " >> /etc/crontab
echo "*/5 * * * * root /usr/sbin/ntpdate pool.ntp.org > /dev/null 2>&1" >> /etc/crontab/usr/sbin/ntpdate pool.ntp.org


3>系统版本
CentOS_6.x_x64

二:安装部署
cd /opt/distfiles
wget http://www.erlang.org/download/otp_src_R16B03-1.tar.gz
tar zvfx otp_src_R16B03-1.tar.gz
cd otp_src_R16B03-1
./configure
make
make install
cd ..

yum install xmlto -y

wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.5.2/rabbitmq-server-generic-unix-3.5.2.tar.gz
wget http://pkg.hichao.com/ecshop/rabbitmq/rabbitmq-server-generic-unix-3.5.2.tar.gz
mkdir -p /data/rabbitmq/data
mkdir -p /data/logs/rabbitmq
cd /opt/distfiles
tar zvfx rabbitmq-server-generic-unix-3.5.2.tar.gz
/bin/mv rabbitmq_server-3.5.2 /usr/local/
cd /usr/local/rabbitmq_server-3.5.2/etc/rabbitmq
cp rabbitmq.config.example rabbitmq.config
echo 'export PATH=$PATH:/usr/local/rabbitmq_server-3.5.2/sbin' >> /etc/profile
source /etc/profile


配置环境变量:
echo '
RABBITMQ_MNESIA_BASE=/data/rabbitmq/data
RABBITMQ_LOG_BASE=/data/logs/rabbitmq
' > /usr/local/rabbitmq_server-3.5.2/etc/rabbitmq/rabbitmq-env.conf


rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问 如需要访问设置如下:
vim /usr/local/rabbitmq_server-3.5.2/etc/rabbitmq/rabbitmq.config(打开第58行 注意去掉后面的逗号)
#-------------------------------------------------------------------------
{loopback_users, []}
#-------------------------------------------------------------------------

修改开机自启动找不到erl问题:
vim /usr/local/rabbitmq_server-3.5.2/sbin/rabbitmq-defaults
#---------------------------------------------------------------------------
ERL_DIR=/usr/local/bin/
#---------------------------------------------------------------------------


添加自启动检查:
#!/bin/bash
#date:2015-07-20
#author:zhangluya
*/1 * * * * /bin/bash /opt/sbin/rabbitmq.sh start
#---------------------------------------------------------------------------

vim /opt/sbin/rabbitmq.sh
#---------------------------------------------------------------------------
#!/bin/bash
#date:20150707
#author:zhangluya
#info:customer server web_service stop|start|restart

#Source function library.
. /etc/rc.d/init.d/functions

#Check that networking is up.
if [ "$NETWORKING" = "no" ];then
exit 0
fi

RPATH="/usr/local/rabbitmq_server-3.5.2"
RETVAL=0
prog="rabbitmq"
SERVER=`netstat -lntup|grep 5672|awk -F ':::' '{print $2}'|grep -v -E "^$|grep"|wc -l`

start(){
if [ ${SERVER} -eq 1 ];then
echo "${prog} already is running......"
else
${RPATH}/sbin/rabbitmq-server -detached
RETVAL=$?
if [ $RETVAL -ne 0 ] ; then
action "start ${prog} fail......" /bin/false
exit 1
else
action "start ${prog} success......" /bin/true
fi
fi
}

stop(){
if [ ${SERVER} -eq 1 ];then
${RPATH}/sbin/rabbitmqctl stop
RETVAL=$?
if [ $RETVAL -eq 0 ] ; then
action "stop $prog ok......" /bin/true
else
action "stop $prog fail......" /bin/false
fi
else
echo "${prog} is not running......"
fi
}

case $1 in
"start")
start
;;
"stop")
stop
;;
"restart")
stop
start
;;
*)
echo "please input stop|start|restart"
;;
esac
#---------------------------------------------------------------------------


四:集群配置
1>同步cookie保证集群一致(rabbitmq-01、rabbitmq-02)
scp .erlang.cookie 192.168.1.198:/root/
scp .erlang.cookie 192.168.1.199:/root/


2>使用 -detached 参数运行各节点
rabbitmqctl stop
rabbitmq-server -detached
echo "/usr/local/rabbitmq_server-3.5.2/sbin/rabbitmq-server -detached" >> /etc/rc.local

3>开启监控插件(rabbitmq-01、rabbitmq-02、rabbitmq-03)
rabbitmq-plugins enable rabbitmq_management

4>(rabbitmq-02、rabbitmq-03 和rabbitmq-01组成集群)
rabbitmqctl stop_app
rabbitmqctl join_cluster rabbit@chn-bj-yj-rabbitmq-01
rabbitmqctl start_app

5>查看集群状态
rabbitmqctl cluster_status

6>设置镜像队列策略(任意节点执行)
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all"}'
将所有队列设置为镜像队列,即队列会被复制到各个节点,各个节点状态保持一直

7>账户管理
删除默认账户:
rabbitmqctl delete_user guest

创建账户:
rabbitmqctl add_user admin nicai

赋予其administrator角色
rabbitmqctl set_user_tags admin administrator

更改密码:
change_password <username> <newpassword>

创建RabbitMQ监控用户 负责整个MQ的监控 例如:
rabbitmqctl add_user monitor monitor_pwd

赋予其monitoring角色:
rabbitmqctl set_user_tags monitor monitoring

创建某个项目的专用用户 只能访问项目自己的virtual hosts
rabbitmqctl add_user user_1 passwd_1

赋予其monitoring角色:
rabbitmqctl set_user_tags user_1 management

创建和赋角色完成后查看并确认:
rabbitmqctl list_users

命令使用户admin具有/ virtual host中所有资源的配置、写、读权限以便管理其中的资源
rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'

列出用户权限
[root@02 ~]#rabbitmqctl list_user_permissions admin
Listing permissions for user "admin" ...
/ .* .* .*

[root@02 ~]# rabbitmqctl list_permissions -p /
Listing permissions in vhost "/" ...
admin .* .* .*

8>更改节点类型 (示例chn-bj-yj-rabbitmq-02改为ram节点|disc)
rabbitmqctl cluster_status
rabbitmqctl stop_app
rabbitmqctl change_cluster_node_type ram
rabbitmqctl start_app
rabbitmqctl cluster_status

完整示例如下:
[root@chn-bj-yj-rabbitmq-02 ~]# rabbitmqctl stop_app
Stopping node 'rabbit@chn-bj-yj-rabbitmq-02' ...

[root@chn-bj-yj-rabbitmq-02 ~]# rabbitmqctl change_cluster_node_type ram
Turning 'rabbit@chn-bj-yj-rabbitmq-02' into a ram node ...

[root@chn-bj-yj-rabbitmq-02 ~]# rabbitmqctl start_app
Starting node 'rabbit@chn-bj-yj-rabbitmq-02' ...

[root@chn-bj-yj-rabbitmq-02 ~]# rabbitmqctl cluster_status
Cluster status of node 'rabbit@chn-bj-yj-rabbitmq-02' ...
[{nodes,[{disc,['rabbit@chn-bj-yj-rabbitmq-03',
'rabbit@chn-bj-yj-rabbitmq-01']},
{ram,['rabbit@chn-bj-yj-rabbitmq-02']}]},
{running_nodes,['rabbit@chn-bj-yj-rabbitmq-01',
'rabbit@chn-bj-yj-rabbitmq-03',
'rabbit@chn-bj-yj-rabbitmq-02']},
{cluster_name,<<"rabbit@chn-bj-yj-rabbitmq-03">>},
{partitions,[]}]

9>:重启集群节点(在任何时候必须有一个disk node在运行)
rabbitmqctl stop
rabbitmqctl status
rabbitmq-server -detached

10>节点退出集群
rabbitmqctl stop_app
rabbitmqctl reset #如果只剩最后一个节点 退出集群时使用force_reset
rabbitmqctl start_app

PS:如改动了erlang.cookie 服务重启后出现各种各样的问题 建议在rabbitmq的服务开启之前要把erlang.cookie配置好,
如果出现问题,解决方法就是停掉服务 执行如下命令:
rm -rf /data/rabbitmq/data/rabbit\@chn-bj-yj-rabbitmq-03/*
重启服务即可

备注信息:
一:环境变量
环境变量初始值通过文件rabbitmq-env.conf来配置 rabbitmq-env.conf默认在/etc/rabbitmq,
rabbitmq-env.conf中的每项都以 RABBITMQ_为前缀,常用参数如下:
RABBITMQ_NODE_IP_ADDRESS= //IP地址,空串bind所有地址,指定地址bind指定网络接口
RABBITMQ_NODE_PORT= //TCP端口号,默认是5672
RABBITMQ_NODENAME= //节点名称。默认是rabbit
RABBITMQ_CONFIG_FILE= //配置文件路径
RABBITMQ_MNESIA_BASE= //mnesia所在路径
RABBITMQ_LOG_BASE= //日志所在路径
RABBITMQ_PLUGINS_DIR= //插件所在路径

配置文件:
tcp_listeners #设置rabbimq的监听端口
disk_free_limit #磁盘低水位线 若磁盘容量低于指定值则停止接收数据 默认值为{mem_relative 1.0} 即与内存相关联1:1 也可定制为多少byte
vm_memory_high_watermark #设置内存低水位线 若低于该水位线 则开启流控机制 默认值是0.4 即内存总量的40%。
hipe_compile #将部分rabbimq代码用High Performance Erlang compiler编译 可提升性能 该参数是实验性 若出现erlang vm segfaults应关掉。
force_fine_statistics #该参数属于rabbimq_management 若为true则进行精细化的统计 但会影响性能。
frame_max #包大小 若包小则低延迟 若包则高吞吐 默认是131072=128K。
heartbeat #客户端与服务端心跳间隔 设置为0则关闭心跳 默认是600秒。

rabbitmq-env.conf 和 rabbitmq.config默认是不存在的。
rabbitmq-env.conf需要在缺省位置手动创建一个。
rabbitmq.config需要在RABBITMQ_CONFIG_FILE指定位置手动创建一个。

管理端口:
4369 (epmd), 25672 (Erlang distribution)
5672, 5671 (AMQP 0-9-1 without and with TLS)
15672 (if management plugin is enabled)
61613, 61614 (if STOMP is enabled)
1883, 8883 (if MQTT is enabled)

 


http://www.linuxidc.com/Linux/2012-10/72720p3.htm
http://blog.chinaunix.net/topic/surpershi/
http://blog.chinaunix.net/uid-22312037-id-3479210.html
http://itindex.net/detail/50654-%E6%9E%B6%E6%9E%84-rabbitmq

权限管理:http://blog.csdn.net/zyz511919766/article/details/42292655
http://www.ttlsa.com/linux/install-rabbitmq-on-linux/
参考文档:http://www.360doc.com/content/15/0520/17/15077656_471996230.shtml
http://nonfu.me/p/8833.html

posted @ 2016-02-25 15:18  study-notes  阅读(212)  评论(0编辑  收藏  举报