ActiveMQ基于zookeeper+leveldb主从配置

来源:互联网 发布:小甲鱼c语言视频很烂吗 编辑:程序博客网 时间:2024/05/19 18:43
上周五搭建了activemq的JDBC Master Slave主从集群,用的是mysql数据库。通过简单测试发现持久化之后生产速度非常慢,局域网环境每秒100条左右。
这个速度远远不能满足设计要求,所以就在网上寻求帮助。
我找到了这篇文章:
http://blog.csdn.net/liuyifeng1920/article/details/50233067
写的非常详细。里面那句Very fast同样深深的打动了我。


我是在三台服务器上部署的,分别是192.168.1.91、192.168.1.92、192.168.1.93
首先下载zookeeper,我下载的版本是zookeeper-3.5.1-alpha.tar.gz
安装过程很简单tar zxvf zookeeper-3.5.1-alpha.tar.gz
然后按照我的习惯移动到/usr/local/目录下 mv zookeeper-3.5.1-alpha /usr/local/ 
接下来到/usr/local/zookeeper-3.5.1-alpha/conf/目录下修改配置文件zoo_sample.cfg
配置文件修改非常简单,先重新定义一下dataDir和dataLogDir的路径,我是这样定义的:
dataDir=/usr/local/zookeeper-3.5.1-alpha/data
dataLogDir=/usr/local/zookeeper-3.5.1-alpha/log
这两个目录实际上是不存在的,需要手动创建一下,在/usr/local/zookeeper-3.5.1-alpha/目录下执行mkdir data和mkdir log就行了。权限也不用改,太方便了。


再在后面添加上另外三台的信息。
server.1=192.168.1.91:2888:3888
server.2=192.168.1.92:2889:3889
server.3=192.168.1.93:2890:3890
这里具体2888:3888是什么含义我还没搞明白,希望大神解答。


之后在新创建的/usr/local/zookeeper-3.5.1-alpha/data/目录下创建一个文件myid,内容就是本机在集群里面的编号:
比如本机是server.1 那么myid就是1、本机是server.2 那么myid就是2,依此类推。


上面这些操作在三台服务器上都完成后,就可以启动了。在/usr/local/zookeeper-3.5.1-alpha/bin/目录下执行命令./zkServer.sh start 启动服务。
启动服务后可以看看日志 tail ../logs/zookeeper-root-server-t91.out -f
如果集群内的其他 zookeeper 服务没有启动,就会报“java.net.ConnectException: 拒绝连接”,等其他服务都启动就好了。


到现在为止 zookeeper 就已经安装完成了。下面开始弄ActiveMQ。


这个轻车熟路了,我用的是apache-activemq-5.13.3-bin.tar.gz,一定要用5.9以上版本。
先从官网下载 wget http://mirror.bit.edu.cn/apache//activemq/5.13.3/apache-activemq-5.13.3-bin.tar.gz
然后解压缩 tar zxvf apache-activemq-5.13.3-bin.tar.gz
移动到我习惯的目录下 mv apache-activemq-5.13.3 /usr/local/
修改配置文件/usr/local/apache-activemq-5.13.3/conf/activemq.xml
把<persistenceAdapter>标签中 kahaDB 改成 LevelDB 方式,具体如下:
        <persistenceAdapter>
            <!-- <kahaDB directory="${activemq.data}/kahadb"/> -->
<replicatedLevelDB
directory="activemq-data"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="192.168.1.91:2181,192.168.1.92:2182,192.168.1.93:2183"
zkPath="/activemq/leveldb-stores"
hostname="192.168.1.91"
/>
        </persistenceAdapter>
注意:
replicas是主从服务器的总数量
hostname配置成当前服务器的物理ip即可。
zkAddress是全部主从服务器的ip和端口
bind是绑定本机网卡的物理ip,想省事就写0.0.0.0 表示本机全部网卡


然后启动三台服务器activemq就可以了 /usr/local/apache-activemq-5.13.3/bin/activemq start


到现在部署工作已经完成,开始测试速度。
结果非常令人失望,每秒处理速度只有50条,还不如用mysql持久化的效果。


正在我失望至极的时候,突然想起“凌舞袖白雪”朋友提起的事务方式。


马上修改生产者,以实物方式提交
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
生成完后最后再加上一句
session.commit();
测试效率每秒10000条左右,完全满足设计要求。
下面是生产者的完整代码:
try {


ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("QXT_SaveMo_QUEUE", "QXT_SaveMo_QUEUE", "failover:(tcp://192.168.1.91:61616,tcp://192.168.1.92:61616,tcp://192.168.1.93:61616,tcp://192.168.1.94:61616)");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(true, Session.SESSION_TRANSACTED);// 事务方式提交
Destination destination = session.createQueue("QXT_SaveMo_QUEUE");
MessageProducer producer = session.createProducer(destination);
// producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
for (int i = 0; i < 50000; i++) {
TextMessage msg = session.createTextMessage("T" + i);
connection.start();
producer.send(msg);
}
session.commit();
} catch (Exception e) {
e.printStackTrace();
}


中间件选型到今天基本可以确定了。明天要再尝试一下activemq的优先级功能。
觉得构架越来越有意思了。
1 0
原创粉丝点击