1. 使用 fluent-bit 采集文件

1. 使用 fluent-bit 采集文件

简介

Fluent Bit是一款快速、灵活的日志处理器,旨在收集、解析、过滤日志,并将日志发送到远程数据库,以便执行数据分析。

数据分析通常发生在数据存储和数据库索引之后,但对于实时和复杂的分析需求,在日志处理器中处理仍在运行的数据会带来很多好处,这种方法被称为边缘流处理(Stream Processing on the Edge)。

流式处理引擎架构

fluent-bit之所以这么说,其实是因为其架构设计了一个流式的处理引擎:

默认实现组件

fluent-bit实现了不少默认的组件:

  • INPUT
    collectd, cpu-metrics, disk-io-metrics, docker-events, docker-metrics, dummy, exec, fluentbit-metrics, forward, head, health, http, kernel-logs, memory-metrics, mqtt, network-io-metrics, nginx, node-exporter-metrics, process, random, serial-interface, standard-input, statsd, syslog, systemd, tail, tcp, thermal, windows-event-log, windows-event-log-winevtlog, windows-exporter-metrics,

  • OUTPUT
    new-relic, forward, prometheus-remote-write, treasure-data, opensearch, skywalking, prometheus-exporter, azure, azure_blob, postgresql, bigquery, loki, elasticsearch, counter, null, cloudwatch, standard-output, syslog, websocket, flowcounter, logdna, firehose, influxdb, tcp-and-tls, kinesis, stackdriver, kafka-rest-proxy, opentelemetry, stackdriver_special_fields, slack, gelf, s3, datadog, splunk, file, http, kafka, nats

  • FILTERS
    grep, aws-metadata, nightfall, lua, parser, type-converter, nest, record-modifier, standard-output, throttle, multiline-stacktrace, expect, tensorflow, geoip2-filter, modify, checklist, kubernetes, rewrite-tag

  • PARSERS
    ltsv, configuring-parser, regular-expression, decoders, json, logfmt

该系列文章将介绍如何使用Fluent Bit,进行数据采集、处理、分发的过程。

本节将以采集文本文件入手,并结合监控方法来逐步为您展开介绍;

编译部署

前置条件

fluent-bit 采用c语言编写,可以通过容器或者二进制进行部署安装;其占用较少的CPU和内存资源,目前能够兼容绝大部分基于x86、x86_64、arm32v7和arm64v8的系统平台;

为了能够进行在本地进行测试编译,你需要如下依赖环境:

  • GCC or Clang
  • CMake
  • Flex & Bison: 仅当你需要流处理和记录访问器特性(这两种功能默认也是开启的)

编译

# clone 代码
git clone http://github.com/fluent/fluent-bit.git

# 切换到当前最新的一个发布分支
git checkout -b v1.9.1 v.9.1

# 编译
cd build
cmake ..
make

# 安装
# sudo make install 先不着急安装,我们来测试一下

测试

1. 先来创建一个测试路径:

mkdir ~/iSoft/fluent-bit -p
mkdir ~/isoft/fluent-bit/bin
mkdir ~/isoft/fluent-bit/conf
mkdir ~/isoft/fluent-bit/db
mkdir ~/isoft/fluent-bit/data
mkdir ~/isoft/fluent-bit/tmp

