一、kafka概述
Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。
消息队列的好处
1.解耦合
耦合的状态表示当你实现某个功能的时候,是直接接入当前接口,而利用消息队列,可以将相应的消息发送到消息队列,这样的话,如果接口出了问题,将不会影响到当前的功能。
2.异步处理
异步处理替代了之前的同步处理,异步处理不需要让流程走完就返回结果,可以将消息发送到消息队列中,然后返回结果,剩下让其他业务处理接口从消息队列中拉取消费处理即可。
3.流量削峰
高流量的时候,使用消息队列作为中间件可以将流量的高峰保存在消息队列中,从而防止了系统的高请求,减轻服务器的请求处理压力。
二、部署kafka
1、下载jdk
方法一:
1、首先去官网下载jdk
官网jdk链接
2、检查当前系统是否已经安装openJDK,如果已经安装进行卸载
检查openJDK是否安装命令:rpm -qa|grep jdk
(如果有安装openJDK 那么除了copy-jdk-configs-3.3-2.el7.noarch文件可以不用删除。其他的openJdk全部要卸载)
卸载命令:yum -y remove xxxx
3、进入目录 : cd /usr/local
4、创建java安装目录:mkdir /usr/local/java
5、解压安装包到 /usr/local/java目录: tar -zxvf jdk-8u162-linux-x64.tar.gz /usr/local/java
6、配置jdk环境变量:
编辑/etc/下的profile文件: vi /etc/profile
在文件末尾添加如下配置:
export JAVA_HOME=/usr/local/java/jdk1.8.0_162
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
标红色路径为jdk解压路径,根据实际情况配置
保存配置文件退出(vi编辑器使用自备)
7、使/etc/profile生效 :source /etc/profile
8、测试jdk安装是否成功
java -version
方法二:
yum安装
yum install java-1.8.0-openjdk* -y
2、安装zookeeper
想要安装zookeeper,必须先在linux中安装好jdk。
1.下载并解压zookeeper压缩包
先进入/usr/local/目录,也可以是其他的目录:
[root@localhost /]# cd /usr/local
2.zookeeper安装包可以在官网下载。
也可以在后面这个地址下载 http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
如果链接打不开,就先打开 http://mirror.bit.edu.cn/apache/zookeeper , 再选择版本。
在此目录下载zookeeper安装包:
[root@localhost local]# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz
3.解压:
[root@localhost local]# tar -zxvf zookeeper-3.4.13.tar.gz
4.编辑配置文件
进入conf目录:
[root@localhost local]# cd zookeeper-3.4.13/conf
将zoo_sample.cfg这个文件复制为zoo.cfg (必须是这个文件名)
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
进入zoo.cfg文件进行编辑
[root@localhost conf]# vim zoo.cfg
按 i 进入编辑模式,修改以下内容:
dataDir=/tmp/zookeeper/data
dataLogDir=/tmp/zookeeper/log
注意:如果想配置集群的话,请在clientPort下面添加服务器的ip。如
server.1=172.16.10.11:2888:3888
server.2=172.16.10.12:2888:3888
server.3=172.16.10.13:2888:3888
如果电脑内存比较小,zookeeper还可以设置成伪集群。也就是全部服务器采用同一个ip,但是使用不同的端口。
在tmp目录创建目录。
mkdir /tmp/zookeeper
mkdir /tmp/zookeeper/data
mkdir /tmp/zookeeper/log
如果是配置集群,还需要在前面配置过的dataDir路径下新增myid文件
[root@localhost conf]# cd /tmp/zookeeper/data
[root@localhost data]# touch myid
[root@localhost data]# vim myid
在data目录下创建文件,文件名为“myid”, 编辑该“myid”文件,并在对应的IP的机器上输入对应的编号。
如在172.16.10.11上,“myid”文件内容就是1。在172.16.10.12上,内容就是2。
5.配置环境变量
上面的操作都完事之后,我们需要配置一下环境变量,配置环境变量的命令如下:
export ZOOKEEPER_INSTALL=/usr/local/zookeeper-3.4.13/
export PATH=$PATH:$ZOOKEEPER_INSTALL/bin
启动zookeeper
进入bin目录,并启动zookeep。如果不是在bin目录下执行,启动zookeeper时会报错: bash: ./zkServer.sh: No such file or directory
注意: ./zkServer.sh start前面的 . 不可忽略。
[root@localhost local]# cd /usr/local/zookeeper-3.4.13/bin
[root@localhost bin]# ./zkServer.sh start
启动成功效果如下:
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/…/conf/zoo.cfg
Starting zookeeper … STARTED
zookeeper的服务端启动后,还需要启动zookeeper的客户端:
[root@localhost bin]# ./zkCli.sh
如果是连接多个不同的主机节点,可以使用如下命令:
./zkCli.sh -server 172.16.10.12:2888
启动成功效果如下:
复制代码
Connecting to localhost:2181
…
…
…
Welcome to ZooKeeper!
2021-11-25 21:04:54,407 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxnSendThread@1029] - Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)
JLine support is enabled
2021-11-25 21:04:54,471 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxnSendThread@879] - Socket connection established to localhost/0:0:0:0:0:0:0:1:2181, initiating session
[zk: localhost:2181(CONNECTING) 0] 2021-11-25 21:04:54,501 [myid:] - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread@1303] - Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x10000712e6f0000, negotiated timeout = 30000
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
复制代码
查看状态:
[root@localhost bin]# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper-3.4.13/bin/…/conf/zoo.cfg
Mode: standalone
遇到问题怎么解决?
zookeeper的出错日志会记录在 zookeeper.out。
当前处于哪个目录,执行完zkServer.sh start命令, zookeeper.out就会写在哪个目录。
vim zookeeper.out 可以查看报错信息。然后再搜索解决。
6.zookeeper使用
通过 ./zkCli.sh 进入客户端后,就可以使用命令来操作zookeeper了。
创建节点
使用create命令,可以创建一个zookeeper节点。
create [-s] [-e] path data acl
其中-s表示顺序节点,-e表示临时节点。默认情况下,创建的是持久节点。
path是节点路径,data是节点数据,acl是用来进行权限控制的。
如下:
创建一个叫做/zk-test的节点,内容是"123"
[zk: localhost:2181(CONNECTED) 0] create /zk-test 123
Created /zk-test
创建/zk-test的子节点book,内容是"233"
[zk: localhost:2181(CONNECTED) 7] create /zk-test/book 233
Created /zk-test/book
查看节点内容
使用get命令,可以获取zookeeper指定节点的内容和属性信息。
如下:
复制代码
[zk: localhost:2181(CONNECTED) 1] get /zk-test
123
cZxid = 0x3a
ctime = Sun Nov 11 21:50:44 CST 2021
mZxid = 0x3a
mtime = Sun Nov 11 21:50:44 CST 2021
pZxid = 0x3a
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
复制代码
查看子节点
使用ls命令可以查看指定节点下的所有子节点
以下查看根目录下的所有子节点:
[zk: localhost:2181(CONNECTED) 2] ls /
[zk-test, zookeeper]
查看zk-test节点的子节点:
[zk: localhost:2181(CONNECTED) 3] ls /zk-test
[book]
更新节点内容
使用set命令,更新节点内容。格式为:
set path data
其中的data就是要更新的新内容。
复制代码
[zk: localhost:2181(CONNECTED) 4] set /zk-test 456
cZxid = 0x3a
ctime = Sun Nov 11 21:50:44 CST 2021
mZxid = 0x3b
mtime = Sun Nov 11 22:05:20 CST 2021
pZxid = 0x3a
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0
复制代码
在输出的信息中,可以发现,dataVersion的值由原来的0 变成了 1,这是因为刚才的更新操作导致该节点的数据版本也发生变更。
删除节点
使用delete命令来删除节点,如下:
[zk: localhost:2181(CONNECTED) 11] delete /zk-test
Node not empty: /zk-test
可以发现,一个节点存在子节点时,无法删除该节点。
删除子节点/zk-test/book,如下:
[zk: localhost:2181(CONNECTED) 12] delete /zk-test/book
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/zk-test/book
zookeeper中的watcher会监控节点,当子节点发生变化时会发出通知。此时提示子节点 /zk-test/book删除成功。
继续尝试删除节点 /zk-test,
[zk: localhost:2181(CONNECTED) 13] ls /zk-test
[]
[zk: localhost:2181(CONNECTED) 14] delete /zk-test
[zk: localhost:2181(CONNECTED) 15] ls /
[]
删除成功。
3、安装kafka
安装条件:确保zookeeper已经安装成功。
1.下载kafka
Apache官网
选择Binary downloads,选择版本进行下载。
也可以直接用以下命令下载:
wget http://apache.01link.hk/kafka/2.0.0/kafka_2.11-2.0.0.tgz
2.解压下载的kafka
cd /usr/local
tar -xzf kafka_2.11-2.0.0.tgz
cd kafka_2.11-2.0.0
3.启动服务
启动zookeeper
启动zk有两种方式,第一种是使用kafka自己带的一个zk。
bin/zookeeper-server-start.sh config/zookeeper.properties
另一种是使用其它的zookeeper,可以位于本机也可以位于其它地址。
这种情况需要修改config下面的sercer.properties里面的zookeeper地址 。例如zookeeper.connect=192.168.213.11:2181
成功启动zookeeper后才可以启动kafka。
启动 kafka
bin/kafka-server-start.sh config/server.properties
4.创建topic
[root@bogon kafka_2.11-2.0.0]#
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
创建一个名为test的topic,只有一个副本,一个分区。
通过list命令查看刚刚创建的topic
bin/kafka-topics.sh -list -zookeeper localhost:2181
5.启动producer并发送消息启动producer
[root@bogon kafka_2.11-2.0.0]#
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
启动之后就可以发送消息了
比如
test
hello boy
6.然后在另一个终端中,启动consumer
以下是旧版本的命令:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
报错:consumer zookeeper is not a recognized option
发现在启动的时候说使用 --zookeeper是一个过时的方法,最新的版本中命令如下:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
启动consumer之后就可以在console中看到producer发送的消息了
可以开启两个终端,一个发送消息,一个接受消息。