云服务器搭建Kafaka集群环境

从京东云上面购买了三台服务器,作为kafka集群搭建环境。下面的不是本人真实ip地址

服务器简介:

服务器名称 服务器ip地址 服务器角色 备注
Jd1 190.168.161.26 节点
Jd2 190.168.161.25 节点
Jd3 190.168.161.24 节点

云服务器开通端口:
在这里插入图片描述
在这里插入图片描述

一、安装java环境

选择java1.8+ 及以上版本,我使用的是jdk-8u221-linux-x64.tar.gz。每台服务器均安装

上传到centos系统上,然后解压软件:

[root@jd3 software]# tar zxvf jdk-8u221-linux-x64.tar.gz

得到一个文件夹,移动到/usr/local目录下:

[root@jd3 software]# mv jdk1.8.0_221/ /usr/local/java

配置java环境变量:

[root@jd3 software]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JRE_HOME=$JAVA_HOME/jre

重新加载环境变量配置:

[root@jd3 software]# source /etc/profile

测试java环境是否安装成功

[root@jd3 software]# java -version

二、安装zookeeper环境

选择zookeeper版本,我使用的是apache-zookeeper-3.6.0-bin.tar.gz。每台服务器都安装
上传到centos系统上,然后解压软件:

[root@jd3 software]# tar zxvf apache-zookeeper-3.6.0-bin.tar.gz

修改文件夹名称为zookeeper,也可以不修改

[root@jd3 software]# mv /opt/zookeeper-3.6.0  /opt/zookeeper

得到一个文件夹,进入到其/conf目录下:
我解压后的目录位置在/opt下面

[root@jd3 software]# cd /opt/zookeeper/conf

创建一个配置文件:

[root@jd3 software]# cp zoo_sample.cfg  zoo.cfg

修改配置文件:

[root@jd3 software]# vim  zoo.cfg
#只需要修改下面这几个地方
dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zkdataLog
clientPort=12181

server.1=190.168.161.26:12888:13888
server.2=190.168.161.25:12888:13888
server.3=190.168.161.24:12888:13888

为了便于讲解上面的配置,这里抽象出一个公式,即
server.A=B:C:D。其中 A 是一个数字,代表服务器的编号,就是前面所说的myid文件里面的值。集群中每台服务器的编号都必须唯一,所以要保证每台服务器中的myid文件中的值不同。B代表服务器的IP地址。C表示服务器与集群中的 leader 服务器交换信息的端口。D 表示选举时服务器相互通信的端口。

创建文件目录

[root@jd3 software]# mkdir /opt/zookeeper/zkdata
[root@jd3 software]# mkdir /opt/zookeeper/zkdataLog

创建服务器的编号:(每台服务器上面执行,注意数字要和配置文件对应)

[root@jd1 software]# echo “1” >  /opt/zookeeper/zkdata/myid

进入到/opt/zookeeper/bin 目录,三台机器都启动:

[root@jd3 software]# cd /opt/zookeeper/bin
[root@jd3 software]# ./zkServer.sh start

查看运行状态,其中一个为leader,另外两个为follower

[root@jd3 software]# ./zkServer.sh status

注意问题:云服务器搭建zookeeper集群,因为虚拟化的问题导致无法启动集群。在每个Zookeeper节点上的zoo.cfg里面添加上quorumListenOnAllIPs=true

dataDir=/opt/zookeeper/zkdata
dataLogDir=/opt/zookeeper/zkdataLog
clientPort=12181
quorumListenOnAllIPs=true

server.1=190.168.161.26:12888:13888
server.2=190.168.161.25:12888:13888
server.3=190.168.161.24:12888:13888

三、安装kafka环境

选择kafka版本为scala2.12版本的,我使用的版本为kafka_2.12-2.4.1.tgz
解压kafka软件:

[root@jd3 software]# tar -zxvf kafka_2.12-2.4.1.tgz

修改文件夹名称为kafka,也可以不修改

[root@jd3 software]# mv /opt/kafka_2.12-2.4.1  /opt/kafka

得到一个文件夹,进入到其/config目录下:
我解压后的目录位置在/opt下面

[root@jd3 config]# cd /opt/kafka/config

修改配置文件server.properties文件:

[root@jd3 config]# vim /opt/kafka/config/server.properties
#主要修改下面几点:
broker.id=0# 如果其他几个节点,也要安装kafka,则这里需要改动为1、2、3....。不能重复