# 先将我们编译路径build下bin子路径内的东西全部复制过去
cp build/bin/* ~/iSoft/fluent-bit/bin/

2. 在conf目录下,创建三个配置文件:

fluent-bit.conf

[SERVICE]
    # Flush
    # =====
    # set an interval of seconds before to flush records to a destination
    flush        1

    # Daemon
    # ======
    # instruct Fluent Bit to run in foreground or background mode.
    daemon       Off

    # Log_Level
    # =========
    # Set the verbosity level of the service, values can be:
    #
    # - error
    # - warning
    # - info
    # - debug
    # - trace
    #
    # by default 'info' is set, that means it includes 'error' and 'warning'.
    log_level    info

    # Parsers File
    # ============
    # specify an optional 'Parsers' configuration file
    parsers_file parsers.conf

    # Plugins File
    # ============
    # specify an optional 'Plugins' configuration file to load external plugins.
    # plugins_file plugins.conf

    # HTTP Server
    # ===========
    # Enable/Disable the built-in HTTP Server for metrics
    http_server  On
    http_listen  0.0.0.0
    http_port    2020

    # Storage
    # =======
    # Fluent Bit can use memory and filesystem buffering based mechanisms
    #
    # - http://docs.fluentbit.io/manual/administration/buffering-and-storage
    #
    # storage metrics
    # ---------------
    # publish storage pipeline metrics in '/api/v1/storage'. The metrics are
    # exported only if the 'http_server' option is enabled.
    #
    #storage.metrics on

    # storage.path
    # ------------
    # absolute file system path to store filesystem data buffers (chunks).
    #
    # storage.path /tmp/storage

    # storage.sync
    # ------------
    # configure the synchronization mode used to store the data into the
    # filesystem. It can take the values normal or full.
    #
    # storage.sync normal

    # storage.checksum
    # ----------------
    # enable the data integrity check when writing and reading data from the
    # filesystem. The storage layer uses the CRC32 algorithm.
    #
    # storage.checksum off

    # storage.backlog.mem_limit
    # -------------------------
    # if storage.path is set, Fluent Bit will look for data chunks that were
    # not delivered and are still in the storage layer, these are called
    # backlog data. This option configure a hint of maximum value of memory
    # to use when processing these records.
    #
    # storage.backlog.mem_limit 5M

[INPUT]
    Name   tail
    Path   /home/etl/iSoft/fluent-bit/data/*.txt
    DB     /home/etl/iSoft/fluent-bit/db/tail.db


[OUTPUT]
    Name  stdout
    Match *

parser.conf

[PARSER]
    Name   json
    Format json
    Time_Key time
    Time_Format %d/%b/%Y:%H:%M:%S %z%

plugins.conf
这个文件其实暂时还用不上,是为我们自定义扩展插件的配置文件

[PLUGINS]
    # Path /path/to/out_gstdout.so

3. 启动fluent-bit
先进入到我们自己创建的tmp目录, 创建一些测试数据

cd ~/iSoft/fluent-bit/tmp

cat <<EOF > test-data.txt
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}
EOF

根据上面fluent-bit.conf配置文件当中的INPUT/OUTPUT可以看出,我们利用了tail组件来监听data目录中的txt文件,并将结果输出到标准输出上来;

所以,启动程序

./fluent-bit -c ../conf/fluent-bit.conf 
Fluent Bit v1.9.1
* Git commit: 619277847c6343dea9e4215deacd36cf61caf0a3
* Copyright (C) 2015-2021 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* http://fluentbit.io

[2022/03/20 15:23:43] [ info] [engine] started (pid=15543)
[2022/03/20 15:23:43] [ info] [storage] version=1.1.6, initializing...
[2022/03/20 15:23:43] [ info] [storage] in-memory
[2022/03/20 15:23:43] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
[2022/03/20 15:23:43] [ info] [cmetrics] version=0.3.0
[2022/03/20 15:23:43] [ info] [output:stdout:stdout.0] worker #0 started
[2022/03/20 15:23:43] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020
[2022/03/20 15:23:43] [ info] [sp] stream processor started

ok, fluent-bit已经阻塞开始监听了

4. 开始测试

重新开启一个终端创口,进入到创建好的tmp目录,将测试数据手动批量的输出到data目录下:

cd ~/iSoft/fluent-bit/tmp
cat test-data.txt >> ../data/test.txt
cat test-data.txt >> ../data/test.txt
cat test-data.txt >> ../data/test.txt
cat test-data.txt >> ../data/test.txt
cat test-data.txt >> ../data/test.txt
cat test-data.txt >> ../data/test.txt
cat test-data.txt >> ../data/test.txt

这时可以看到fluent-bit阻塞的窗口已经在一直输出了

Fluent Bit v1.9.1
* Git commit: 619277847c6343dea9e4215deacd36cf61caf0a3
* Copyright (C) 2015-2021 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* http://fluentbit.io

[2022/03/20 15:23:43] [ info] [engine] started (pid=15543)
[2022/03/20 15:23:43] [ info] [storage] version=1.1.6, initializing...
[2022/03/20 15:23:43] [ info] [storage] in-memory
[2022/03/20 15:23:43] [ info] [storage] normal synchronization mode, checksum disabled, max_chunks_up=128
[2022/03/20 15:23:43] [ info] [cmetrics] version=0.3.0
[2022/03/20 15:23:43] [ info] [output:stdout:stdout.0] worker #0 started
[2022/03/20 15:23:43] [ info] [http_server] listen iface=0.0.0.0 tcp_port=2020
[2022/03/20 15:23:43] [ info] [sp] stream processor started
[2022/03/20 15:23:43] [ info] [input:tail:tail.0] inotify_fs_add(): inode=11409520 watch_fd=1 name=/home/etl/iSoft/fluent-bit/data/test.txt
[0] tail.0: [1647761052.113552720, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[0] tail.0: [1647763863.114999757, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[1] tail.0: [1647763863.403883305, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[0] tail.0: [1647763893.545292283, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[0] tail.0: [1647763954.515264556, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[1] tail.0: [1647763954.515268143, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[2] tail.0: [1647763954.515268725, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[3] tail.0: [1647763954.515269171, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[4] tail.0: [1647763954.515269621, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[5] tail.0: [1647763954.515270065, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[6] tail.0: [1647763954.515270512, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[7] tail.0: [1647763954.515270965, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[8] tail.0: [1647763954.515271452, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]
[9] tail.0: [1647763954.515276040, {"log"=>"{"log":"Done","stream":"stdout","time":"2018-02-19T23:25:29.1845622Z"}"}]

小结

通过上面的配置文件fluent-bit.conf看到,我们为INPUT tail组件,还配置了一个DB参数,那是因为tail组件采用了嵌入式的sqlite3的数据库来记录监听文件的偏移量,我们可以去查看一下:

cd ~/iSoft/fluent-bit/db
sqlite3 tail.db 
sqlite> .schema
CREATE TABLE in_tail_files (  id      INTEGER PRIMARY KEY,  name    TEXT NOT NULL,  offset  INTEGER,  inode   INTEGER,  created INTEGER,  rotated INTEGER DEFAULT 0);
sqlite> 
sqlite> select * from in_tail_files ;
1|/home/etl/iSoft/fluent-bit/data/test.txt|77520|11409520|1647761023|0
sqlite> 

通过字段名称可以看出来,分别是文件全路径名称、读取到的文件偏移量(字节数)、文件inode、文件创建时间、文件滚动标记

监控

根据fluent-bit官网的介绍,我们在上面的配置文档中,将fluent-bit进程的http_server设置为On,并且暴露在2020端口上,那么我们可以使用如下两个接口来查看其输出情况:

curl -s http://127.0.0.1:2020/api/v1/uptime | jq
{
  "uptime_sec": 391,
  "uptime_hr": "Fluent Bit has been running:  0 day, 0 hour, 6 minutes and 31 seconds"
}


curl -s http://127.0.0.1:2020/api/v1/metrics | jq
{
  "input": {
    "tail.0": {
      "records": 1,
      "bytes": 88,
      "files_opened": 1,
      "files_closed": 0,
      "files_rotated": 0
    }
  },
  "filter": {},
  "output": {
    "stdout.0": {
      "proc_records": 1,
      "proc_bytes": 88,
      "errors": 0,
      "retries": 0,
      "retries_failed": 0,
      "dropped_records": 0,
      "retried_records": 0
    }
  }
}

拉取promethues grafana镜像

fluent-bitpromethues提供了监控接口,那么我们来尝试一下:

在本地拉取promethues和grafana的镜像(这里就简单的将这两位泡在容器里)

docker pull prom/prometheus
docker pull grafana/grafana

配置promethues

mkdir ~/isoft/prometheus
vim ~/isoft/prometheus/fluent-bit-prom.yaml

这里为prometheus增加了一个job,因为是运行在docker里面,所以选择了另外一个宿主机IP, 以能否访问运行在宿主机上的fluent-bit

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090"]
  - job_name: "fluent-bit"
    metrics_path: '/api/v1/metrics/prometheus' # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      # 宿主机IP
      - targets: ["192.168.241.1:2020"]

启动

docker run -d -p 9090:9090 --name prom -v /home/etl/iSoft/prometheus/fluent-bit-prom.yaml:/etc/prometheus/prometheus.yml prom/prometheus

通过浏览器访问 http://localhost:9090/

配置grafana

mkdir ~/isoft/grafana/storage -p
chmod 777 ~/isoft/grafana/storage

启动

docker run -d -p 3000:3000 --name grafana -v /home/etl/iSoft/grafana/storage:/var/lib/grafana grafana/grafana

添加promethues数据源

导入fluent-bit提供的默认dashboard
fluent-bit-dashboard.json

查看监控界面
输入项

输出项

发现资源都叫 tail.0,所以根据文档,将配置文件INPUT/OUTPUT处增加两个别名,以区分可能监控到的多个配置

[INPUT]
   Name   tail
   Path   /home/etl/iSoft/fluent-bit/data/*.txt
   DB     /home/etl/iSoft/fluent-bit/db/tail.db
   Alias  monitor_txt_file
[OUTPUT]
   Name  stdout
   Match *
   Alias output_txt_file

再次查看监控界面
输入项

输出项

总结

至此,先完成初步测试,感兴趣的同学可以持续关注,后续会逐个介绍异构数据处理和发送(尽量多介绍相关组件和场景的使用)、如何使用pipline streaming的窗口SQL统计、为fluent-bit开发扩展组件等功能;

至于windows环境编译较为复杂(需要微软编译环境,我已测试过),感兴趣的同学,可以直接从github下载对应的win版本来进行测试;(我测试是OK的)

本文转载于网络 如有侵权请联系删除

相关文章

  • LeetCode-498-对角线遍历

    #LeetCode-498-对角线遍历给定一个含有MxN个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。示例:输入: [ [1,2,3], [4,5,6], [7,8,9] ] 输出:[1,2,4,7,5,3,6,8,9]复制说明:给定矩阵中的元素总数不会超过100000。#解题思路方法1、模拟路径,观察图可以知道对角线位置的横纵坐标之和等于第一行的该对角线元素索引号,以第一行为例,奇数往右上走,偶数往左下走,对于越界的不添加,将他按左下或右上移动,直到到矩阵位置里面进行添加。这种方法的缺点是遍历了很多没有用的位置,浪费了时间,运行时间93ms方法2、简化问题,直接遍历每个对角线,翻转奇数对角线数值即可,外层循环为所有对角线初始点。运行时间7ms还有一些其他更简单的方法,时间和空间上消耗都比较少,可以右转leetcode看看~#Java代码1publicstaticint[]findDiagonalOrder(int[][]matrix){ if(matrix==null||matrix.length==0){ returnnewint

  • LeetCode 训练场:1464. 数组中两元素的最大乘积

    1.题目1464.数组中两元素的最大乘积2.描述给你一个整数数组nums,请你选择数组的两个不同下标i和j_,_使(nums[i]-1)*(nums[j]-1)取得最大值。 请你计算并返回该式的最大值。3.思路将数组进行排序后,取最后的两元素进行相乘返回即可,主要进行排序操作,时间复杂度为O(n*logn).4.实现publicintmaxProduct(int[]nums){ //现将数组进行排序 Arrays.sort(nums); //然后选取排序后数组的最后两个元素乘积 intsize=nums.length; return(nums[size-1]-1)*(nums[size-2]-1); }复制

  • MCU缺货涨价后的国产化浪潮(三):全球 MCU 市场高度集中,多因素共振加速国产替代

    中国MCU当前市场存量约250-300亿元,本土厂商超过100家,但合计市占率却不足15%,虽然在性价比方面有独特优势,但产品系列及生态建设方面差距不小,且大多数厂商集中在消费类市场,工控和汽车还有待拓展。国内MCU厂商该如何发力?今年AI电堂陆续发布过关于MCU的相关文章。如果大家想了解STM32如何在这一年成为理财芯片的,可以阅读往期文章,《缺货涨价行情下,国产替代真的那么香吗?》,《MCU的2020与2021》。本篇为系列文章第三篇,MCU产能增长相对有限,未来供需结构将趋于平衡。《MCU缺货涨价后的国产化浪潮》系列文章:▷第一篇:MCU需求端多样化,汽车和物联网引领未来成长▷第二篇:MCU产能增长相对有限,未来供需结构将趋于平衡▷第三篇:全球MCU市场高度集中,多因素共振加速国产替代▷第四篇:MCU会是中国芯片本土化的下一个亮点吗?1全球Top5MCU巨头占据75%以上市场,内生外延产品布局完善MCU在海外是一个很成熟的行业,已经形成非常稳定的竞争格局,全球前五大MCU厂商市占率合计超75%,目前MCU大厂形成各有特色的市场布局。 瑞萨电子:汽车业务占比较高,收购IDT和Dia

  • 天池 在线编程 订单分配(回溯)

    文章目录1.题目2.解题1.题目描述 打车派单场景,假定有N个订单,待分配给N个司机。 每个订单在匹配司机前,会对候选司机进行打分,打分的结果保存在N*N的矩阵score,其中score[i][j]代表订单i派给司机j的分值。 假定每个订单只能派给一位司机,司机只能分配到一个订单。 求最终的派单结果,使得匹配的订单和司机的分值累加起来最大,并且所有订单得到分配。题目保证每组数据的最大分数都是唯一的示例样例1 输入: [[1,2,4],[7,11,16],[37,29,22]] 输出: [1,2,0] 解释: 标号为0的订单给标号为1的司机,获得score[0][1]=2分, 标号为1的订单给标号为2的司机,获得score[1][2]=16分, 标号为2的订单给标号为0的司机,获得score[2][0]=37分, 所以一共获得了2+16+37=55分。复制https://tianchi.aliyun.com/oj/403958541416425656/4305424464155164422.解题classSolution{ public: /** *@paramscore:Whenthe

  • 马斯克放话:6个月内公测卫星互联网!颠覆5G的将不是6G

    十三雷刚发自凹非寺 量子位报道「3个月内私人内测,6个月内公测。」这就是马斯克透露的卫星互联网业务的最新时间表。 就在本周,随着60颗星链卫星成功发射,现在StarLink已有420颗卫星运行于地球轨道。按照马斯克吹下的牛,它们的使命,将是替代光纤,给全球提供高速、稳定又便宜的网络连接。但这幅宏伟蓝图里,需要12000颗——现在进程才完成3.5%。 不过,马斯克何以是马斯克?他有创新的天才,打破常规的勇气,更知道如何用商业成功证明自己、积累更大的势能。所以用现在的420颗卫星,马斯克希望自己心心念念的「卫星互联网」,可以让一部分人先用起来。这是一个怎样的疯狂想法?让我们先赘述下Starlink计划——野心跟马斯克的其他项目一样大。上面也介绍了,这个计划核心是SpaceX会利用猎鹰9号可回收火箭,将12,000颗卫星送到轨道平面,然后组成卫星通信群,为全球网民提供高速宽带服务。其中一组4425颗卫星,将坐落在约1200千米的高度,而7518颗卫星将坐落在约300千米的高度,并以不同的无线电频率运行。这样一个庞大的卫星群将实时围绕地球运转,据称可以在任何时间提供地球任何地点的宽带覆盖。12

  • java服务端推送消息有那么难吗?

    场景今天项目经理交给我一个开发任务。如果有人在前台下了订单就给后台仓库管理一个发货通知。也就是服务端触发一个事件,推送消息到客户端。如果我用websocket来做还要搞个websocket服务器,而且还有不少配置。websocket是全双工通信,单向通信简直是杀鸡用牛刀。用轮询吧,浪费服务器资源不说,还不一定实时,订单处理慢了岂不是怠慢了客户。有没有别的选择呢?当然有!1SSE推送技术SSE全称Server-sentEvents,是HTML5规范的一个组成部分,具体去MDN网站查看相关文档。该规范十分简单,主要由两个部分组成:第一个部分是服务器端与浏览器端之间的通讯协议,第二部分是在浏览器端可供JavaScript使用的EventSource对象。通讯协议是基于纯文本的简单协议。服务器响应的内容类型是“text/event-stream”。响应文本的内容可以看成是一个事件流,由不同的事件所组成。每个事件由类型和数据两部分组成,同时每个事件可以有一个可选的标识符。不同事件的内容之间通过仅包含回车符和换行符的空行(“\r\n”)来分隔。每个事件的数据可能由多行组成。如上图所示,每个事件之间

  • 系统架构设计方法论——Zachman框架模型

    驾驭复杂系统的整体设计整个体系的架构设计和价值事物背后的思考Zachmanproposesalogicalstructureforclassifyingandorganizingthedescriptiverepresentationsofanenterprise,indifferentdimensions,andeachdimensioncanbeperceivedindifferentperspectives. [AMethodtoDefineanEnterpriseArchitectureusingtheZachmanFramework(CarlaMarquesPereira,PedroSousa)] Zachman框架(ZachmanFramework™)是一个纲目(schema)——两种有几千年历史的分类法的交集。第一种是建立在原始疑问词上的沟通基础要素:什么、如何、何时、何人、何地以及为何。这些问题答案的集成,能够对复杂的想法形成全面、综合的描述。第二种来自具体化,即古希腊哲学中假定的抽象观念到实例的转换,在Zachman框架中记为:辨别、定义、表达、规定、配置和实例化。Z

  • 腾讯云学生服务器

    小编自己购买了学生机使用后可以说是想要强烈推荐给大家了。首先说说价格,现在的一个秒杀活动,新用户购买1核1G的一年230元,而我们的学生机1核2G只需要120,更刺激的是用户完成学生信息填写,即能获得2次以购买价续费的资格,也就是说我们可以360元购买1核2G的服务器三年,简直不能再美了。购买地址活动规则活动对象:   面向腾讯云官网通过个人认证的在校大学生。  【注】企业用户、协作者、后付费用户暂不支持参与此活动。活动时间:   2017年9月26日--2019年7月1日活动规则:符合条件的用户可购买腾讯云服务器校园优惠套餐,套餐内包含云服务器,对象存储,域名(可选),可选产品需加价购买同一个身份证号码、手机号对应的多个账号仅限一个帐号购买本套餐每日限量100个,每个用户限购1个,此前购买旧版学生套餐的用户也可购买若提升了配置,或调整了网络带宽,将无法进行优惠续费不支持降配和带宽计费模式切换,退款后将不再保留购买资格购买产品若发生退款,参照官网退款规则本次活动不支持代金券支付续费规则:用户需先完成学生信息填写,即能获得2次以购买价续费的资格,优惠续费需在本活动页面进行,可选时长:1、

  • 腾讯云验证码更新历史

    第13次发布发布时间:2022-11-0206:08:36 本次发布包含了以下内容: 改善已有的文档。 新增接口: GetTicketStatistics 第12次发布发布时间:2022-10-1906:11:45 本次发布包含了以下内容: 改善已有的文档。 修改接口: GetTotalTicketStatistics 新增入参:StartTimeStr,EndTimeStr,Dimension 新增出参:Data,CaptchaCode,CaptchaMsg 新增数据结构: CaptchaStatisticObj InterceptPerTrendObj RequestTrendObj TicketCheckTrendObj 第11次发布发布时间:2022-10-1806:13:00 本次发布包含了以下内容: 改善已有的文档。 新增接口: GetTotalTicketStatistics 第10次发布发布时间:2022-10-1006:11:02 本次发布包含了以下内容: 改善已有的文档。 修改接口: DescribeCaptchaDataSum 新增出参:Ti

  • Bash 的 no-fork 优化

    我们知道,Bash在执行一个外部命令时,会先fork()一个子进程,然后在子进程里面执行execve()去加载那个外部程序。fork子进程是会耗性能的,所以Bash会在下面几种情况下不fork子进程,直接在当前进程执行execve()。 bash-c'command' 如果用了bash-c的形式启动Bash,同时-c选项的参数里只包含一个命令,比如bash-c'sleep666',这时Bash不会fork子进程去运行sleep命令,它会让sleep直接占用自己现有的进程: $bash-c'sleep666'& $pstree-ap ... | `-bash,3117 |   |-pstree,3119-ap |   `-sleep,3118666 ... 3117是我当前敲入命令的交互Shell,3118就是bash-c启动的那个进程,然后直接被替换成了sleep,pid还是3118。 我们可以看一下Bash无法优化的情况下,进程树是什么样的:  $bash-c'sleep6

  • Zabbix监控MySQL

    Zabbix监控MySQL agent端 $vim/usr/local/zabbix/etc/zabbix_agentd.conf #添加自定义的目录 Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/*.conf $cp/usr/local/src/zabbix-3.4.15/conf/zabbix_agentd/userparameter_mysql.conf/usr/local/zabbix/etc/zabbix_agentd.conf.d/ $cd/usr/local/zabbix/etc/ #mysql会去读取里面的配置,这样可以不用在配置中写上用户名和密码 $vim.my.cnf [mysql] host=localhost user=zabbix password=123456789 socket=/var/lib/mysql/mysql.sock [mysqladmin] host=localhost user=zabbix password=123456789 socket=/var/lib/mysql/my

  • RESTful API规范

    转自阮一峰老师的网络日志 RESTful 是目前最流行的API设计规范,用于Web数据接口的设计。 它的大原则容易把握,但是细节不容易做对。本文总结RESTful的设计细节,介绍如何设计出易于理解和使用的API。 一、URL设计 1.1动词+宾语 RESTful的核心思想就是,客户端发出的数据操作指令都是"动词+宾语"的结构。比如,GET/articles这个命令,GET是动词,/articles是宾语。 动词通常就是五种HTTP方法,对应CRUD操作。 GET:读取(Read) POST:新建(Create) PUT:更新(Update) PATCH:更新(Update),通常是部分更新 DELETE:删除(Delete) 根据HTTP规范,动词一律大写。 1.2动词的覆盖 有些客户端只能使用GET和POST这两种方法。服务器必须接受POST模拟其他三个方法(PUT、PATCH、DELETE)。 这时,客户端发出的HTTP请求,要加上X-HTTP-Method-Override属性,告诉服务器应该使用哪一个动词,覆盖POST方法。 POST/api/Perso

  • 迭代器模式 - 设计模式学习

      迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。   当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。同时,你需要对聚集有多重方式遍历时们可以考虑用迭代器模式。   实际上,到目前为止,迭代器的实用价值不大,因为很多高级编程语言,如C#,java等本身已经把这个模式做在语言中了,就是foreach。另外想IEnumerable接口也是为迭代器模式准备的。   下面给出迭代器模式的UML示例图:      下面给出迭代器模式的代码结构: namespaceConsoleApplication1 { //Iterator迭代器抽象类 abstractclassIterator { publicabstractobjectFirst();//用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法统一接口 publicabstractobjectNext(); publicabstractboolIsDone(); publicabstractobjectCurren

  • 二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。 对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。 输入描述: 每组数组包含网格长宽W,

    二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))的算术平方根小易想知道最多可以放多少块蛋糕在网格盒子里。  输入描述: 每组数组包含网格长宽W,H,用空格分割.(1≤W、H≤1000)复制 输出描述: 输出一个最多可以放的蛋糕数复制   输入例子: 32复制   输出例子: 4复制 #include<iostream> usingnamespacestd; intmain() { intW,H; while(scanf("%d%d",&W,&H)>0) { intcnt=0; if(W%4==0||H%4==0) cnt=W*H/2; elseif(W%2==0&&H%2==0) cnt=(W*H/4+1)*2; else cnt=W*H/2+1; cout<<c

  • (转)PC端常见分辨率

    1024*600           (常见8、9寸电脑使用)1024*768           (常见10.4、12.1、14.1、15寸电脑使用)1280*1024           (常见14.1、15寸电脑使用)1280*800           (常见10.8、12.1、15.4寸电脑使用)1280*854           (不常见)1366*768      &nb

  • AD域服务端配置策略:客户端系统自动更新补丁

    【实现目的】通过策略下发设定域的计算机系统在指定的时间内,下发更新和安装 1、打开【组策略管理】→【计算机配置】→【策略】→【管理模板】→【Windows组件】→【Windows更新】2、配置部分:  (1)配置自动更新:    【已启动】→【配置自动更新】(选择:自动下载并计划安装)→【计划安装日期】(每月第三周/周五)→【计划安装时间】(12:30)  (2)指定InternetMicrosoft更新服务位置:    【已启动】→【更新服务器位置和统计服务位置】127.0.0.1(下图配置)      

  • PCIE_DMA实例一:xapp1052详细使用说明

    一:前言 很多和我一样初学pcie的硬件工程师都会遇到这样一个问题,看了不少pcie相关的资料,还是搞不清这玩意儿到底该怎么用。于是我们打开ISE的core_generator工具,生成了一个pcie的ip核,用modelsim仿真一下exampledesign,仔细分析一下,好像对协议部分理解更深了。至于怎么用,呵呵…… 当然,多数硬件工程师都是有上进心的!于是我们上网找资料,发现了一个xilinx官方出品的demo:xapp1052。全称是BusMasterDMAPerformanceDemonstrationReferenceDesignfortheXilinxEndpointPCIExpress®Solutions。高大上啊,终于知道用在什么地方了,果断下载下来。打开一看,东西不少,按照里面xapp1052.pdf的说明,一步一步生成bit,下载到开发板里,然后安装上位机软件,最后测试并且用chipscope抓信号分析。但事实上,你愚蠢得连bit都生成不了(遇到相同情况的朋友请默默为我点赞)。就在你干着急的时候,你看到了这篇伟大的博客……接下来,我将手把手教你如何使用这个xap

  • rest_framework开发API

    一.什么是RESTful  REST与技术无关,代表的是一种软件架构风格,REST是RepresentationalStateTransfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:ResourceOrientedArchitecture) 二.RESTfulAPI设计的十条规范 1.API与用户的通信协议,总是使用HTTPs协议 2.域名  https://api.example.com尽量将API部署在专用域名(会存在跨域问题) https://example.org/api/API很简单(不存在跨域问题)复制 3.版本 URL,如:https://api.exampl

  • react ant-menu-item-selected选中的菜单样式修改

    之前引入的方式是 importstylesfrom'./index.less'; 复制 然后我在index.less里修改,没有一点反应,后来发现上面引入的方式只是把样式导进去,用不用不清楚,这个时候需要加上 import'./index.less'; 复制 然后index.less里面的样式就可以生效了 .ant-menu-dark.ant-menu-dark:not(.ant-menu-horizontal).ant-menu-item-selected{ background-color:#2970FF; } 复制

  • 【Amadeus原创】SQLServer2008防小人利器:审核/审计功能

    小人见怪不怪,世界上最可怕的就是会技术的小人,防不胜防! sa密码泄露也就算了,关键是人家也可以前台攻击,直接把你弄的没辙! 在诅咒这种小人的同时,除了加强服务器安全管理,密码策略等,SQLServer2008开始,又出现了一个更牛叉的功能:审核。 对外可以优雅地声称,叫防黑客,对内,这技术叫防小人! 这审核功能,无非就是看一下有哪些人试图入侵数据库服务器,入侵了之后是否有drop表,是否有delete数据 开始吧: 1,打开数据库-安全性-审核,右击审核-新建审核 2,修改:审核名称,指定服务器的文件路径,确定,右键-启用审核 3,创建一个testDB(DEMO使用,自己有库的忽略) usemaster; GO IFDATABASEPROPERTYEX('testDB','version')>0 BEGIN ALTERDATABASEtestDBSETSINGLE_USER WITHROLLBACKIMMEDIATE; DROPDATABASEtestDB; END CREATEDATABASEtestDB; GO usetestDB; GO CREATET

  • 查询Sqlserver数据库死锁的一个存储过程

     使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁,死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉。利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. 创建sp_who_lock存储过程   CREATEproceduresp_who_lock as begin declare@spidint declare@blkint declare@countint declare@indexint declare@locktinyint set@lock=0 createtable#temp_who_lock ( idintidentity(1,1), spidint, blkint ) if@@error<>0return@@error insertinto#temp_who_lock(spid,blk) select0,blocked from(select*frommaster..sysprocesseswhereblocked&g

相关推荐

推荐阅读