[mq] kafka1.5 install

安装kafka

我们知道apt-get install只能安装某个版本的软件,这取决于在软件源那里的最新软件版本,你可以使用apt-get search搜索看有没有自己想要的版本

一般的,为了安装特定的版本,或自己没有root权限,我们需要自己手动下载安装包编译,或解压

[TOC]

安装zookeeper

首先安装zk

解压

对于.tar.gz格式的压缩包,使用tar -zxvf 轻松解压

对于.zip格式的压缩包,需要使用unzip

默认安装目录

一般的,程序会被安装到/usr/local/

所以我们执行如下的命令:

tar -zxf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 /usr/local/zookeeper 

usr目录,也许可以理解成user shared resource,总之就是只读资源目录的意思

  • 如果是配置文件,一般放在/etc目录

    • editable text configuration
  • 如果是日志文件或数据文件,一般放在/var目录

    • variable,可变数据,即需要常更新写入的日志

创建配置

可以使用__here document__的用法,即使用cat > file << EOF来在终端写入一个多行文本

cat > /usr/local/zookeeper/conf/zoo.cfg << EOF 
> tickTime=2000 
> dataDir=/var/lib/zookeeper 
> clientPort=2181 
> EOF

配置说明

zookeeper是一个分布式数据库,基于某种一致性协议进行节点同步

当节点个数有一半不可提供服务时,zookeeper就不对外提供服务(即如果有多数节点能提供服务,zookeeper就能提供服务)

  • 因此,一般建议配置奇数个节点,比如3个节点,则允许坏1台;5个节点,允许坏2台;一般不建议大于7,因为会增加一致性协议同步的负担

TickTime

服务器会主动的轮询自身集群的状态,这个间隔就是ticktime,一切的其他与时间有关的任务,比如从节点与主节点最大的不同步时间,比如从节点和主节点初始化连接的超时时间

这样好处是,在底层实现上,我们的确是以一定的时间间隔来轮询的.

通信端口与选举端口

对内,zk集群内节点会暴露两个端口,一个是用于通信的端口,一个是用于leader选举的端口

对外,整个zk暴露一个clientPort,用于客户端的连接

Paxos&ZAB协议

paxos是Lesile Lamport于1990年提出的基于消息传递且具有高容错特性的一致性算法

zookeeper的一致性算法并没有完全采用paxos,而是使用了一种称为zookeeper atomic broadcast(ZAB,zookeeper原子消息广播协议)

Paxos是通用算法,ZAB是非通用的专用于zk的一致性算法

leader&follower&observer

在zookeeper中,节点有三种类型:

  • leader
  • follower
  • observer

其中,leader和follower称为公民,用于计算存活节点;follower和observer称为learner.

leader只有一个,为客户端和follower提供读写服务.leader也可以拒绝客户端的连接,而只向follower提供写服务.

follower只提供读服务,对于写请求,会统一转发到leader,由leader进行统一的调度

对于写操作,leader接收到来自follower的写请求后,向所有follower转发写请求,当有过半follower返回ack后,则在leader服务器上提交写请求,代表写成功. 对于那些在leader提出但未提交的写事务,则会被丢弃

以上只是简略的一个介绍,其目的是知道这些名词,详细介绍应该去看书,或者zk系列文章

注意zookeeper需要设置三个端口,分别用于接收客户端请求clientPort,节点间通信peerPort和节点间选举leaderPort.

安装Broker

解压后移动到/usr/local即可(因为/usr/local是在path的)

当然,kafka还要求设置log目录和JAVA_HOME环境变量

tar -zxf kafka_2.11-0.9.0.1.tgz
mv kafka_2.11-0.9.0.1 /usr/local/kafka
mkdir /tmp/kafka-logs
export JAVA_HOME=/usr/java/jdk1.8.0_51

启动脚本启动服务器:

/usr/local/kafka/bin/kafka-server-start.sh -daemon
/usr/local/kafka/config/server.properties

创建topic并打印信息

  • replication-factor=1 表示复制因子为1,即每个partition只有一个副本(这个副本,不是指额外的拷贝,而是算自身的,所以如果你想一个leader,一个follower,则应该设置复制因子为2)

  • --zookeeper localhost:2181 首先连接到zk,然后指定主题名--topic test,然后指定动作:createdescribe

/usr/local/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --create 
--topic test --replication-factor 1 --partitions 1 
> Created topic "test".
/usr/local/kafka/bin/kafka-topics.sh --zookeeper localhost:2181 --describe 
--topic test

生产者向对应topci生产消息

  • 这里Test Message 1\nTest Message 2是自己的输入,使用ctrl-D输入EOF
  • 这里:9092是kafka默认监听的端口,因此生产者其实不需要指定zk
/usr/local/kafka/bin/kafka-console-producer.sh --broker-list
localhost:9092 --topic test
Test Message 1
Test Message 2
^D

消费者从对应topic消费消息

/usr/local/kafka/bin/kafka-console-consumer.sh --zookeeper
localhost:2181 --topic test --from-beginning
Test Message 1
Test Message 2
^C
Consumed 2 messages

很奇怪,为什么一会是连接zk,一会是连接kafka呢?