ActiveMQ之Linux部署手册

1. 固定IP

界面配置

2. 关闭SELINUX

vi /etc/selinux/config

修改如下:

#SELINUX=enforcing # 注释掉
#SELINUXTYPE=targeted # 注释掉
SELINUX=disabled # 增加

:wq! # 保存退出

setenforce 0   # 使配置立即生效

3. 配置hosts

Vi /etc/hosts
10.2.5.111 EDIS111
10.2.5.112 EDIS112
10.2.5.113 EDIS113

4. Zookeeper集群

本文使用Zookeeper3.4.6,3台虚拟机:10.2.5.111, 10.2.5.112, 10.2.5.113。

4.1. 下载Zookeeper

下载或上传Zookeeper-3.4.9.tar.gz到/home/user/Zookeeper目录

cd /home/use/Zookeeper
wget http://apache.fayea.com/Zookeeper/Zookeeper-3.4.9/Zookeeper-3.4.9.tar.gz

解压Zookeeper安装包,并按节点号对Zookeeper目录重命名:

tar -zxvf Zookeeper-3.4.9.tar.gz

服务器1:

mv Zookeeper-3.4.9 node-01

服务器2:

mv Zookeeper-3.4.9 node-02

服务器3:

mv Zookeeper-3.4.9 node-03

在各Zookeeper节点目录下创建以下目录:

X代表节点号1、2、3,以下同解

cd /home/node-01/zookeeper/zookeeper-3.4.9 
mkdir data
mkdir logs

将Zookeeper/node-0X/conf目录下的zoo_sample.cfg文件拷贝一份,命名为zoo.cfg:

cp zoo_sample.cfg zoo.cfg

4.2. 修改zoo.cfg配置文件

Zookeeper/node-01的配置(/home/user/Zookeeper/node-01/conf/zoo.cfg)如下:

tickTime=2000
initLimit=10
syncLimit=5dataDir=/home/node-01/zookeeper/zookeeper-3.4.9/data
dataLogDir=/home/node-01/zookeeper/zookeeper-3.4.9/logs
clientPort=2181
server.1=10.2.5.111:2888:3888
server.2=10.2.5.112:2888:3888
server.3=10.2.5.113:2888:3888

Zookeeper/node-02的配置(/home/user/Zookeeper/node-02/conf/zoo.cfg)如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/node-02/zookeeper/zookeeper-3.4.9/data
dataLogDir=/home/node-02/zookeeper/zookeeper-3.4.9/logs
clientPort=2181
server.1=10.2.5.111:2888:3888
server.2=10.2.5.112:2888:3888
server.3=10.2.5.113:2888:3888

Zookeeper/node-03的配置(/home/user/Zookeeper/node-03/conf/zoo.cfg)如下:

tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/node-03/zookeeper/zookeeper-3.4.9/data
dataLogDir=/home/node-03/zookeeper/zookeeper-3.4.9/logs
clientPort=2181
server.1=10.2.5.111:2888:3888
server.2=10.2.5.112:2888:3888
server.3=10.2.5.113:2888:3888

参数说明:

  1. tickTime=2000
    tickTime这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳
  2. initLimit=10
    initLimit这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
  3. syncLimit=5
    syncLimit这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
  4. dataDir=/home/node-01/zookeeper/zookeeper-3.4.9/data
    dataDir顾名思义就是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里。
  5. clientPort=2181
    clientPort这个端口就是客户端(应用程序)连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求。
  6. server.A=B:C:D
  7. server.1=10.2.5.111:2888:3888
  8. server.2=10.2.5.112:2888:3888
  9. server.3=10.2.5.113:2888:3888
    A是一个数字,表示这个是第几号服务器;
    B是这个服务器的IP地址(或者是与IP地址做了映射的主机名);
    C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的Leader服务器交换信息的端口;
    D是在leader挂掉时专门用来进行选举leader所用的端口。
    注意:如果是伪集群的配置方式,不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

4.3. 配置myid文件

在dataDir=/home/user/Zookeeper/node-0X/data下创建myid文件
编辑myid文件,并在对应的IP的机器上输入对应的编号。如在node-01上,myid文件内容就是
1,node-02上就是2,node-03上就是3:

vi /home/node-01/zookeeper/zookeeper-3.4.9/data/myid  ## 值为1
vi /home/node-02/zookeeper/zookeeper-3.4.9/data/myid  ## 值为2
vi /home/node-03/zookeeper/zookeeper-3.4.9/data/myid  ## 值为3

4.4. 修改防火墙

防火墙中打开要用到的端口2181、2888、3888。
切换到root用户权限,执行以下命令:

chkconfig iptables on
service iptables start

编辑/etc/sysconfig/iptables

vi /etc/sysconfig/iptables

如服务器×增加以下3行:

— Zookeeper
-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT
 -A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT

重启防火墙:

service iptables restart

查看防火墙端口状态:

service iptables status

备注:

