版本说明

  • Ubuntu 18.04.6
  • Zookeeper 3.5.9
  • Kafka 2.7.0
  • JDK8

集群配置

操作系统

ip

域名

Zookeeper 端口

Kafka 端口

Ubuntu 18.04.6

192.168.50.131

kafka1.com

2181

9092

Ubuntu 18.04.6

192.168.50.132

kafka2.com

2181

9092

Ubuntu 18.04.6

192.168.50.133

kafka3.com

2181

9092

安装 vim, curl

sudo apt update
sudo apt install vim
sudo apt install curl

配置静态 ip 和 hosts

为了使用域名,更加方便的进行配置,这里将虚拟机的 DHCP 改成了静态分配 IP,所以需要手动设置一下每台机器 IP 地址,这里以 192.168.50.131 为例。

  1. 找到网络接口名称,运行以下命令:
ip addr

查找以 enseth 开头的接口名称。例如,ens33eth0

hedon@ubuntu:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:82:9e:69 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.133/24 brd 192.168.50.255 scope global dynamic noprefixroute ens33
       valid_lft 1644sec preferred_lft 1644sec
    inet6 fe80::c367:c7cc:3ad4:23b3/64 scope link 
       valid_lft forever preferred_lft forever

可以找到 ens33,其中 inet 192.168.50.133/24 表示 IP 地址为 192.168.50.133,子网掩码为 /24(等于 255.255.255.0)。

这个 IP 地址是 DHCP 动态分配的,说明宿主机分配给虚拟机的 IP 范围就在 192.168.50.xxx,所以我们会将静态 IP 配置在这个范围内。

  1. 获取网关地址
ip route | grep default

输出:

hedon@ubuntu:~$ ip route | grep default
default via 192.168.50.2 dev ens33 proto dhcp metric 100

说明默认网关是 192.168.50.2

  1. 编辑 /etc/network/interfaces 文件,配置静态 IP 地址,内容如下:
auto ens33
iface ens33 inet static
	address 192.168.50.131
	netmask 255.255.255.0
	gateway 192.168.50.2
	dns-nameservers 8.8.8.8 8.8.4.4
  1. 重启
su reboot
  1. 再次查看 ip 地址
ip addr

有以下输出便说明静态 IP 配置成功了。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:82:9e:69 brd ff:ff:ff:ff:ff:ff
    inet 192.168.50.131/24 brd 192.168.50.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe82:9e69/64 scope link 
       valid_lft forever preferred_lft forever
  1. 配置域名
sudo vim /etc/hosts

追加内容如下:

192.168.50.131 kafka1.com
192.168.50.132 kafka2.com
192.168.50.133 kafka3.com
  1. ping 一下
hedon@ubuntu:~$ ping kafka1.com
PING kafka1.com (192.168.50.131) 56(84) bytes of data.
64 bytes from kafka1.com (192.168.50.131): icmp_seq=1 ttl=64 time=0.024 ms
64 bytes from kafka1.com (192.168.50.131): icmp_seq=2 ttl=64 time=0.021 ms
64 bytes from kafka1.com (192.168.50.131): icmp_seq=3 ttl=64 time=0.029 ms
^C
--- kafka1.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2029ms
rtt min/avg/max/mdev = 0.021/0.024/0.029/0.006 ms
  1. ping 一下百度,看看能不能访问外网
hedon@ubuntu:~$ ping baidu.com
ping: baidu.com: Name or service not known

如果这里可以访问,则直接跳过进入下一步,不可以的话,需要配置一下域名解析系统。

  1. 配置域名解析系统
sudo vim /etc/resolv.conf

追加下面内容:

nameserver 8.8.8.8
nameserver 8.8.4.4

再尝试 ping 一下百度:

hedon@ubuntu:~$ ping www.baidu.com
PING www.a.shifen.com (153.3.238.110) 56(84) bytes of data.
64 bytes from 153.3.238.110 (153.3.238.110): icmp_seq=1 ttl=128 time=15.9 ms
64 bytes from 153.3.238.110 (153.3.238.110): icmp_seq=2 ttl=128 time=15.9 ms
64 bytes from 153.3.238.110 (153.3.238.110): icmp_seq=3 ttl=128 time=16.1 ms
64 bytes from 153.3.238.110 (153.3.238.110): icmp_seq=4 ttl=128 time=15.3 ms
^C
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 14104ms
rtt min/avg/max/mdev = 15.368/15.850/16.145/0.291 ms

补充说明:/etc/network/interfaces 文件的配置

