一、Zookeeper的下载、安装、配置

ZooKeeper服务器是用Java创建的,它需要在JVM上运行,所以需要使用JDK1.6及以上版本的支持。对于jdk的安装本文不做介绍。

1、zookeeper的下载:

因为apache-zookeeper-3.5.5的在安装完启动时可能会报,"错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain",所以建议下载安装apache-zookeeper-3.5.5-bin

①:到apache上的zookeeper网站:Apache ZooKeeper

②:选择Getting Started下的Download点击进入:

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_zookeeper

③选择Download下的Download

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_apache_02

④选择清华大学的站点地址:Index of /apache/zookeeper

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_zookeeper_03

⑤三者选择其中之一,然后进行下载:

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_zookeeper_04

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_kafka_05

2、zookeeper的安装:

①:将下载的zookeeper安装包上传到Linux中的/usr/local目录下

②:在/usr/local下新建一个software文件夹,专门用来存放安装的软件

③:解压 tar -zxvf apache-zookeeper-3.5.5-bin.tar.gz

④:mv apache-zookeeper-3.5.5-bin software (将apache-zookeeper-3.5.5-bin移动到software文件夹下)

3、zookeeper的配置:

⑤:在/usr/local/software/apache-zookeeper-3.5.5-bin下创建data、logs文件夹

⑥:cd /usr/local/software/apache-zookeeper-3.5.5-bin/conf,然后cp zoo_sample.cfg zoo.cfg(复制创建一份新的zoo.cfg配置文件)

⑦:vim zoo.cfg将dataDir=/tmp/zookeeper  改为:dataDir=/usr/local/software/apache-zookeeper-3.5.5-bin/data 

4、启动:

在/usr/local/software/apache-zookeeper-3.5.5-bin下 bin/zkServer.sh start启动

5、停止:

在/usr/local/software/apache-zookeeper-3.5.5-bin下 bin/zkServer.sh stop 停止

二、Kafka的下载、安装、配置

1、kafka的下载:

①:进入Apache Kafka  ,选择Download

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_apache_06

②:选择版本下载:

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_kafka_07

2、安装

①:将kafka_2.12-2.3.0.tgz上传到/usr/local下

②:解压 tar -zxvf kafka_2.12-2.3.0.tgz

③:mv kafka_2.12-2.3.0 software

3、配置

在/usr/local/software/kafka_2.12-2.3.0下 运行 vim config/server.properties(编辑server.properties文件)

注意:最好设置成Ip地址,而不是localhost,这样其他电脑也能连接,否则Java项目可能会报找不到kafka节点的错误!

①、listeners=PLAINTEXT://Linux的Ip:9092 
②、advertised.listeners=PLAINTEXT://Linux的Ip:9092 

zookeeper对应kafka版本兼容官方文档 zookeeper管理kafka_apache_08

kafka listeners 和 advertised.listeners 的区别及应用:kafka listeners 和 advertised.listeners 的区别及应用_PONY LEE的博客 

在公司内网部署 kafka 集群只需要用到 listeners,内外网需要作区分时 才需要用到advertised.listeners。

listeners: 学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的 Kafka 服务。 advertised.listeners:和 listener相比多了个advertised。Advertise的含义表示宣称的、公布的,就是组监听器是 Broker 用于对外发布的【外网】。

listeners=INSIDE://172.17.0.10:9092,OUTSIDE://<公网 ip>:端口
advertised.listeners=INSIDE://172.17.0.10:9092,OUTSIDE://<公网 ip>:端口
listener.security.protocol.map=INSIDE:SASL_PLAINTEXT,OUTSIDE:SASL_PLAINTEXT
inter.broker.listener.name=INSIDE

advertised_listeners 监听器会注册在 zookeeper 中;

当我们对 172.17.0.10:9092 请求建立连接,kafka 服务器会通过 zookeeper 中注册的监听器,找到 INSIDE 监听器,然后通过 listeners 中找到对应的 通讯 ip 和 端口;

同理,当我们对 <公网 ip>:端口 请求建立连接,kafka 服务器会通过 zookeeper 中注册的监听器,找到 OUTSIDE 监听器,然后通过 listeners 中找到对应的 通讯 ip 和 端口 172.17.0.10:9094;

总结:advertised_listeners 是对外暴露的服务端口,真正建立连接用的是 listeners。


4、启动

在/usr/local/software/kafka_2.12-2.3.0下 运行

bin/kafka-server-start.sh config/server.properties

kafka后台启动的命令:

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

5、停止

在/usr/local/software/kafka_2.12-2.3.0下 运行

bin/kafka-server-stop.sh config/server.properties

6、使用

①:创建一个名为“test”的Topic,只有一个分区和一个备份:(ip需要和config/server.properties的保持一致)

bin/kafka-topics.sh --create --zookeeper 192.168.1.200:2181 --topic test --partitions 1 --replication-factor 1

②、查看已创建的topic信息:(ip需要和config/server.properties的保持一致)

> bin/kafka-topics.sh --list --zookeeper 192.168.1.200:2181

③、开启生产者发送消息:(ip需要和config/server.properties的保持一致)

bin/kafka-console-producer.sh --broker-list 192.168.1.200:9092 --topic test

④:开启消费者消费消息:(ip需要和config/server.properties的保持一致)

bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.200:9092 --topic test --from-beginning

三、Springboot整合Kafka

1、在pom.xml中加入kafka的依赖

<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
</dependency>

2、springboot启动的时候如果一直报

Connection to node -1 could not be established. Broker may not be available.

可能是zoopeeper和kafka在Linux上的端口没有开放

3、开放zoopeeper和kafka在Linux上的端口

一、CentOS 7快速开放端口:

CentOS升级到7之后,发现无法使用iptables控制Linuxs的端口,baidu之后发现Centos 7使用firewalld代替了原来的iptables。下面记录如何使用firewalld开放Linux端口:

开启端口
[root@centos7 ~]# firewall-cmd --zone=public --add-port=2181/tcp --permanent(开放zookeeper的端口)

[root@centos7 ~]# firewall-cmd --zone=public --add-port=9092/tcp --permanent(开放kafka的端口)

重启防火墙:

[root@centos7 ~]# firewall-cmd --reload

查询端口号2181、9092 是否开启:(yes:端口开启成功,no:端口开启失败)

[root@centos7 ~]# firewall-cmd --query-port=2181/tcp

[root@centos7 ~]# firewall-cmd --query-port=9092 /tcp

查询有哪些端口是开启的:

[root@centos7 ~]# firewall-cmd --list-port

命令含义:
--zone #作用域
--add-port=2181/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效

关闭firewall:

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

二、CentOS6防火墙开放端口:

在我们使用CentOS系统的时候,CentOS防火墙有时是需要改变设置的。CentOS防火墙默认是打开的,设置CentOS防火墙开放端口方法如下:

打开iptables的配置文件:vi /etc/sysconfig/iptables

修改CentOS防火墙时注意:一定要给自己留好后路,留VNC一个管理端口和SSh的管理端口

下面是一个iptables的示例:

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp –icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
COMMIT

修改CentOS防火墙需要注意的是,你必须根据自己服务器的情况来修改这个文件。

举例来说,如果你不希望开放80端口提供web服务,那么应该相应的删除这一行:
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

全部修改完之后重启iptables:service iptables restart

你可以验证一下是否规则都已经生效:iptables -L

这样,我们就完成了CentOS防火墙的设置修改。