vi /etc/hosts

将/etc/hosts中的127.0.1.1行去掉

4.5. 启动并测试Zookeeper

要用user用户启动,不要用root,方便后期的用户操作。
使用user用户到/home/user/Zookeeper/node-0X/bin目录中执行:

/home/node-01/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start
/home/node-02/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start
/home/node-03/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start

查看状态:

/home/node-01/zookeeper/zookeeper-3.4.9/zkServer.sh status

查看Zookeeper服务输出信息:

由于服务信息输出文件在/home/user/Zookeeper/node-0X/bin/Zookeeper.out

tail -500f Zookeeper.out

停止Zookeeper进程:

zkServer.sh stop

4.6. 开机启动

配置Zookeeper开机使用user用户启动:
编辑node-01、node-02、node-03中的/etc/rc.local文件,分别加入:

vi /etc/rc.local
su - root -c '/home/node-01/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start'
su - root -c '/home/node-02/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start'
su - root -c '/home/node-03/zookeeper/zookeeper-3.4.9/bin/zkServer.sh start'

5. ActiveMQ集群

本文使用activemq-5.14.5,3台虚拟机:10.2.5.111, 10.2.5.112, 10.2.5.113。Zookeeper的虚拟机为相同的虚拟机。

5.1. 下载activemq-5.14.5

下载文件

wget  http://archive.apache.org/dist/activemq/5.14.5/apache-activemq-5.14.5-bin.tar.gz

解压文件

tar -xvf apache-activemq-5.14.5-bin.tar.gz

服务器1:

mv apache-activemq-5.14.5 ActiveMQ

5.2. 修改ActiveMQ配置文件

修改配置文件 X代表节点号1、2、3,以下同解

vi node-×/conf/activemq.xml

5.2.1. 生产者流控

从5.x版本起,可以给每个producer单独设置流控。流控简单的说就是控制生产者的在内存使用限制下的行为。当然,流控的目的在于防止在将ActiveMQ作为内存MQ使用时,生产速度大于消费速度时将MQ撑爆的问题。

同步发送消息(useAsynSend为false):此时将在SystemUsage的限制下,使用destinationPolicy中的policyEntry中的限制,例如:






限制非持久化时queueA 的内存使用量为10mb,达到这个内存使用量时直接阻塞掉producer,直到有空余的内存时,才允许producer发送消息。

5.2.2. 持久文件方案

ActiveMQ根目录下的conf/activemq.xml, 持久方案原来默认如下:


  

修改为:






  

directory : 存储数据的路径

replicas : 集群中的节点数【(replicas/2)+1公式表示集群中至少要正常运行的服务数量】, 3台集群那么允许1台宕机, 另外两台要正常运行

bind : 当这个节点成为Master, 它会绑定配置好的地址和端口来履行主从复制协议

zkAddress : Zookeeper的ip和port, 如果是集群, 则用逗号隔开(这里作为简单示例Zookeeper配置为单点, 这样已经适用于大多数环境了, 集群也就多几个配置)
zkPassword : 当连接到Zookeeper服务器时用的密码
hostname : 本机ip
sync : 在认为消息被消费完成前, 同步信息所存贮的策略, 如果有多种策略用逗号隔开, ActiveMQ会选择较强的策略(local_mem, local_disk则肯定选择存贮在本地硬盘)
zkPath : Zookeeper选举信息交换的存贮路径
备注:hostname,bind必须要根据IP而定

5.2.3. 消息内存设置

ActiveMQ根目录下的conf/activemq.xml, 内存设置原来默认如下:

    
    
   
     
     
      
      
   
    
   
  
   
   

修改为:



 

 


 
 

  
 

memoryUsage: 表示ActiveMQ使用的内存,根据JVM运行的百分比计算java heap size* 70%

storeUsage: 表示持久化存储文件的大小

tempUsage: 表示非持久化消息存储的临时内存大小

5.2.4. 客户端异常配置

应对代理空间不足,而导致不确定的阻塞 send()操作的一种替代方案,就是将其配置成客户端抛出的一个异常。通过将sendFailIfNoSpace属性设置为true,代理将会引起send()方法失败,并抛出javax.jms.ResourceAllocationException异常,传播到客户端。下面是一个配置的示例:


 
   
     
   
 

这个属性的好处是,客户端可以捕获javax.jms.ResourceAllocationException异常,稍等一下,并重试send()操作,而不是无限期地傻等下去。

从5.3.1版本之后,sendFailIfNoSpaceAfterTimeout 属性被加了进来。这个属性同样导致send()方法失败,并在客户端抛出异常,但仅当等待了指定时间之后才触发。如果在配置的等待时间过去之后,代理上的空间仍然没有被释放,仅当这个时候send()方法才会失败,并且在客户端抛出异常。下面是一个示例:


 
   
     
   
 

