Zookeeper+Kafka

1.环境介绍
Centos7
JDK1.8
Zookeeper-3.4.14
Kafka_2.11-1.1.1

192.168.10.232			zk+Kafka 			node1
192.168.10.230			zk+kafka 			node2
192.168.10.229			zk+kafka 			node3

2.部署Zookeeper集群

2.1安装JDK
	...

2.2安装zk

	解压到/home
	tar -xvf zookeeper-3.4.14.tar.gz -C /home/


	修改配置文件
	cp conf/zoo_sample.cfg conf/zoo.cfg

	vim conf/zoo.cfg

	tickTime=2000
	initLimit=10
	syncLimit=5
	dataDir=/opt/zookeeper
	clientPort=2181
	server.1=192.168.10.232:2888:3888
	server.2=192.168.10.230:2888:3888
	server.3=192.168.10.229:2888:3888

zoo.cfg配置文件详解:
   2888&3888端口:2888端口是zookeeper服务之间通信的,3888端口用于内部选举

  clientPort:连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求;

  tickTime:zookeeper中的基本时间单元,代表发送心跳的间隔时间,单位是毫秒;

  initLimit:用来配置 Zookeeper 接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客户端,而是 Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过5个心跳的时间(也就是 tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端和leader连接失败。总的时间为:10*2000=20秒;

  dataDir:是zookeeper持久化存放数据存放的目录;.

  syncLimit:Leader和Follower之间发送消息时,请求和应答的时间长度,最长不能超过多少个tickTime的时间长度,默认值为5,所以总的时间为5*2000=10秒;


	创建数据目录并创建myid文件
	mkdir /opt/zookeeper
	echo 1 > /opt/zookeeper/myid


	将目录复制到node2、node3,创建数据目录并修改myid文件
	scp -r /home/zookeeper node2:/home/
	scp -r /home/zookeeper node3:/home/

	ssh node2 mkdir /opt/zookeeper
	ssh node3 mkdir /opt/zookeeper

	ssh node2 echo 2 > /opt/zookeeper/myid
	ssh node3 echo 2 > /opt/zookeeper/myid


	启动zookeeper(在三个节点上执行此命令)
	./bin/zkServer.sh start &
	启动后可以在当前目录下看zookeeper.out的日志

	./bin/zkServer.sh start-foreground & 		#前台运行

	执行./bin/zkServer.sh status,可以看到当前节点的角色


	zookeeper命令:

		连接zk:
			./bin/zkCli.sh -server 192.168.10.232(节点IP)
		创建节点:
			create /test123 "test"
			其他两个节点同步

			test:为节点信息
		获取节点信息:
			get /test123
		修改节点信息:
			set /test123 test1
		删除节点:
			delete /test123
			其他两个节点同步删除

!!!注意 :
	在集群模式下,建议至少部署3个zk进程,或者部署奇数个zk进程。如果只部署2个zk进程,当其中一个zk进程挂掉后,剩下的一个进程并不能构成一个quorum的大多数。因此,部署2个进程甚至比单机模式更不可靠,因为2个进程其中一个不可用的可能性比一个进程不可用的可能性还大。

3.部署Kafka集群

解压Kafka
tar -xvf kafka_2.11-1.1.1.tgz -C /home/

配置

ID(node2和node3为1、2)
broker.id=0

#删除topic配置
delete.topic.enable=true

#关闭自动创建topic
auto.create.topics.enable=false

修改kafka地址
advertised.host.name=192.168.10.232

修改数据目录
log.dirs=/opt/kafkaLogs

修改zookeeper连接
zookeeper.connect=192.168.10.232:2181,192.168.10.230:2181,192.168.10.229:2181

注意:
auto.create.topics.enable=false:
	如果设为true,那么produce,consume或者fetch metadata一个不存在的topic时,就会自动创建一个默认replication factor和partition number的topic。默认是true

advertised.host.name:
	参数用来配置返回的host.name值,把这个参数配置为IP地址。这样客户端在使用java.net.InetAddress.getCanonicalHostName()获取时拿到的就是ip地址而不是主机名。


创建数据目录
mkdir /opt/kafkaLogs


将目录复制到node2、node3,修改配置ID和地址,并创建数据目录
scp -r /home/kafka node2:/home/
scp -r /home/kafka node3:/home/

node2:vim /home/kafka/conf/server.properties
node3:vim /home/kafka/conf/server.properties

ssh node2 mkdir /opt/kafkaLogs
ssh node2 mkdir /opt/kafkaLogs

启动kafka(node2,node3相同)
./bin/kafka-server-start.sh -daemon config/server.properties &

停止kafka
./bin/kafka-server-stop.sh


测试集群:

	node1创建test123的topic:

	./bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 31--topic test123
		注意:为Topic创建分区时,--partitions(分区数)最好是broker数量的整数倍,这样才能使一个Topic的分区均匀的分布在整个Kafka集群中

	创建生产者,并输入内容
	./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test123

	node2、node3输入命名即可查看到在node1发送的内容
	./bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test123 --from-beginning

查看topic:./bin/kafka-topics.sh --list --zookeeper localhost:2181
删除topic:./bin/kafka-topics.sh --delete --zookeeper localhost:2181 --topic test123

安装Kafka-manager(图形化)

作用:
管理多个不同的集群;
很容易地检查集群的状态(topics, brokers, 副本的分布, 分区的分布);
选择副本;
产生分区分配(Generate partition assignments)基于集群的当前状态;
重新分配分区。

安装sbt
	curl https://bintray.com/sbt/rpm/rpm | sudo tee /etc/yum.repos.d/bintray-sbt-rpm.repo
	yum install -y sbt

安装kafka-manager

	git clone https://github.com/yahoo/kafka-manager.git
	cd kafka-manager
	sbt clean dist(需要15分钟)

	编译完成后在~/target/universal/生成一个zip包
	cp target/universal/kafka-manager-2.0.0.2.zip .
	unzip kafka-manager-2.0.0.2.zip
	cd kafka-manager-2.0.0.2
	vim conf/application.conf
	修改
	kafka-manager.zkhosts="192.168.10.232:2181,192.168.10.230:2181,192.168.10.229:2181"

	启动kafka-manager:
	./bin/kafka-manager

	默认是监听9000端口,可以在启动时指定配置文件和监听端口
	./bin/kafka-manager -Dconfig.file=/path/to/application.conf -Dhttp.port=8080

	后台运行:
	nohup bin/kafka-manager > /dev/null 2>&1 &

	访问:
		192.168.10.232:9000

	添加集群即可.