目录
2.zookeeper伪分布式安装(在同一台机器安装不同实例)
写在前面
(1)本例使用三台服务器(VMware虚拟机搭建,centos7),已在hosts中配置主机与IP映射
主机 | IP | 部署内容 |
my108 | 192.168.10.108 | zookeeper、kafka、jdk1.8 |
my109 | 192.168.10.109 | zookeeper、kafka、jdk1.8 |
my110 | 192.168.10.110 | zookeeper、kafka、jdk1.8 |
(2)zookeeper单独部署,非使用kafka自带;(zookeeper版本:zookeeper-3.4.11;kafka版本:kafka_2.11-2.1.0)
1.zookeeper集群安装
(1)下载zookeeper-3.4.11.tar.gz,可以从http://mirrors.hust.edu.cn/apache/ 中下载,找到zookeeper,下载对应版本。上传到虚拟机my108中
解压:tar -zxvf zookeeper-3.4.11.tar.gz
拷贝到home下:mv zookeeper-3.4.11 /home/
进入conf路径:cd /home/zookeeper-3.4.11/conf
复制zoo.cfg:cp zoo_sample.cfg zoo.cfg
(2)修改zoo.cfg配置(注意标红部分配置)
#
数据目录
dataDir=/home/zookeeper-3.4.11/data
#
日志目录
dataLogDir=/home/zookeeper-3.4.11/logs
#
心跳间隔时间,zookeeper中使用的基本时间单位,毫秒值。每隔2秒发送一个心跳
tickTime=2000
#leader
与客户端连接超时时间。表示5个心跳间隔
initLimit=5
#Leader
与Follower之间的超时时间,表示2个心跳间隔
syncLimit=2
#
客户端连接端口。多个实例的端口配置不可重复
clientPort=2181
#这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启
autopurge.purgeInterval=24
#这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目,默认是保留3个
autopurge.snapRetainCount=5
#server.NUM=IP:port1:port2 NUM
表示本机为第几号服务器;IP为本机ip地址;
#port1
为leader与follower通信端口;port2为参与竞选leader的通信端口
#
多个实例的端口配置不能重复,如下:
server.0=my108:2888:3888
server.1=my109:2888:3888
server.2=my110:2888:3888
(3)添加myid
进入dataDir中的目录,执行:echo '0' > myid (具体数字为zoo.cfg中配置的数字)
(4)拷贝文件到其他机器(my109、my110)
scp -r zookeeper-3.4.11 root@my110:/home/
注意修改:对应的myid
(5)配置环境变量(vi /etc/profile)
添加如下内容:
ZOOKEEPER_HOME=/home/zookeeper-3.4.11
PATH=$PATH:$ZOOKEEPER_HOME/bin
生效:source /etc/profile
(6)启动zookeeper
添加上面环境变量后就可以在任意目录下执行zookeeper命令了
#启动
zkServer.sh start
#查看状态
zkServer.sh status
#查看状态jps -l
2.zookeeper伪分布式安装(在同一台机器安装不同实例)
(1)每个实例配置文件zoo.cfg
在集群部署的基础上,在某个机器(如my108中)配置文件中复制3个zoo.cfg
cp –r zoo.cfg zoo0.cfg
cp –r zoo.cfg zoo1.cfg
cp –r zoo.cfg zoo2.cfg
主要修改如下内容
zoo0.cfg
# 数据目录
dataDir=/home/zookeeper-3.4.11/zk0/data
dataLogDir=/home/zookeeper-3.4.11/zk0/logs
# 端口号
clientPort=2180
server.0=localhost:2887:3887
server.1=localhost:2888:3888
server.2=localhost:2889:3889
zoo1.cfg
# 数据目录
dataDir=/home/zookeeper-3.4.11/zk1/data
dataLogDir=/home/zookeeper-3.4.11/zk1/logs
# 端口号
clientPort=2181
server.0=localhost:2887:3887
server.1=localhost:2888:3888
server.2=localhost:2889:3889
zoo2.cfg
# 数据目录
dataDir=/home/zookeeper-3.4.11/zk2/data
dataLogDir=/home/zookeeper-3.4.11/zk2/logs
# 端口号
clientPort=2182
server.0=localhost:2887:3887
server.1=localhost:2888:3888
server.2=localhost:2889:3889
(2)创建myid
在zk1、zk2、zk3下创建data与logs目录
进入dataDir中的目录,执行:echo 'X' > myid (具体数字为zooX.cfg中配置的数字)
(3)启动zookeeper
# 启动3个zookeeper服务
zkServer.sh start /home/zookeeper-3.4.11/conf/zoo0.cfg
zkServer.sh start /home/zookeeper-3.4.11/conf/zoo1.cfg
zkServer.sh start /home/zookeeper-3.4.11/conf/zoo2.cfg
# 查看每个zookeeper对应的角色
zkServer.sh status /home/zookeeper-3.4.11/conf/zoo0.cfg
zkServer.sh status /home/zookeeper-3.4.11/conf/zoo1.cfg
zkServer.sh status /home/zookeeper-3.4.11/conf/zoo2.cfg
# 停止zookeeper服务 或jps -l 使用 kill 命令停止
zkServer.sh stop /home/zookeeper-3.4.11/conf/zoo0.cfg
zkServer.sh stop /home/zookeeper-3.4.11/conf/zoo1.cfg
zkServer.sh stop /home/zookeeper-3.4.11/conf/zoo2.cfg
3.kafka集群安装
具体配置项,详细信息可以参考官网:http://kafka.apache.org/quickstart
(1)下载:kafka_2.11-2.1.0.tgz(点击下载)
(2)解压:tar -zxvf kafka_2.11-2.1.0.tgz
(3)进入配置文件目录:cd /home/kafka_2.11-2.1.0/config
(4)修改配置文件(实际配置如下标红部分): vi server.properties
broker.id=0
listeners=PLAINTEXT://:9092
log.dirs=/tmp/kafka-logs0
zookeeper.connect=my108:2181,my109:2181,my110:2181
(5)启动(集群每台机器都要执行):
进入到kafka的bin目录执行(或将kafka的bin目录加入到PATH中)
kafka-server-start.sh -daemon /home/kafka_2.11-2.1.0/config/server.properties
4.kafka伪分布式安装
在原来配置基础上(集群配置中的my108节点配置),拷贝配置,启动不同实例
(1)拷贝配置文件,在kafka主目录下执行
cp config/server.properties config/server1.properties
cp config/server.properties config/server2.properties
(2)配置文件server.properties
config/server1.properties
broker.id=1
listeners=PLAINTEXT://:9093
log.dir=/tmp/kafka-logs1
config/server2.properties
broker.id=2
listeners=PLAINTEXT://:9094
log.dir=/tmp/kafka-logs2
(3)启动:(如果kafka的bin目录加入到系统path中可以在任意目录下执行)
kafka-server-start.sh -daemon /home/kafka_2.11-2.1.0/config/server1.properties
kafka-server-start.sh -daemon /home/kafka_2.11-2.1.0/config/server2.properties
(4)常用命令
#创建topic
kafka-topics.sh --create --zookeeper my108:2181 --replication-factor 2 --partitions 5 --topic test111
#查看topic列表
kafka-topics.sh --list --zookeeper my108:2181
#生产者
kafka-console-producer.sh --broker-list my108:9092 --topic test111
#消费者
kafka-console-consumer.sh --bootstrap-server my108:9092 --from-beginning --topic test111
5.Java API
package demo;
import java.util.Properties;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
public class ProducerTest {
public static void main(String[] args) {
Properties props = new Properties();
props.put("bootstrap.servers", "my108: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");
Producer<String, String> producer = new KafkaProducer<>(props);
for(int i = 0; i < 2; i++){
producer.send(new ProducerRecord<>("test111", "key111", "ceshi"+i));
}
producer.close();
System.out.println("end");
}
}
package demo;
import java.util.Arrays;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
public class ConsumerTest {
private static KafkaConsumer<String, String> consumer;
private final static String TOPIC = "test111";
public ConsumerTest(){
Properties props = new Properties();
props.put("bootstrap.servers", "my108:9092");
//每个消费者分配独立的组号
props.put("group.id", "group1");
//如果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) {
System.out.println("qqqq");
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();
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new ConsumerTest().consume();
}
}
(3)运行所需jar包(在kafka安装包的libs)
kafka-clients-2.1.0.jar
log4j-1.2.17.jar
slf4j-api-1.7.25.jar
slf4j-log4j12-1.7.25.jar
6.关于kafka相关文章
(一)离线安装部署kafka(zookeeper、kafka集群与伪集群)
(二)kafka监控工具(Monitor、manager、eagle)