rabbitmq3.4.2 shell脚本分析 | http://aperise.iteye.com/blog/2346584 |
rabbitmq3.4.2单机安装和集群安装 | http://aperise.iteye.com/blog/2346179 |
rabbitmq3.4.1脑裂问题(转载) | http://blog.csdn.net/u013256816/article/details/53291907 |
spring-amqp官方文档(转载) | http://projects.spring.io/spring-amqp/#quick-start |
spring-amqp在GITHUB源码(转载) | https://github.com/spring-projects/spring-amqp |
1.准备工作(root用户执行)
涉及公用的linux库、公用的JDK、公用的ERLANG环境统一采用root用户安装,配置环境变量到/etc/profile供所有用户使用
1.1 必要的linux依赖库
安装GCC GCC-C++ Openssl ncurses等模块,否则在make&&make install Erlang等操作期间会出现一些由于没有其依赖的软件模块而失败。
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel ncurses-devel xmlto libxslt
1.2 JDK安装
- 在Erlang的编译(make)环节,默认是要使用javac的;
- 对erlang来说它的JInterface的编译需要java编译器javac(JInterface是JDK5的, 若缺省JDK低于1.5,make到JInterface时依然会出错);
- JDK不是必须的,可以使用如下方法设置不用javac
cd /home/nmscmq/rabbitmq-server-3.4.2-source ./configure --prefix=/opt/erlang --without-javac //设置不用java编译这里是从oracle官网下载JDK7,现在oracle官网找个JDK7真心不容易,不知是不是为了推JDK8,JDK7的下载链接那个难找啊!!! http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz
![](https://i-blog.csdnimg.cn/blog_migrate/ed1d65689534f2c5696299655ae8113e.png)
![](https://i-blog.csdnimg.cn/blog_migrate/95396a46746ff9471bec26b51f302fb8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/051c4b0fc6b53dd3d2a96651e765317b.png)
#1.首先不建议用openjdk,建议采用oracle官网JDK #2.首先卸载系统自带的低版本或者自带openjdk #首先用命令java -version 查看系统中原有的java版本 #然后用用 rpm -qa | java-1.7.0-openjdk-1.7.0.79-2.5.5.4.el6.x86_64 命令查看具体的信息, rpm -e --nodeps java-1.7.0-openjdk-1.7.0.79-2.5.5.4.el6.x86_64 rpm -e --nodeps java-1.6.0-openjdk-1.6.0.35-1.13.7.1.el6_6.x86_64 #3.安装jdk-7u79-linux-x64.gz #下载jdk-7u79-linux-x64.gz放置于/opt/java/jdk-7u79-linux-x64.gz并解压 cd /opt/java/ #这里是从oracle官网下载JDK7,现在oracle官网找个JDK7真心不容易,不知是不是为了推JDK8,JDK7的下载链接那个难找啊!!! wget http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz tar -zxvf jdk-7u79-linux-x64.gz #4.配置环境变量 #配置linux系统环境变量 vi /etc/profile #在文件末尾追加如下内容 export JAVA_HOME=/opt/java/jdk1.7.0_79 export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #使配置生效 source /etc/profile #5.检查JDK环境是否配置成功 java -version
1.3 ERLANG安装
安装rabbitmq首先必须安装Erlang,因为rabbitmq是用erlang开发的,这好比很多JAVA开发的程序首先要安装JDK一样。
目前Erlang(http://www.erlang.org)官网版本已经到了19.2,这里我下载的是Erlang版本17.0。
#1.下载、编译和安装erlang cd /opt/software #下载erlang源码包 wget http://erlang.org/download/otp_src_17.0.tar.gz #解压erlang源码包 tar -zxvf otp_src_17.0.tar.gz cd /opt/software/otp_src_17.0 #创建安装目录 mkdir -p /opt/erlang #设置erlang安装目录,设置需不需要使用javac #如果不需要就这么设置./configure --prefix=/opt/erlang --without-javac ./configure --prefix=/opt/erlang #编译并安装 make make install #2.ERLANG环境变量配置 vi /etc/profile #在文件末尾追加如下内容 export ERLANG_HOME=/opt/erlang export PATH=$PATH:$ERLANG_HOME/bin #修改完后使配置文件生效 source /etc/profile #3.ERLANG安装成功检测 erl -version #Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 6.0
在centos5.11上安装时候报错和解决办法如下:
********************************************************************* ********************** APPLICATIONS INFORMATION ******************* ********************************************************************* wx : wxWidgets not found, wx will NOT be usable ********************************************************************* ********************************************************************* ********************** DOCUMENTATION INFORMATION ****************** ********************************************************************* documentation : fop is missing. Using fakefop to generate placeholder PDF files. *********************************************************************
解决办法如下:
wget https://github.com/wxWidgets/wxWidgets/releases/download/v2.8.12/wxWidgets-2.8.12.zip
unzip wxWidgets-2.8.12.zip
cd wxWidgets-2.8.12
./configure --with-gtk --enable-unicode --disable-shared
make
make install
ldconfig
1.4 后期管理rabbitmq集群的linux服务器账号创建
#创建nmscmq用户和组 groupadd nmscmq useradd -g nmscmq nmscmq passwd nmscmq
2.rabbitmq3.4.2安装(linux账户nmscmq执行如下所有命令)
通过http://www.rabbitmq.com/releases/rabbitmq-server/可以找到目前所有版本的下载链接,截图如下:
这里我选择的是3.4.2版本做讲解,选择此版本没啥特别的理由,之所以不选择3.4.1是因为版本3.4.0和版本3.4.1存在脑裂问题(参见http://blog.csdn.net/u013256816/article/details/53291907),关于3.4.2官网http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.2/提供的安装安装包如下:
安装方式有RPM和基于tar.gz包的编译安装,个人倾向于基于tar.gz包的编译安装,原因是这种方式可以自己灵活控制安装位置,控制所有配置放置位置,RPM包方式是简介,RPM方式默认相关配置如下:
# 继承rabbitmq-env已有配置的子配置文件,会自动加后缀.config去查找这个文件,注意不是目录 CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/conf/rabbitmq # 日志文件目录,注意不是文件 LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq # 数据库目录,注意不是文件 MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia # 记录启用的插件的文件,注意不是目录 ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins # 插件所在目录 PLUGINS_DIR="${RABBITMQ_HOME}/plugins" # rabbitmq相关环境配置文件 CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf
2.1 RPM方式安装和卸载
如果你选择的是rpm包,那么安装方式如下:
cd /opt wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.2/rabbitmq-server-3.4.2-1.noarch.rpm rpm --nodeps -Uvh rabbitmq-server-3.4.2-1.noarch.rpm #--nodeps是为了规避如下问题(会报没有找到erlang依赖,但是其实我们已经安装了Erlang) warning: rabbitmq-server-3.4.2-1.noarch.rpm: Header V4 DSA/SHA1 Signature, key ID 056e8e56: NOKEY error: Failed dependencies: erlang >= R13B-03 is needed by rabbitmq-server-3.4.2-1.noarch
如果想卸载RPM安装的包,操作如下:
1)首先通过 rpm -q rabbitmq-server 可以查询到rpm包的名字 2)然后 调用 rpm -e rabbitmq-server-3.4.2-1.noarch 删除特定rpm包 3)如果遇到依赖,无法删除,使用 rpm -e --nodeps rabbitmq-server-3.4.2-1.noarch 不检查依赖,直接删除rpm包 4)如果恰好有多个包叫同样的名字,使用 rpm -e --allmatches --nodeps rabbitmq-server 删除所有相同名字的包,并忽略依赖
2.2 基于tar.gz的编译安装
而我选择的是源码编译安装(关于源码编译安装参见http://www.rabbitmq.com/build-server.html),主要是方便规划管理rabbitmq的安装目录,所以我的安装方式如下:
#切换到账户nmscmq su - nmscmq #下载 cd /home/nmscmq wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.4.2/rabbitmq-server-3.4.2.zip #解压 cd /home/nmscmq unzip rabbitmq-server-3.4.2.zip #重命名源码目录 mv /home/nmscmq/rabbitmq-server-3.4.2 /home/nmscmq/rabbitmq-server-3.4.2-source #创建安装目录 mkdir -p /home/nmscmq/rabbitmq-server-3.4.2 cd /home/nmscmq/rabbitmq-server-3.4.2-source #编译安装 #安装到根目录TARGET_DIR=/home/nmscmq/rabbitmq-server-3.4.2 #安装后的基本放置位置SBIN_DIR=/home/nmscmq/rabbitmq-server-3.4.2/sbin #安装后的MAN放置位置MAN_DIR=/home/nmscmq/rabbitmq-server-3.4.2/man #安装后的DOC放置位置DOC_INSTALL_DIR=/home/nmscmq/rabbitmq-server-3.4.2/doc make make install TARGET_DIR=/home/nmscmq/rabbitmq-server-3.4.2 SBIN_DIR=/home/nmscmq/rabbitmq-server-3.4.2/sbin MAN_DIR=/home/nmscmq/rabbitmq-server-3.4.2/man DOC_INSTALL_DIR=/home/nmscmq/rabbitmq-server-3.4.2/doc
2.3 rabbitmq环境变量设置
rabbitmq安装在linux的用户nmscmq下,这里只将rabbitmq的脚本配置到用户nmscmq的环境变量中,是防止其他linux账户能随意操作rabbitmq,造成不必要的问题
cd /home/nmscmq vi .bashrc #add by wuzhongwen RABBITMQ_HOME=/home/nmscmq/rabbitmq-server-3.4.2 export PATH=$PATH:$RABBITMQ_HOME/sbin #使得配置生效 source /home/nmscmq/.bashrc
至此,rabbitmq已经安装完毕。
3.单机rabbitmq服务管理
3.1 配置文件存放目录和配置文件创建
接下来要启动单机rabbitmq了,在这之前我们要创建自己的相关目录存放位置和配置文件名称,方便后续配置使用,创建如下:
rm -rf /home/nmscmq/rabbitmq/* #日志文件目录 mkdir -p /home/nmscmq/rabbitmq/log #数据库目录 mkdir -p /home/nmscmq/rabbitmq/data #配置文件目录 mkdir -p /home/nmscmq/rabbitmq/conf echo "">>/home/nmscmq/rabbitmq/conf/rabbitmq.config echo "">>/home/nmscmq/rabbitmq/conf/rabbitmq-env.conf #记录启用的插件的文件 echo "">>/home/nmscmq/rabbitmq/enabled_plugins
3.2 修改rabbitmq-defaults
修改文件/home/nmscmq/rabbitmq-3.4.2/sbin/rabbitmq-defaults,修改内容如下:
#modify by nmscmq #CONFIG_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq #LOG_BASE=${SYS_PREFIX}/var/log/rabbitmq #MNESIA_BASE=${SYS_PREFIX}/var/lib/rabbitmq/mnesia #ENABLED_PLUGINS_FILE=${SYS_PREFIX}/etc/rabbitmq/enabled_plugins CONFIG_FILE=${SYS_PREFIX}/home/nmscmq/rabbitmq/conf/rabbitmq LOG_BASE=${SYS_PREFIX}/home/nmscmq/rabbitmq/log MNESIA_BASE=${SYS_PREFIX}/home/nmscmq/rabbitmq/data ENABLED_PLUGINS_FILE=${SYS_PREFIX}/home/nmscmq/rabbitmq/enabled_plugins #modify by nmscmq #CONF_ENV_FILE=${SYS_PREFIX}/etc/rabbitmq/rabbitmq-env.conf CONF_ENV_FILE=${SYS_PREFIX}/home/nmscmq/rabbitmq/conf/rabbitmq-env.conf
CONFIG_FILE配置的是/home/nmscmq/rabbitmq/conf/rabbitmq,但实际会加上后缀“.config”,实际加载的是/home/nmscmq/rabbitmq/conf/rabbitmq.config
如果对rabbitmq配置和脚本有所疑惑,详见我的另一博客介绍rabbitmq3.4.2 shell脚本分析
3.3 修改rabbitmq-env.conf
修改文件/home/nmscmq/rabbitmq/conf/rabbitmq-env.conf,配置内容如下:
NODENAME=rabbit@nmscmq1
3.4 修改rabbitmq.config
修改文件/home/nmscmq/rabbitmq/conf/rabbitmq.config,配置内容如下:
[
{rabbit, [{vm_memory_high_watermark, 0.8}]}
].
关于/home/nmscmq/rabbitmq/conf/rabbitmq.config的配置样例参见文件/home/nmscmq/rabbitmq-3.4.2/doc/rabbitmq-example文件,这里配置的vm_memory_high_watermark=0.8意思是rabbitmq优先使用内存,在内存超过阈值80%*机器内存时候,开始使用磁盘存储消息数据
3.5 启动和关闭rabbitmq服务
#后台启动rabbitmq服务 rabbitmq-server –detached #关闭rabbitmq服务 rabbitmqctl stop
3.6 激活rabbitmq插件
rabbitmq-plugins enable rabbitmq_management rabbitmq-plugins enable rabbitmq_mqtt
激活完毕后在文件/home/nmscmq/rabbitmq/enabled_plugins中生成如下内容:
3.7 创建rabbitmq WEB管理端链接账户
#创建rabbitmq WEB管理账户rabbitmq-test,其密码为rabbitmq-test rabbitmqctl add_user rabbitmq-test rabbitmq-test #将账户rabbitmq-test设置为administrator账户 rabbitmqctl set_user_tags rabbitmq-test administrator
创建完毕账户后在浏览器中打开http://localhost:15672/后输入账户rabbitmq-test/rabbitmq-test后登陆截图如下:
4.rabbitmq集群服务管理
在3台机器nmscmq1,nmscmq2,nmscmq3上分别按照之前1、2和3步骤搭建单机版rabbitmq服务,之后操作如下:
4.0 修改/etc/hosts,添加如下内容:
192.168.62.32 nmscmq1 192.168.62.33 nmscmq2 192.168.62.34 nmscmq3
4.1 修改rabbitmq-env.conf
#机器nmscmq1上/home/nmscmq/rabbitmq/conf/rabbitmq-env.conf配置如下: NODENAME=rabbit@nmscmq1 #机器nmscmq2上/home/nmscmq/rabbitmq/conf/rabbitmq-env.conf配置如下: NODENAME=rabbit@nmscmq2 #机器nmscmq3上/home/nmscmq/rabbitmq/conf/rabbitmq-env.conf配置如下: NODENAME=rabbit@nmscmq3
4.2 同步erlang的cookie
Rabbitmq的集群是依赖于erlang的集群来工作的,所以必须先构建起erlang的集群环境。Erlang的集群中各节点是通过一个magic cookie来实现的,这个cookie存放在 /home/nmscmq/.erlang.cookie 中,文件是400的权限。所以必须保证各节点cookie保持一致,否则节点之间就无法通信。
#先修改hostname=nmscmq3机器上/home/nmscmq/.erlang.cookie权限 chmod 777 /home/nmscmq/.erlang.cookie #从hostname= nmscmq3上执行如下命令复制到另外两台机器 scp /home/nmscmq/.erlang.cookie nmscmq@192.168.62.32:/home/nmscmq/.erlang.cookie scp /home/nmscmq/.erlang.cookie nmscmq@192.168.62.33:/home/nmscmq/.erlang.cookie #复制完后回复3台机器/home/nmscmq/.erlang.cookie权限为400 chmod 400 /home/nmscmq/.erlang.cookie
4.3 集群启动和加入
#nmscmq3机器上执行如下: rabbitmqctl stop rabbitmq-server -detached #nmscmq1机器上执行如下: #停止所有节点RabbitMq服务,然后使用detached参数独立运行,这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序 rabbitmqctl stop rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl join_cluster --ram rabbitmq@nmscmq3 rabbitmqctl start_app #nmscmq2机器上执行如下: #停止所有节点RabbitMq服务,然后使用detached参数独立运行,这步很关键,尤其增加节点停止节点后再次启动遇到无法启动都可以参照这个顺序 rabbitmqctl stop rabbitmq-server -detached rabbitmqctl stop_app rabbitmqctl join_cluster --ram rabbitmq@nmscmq3 rabbitmqctl start_app
上述命令先停掉rabbitmq应用,然后调用cluster命令,将nmscmq1和nmscmq2以内存节点加入到rabbt@nmscmq3,使三者成为一个集群,最后重启rabbitmq应用。在这个cluster命令下,nmscmq1、nmscmq2是内存节点,nmscmq3是磁盘节点(RabbitMQ启动后,默认是磁盘节点)。
如果要使nmscmq1或nmscmq2在集群里也是磁盘节点,join_cluster 命令去掉--ram参数即可。
只要在节点列表里包含了自己,它就成为一个磁盘节点。在RabbitMQ集群里,必须至少有一个磁盘节点存在。
在浏览器中打开http://localhost:15672/登录查看集群如下:
4.4 rabbitmq集群创建vitual host
4.5 rabbitmq集群服务镜像配置
上面配置RabbitMQ默认集群模式,但并不保证队列的高可用性,尽管交换机、绑定这些可以复制到集群里的任何一个节点,但是队列内容不会复制,虽然该模式解决一部分节点压力,但队列节点宕机直接导致该队列无法使用,只能等待重启,所以要想在队列节点宕机或故障也能正常使用,就要复制队列内容到集群里的每个节点,需要创建镜像队列。
镜像队列保证数据写到某个节点后,能够同步到其他节点,在主副本节点宕机后,其他节点的副本仍然存在,不会导致消息队列数据的丢失,就算所有节点宕机,但主要能保证最后宕机的是一个磁盘节点,当集群再次启动后,磁盘节点最后时刻保留的所有消息数据都可以恢复出来并同步到其他内存节点。
镜像队列的配置通过添加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,manually |
[Priority] | 可选参数, policy的优先级 |
例如,对队列名称以q_ismp_开头的所有队列进行镜像,并在集群的两个节点上完成镜像,policy的设置命令为:
rabbitmqctl set_policy ismp ismp_mirror "^q_ismp_" '{"ha-mode":"all","ha-sync-mode":"automatic"}' 0