这是一个用于配置 Linux 系统上网络接口的文件。在这个示例中,我们为名为 ens33 的网络接口配置了静态 IP 地址和相关的网络设置。下面是各行的解释:

  1. auto ens33: 这一行表示在系统启动时自动激活 ens33 网络接口。auto 关键字后面跟着接口名称。
  2. iface ens33 inet static: 这一行定义了 ens33 网络接口的配置。iface 关键字后面跟着接口名称,inet 表示我们正在配置 IPv4 地址,static 表示我们要为接口分配一个静态 IP 地址(而不是通过 DHCP 获得)。
  3. address 192.168.50.131: 这一行设置了网络接口的静态 IP 地址。在这个例子中,我们为 ens33 接口分配了 192.168.50.131 IP 地址。

IP 地址是 Internet 协议(IP)用于在网络中唯一标识设备的数字标签。每个连接到网络的设备都需要一个唯一的 IP 地址,以便其他设备可以找到并与之通信。IP 地址通常分为两种版本:IPv4 和 IPv6。在此示例中,我们使用了一个 IPv4 地址。

  1. netmask 255.255.255.0: 这一行定义了子网掩码。在这个例子中,子网掩码是 255.255.255.0,表示前三个字节(24 位)是网络地址,最后一个字节(8 位)是主机地址。

子网掩码用于划分 IP 地址的网络部分和主机部分。子网掩码与 IP 地址进行按位与操作,从而得到网络地址。这有助于确定哪些 IP 地址属于同一子网,以便正确地将数据包路由到目的地。子网划分有助于组织网络、提高安全性和管理性。

  1. gateway 192.168.50.2: 这一行设置了默认网关。在这个例子中,我们将默认网关设置为 192.168.50.2。默认网关是用于将数据包发送到其他网络的路由器或设备的 IP 地址。

网关是一个充当网络中数据包传输的中继点的设备,通常是一个路由器。当一个设备需要将数据包发送到不同子网的另一个设备时,它会将数据包发送到网关。网关负责将数据包路由到正确的目的地。默认网关是设备用于将数据包发送到其他网络的首选网关。

  1. dns-nameservers 8.8.8.8 8.8.4.4: 这一行指定了 DNS 服务器的 IP 地址。在这个例子中,我们使用了谷歌的公共 DNS 服务器 8.8.8.88.8.4.4。DNS 服务器用于将主机名解析为 IP 地址。

域名系统(DNS)是将人类可读的域名(例如 www.baidu.com)IP 地址的系统。DNS 服务器是负责执行此解析过程的服务器。当您在浏览器中输入一个网址时,计算机会向 DNS 服务器查询该域名对应的 IP 地址,然后将请求发送到该 IP 地址以获取网页内容。

配置文件中的这些设置将在系统启动时生效。要立即应用更改,您可以使用以下命令重启网络服务:

sudo systemctl restart networking

安装 jdk

sudo apt update
sudo apt install openjdk-8-jdk

验证 java8 是否已经安装成功:

java -version

有以下类似输出的话则表明安装成功:

openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-8u372-ga~us1-0ubuntu1~18.04-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)

安装 zookeeper

在 Ubuntu 上,您可以通过以下步骤安装 Apache Zookeeper 3.5.9:

  1. 下载 Apache Zookeeper 3.5.9 的二进制文件。使用以下命令下载并解压缩 Zookeeper:
wget https://archive.apache.org/dist/zookeeper/zookeeper-3.5.9/apache-zookeeper-3.5.9-bin.tar.gz
tar -xzf apache-zookeeper-3.5.9-bin.tar.gz
  1. 将解压缩后的文件夹移动到 /opt 目录中:
sudo mv apache-zookeeper-3.5.9-bin /opt/zookeeper-3.5.9
  1. /opt/zookeeper-3.5.9 目录中创建一个名为 data 的文件夹,用于存储 Zookeeper 的数据:
sudo mkdir /opt/zookeeper-3.5.9/data
  1. /opt/zookeeper-3.5.9/data 下创建 myid 文件并设置内容为 1,其他两台机器则为 23
echo 1 | sudo tee /opt/zookeeper-3.5.9/data/myid
  1. 复制 Zookeeper 配置文件样本,并将其命名为 zoo.cfg
sudo cp /opt/zookeeper-3.5.9/conf/zoo_sample.cfg /opt/zookeeper-3.5.9/conf/zoo.cfg
  1. 使用文本编辑器(例如 vim)编辑 zoo.cfg 文件:
