示例中使用到的服务器相关参数以及各服务器上的相关组件:
主机IP | 主机名称 | 操作系统 | 数据存储目录 | 安装路径 | 安装组件 |
192.168.174.101 | kafka1 | centos7 x64 | /opt/kafka | /usr/local/kafka | kafka,kafka-monitor |
192.168.174.102 | kafka2 | centos7 x64 | /opt/kafka | /usr/local/kafka | kafka |
192.168.174.103 | kafka3 | centos7 x64 | /opt/kafka | /usr/local/kafka | kafka |
系统基础环境修改
本章节中的所有都需要在ROOT用户下进行操作。
关闭防火墙
• 检查防火墙状态
Centos6: [root@localhost~]# service iptables status
Centos7: [root@localhost ~]# systemctl status firewalld.service
如果显示状态不是iptables: Firewall is not running.则需要关闭防火墙
• 关闭防火墙
Centos6: [root@localhost ~]# service iptables stop
Centos7: [root@localhost ~]# systemctl stop firewalld
• 永久关闭防火墙
Centos6:[root@localhost ~]# chkconfig iptables off
Centos7:[root@localhost ~]# systemctl disable firewalld.service
• 再次检查防火墙状态
Centos6: [root@localhost ~]# service iptables status
Centos7: [root@localhost ~]# systemctl status firewalld.service
iptables: Firewall is not running.
关闭SELinux
因为centos的所有访问权限都是有SELinux来管理的,为了避免我们安装中由于权限关系而导致的失败,我们将其关闭,以后跟根据需要进行重新管理。以下给出关闭SELinux的操作命令(在ROOT用户下进行操作):
• 查看SElinux的状态
[root@localhost~]# /usr/sbin/sestatus –v
SELinux status: enabled
如果SELinux status参数为enabled即为开启状态,需要进行下面的关闭操作。
• 关闭SElinux
[root@localhost ~]# vim /etc/selinux/config
在文档中找到SELINUX,将SELINUX的值设置为disabled,即:
SELINUX=disabled
• 在内存中关闭SElinux
[root@localhost ~]# setenforce 0
• 检查内存中状态
[root@localhost ~]# getenforce
如果日志显示结果为disabled或者permissive,说明操作已经成功。
添加安装用户
为了避免有些现场可能以后会回收ROOT权限,我们最好在非ROOT用户下安装,如果在非ROOT用户下能成功,在ROOT下就不会失败。如果条件允许,使用ROOT也不是一件坏事。以下给出创建用户的操作指令:
# 创建用户名称
[root@localhost ~]# adduser kafka
# 为用户初始化密码
# 为这个用户初始化密码,linux会判断密码复杂度,不过可以强行忽略:
[root@localhost ~]# passwd kafka
更改用户 kafka 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 过于简单化/系统化
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
为用户创建安装目录和数据目录
[root@localhost ~]# mkdir -p /opt/kafka/zkDataDir
[root@localhost ~]# mkdir -p /opt/kafka/logDir
[root@localhost ~]# mkdir -p /usr/local/kafka
# 将以上创建的文件夹的所有者交给kafka用户
[root@localhost ~]# chown -R kafka:kafka /opt/kafka
[root@localhost ~]# chown -R kafka:kafka /usr/local/kafka
修改主机名称
修改主机名的原因是为了方便我们记忆与管理,但这并不是主要原因,更主要的是防止kafka的内部实现机制要通过主机名来路由到该主机的IP上。(确保所有主机的hostname不相同)
Centos6:
[root@localhost ~]# vi /etc/hostname
将内容修改为新的hostname
Centos7:
[root@localhost ~]# hostnamectl set-hostname kafka
[root@localhost ~]# hostname kafka
执行完以上的命令退出,重新登录即可。
主机名中不能使用下划线(_)。
主机名不能保护大写字符
修改HOSTS
修改HOSTS的原因主要有两点:
1、 为了防止kafka内部实现机制通过主机名来进行对主机的访问。
2、 为了我们在配置过程中书写起来比较方便,看起来也一目了然。
这里要说明的是,我们配置HOSTS并不是只配置本机IP和主机的对应关系,而是我们规划中的每一台机器都要配置所有机器的IP和主机名称的对应关系。
修改HOSTS方法:
以下给出修改HOSTS的操作命令(在ROOT用户下进行操作):
修改/etc/hosts文件,在文件中添加规划中的所有主机的IP和主机名的对应关系。而且每一台机器都配置。
[root@kafka ~]# vi /etc/hosts
在该文件中添加以下格式的内容,该内容是我们规划中的所有主机的IP和主机名称,而且每一台机器的HOSTS中都要添加相同的内容,IP与主机名用一个TAB键隔开。
192.168.174.100 kafka
如果想要对个名称路由到同一个IP,我们只需要在后边继续添加即可,同样是使用TAB键隔开。例如:
192.168.186.101 es1 kafka1 spark1 hadoop1
配置免密登录
因为集群再启动中需要跨服务器启动,那么两台服务器之间就需要通过sshd服务进行通信。但是由于我们通过sshd服务进行通信时,每次都要输入密码,这样很麻烦,而且也不合理。如果集群中机器很多我们输入不过来,如果在启动中由于输入密码超时导致启动失败,如果我们集群中分配任务有需要输入密码又该怎么办。所以,配置免密登录是有必要的。
注意:配置免密登录是与用户相关的,如果再root用户下配置就是对root用户免密。所以,我们此时配置要使用kafka用户。但是,在配置免密之前要保证其他设备已经配置好以上的步骤,保证都已经存在kafka用户。
安装SSH服务
[kafka@kafka1 ~]# yum -y install ssh
设置开机启动
centos6: [kafka@kafka1 ~]# chkconfig sshd on
centos7: [kafka@kafka1 ~]# systemctl enable sshd.service
启动服务
[kafka@kafka1 ~]# systemctl start sshd.service
生成密钥
[kafka@kafka1 ~]# ssh_keygen –t rsa
一路回车,什么都不输入
配置免密设备
在当前操作的设备上执行以下命令,有多少台机器需要对当前设备免密就执行多少次,只需要将命令中的USER和IP修改为被免密设备的真实IP和用户名称。凡是选择yes/no的都输入yes,需要输入密码的地方都输入被免密设备中被免密用户的密码。
[spark@spark1~]# ssh-copy-id USER@IP yes PASSWORD 配置设备免密
[kafka@kafka1 ~]# ssh-copy-id kafka@192.168.174.101
[kafka@kafka1 ~]# ssh-copy-id kafka@192.168.174.102
[kafka@kafka1 ~]# ssh-copy-id kafka@192.168.174.103
JDK安装
因为kafka使用scala编写的,他可以运行在JDK1.8的运行环境中。所以在安装kafka之前一定要先安装JDK1.8或者是对应版本的scala。因为scala版本之间具有不兼容性,因此建议安装JDK。本示例中以在ROOT用户下安装JDK为例。
1、 卸载系统自带的open JDK
[root@localhost ~]# rpm -qa|grep jdk
# ***表示的是上述命令查询到的所有结果
[root@localhost ~]# rpm -e --nodeps ***
2、下载并上传JDK1.8的安装包
将压缩包上传到任意目录,本文以ROOT用户的主目录(~)下为例
3、 解压到相应的安装目录下
[root@kafka ~]# tar -zxvf jdk-8u131-linux-x64.tar.gz -C /usr/local/
4、 配置环境变量
将解压后的jdk的目录配置到环境变量中
[root@kafka ~]# vi /etc/profile
# 在该文件的末尾处添加以下内容
export JAVA_HOME=/usr/local/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
5、刷新环境变量
[root@kafka ~]# source /etc/profile
6、测试是否安装成功
在任意目录下执行一下命令
[root@kafka ~]# java -version
如果出现Java的版本信息证明安装成功,如果未出现,请检查环境变量中配置的路径是否正确。
Kafka部署
以上的所有步骤我们需要在所有的主机中都要执行,一定不要有任何遗漏和错误。
1. 将kafka_2.10-0.8.1.1.tgz文件上传到主机的kafka用户主目录(~)下,然后解压缩
本示例中将kafka安装到/usr/local/kafka目录下,以下给出解压命令:
[root@kafka ~]# su kafka
kafka@kafka ~]$ cd ~
[kafka@kafka ~]$ tar -zxvf kafka_2.11-0.10.2.1.tgz -C /usr/local/kafka/
2. zookeeper配置
[kafka@kafka ~]$ vi /usr/local/kafka/kafka_2.11-0.10.2.1/config/zookeeper.properties
修改该文件中的以下两个参数:
配置项 | 配置项的值 | 说明 |
dataDir | /opt/kafka/zkDataDir | zookeeper数据存储目录。zookeeper存储的数据量较小。 |
clientPort | 2181 | 客户端连接zookeeper使用的端口 |
server | server.1=192.168.174.101:2888:3888 server.2=192.168.174.102:2888:3888 server.3=192.168.174.103:2888:3888 | 集群中每个主机的地址,每个主机一行。地址的形式为:<IP:端口1:端口2>。server后的数字为主机编号,每个主机的编号不能重复 |
在dataDir配置的目录中创建myid文件,文件的内容为主机编号。编号必须为数字,按照server.x中的x进行设置。一一对应的关系。
3. server配置
[kafka@kafka ~]$ vi /usr/local/kafka/kafka_2.11-0.10.2.1/config/server.properties
修改该文件下的以下内容:
配置项 | 配置项的值 | 说明 |
broker.id | 0 | 每个kafka服务的编号,各个kafka服务编号不能相同 |
listeners | PLAINTEXT://hostname:9092 | 监听端口:部署所在机器的hostname |
log.dirs | /opt/kafka/logDir | kafka server缓存数据的存储目录,多个目录使用逗号分隔。 |
log.retention.hours | 168 | 数据缓存时间期限,单位是小时。超出该时间的数据将被删除 |
zookeeper.connect | 192.168.174.101:2181,192.168.174.102:2181,192.168.174.103:2181 | zookeeper服务地址。地址的形式:<IP:端口>。多个zookeeper地址使用逗号分隔 |
zookeeper.connection.timeout.ms | 1000000 | 连接zookeeper服务的超时时间。单位是毫秒 |
4. 设置JAVA_HOME
[kafka@kafka ~]$ vi /usr/local/kafka/kafka_2.11-0.10.2.1/bin/kafka-run-class.sh
在该文件的开头添加JAVA_HOME:
export JAVA_HOME=/usr/local/jdk1.8.0_131
修改JAVA_HOME的路径为本机的java的目录
5. 内存设置
根据实际的使用情况,数据量的大小,负载量的大小,进行合适的调整,平时在个人电脑上测试按照默认或者是按照以下的修改即可。
设置zookeeper的内存容量:
[kafka@kafka ~]$ vi /usr/local/kafka/kafka_2.11-0.10.2.1/bin/zookeeper-server-start.sh
将该文件中 export KAFKA_HEAP_OPTS=”-Xmx512M -Xmx512M” 这行配置修改为:
export KAFKA_HEAP_OPTS=”-Xmx1G -Xmx1G”
修改-Xmx和-Xms后的数字设置zookeeper占用的内存容量。默认配置为占用512M的内存。zookeeper占用的内存最小设置为1G。
设置kafka的内存容量
[kafka@kafka ~]$ vi /usr/local/kafka/kafka_2.11-0.10.2.1/bin/kafka-server-start.sh
将该文件中 export KAFKA_HEAP_OPTS=”-Xmx512M -Xmx512M” 这行配置修改为:
export KAFKA_HEAP_OPTS=”-Xmx2G -Xmx2G”
修改-Xmx和-Xms后的数字设置kafka占用的内存容量。默认配置为占用1G的内存。kafka占用的内存最小设置为2G,尽量设置为操作系统中可以利用的内存的最大值。
6. 进入[安装目录]/bin目录,执行如下命令启动
[kafka@kafka ~]$ cd /usr/local/kafka/kafka_2.11-0.10.2.1/bin
#先启动每一台机器的zookeeper
[kafka@kafka bin]$ setsid ./zookeeper-server-start.sh ../config/zookeeper.properties >/dev/null 2>&1
#再启动每一台机器的kafka server
[kafka@kafka bin]$ setsid ./kafka-server-start.sh ../config/server.properties >/dev/null 2>&1
安装验证
安装完成后,验证kafka的相关服务是否启动。
在操作系统命令行中执行jps命令(这是java的命令,需要将操作系统的PATH中加入java的bin目录)
[kafka@kafka bin]$ jps
2596 Kafka
2324 QuorumPeerMain
2842 Jps
有QuorumPeerMain和Kafka进程,说明kafka服务已经启动。
也可以通过ps命令查看kafka相关进程是否存在
[kafka@kafka bin]$ ps -aux|grep kafka
kafka常用控制台命令
# 创建Topic
[kafka@kafka bin]$ ./kafka-topics.sh --zookeeper localhost:2181 --create --topic topic-name --partitions 10 --replication-factor 1
Created topic "topic-name".
# 查看创建的所有的Topic
[kafka@kafka bin]$ ./kafka-topics.sh --list --zookeeper localhost:2181
# 查看某个Topic的状态
[kafka@kafka bin]$ ./kafka-topics.sh --describe --zookeeper localhost:2181 --topic topic-name
# 消息的订阅者
[kafka@kafka bin]$ ./kafka-console-consumer.sh --zookeeper localhost:2181 --topic topic-name --from-beginning(在0.10.2.1版本之前使用,在新版本中不建议再使用)
[kafka@kafka bin]$ ./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topic-name --from-beginning
# 消息的发布者
[kafka@kafka bin]$ ./kafka-console-producer.sh --broker-list localhost:9092 --topic topic-name