版本说明
- 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
为例。
-
找到网络接口名称,运行以下命令:
ip addr
查找以
ens
或eth
开头的接口名称。例如,ens33
或eth0
。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 配置在这个范围内。 -
获取网关地址
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
, -
编辑
/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
-
重启
su reboot
-
再次查看 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
-
配置域名
sudo vim /etc/hosts
追加内容如下:
192.168.50.131 kafka1.com 192.168.50.132 kafka2.com 192.168.50.133 kafka3.com
-
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
-
ping 一下百度,看看能不能访问外网
hedon@ubuntu:~$ ping baidu.com ping: baidu.com: Name or service not known
如果这里可以访问,则直接跳过进入下一步,不可以的话,需要配置一下域名解析系统。
-
配置域名解析系统
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 地址和相关的网络设置。下面是各行的解释:
-
auto ens33
: 这一行表示在系统启动时自动激活ens33
网络接口。auto
关键字后面跟着接口名称。 -
iface ens33 inet static
: 这一行定义了ens33
网络接口的配置。iface
关键字后面跟着接口名称,inet
表示我们正在配置 IPv4 地址,static
表示我们要为接口分配一个静态 IP 地址(而不是通过 DHCP 获得)。 -
address 192.168.50.131
: 这一行设置了网络接口的静态 IP 地址。在这个例子中,我们为ens33
接口分配了192.168.50.131
IP 地址。IP 地址是 Internet 协议(IP)用于在网络中唯一标识设备的数字标签。每个连接到网络的设备都需要一个唯一的 IP 地址,以便其他设备可以找到并与之通信。IP 地址通常分为两种版本:IPv4 和 IPv6。在此示例中,我们使用了一个 IPv4 地址。
-
netmask 255.255.255.0
: 这一行定义了子网掩码。在这个例子中,子网掩码是255.255.255.0
,表示前三个字节(24 位)是网络地址,最后一个字节(8 位)是主机地址。子网掩码用于划分 IP 地址的网络部分和主机部分。子网掩码与 IP 地址进行按位与操作,从而得到网络地址。这有助于确定哪些 IP 地址属于同一子网,以便正确地将数据包路由到目的地。子网划分有助于组织网络、提高安全性和管理性。
-
gateway 192.168.50.2
: 这一行设置了默认网关。在这个例子中,我们将默认网关设置为192.168.50.2
。默认网关是用于将数据包发送到其他网络的路由器或设备的 IP 地址。网关是一个充当网络中数据包传输的中继点的设备,通常是一个路由器。当一个设备需要将数据包发送到不同子网的另一个设备时,它会将数据包发送到网关。网关负责将数据包路由到正确的目的地。默认网关是设备用于将数据包发送到其他网络的首选网关。
-
dns-nameservers 8.8.8.8 8.8.4.4
: 这一行指定了 DNS 服务器的 IP 地址。在这个例子中,我们使用了谷歌的公共 DNS 服务器8.8.8.8
和8.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:
- 下载 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
- 将解压缩后的文件夹移动到
/opt
目录中:
sudo mv apache-zookeeper-3.5.9-bin /opt/zookeeper-3.5.9
- 在
/opt/zookeeper-3.5.9
目录中创建一个名为data
的文件夹,用于存储 Zookeeper 的数据:
sudo mkdir /opt/zookeeper-3.5.9/data
- 在
/opt/zookeeper-3.5.9/data
下创建 myid 文件并设置内容为1
,其他两台机器则为2
和3
:
echo 1 | sudo tee /opt/zookeeper-3.5.9/data/myid
- 复制 Zookeeper 配置文件样本,并将其命名为
zoo.cfg
:
sudo cp /opt/zookeeper-3.5.9/conf/zoo_sample.cfg /opt/zookeeper-3.5.9/conf/zoo.cfg
- 使用文本编辑器(例如 vim)编辑
zoo.cfg
文件:
sudo vim /opt/zookeeper-3.5.9/conf/zoo.cfg
- 修改
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 地址,port1
和port2
是用于集群间通信的端口。具体来说:
port1(2888)
:这是服务器之间用于相互通信的端口。Zookeeper 服务器使用这个端口进行 leader 选举以及同步 follower 和 leader 之间的状态。
port2(3888)
:这个端口用于服务器之间的 leader 选举。在 Zookeeper 集群启动或者在 leader 服务器崩溃后,follower 服务器会通过这个端口进行新一轮的 leader 选举。这两个端口可以根据你的网络配置进行修改,但必须在所有的 Zookeeper 服务器上保持一致。
- 三个节点都启动 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.
- 要停止 Zookeeper 服务器,可以使用以下命令:
/opt/zookeeper/bin/zkServer.sh stop
安装 Kafka
-
下载并解压 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
-
将解压缩后的文件夹移动到
/opt
目录中:sudo mv kafka_2.13-2.7.0 /opt/kafka-2.7.0
-
创建日志目录
sudo mkdir /opt/kafka-2.7.0/kafka-logs
-
备份 Kafka 默认配置
sudo cp /opt/kafka-2.7.0/config/server.properties /opt/kafka-2.7.0/config/server.properties.bak
-
修改 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
-
三个节点都启动 Kafka
/opt/kafka-2.7.0/bin/kafka-server-start.sh -daemon /opt/kafka-2.7.0/config/server.properties
-
选择任意一个节点创建一个新 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.
-
在其他节点获取
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