本节主要内容:

1. 日志收集系统设计
2. 日志客户端开发

1. 项目背景
    a. 每个系统都有日志,当系统出现问题时,需要通过日志解决问题
    b. 当系统机器比较少时,登陆到服务器上查看即可满足
    c. 当系统机器规模巨大,登陆到机器上查看几乎不现实

2. 解决方案
    a. 把机器上的日志实时收集,统一的存储到中心系统
    b. 然后再对这些日志建立索引,通过搜索即可以找到对应日志
    c. 通过提供界面友好的web界面,通过web即可以完成日志搜索

3. 面临的问题
    a. 实时日志量非常大,每天几十亿条
    b. 日志准实时收集,延迟控制在分钟级别
    c. 能够水平可扩展

4. 业界方案ELK

    日志收集系统架构

Go语言学习之11 日志收集系统kafka库实战

    该方案问题:

    a. 运维成本高,每增加一个日志收集,都需要手动修改配置
    b. 监控缺失,无法准确获取logstash的状态
    c. 无法做定制化开发以及维护

6. 日志收集系统设计

 Go语言学习之11 日志收集系统kafka库实战

    各组件介绍:
    a. Log Agent,日志收集客户端,用来收集服务器上的日志
    b. Kafka,高吞吐量的分布式队列,linkin开发,apache顶级开源项目
    c. ES,elasticsearch,开源的搜索引擎,提供基于http restful的web接口
    d. Hadoop,分布式计算框架,能够对大量数据进行分布式处理的平台

7. kafka应用场景
    1. 异步处理, 把非关键流程异步化,提高系统的响应时间和健壮性

Go语言学习之11 日志收集系统kafka库实战

Go语言学习之11 日志收集系统kafka库实战

 

     2. 应用解耦,通过消息队列

Go语言学习之11 日志收集系统kafka库实战

    3. 流量削峰3. 流量削峰

Go语言学习之11 日志收集系统kafka库实战

 

 8. zookeeper应用场景

     1. 服务注册&服务发现

 Go语言学习之11 日志收集系统kafka库实战

 

     2. 配置中心

Go语言学习之11 日志收集系统kafka库实战

    3. 分布式锁

  • Zookeeper是强一致的
  • 多个客户端同时在Zookeeper上创建相同znode,只有一个创建成功

 9. 安装kafka

     见博客:https://www.cnblogs.com/xuejiale/p/10505391.html

10. log agent设计

Go语言学习之11 日志收集系统kafka库实战

11. log agent流程

 Go语言学习之11 日志收集系统kafka库实战

11. kafka示例

      先导入第三方包:

github.com/Shopify/sarama

     我的kafka和ZooKeeper都安装在Linux(Centos6.5,ip: 192.168.30.136)上:

 1 package main
 2 
 3 import (
 4     "fmt"
 5     "time"
 6     "github.com/Shopify/sarama"
 7 )
 8 
 9 func main() {
10 
11     config := sarama.NewConfig()
12     config.Producer.RequiredAcks = sarama.WaitForAll
13     config.Producer.Partitioner = sarama.NewRandomPartitioner
14     config.Producer.Return.Successes = true
15 
16     client, err := sarama.NewSyncProducer([]string{"192.168.30.136:9092"}, config)
17     if err != nil {
18         fmt.Println("producer close, err:", err)
19         return
20     }
21 
22     defer client.Close()
23     for {
24         msg := &sarama.ProducerMessage{}
25         msg.Topic = "nginx_log"
26         msg.Value = sarama.StringEncoder("this is a good test, my message is good")
27 
28         pid, offset, err := client.SendMessage(msg)
29         if err != nil {
30             fmt.Println("send message failed,", err)
31             return
32         }
33 
34         fmt.Printf("pid:%v offset:%v\n", pid, offset)
35         time.Sleep(time.Second)
36     }
37 }
kafka示例

相关文章: