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
参数说明:
- tickTime=2000
tickTime这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳 - initLimit=10
initLimit这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。 - syncLimit=5
syncLimit这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。 - dataDir=/home/node-01/zookeeper/zookeeper-3.4.9/data
dataDir顾名思义就是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里。 - clientPort=2181
clientPort这个端口就是客户端(应用程序)连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求。 - server.A=B:C:D
- server.1=10.2.5.111:2888:3888
- server.2=10.2.5.112:2888:3888
- 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中的限制,例如:
<policyEntry queue=">" producerFlowControl="true" memoryLimit="2mb">
<!-- Use VM cursor for better latencyFor more information
, see: http://activemq.apache.org/message-cursors.html
<pendingQueuePolicy><vmQueueCursor/></pendingQueuePolicy>
-->
</policyEntry>
限制非持久化时queueA 的内存使用量为10mb,达到这个内存使用量时直接阻塞掉producer,直到有空余的内存时,才允许producer发送消息。
5.2.2. 持久文件方案
ActiveMQ根目录下的conf/activemq.xml, 持久方案原来默认如下:
<persistenceAdapter>
<kahaDB** directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
修改为:
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://10.2.5.111:61619"
zkAddress="10.2.5.111:2181,10.2.5.112:2181,10.2.5.113:2181"
zkPassword=""
hostname="10.2.5.111"
sync="local_disk"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
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, 内存设置原来默认如下:
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap =" 70 " />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit= "50 gb" />
</tempUsage>
</systemUsage>
</systemUsage>
修改为:
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70"/>
</memoryUsage>
<storeUsage>
<storeUsage limit="30 gb" />
</storeUsage>
<tempUsage>
<tempUsage limit="10 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
memoryUsage: 表示ActiveMQ使用的内存,根据JVM运行的百分比计算java heap size* 70%
storeUsage: 表示持久化存储文件的大小
tempUsage: 表示非持久化消息存储的临时内存大小
5.2.4. 客户端异常配置
应对代理空间不足,而导致不确定的阻塞 send()操作的一种替代方案,就是将其配置成客户端抛出的一个异常。通过将sendFailIfNoSpace属性设置为true,代理将会引起send()方法失败,并抛出javax.jms.ResourceAllocationException异常,传播到客户端。下面是一个配置的示例:
<systemUsage>
<systemUsage sendFailIfNoSpace="true">
<memoryUsage>
<memoryUsage limit="20 mb"/>
</memoryUsage>
</systemUsage>
</systemUsage>
这个属性的好处是,客户端可以捕获javax.jms.ResourceAllocationException异常,稍等一下,并重试send()操作,而不是无限期地傻等下去。
从5.3.1版本之后,sendFailIfNoSpaceAfterTimeout 属性被加了进来。这个属性同样导致send()方法失败,并在客户端抛出异常,但仅当等待了指定时间之后才触发。如果在配置的等待时间过去之后,代理上的空间仍然没有被释放,仅当这个时候send()方法才会失败,并且在客户端抛出异常。下面是一个示例:
<systemUsage>
<systemUsage sendFailIfNoSpaceAfterTimeout="3000">
<memoryUsage>
<memoryUsage limit="20 mb"/>
</memoryUsage>
</systemUsage>
</systemUsage>
定义超时的单位是毫秒,所以上面的例子将会在使send()方法失败并对客户端抛出异常之前,等待三秒。这个属性的优点是,它仅仅阻塞配置指定的时间,而不是立即另发送失败,或者无限期阻塞。这个属性不仅在代理端提供了一个改进,还对客户端提供了一个改进,使得客户端能捕获异常,等待一下并重试send()操作。
5.2.5. 安全设置
- Jetty安全设置
ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到
<bean id="securityConstraint" class="org.eclipse.jetty.http.security.Constraint">
<property name="name" value="BASIC" />
<property name="roles" value="admin" />
<property name="authenticate" value="false" />
</bean>
将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
值得注意的是 用户名和密码的格式是
用户名 : 密码 ,角色名
- ActiveMQ连接账号
在activemq服务的根目录下/conf/activemq.xml中有这样一个bean值:
<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>
文件/conf/credentials.properties就是密码所在的位置,但是默认情况下是没有使用的,需要增加插件。
<!-- 添加访问ActiveMQ的账号密码 -->
<plugins>
<simpleAuthenticationPlugin>
<users>
<authenticationUser username="${activemq.username}" password="${activemq.password}" groups="users,admins"/>
<authenticationUser username="guest" password="${guest.password}" groups="users,admins"/>
</users>
</simpleAuthenticationPlugin>
</plugins>
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
<!--
Configure message persistence for the broker. The default persistence
mechanism is the KahaDB store (identified by the kahaDB tag).
For more information, see:
http://activemq.apache.org/persistence.html
-->
<persistenceAdapter>
<!--<kahaDB directory="${activemq.data}/kahadb"/>-->
<jdbcPersistenceAdapter dataSource="#mysql-ds"/>
</persistenceAdapter>
<bean id="mysql-ds" c lass="org.apache.commons.dbcp2.BasicDataSource" destroy- method="close">
<property name="driverClassName" v alue="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_activemq?relaxAutoCommit=true"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
<!--
Enable web consoles, REST and Ajax APIs and demos
The web consoles requires by default login, you can disable this in the jetty.xml file
Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
-->
<import resource="jetty.xml"/>
四、引入Mysql包
复制mysql-connector-java-5.1.45.jar包到\lib\目录下
五、重新运行AMQ,数据库自动生成3张表
进入到\bin\win64\下执行启动命令:
./activemq start
停止命令:
./activemq stop
查看状态:
sh activemq status
activemq_acks:用于存储订阅关系。如果是持久化Topic,订阅者和服务器的订阅关系在这个表保存
activemq_lock:在集群环境中才有用,只有一个Broker可以获得消息,称为Master Broker
activemq_msgs:用于存储消息,Queue和Topic都存储在这个表中