定义超时的单位是毫秒,所以上面的例子将会在使send()方法失败并对客户端抛出异常之前,等待三秒。这个属性的优点是,它仅仅阻塞配置指定的时间,而不是立即另发送失败,或者无限期阻塞。这个属性不仅在代理端提供了一个改进,还对客户端提供了一个改进,使得客户端能捕获异常,等待一下并重试send()操作。

5.2.5. 安全设置

  1. Jetty安全设置

ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到






将property name为authenticate的属性value="false" 改为"true", 控制台的登录用户名密码保存在conf/jetty-realm.properties文件中,内容如下:

## ---------------------------------------------------------------------------
## Licensed to the Apache Software Foundation (ASF) under one or more
## contributor license agreements.  See the NOTICE file distributed with
## this work for additional information regarding copyright ownership.
## The ASF licenses this file to You under the Apache License, Version 2.0
## (the "License"); you may not use this file except in compliance with
## the License.  You may obtain a copy of the License at
## 
## http://www.apache.org/licenses/LICENSE-2.0
## 
## Unless required by applicable law or agreed to in writing, software
## distributed under the License is distributed on an "AS IS" BASIS,
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
## See the License for the specific language governing permissions and
## limitations under the License.
## ---------------------------------------------------------------------------
# Defines users that can access the web (console, demo, etc.)
# username: password [,rolename ...]
hxmqadmin: huxianmqpwd, admin
hxmquser: huxianmqpwd, user

值得注意的是 用户名和密码的格式是

用户名 : 密码 ,角色名

  1. ActiveMQ连接账号

在activemq服务的根目录下/conf/activemq.xml中有这样一个bean值:


    
        
            file:${activemq.conf}/credentials.properties
        
    

文件/conf/credentials.properties就是密码所在的位置,但是默认情况下是没有使用的,需要增加插件。

         
          
              
                  
                     
                                        
                  
              
        

5.3. 启动ActiveMQ

使用user用户到/home/user/ActiveMQ/node-0X/bin目录中执行:

sh /home/node-01/activemq/apache-activemq-5.14.5/bin/activemq start

查看状态:

sh /home/node-01/activemq/apache-activemq-5.14.5/bin/activemq status

停止ActiveMQ进程:

sh /home/node-01/activemq/apache-activemq-5.14.5/bin/activemq stop

5.4. 修改防火墙

防火墙中打开要用到的端口61619、61616、8161。

防火墙查看命令:

 more /etc/sysconfig/iptables

切换到root用户权限,执行以下命令:

chkconfig iptables on

service iptables start

编辑/etc/sysconfig/iptables

vi /etc/sysconfig/iptables

如服务器×增加以下3行:

--ActiveMQ levelDB

 -A INPUT -m state --state NEW -m tcp -p tcp --dport 61619 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 61616 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8161 -j ACCEPT

5.5. 测试

Step1 :

根据ZooKeeper的策略, 从三台ActiveMQ服务器选一台运行, 其他两台等待运行, 只是做数据上的主从同步。

启动ZooKeeper服务器和ActiveMQ服务器后, 访问http://10.2.5.111:8161/admin/ 、 http://10.2.5.112:8161/admin/、http://10.2.5.113:8161/admin/ 只会有一个成功。

Step2 :

关闭能访问http://ip:8161/admin/的ActiveMQ服务, 访问其他两个, 其中有一个能访问, 说明ActiveMQ + ZooKeeper 集群高可用配置已经成功。

5.6. 开机启动

建立软连接,关联服务

ln -s /home/node-01/activemq/apache-activemq-5.14.5/bin/activemq /etc/init.d/

备注:如果后期不需要软连接的删除方式:

rm -rf   /etc/init.d/activemq 

注意不是**rm -rf ** /etc/init.d/activemq/
然后测试使用

service activemq start
service activemq stop
service activemq status

加入管理服务

chkconfig --add activemq

设置管理 ON状态

chkconfig activemq on

重启或者测试

service activemq status

6. ActiveMQ-Linux下安装配置

一、下载****ActiveMQ

版本:apache-activemq-5.14.5-bin.tar.gz

地址:http://activemq.apache.org/download.html

二、运行****ActiveMQ

1、解压:

tar -xzvf apache-activemq-5.14.5-bin.tar.gz

2、新建目录:

mv apache-activemq-5.14.5 activeMQ

三、修改配置文件持久化到Mysql数据库

文件路径:\conf\activemq.xml

  
  
 
  
  
  
  
  
  
  
 


  
   

四、引入Mysql包

复制mysql-connector-java-5.1.45.jar包到\lib\目录下

五、重新运行AMQ,数据库自动生成3张表

进入到\bin\win64\下执行启动命令:

./activemq start

停止命令:

./activemq stop

查看状态:

sh activemq status

activemq_acks:用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存

image.png

activemq_lock:在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker

image.png

activemq_msgs:用于存储消息,Queue和Topic都存储在这个表中

image.png
image.png

你可能感兴趣的:(ActiveMQ之Linux部署手册)