sudo vim /opt/zookeeper-3.5.9/conf/zoo.cfg
  1. 修改 zoo.cfg 文件:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial 
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between 
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# 设置数据存储目录
dataDir=/opt/zookeeper-3.5.9/data
# the port at which the clients will connect
clientPort=2181
# 设置集群信息
server.1=kafka1.com:2888:3888
server.2=kafka2.com:2888:3888
server.3=kafka3.com:2888:3888

在 Zookeeper 的配置文件中,server.x=hostname:port1:port2 这种格式的配置项是用来设置 Zookeeper 集群(集群模式下)的。其中,x 是服务器的 ID,hostname 是服务器的主机名或 IP 地址,port1port2 是用于集群间通信的端口。

具体来说:

  • port1(2888):这是服务器之间用于相互通信的端口。Zookeeper 服务器使用这个端口进行 leader 选举以及同步 follower 和 leader 之间的状态。
  • port2(3888):这个端口用于服务器之间的 leader 选举。在 Zookeeper 集群启动或者在 leader 服务器崩溃后,follower 服务器会通过这个端口进行新一轮的 leader 选举。

这两个端口可以根据你的网络配置进行修改,但必须在所有的 Zookeeper 服务器上保持一致。

  1. 三个节点都启动 Zookeeper 服务器:
/opt/zookeeper/bin/zkServer.sh start

可以连接到 Zookeeper 的端口上(默认是 2181),通过发送四字命令 srvr 来验证 Zookeeper 是否安装正确(部署集群的话需要把所有 Zookeeper 启动):

hedon@ubuntu:/opt/zookeeper-3.5.9$ telnet localhost 2181
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
srvr
Zookeeper version: 3.5.9-83df9301aa5c2a5d284a9940177808c01bc35cef, built on 01/06/2021 19:49 GMT
Latency min/avg/max: 0/0/0
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x0
Mode: standalone
Node count: 5
Connection closed by foreign host.
  1. 要停止 Zookeeper 服务器,可以使用以下命令:
/opt/zookeeper/bin/zkServer.sh stop

安装 Kafka

  1. 下载并解压 Kafka
wget https://archive.apache.org/dist/kafka/2.7.0/kafka_2.13-2.7.0.tgz
tar -zxvf kafka_2.13-2.7.0.tgz
  1. 将解压缩后的文件夹移动到 /opt 目录中:
sudo mv kafka_2.13-2.7.0 /opt/kafka-2.7.0
  1. 创建日志目录
sudo mkdir /opt/kafka-2.7.0/kafka-logs
  1. 备份 Kafka 默认配置
sudo cp /opt/kafka-2.7.0/config/server.properties /opt/kafka-2.7.0/config/server.properties.bak
  1. 修改 Kafka 配置
sudo vim /opt/kafka-2.7.0/config/server.properties

主要是修改下面几个配置:

# 集群中每个 broker 的 id 必须唯一,这里分别为 1,2,3
broker.id=1
# 日志目录
log.dirs=/opt/kafka-2.7.0/kafka-logs
# 配置 Zookeeper
zookeeper.connect=kafka1.com:2181,kafka2.com:2181,kafka3.com:2181
# 定义 Kafka Broker 在哪些网络地址上监听连接,下面配置表示在所有的 IP 地址上监听 9092 端口
listeners=PLAINTEXT://:9092
# 定义 Kafka Broker 如何向外部公布它的地址。这是 Kafka Broker 通知 Producer 和 Consumer 如何连接到自己的方式。例如,如果你设置 advertised.listeners=PLAINTEXT://my.public.ip:9092,那么 Kafka Broker 将告诉 Producer 和 Consumer 它的公共 IP 地址是 my.public.ip,并且它在 9092 端口上监听连接。
advertised.listeners=PLAINTEXT://kafka1.com:9092
  1. 三个节点都启动 Kafka
/opt/kafka-2.7.0/bin/kafka-server-start.sh -daemon /opt/kafka-2.7.0/config/server.properties
  1. 选择任意一个节点创建一个新 topic
/opt/kafka-2.7.0/bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic test --replication-factor 1 --partitions=2

输出:

Created topic test.
  1. 在其他节点获取 test 这个 topic 的信息
/opt/kafka-2.7.0/bin/kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic test

可以看到关于 test 这个 topic 的信息是可以获取到的,说明集群之前信息是互通的,集群搭建完毕。

Topic: test	PartitionCount: 2	ReplicationFactor: 1	Configs: segment.bytes=1073741824
	Topic: test	Partition: 0	Leader: 1	Replicas: 1	Isr: 1
	Topic: test	Partition: 1	Leader: 2	Replicas: 2	Isr: 2