advertised.listeners=PLAINTEXT://190.168.161.26:9092 #其他节点,需要改为本机ip地址
advertised.host.name=190.168.161.26  #其他节点,需要改为本机ip地址
advertised.port=9092
zookeeper.connect=190.168.161.26:12181,190.168.161.25:12181,190.168.161.24:12181

log.dirs=/opt/kafka/kafkalogs

#在配置文件找到 log.retention.hours=168 ,然后再后面加上这三行
message.max.byte=5242880
default.replication.factor=2
replica.fetch.max.bytes=5242880

注意:PLAINTEXT://190.168.161.26:9092 代表这个kafka服务器,ip地址为190.168.161.26端口为9092 。程序代码里面消费者和生产者就可以直接指定这台服务器地址和端口。

创建日志目录:

[root@jd3 software]# mkdir /opt/kafka/kafkalogs

进入kafka的bin目录下面启动kafka:

[root@jd3 bin]# ./kafka-server-start.sh -daemon ../config/server.properties

测试:
创建一个topic:

[root@jd3 bin]#./kafka-topics.sh --zookeeper 190.168.161.26:12181/kafka --create --topic topic-demo --replication-factor 3 --partitions 4

创建一个生产者:

[root@jd3 bin]#./kafka-console-producer.sh --broker-list 190.168.161.26:9092 --topic topic-demo

(可以在执行后的界面,输入信息)

创建一个消费者:

[root@jd3 bin]# ./kafka-console-consumer.sh --bootstrap-server 190.168.161.26:9092 --topic topic-demo

(可以在这个界面,看到上面输入的内容)

后续

免密操作:

设置sshd免密码登陆

执行命令:

[root@jd3 root]# ssh-keygen
 执行该命令前,需要把/root/.ssh/id_rsa.pub文件删除
[root@jd3 root]# cd  /root/.ssh
[root@jd3 .ssh]#  ssh-copy-id [email protected]

Java代码案例:

生产者代码:SimpleKafkaProducer.java

package io.test.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;

public class SimpleKafkaProducer {
    private static KafkaProducer<String, String> producer;
    private final static String TOPIC = "topic-demo";
    public SimpleKafkaProducer(){
        Properties props = new Properties();
        props.put("bootstrap.servers", "190.168.161.26:9092");
        props.put("acks", "all");
        props.put("retries", 0);
        props.put("batch.size", 16384);
        props.put("linger.ms", 1);
        props.put("buffer.memory", 33554432);
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        //设置分区类,根据key进行数据分区
        producer = new KafkaProducer<String, String>(props);
    }
    public void produce(){
        for (int i = 30;i<40;i++){
            String key = "表名:DUAL,主键:"+String.valueOf(i);
            String data = "id:1 name:小明 age:"+String.valueOf(i);
            producer.send(new ProducerRecord<String, String>(TOPIC,key,data));
            System.out.println(data);
        }
        producer.close();
    }

    public static void main(String[] args) {
        new SimpleKafkaProducer().produce();
    }
}

消费者案例:

package io.test.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.log4j.Logger;

import java.util.Arrays;
import java.util.Properties;

public class SimpleKafkaConsumer {
    private static KafkaConsumer<String, String> consumer;
    private final static String TOPIC = "topic-demo";
    public SimpleKafkaConsumer(){
        Properties props = new Properties();
        props.put("bootstrap.servers", "190.168.161.26:9092");
        //每个消费者分配独立的组号
        props.put("group.id", "test2");
        //如果value合法,则自动提交偏移量
        props.put("enable.auto.commit", "true");
        //设置多久一次更新被消费消息的偏移量
        props.put("auto.commit.interval.ms", "1000");
        //设置会话响应的时间,超过这个时间kafka可以选择放弃消费或者消费下一条消息
        props.put("session.timeout.ms", "30000");
        //自动重置offset
        props.put("auto.offset.reset","earliest");
        props.put("key.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer",
                "org.apache.kafka.common.serialization.StringDeserializer");
        consumer = new KafkaConsumer<String, String>(props);
    }

    public void consume(){
        consumer.subscribe(Arrays.asList(TOPIC));
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(100);
            for (ConsumerRecord<String, String> record : records){
                System.out.printf("offset = %d, key = %s, value = %s",record.offset(), record.key(), record.value());
                System.out.println();
            }
        }
    }

    public static void main(String[] args) {
        new SimpleKafkaConsumer().consume();
    }
}

启动消费者代码之后,程序会一直运行,持续监听这个topic的数据信息。
再启动生产者代码,生产数据。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章