1.项目架构
kafka:
可以用zookeeper管理Kafka集群
zookeeper:
1)服务注册发现
2)分布式锁
启动服务
执行命令zkServer
$zkServer
JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Usage: ./zkServer.sh {
start|start-foreground|stop|restart|status|upgrade|print-cmd}
$ zkServer status
JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Error contacting service. It is probably not running.
$ zkServer start
JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Starting zookeeper ... STARTED
查看zookeeper运行及状态
安装后,可以看到zookeeper提供了zkCli等工具进行.
$zkCli
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is enabled
[zk: localhost:2181(CONNECTING) 0]
[zk: localhost:2181(CONNECTING) 0]
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0] ls
[zk: localhost:2181(CONNECTED) 1] ls /
[zookeeper]
[zk: localhost:2181(CONNECTED) 2] ls /zookeeper
[quota]
[zk: localhost:2181(CONNECTED) 3] ls /zookeeper/quota
[]
[zk: localhost:2181(CONNECTED) 4]
kafka配置
启动kafka
kafka依赖zookeeper,而kafka中默认已有一个单机版的zookeeper供使用(实际生产环境中不推荐使用默认的zookeeper)
开启zookeeper
cd到kafka的安装目录下:
cd /usr/local/Cellar/kafka/2.7.0
执行脚本启动zookeeper:
bin/zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties
/usr/local/etc/kafka/zookeeper.properties 是zookeeper的配置文件,启动成功如下图:
启动kafka
再打开一个控制窗口,cd到kafka的安装目录下
cd /usr/local/Cellar/kafka/2.1.0
执行脚本启动kafka:
bin/kafka-server-start /usr/local/etc/kafka/server.properties
测试:
首先创建一个主题(topic)
再打开一个控制窗口,cd到kafka的安装目录下
cd /usr/local/Cellar/kafka/2.1.0
执行命令,创建一个主题
bin/kafka-topics --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
–create 创建主题命令
–zookeeper localhost:2181 指定zookeeper
–replication-factor 1 指定副本个数
–partitions 1 指定分区个数
–topic test 主题名称为“test”
查看是否成功创建主题
bin/kafka-topics --list --zookeeper localhost:2181
测试生产者(producer)与消费者(consumer)
打开一个窗口输入命令创建一个生产者:
bin/kafka-console-producer --broker-list localhost:9092 --topic test
打开一个窗口输入命令创建一个消费者:
kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning
使用生产者发送消息,消费者接受消息
2.kafka发送数据
package main
import (
"fmt"
"github.com/Shopify/sarama"
)
// 基于sarama第三⽅库开发的kafka client
func main() {
config := sarama.NewConfig()
tailf包使⽤
config.Producer.RequiredAcks = sarama.WaitForAll // 发送完数据需要
leader和follow都确认
config.Producer.Partitioner = sarama.NewRandomPartitioner // 新选出⼀个
partition
config.Producer.Return.Successes = true // 成功交付的消息
将在success channel返回
// 构造⼀个消息
msg := &sarama.ProducerMessage{
}
msg.Topic = "web_log"
msg.Value = sarama.StringEncoder("this is a test log")
// 连接kafka
client, err := sarama.NewSyncProducer([]string{
"192.168.1.7:9092"},
config)
if err != nil {
fmt.Println("producer closed, err:", err)
return
}
defer client.Close()
// 发送消息
pid, offset, err := client.SendMessage(msg)
if err != nil {
fmt.Println("send msg failed, err:", err)
return
}
fmt.Printf("pid:%v offset:%v\n", pid, offset) }
在/usr/local/var/lib/kafka-logs可以看到对应主题的log日志
3.tail包读取日志文件
把数据一行行读取出来以后,放到自己本身的channel里面
tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容 ,在日志收集中可以实时的监测日志的变化。
package main
import (
"fmt"
"github.com/hpcloud/tail"
"time"
)
func main(){
filename := `./xx.log`
config := tail.Config{
ReOpen: true, //日志过大会自动切割
Follow: true,
Location: &tail.SeekInfo{
Offset: 0, Whence: 2}, //打开这个文件从哪个地方开始读数据
MustExist: false, //允许日志不存在
Poll: true, //轮询方式
}
// 打开文件开始读取数据
tails, err := tail.TailFile(filename, config)
if err != nil {
fmt.Println("tail %s failed, err:%v\n", filename, err)
return
}
// 开始读取数据
var (
msg *tail.Line
ok bool
)
for {
msg, ok = <-tails.Lines // chan tail.Line
if !ok {
fmt.Printf("tail file close reopen, filename:%s\n",
tails.Filename)
time.Sleep(time.Second) // 读取出错等一秒
continue
}
fmt.Println("msg:", msg.Text)
}
}
4.配置文件解析
go-ini 用mapTo吧ini配置文件(类似yml)映射到结构体