ActiveMq集群搭建(三台服务器+高可用+负载均衡+持久化+延迟推送)

有一些是从网上参考的,根据自己的业务需求补全他们,感谢前辈们。

目标:以集群方式延迟推送任务,并达到高可用和负载均衡。

集群配置方案:

  1.  高可用集群搭建方案
    1. 节点A: 与节点B、节点C 进行消息同步, 所以节点A 节点B 节点C 都可用作消费者访问节点,注意A点不参与生产,它只是作为消费者,起到分摊压力的作用。
    2. 节点B: 作为 master 主节点, 作为生产者访问节点和消费者访问节点
    3. 节点C: 作为 slave 从节点, 作为 生产者访问节点和消费者访问节点, 当 master 节点挂掉后, slave 自动转换为 master 节点.
  2. 高可用集群搭建步骤
    1. 这里使用三台服务器进行搭建,节点B 和节点C使用 Master/Slave这种方式实现高可用,KahaDb进行持久化数据。那两台服务器就需要共享文件系统支持,这里我使用了NFS。
假设:
    节点A: 192.168.1.1
    节点B: 192.168.2.2
    节点C: 192.168.3.3
    
##在B节点:192.168.2.2##
    1.共享文件夹(按喜好建),用于节点B 节点C 共享。
        mkdir mq/data 
    2.安装NFS
        yum install nfs-utils
    3.设置开机自启动
        sudo systemctl enable rpcbind
        sudo systemctl enable nfs-server
        sudo systemctl enable nfs-lock
        sudo systemctl enable nfs-idmap
    4.开启nfs相关服务
        sudo systemctl start rpcbind
        sudo systemctl start nfs-server
        sudo systemctl start nfs-lock
        sudo systemctl start nfs-idmap
    5.固定端口号(在每次启动的时候nfs的rpc端口号可能变,可以用这个命令查看rpcinfo -plocalhost)
        vim /etc/sysconfig/nfs
        ##添加
        RQUOTAD_PORT=30001
        LOCKD_TCPPORT=30002
        LOCKD_UDPPORT=30002
        MOUNTD_PORT=30003
        STATD_PORT=30004
        ##重启 
        service nfs restart
    6.对应上面的端口开启防火墙
    7.声明开放目录&&授权ip
        echo "/home/xxx/mq/data 192.168.3.3(rw,sync,no_root_squash)" >> /etc/exports
        ##/home/xxx/mq/data 本服务器需要共享的文件夹
        ##192.168.3.3 授权ip(这是C节点Ip)也可以192.168.3.*
        ##rw 读写
        ##sync 同步
        ##no_root_squash 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享        的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用! 
        ##root_squash 在登入 NFS 主机使用分享之目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份。
    8.配置生效
        sudo exportfs -r
    9.查看本地共享的文件夹
        showmount -e localhost

##在C节点:192.168.3.3##
    1.安装nfs
        sudo yum install nfs-utils
    2.查看服务端共享的目录(连接不上会报异常,在服务端也可以查看错误日志 sudo cat /var/log/messages | grep mount)
        showmount -e 192.168.2.2
    3.nfs挂载
        mount -t nfs 192.168.2.2:/home/xxx/mq/data /home/xxx/mq/data
    ## 到此在一端新建文件会出现在两端出现,实现共享文件夹。
##结束##

下面是配置三台服务器

将ActiveMQ安装包解压到三台不同的服务器中,分别为activemq-a, activemq-b, activemq-c(名字随意,这里就是为了好区分)

activemq-a 在192.168.1.1

activemq-b 在192.168.2.2

activemq-c 在192.168.3.3

修改activemq-a/conf/activemq.xml

扫描二维码关注公众号,回复: 6194304 查看本文章
<broker xmlns="http://activemq.apache.org/schema/core" schedulerSupport="true" brokerName="localhost" dataDirectory="${activemq.data}">
....
</broker>
##开启延迟发送 schedulerSupport="true"

<transportConnectors>
	<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
	<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
</transportConnectors>
##只保留tcp这个
<networkConnectors>
	<networkConnector name="local_a_b_c" uri="static:(tcp://192.168.2.2:61616,tcp://192.168.3.3:61616)"/>
</networkConnectors>
##网络连接器静态绑定 作用是消息同步 local_a_b_c:a与b、c节点同步 

修改activemq-b/conf/activemq.xml

 <broker xmlns="http://activemq.apache.org/schema/core"  schedulerSupport="true" brokerName="localhost" dataDirectory="${activemq.data}">
</broker>
## 延迟发送 schedulerSupport="true"

<persistenceAdapter>
            <kahaDB directory="/home/xxx/mq/data"/>
</persistenceAdapter>
## 配置共享文件夹(这里有一个排他锁的概念,自行搜索)

<transportConnectors>
	<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
	<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
</transportConnectors>
## 只保留tcp

<networkConnectors>
	<networkConnector name="network_b_a" uri="static:(tcp://192.168.1.1:61616)"/>
</networkConnectors>
##只与a进行消息同步

修改activemq-c/conf/activemq.xml

 <broker xmlns="http://activemq.apache.org/schema/core"  schedulerSupport="true" brokerName="localhost" dataDirectory="${activemq.data}">
</broker>
## 延迟发送 schedulerSupport="true"

<persistenceAdapter>
            <kahaDB directory="/home/xxx/mq/data"/>
</persistenceAdapter>
## 配置共享文件夹(这里有一个排他锁的概念,自行搜索)

<transportConnectors>
	<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
	<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
	<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
</transportConnectors>
## 只保留tcp

<networkConnectors>
	<networkConnector name="network_c_a" uri="static:(tcp://192.168.1.1:61616)"/>
</networkConnectors>
##只与a进行消息同步

如果要修改HTML管理页面端口号的话(不配默认8161):

修改 activemq-c/conf/jetty.xml

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
	<!-- the default port number for the web console -->
	<property name="host" value="0.0.0.0"/>
	<property name="port" value="8163"/>
</bean>

 启动

sudo /usr/local/activemq/apache-activemq-a/bin/activemq start
##启动顺序  a-b-c
如果节点B 先启动,会先拿取共享文件夹的排他锁成为Master,节点C 配排除在外,做冷备。

配置文件

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

下面这两个连接池是有坑的,使用哪个连接池是跟Spring的版本有关
spring 2.1.* 以上
<dependency>
    <groupId>org.messaginghub</groupId>
    <artifactId>pooled-jms</artifactId>
</dependency>

spring 2.1.* 以下
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
</dependency>
##application.yml 配置
spring.activemq.broker-url=failover:(tcp://192.168.1.1:61617,tcp://192.168.2.2:61616,tcp://192.168.3.3:61616)
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring.activemq.pool.idle-timeout=30000

https://docs.spring.io/spring-boot/docs/2.2.0.BUILD-SNAPSHOT/reference/html/appendix.html#appendix

代码

https://download.csdn.net/download/qq_34934864/11006259

猜你喜欢

转载自blog.csdn.net/qq_34934864/article/details/88327112
今日推荐