安装Zookeeper
安装Kafka必须先安装zookeeper,虽然Kafka内置了zookeeper,但是建议不用。我们全新安装部署一套。
注意:zookeeper 3.5.4版本需要JDK1.8以上版本支持
tar xzvf zookeeper-3.5.4-beta.tar.gz
cp -r zookeeper-3.5.4-beta /usr/local/zookeeper
cd /usr/local/zookeeper
## 创建存储目录和日志目录
mkdir data
mkdir logs
## 修改配置文件
cd conf
mv zoo_sample.cfg zoo.cfg
修改配置文件,主要修改存储目录和日志目录
dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/logs
集群模式
如果是集群环境,需要在每个服务器上都执行上述的操作,同时在每个集群服务器的zookeeper配置文件中都添加所有的服务配置:
server.{id}={ip}:{port1}:{port1}
上面的配置中的id
从 1
开始,最多 255
,并且需要将该id写入到服务器对应的dataDir目录下的myid文件中,例如
echo '1' > /usr/loca/zookeeper/data/myid
上面配置中的 ip
为集群环境中各个服务器的ip地址;
第一个端口是从follower连接到leader机器的端口,第二个端口是用来进行leader选举时的端口,所以集群配置中有三个非常重要的端口:
clientPort:2181
port:2888
port:3888
所以集群环境中服务器的配置可以如下所示(每台服务器都相同):
server.1=172.16.9.41:2888:3888
server.2=172.16.9.42:2888:3888
server.3=172.16.9.43:2888:3888
配置环境变量
在配置完zookeeper,需要配置环境变量
vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
启动zookeeper
cd /usr/local/zookeeper/bin
./zkServer.sh start
./zkServer.sh stop
./zkServer.sh restart
./zkServer.sh status
安装Scala
Kafka是基于Scala编写的,所以需要先安装Scala。我们下载的kafka包是kafka-2.12-1.1.1.tgz
,表明需要依赖scala2.12版本,所以到scala官网下载了scala-2.12.6.tgz
。
将安装包上传到服务器
tar xzf scala-2.12.6.tgz
mv scala-2.12.6 /usr/local/scala
vi /etc/profile
配置环境变量:
export SCALA_HOME=/usr/local/scala
export PATH=$SCALA_HOME/bin:$PATH
source /etc/profile
安装Kafka
下载安装包kafka-2.12-1.1.1.tgz
,并将该安装包上传到服务器对应的目录;然后解压该安装包:
tar xzf kafka-2.12-1.1.1.tgz
mv kafka-2.12-1.1.1 /usr/local/kafka
配置Kafka
主要配置server.properties
,producer.properties
,consumer.properties
。分别用于配置broker、producer和consumer。
cd config
Broker配置
配置文件是 server.properties
,配置内容说明:
broker.id=0 #当前机器在集群中的唯一标识,和zookeeper的myid性质一样
listeners=PLAINTEXT://192.168.40.129:9092 #服务端监听端口,如果不是集群不要打开!!!
advertised.listeners=PLAINTEXT://your.host.name:9092 #broker发布给生产者消费者的监听host,如果不配置,默认使用listeners配置的信息
port=9092 #当前kafka对外提供服务的端口默认是9092
num.network.threads=3 #网络处理的线程数,一般不变
num.io.threads=8 #I/O处理线程数,一般比磁盘数大
log.dirs=/usr/local/kafka/logs #消息存放的目录,多个用,隔开
num.recovery.threads.per.data.dir=1 #用于处理每个目录的日志的线程数,默认是1,可以调大。
auto.create.topics.enable=true #是否默认创建主题,默认为true。实际环境中最好改为false,通过显示手动创建主题。
socket.send.buffer.bytes=102400 #发送缓冲区buffer大小
socket.receive.buffer.bytes=102400 #接收缓冲区大小
socket.request.max.bytes=104857600 #接收请求的最大数,不能超过JVM的堆内存大小
num.partitions=1 #默认的分区数,一个topic默认一个分区数。分区数越多,能提高并发性,但是也会导致该broker需要处理更多的文件。如果自动创建主题,则由该值决定自动创建的主题的分区数。
log.retention.hours=168 #消息的持久化时间,默认168小时,也就是1周
log.retention.minutes=30 #与上面的二选一,这里是持久化30分钟
log.retention.bytes=1073741824 #消息持久化大小,默认1G
log.segment.bytes=1073741824 #消息分块大小,默认1G,超过该大小后会重新创建新的segment file
compression.type=snappy #日志传输时候的压缩格式,包括lz4,snappy,gzip,建议打开
compressed.topics=topic1
zookeeper.connect= localhost:2181 #配置zookeeper连接,如果多个用,隔开
我们一般需要修改的:
broker.id #每台机器必须唯一
zookeeper.connect #根据实际情况配置,多个zookeeper必须全部加进去,用,隔开
listeners #在配置集群的时候必须设置,不然以后的操作会报找不到leader的错误
集群配置
集群配置只需要在每台机器上安装上面broker配置对应的server.properties文件,必须保证broker.id
唯一。
操作系统调优
主要涉及到Kafka的操作系统参数包括:虚拟内存、网络子系统和磁盘挂载点。这些参数一般配置在 /etc/sysctl.conf
文件里。
虚拟内存
对于大多数依赖吞吐量的应用而言,应该尽量避免内存交换。内存页和磁盘之间的交换对Kafka各方面性能都有影响。
vi /etc/sysctl.conf
vm.swappiness=1 #标识内存使用到99%的时候再进行交换分区。应该尽可能使用内存,而不是磁盘
vm.dirty_background_ratio=5 #当内存中的“脏数据”超过5%时,就写入磁盘
vm.dirty_ratio=60 #如果内存中的“脏数据”超过60%,新的IO将会被阻止,引起阻塞
sysctl -p
通过如下命令查看脏数据
cat /proc/vmstat|egrep "dirty|writeback"
网络优化
vi /etc/sysctl.conf
# socket读写缓冲区
net.core.wmem_default=131072
net.core.rmem_default=131072
net.core.wmem_max=2097152
net.core.rmem_max=2097152
# TCP socket读写缓冲区
net.ipv4.tcp_wmem=4096 65536 2048000
net.ipv4.tcp_rmem=4096 65536 2048000
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_max_syn_backlog=65536
net.core.netdev_max_backlog=65536
sysctl -p
启动Kafka
cd bin
./kafka-server-start.sh -daemon ../config/server.properties &
创建Topic
./kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic ncqueue
上述脚本创建了1个副本(replication-factor
)的topic,如果要创建3个,可以使用--replication-factor 3
。创建的副本数不能大于broker的数量。
分区 partitions
的数量一般是broker的数量的整数倍。
验证Topic是否创建成功
./kafka-topics.sh --list --zookeeper localhost:2181
Topic描述
./kafka-topics.sh --describe --zookeeper localhost:2181 --topic ncqueue
- leader:负责处理消息的读和写,leader是从所有节点中随机选择的
- replicas:列出所有的副本节点,不管节点是否在服务中
- isr:列出正在服务中的副本节点
发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic test
执行完后,进入输入界面,输入数据即可。
接收消息
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test
上面的命令只能获取以后的消息,如果要获取之前的消息,需要使用下面的语句:
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning