下载 elasticsearch-head cd /usr/local git clone https://github.com/mobz/elasticsearch-head 安装 npm 国内的 npm 很慢, 推荐使用 taobao 的镜像 使用 npm 别名方式 # 默认 bash vim ~/.bashrc # 如果你使用的是 zsh 的话 vim ~/.zshrc # 最后一行添加 alias cnpm="npm --registry=https://registry.npm.taobao.org \ --cache=$HOME/.npm/.cache/cnpm \ --disturl=https://npm.taobao.org/dist \ --userconfig=$HOME/.cnpmrc" # 验证一下 cnpm -v 修改 Gruntfile.js 修改 elasticsearch-head 对外提供服务的配置 cd /usr/local/elasticsearch-head vim Gruntfile.js # 大约96行, connect.server.options 节点 修改连接 es 服务的配置 cd /usr/local/elasticsearch-head vim _site/app.js # 大约 4374 行 修改 elasticsearch.yml 文件 使用 head 助手需要 es 允许跨域访问
Elasticsearch 是什么 Elasticsearch(ES) 是一个 Lucene 构建的开源,分布式,RESTful 接口全文搜索引擎. 还是一个分布式文档数据库, 其中每个字段均是被索引的数据且可被搜索,它能够扩展至数以百计的服务器存储以及处理PB级的数据.它可以在很短的时间内存储, 搜索和分析大量的数据. Elasticsearch就是为高可用和可扩展(水平扩展)而生 优点 横向可扩展性: 只需要增加一台服务器, 调整一点儿配置,启动一下Elasticsearch进程就可以并入集群. 分片机制提供更好的分布性: 同一个索引分成多个分片(sharding), 这点类似于HDFS的块机制,分而治之的方式可提升处理效率. 高可用:提供复制(replica)机制,一个分片可以设置多个复制,使得某台服务器在宕机的情况下,集群仍可以照常运行,并会把服务器宕机丢失的数据信息复制恢复到其它可用节点上. 使用简单:解压即可使用. 无需安装(bin/elasticsearch). 相关产品 Beats 它是一个代理, 将不同类型的数据发送到Elasticsearch中. Filebeat: 主要用于转发和集中日志数据。 Metricbeat: 定期收集操作系统、软件或服务的指标数据 Metricbeat支持收集的module非常多,常用的有docker、kafka、mysql、nginx、redis、zookeeper等等 Packetbeat: 是一款轻量型网络数据包分析器,Packetbeat的工作原理是捕获应用程序服务器之间的网络流量,解码应用程序层协议(HTTP,MySQL,Redis等) Winlogbeat: Windows 事件日志 Auditbeat: Auditbeat 允许您在 Linux、macOS 和 Windows 平台上仔细监控任何您感兴趣的文件目录,主要用来记录安全信息,用于对系统安全事件的追溯 Heartbeat: 主要是检测服务或主机是否正常运行或存活,Heartbeat 能够通过 ICMP、TCP 和 HTTP 进行 ping 检测。 Functionbeat: 是在无服务器环境中部署的Elastic Beat,用于收集由云服务生成的事件并将事件发送到Elasticsearch。 Lucene 倒排索引 倒排索引与之相对是正向索引. 正向索引是通过 key 找 value, 倒排索引是对关键字建立倒排索引 正排索引: 文档ID到文档内容和单词的关联 倒排索引: 单词到文档ID的关系 例如, 假设我们有两个文档, 每个文档的内容如下: 我是一名程序员 我是一名高级程序员 为了创建倒排索引, 我们首先将每个文档的content域拆分成单独的词(称词条),创建一个包含所有不重复词条的排序列表,然后列出每个词条出现在哪个文档。结果如下所示:
概要 Elasticsearch对外提供的API遵循REST原则 GET POST PUT DELETE 简介 _index 索引, 文档在哪儿存放 _type 类型, 7.x以后都使用 _doc类型 _id 文档唯一标识, 不指定则自动生成. 一个文档的 _index 、 _type 和 _id 唯一标识一个文档 基本RESTful操作 新增记录 create 二种操作. PUT, POST PUT方法, /{_index}/_create/{id} 如果文档存在,操作失败 还可以使用 /{_index}/_doc/{id}?op_type=create # 创建一个文档, 如果文档存在,操作失败 # 使用_create PUT /student/_create/1 { "name": "张三", "age":19, "sex":1 } # 使用 _doc指定操作类型 PUT /student/_doc/3?op_type=create { "name": "张三丰", "age":600, "sex":1 } # 自动生成ID PUT /student/_doc/ { "name": "张三元", "age":600, "sex":1 } POST方法 {index}/_doc/{id} 如果文档不存在则创建新文档, 文档存在则旧文档删除, 新的文档被索引, 版本信息+1

Redis 配置

配置文件目录 以上是常见的redis存放目录 vim /etc/redis.conf vim /etc/redis/6379.conf 启动配置 # 后台运行: yes 是, no 不是 daemonize yes # 提供服务的端口 port 6379 # 对外提供的ip地址 bind 127.0.0.1 # 只允许本地连接,如果没有其它服务访问, 推荐这种. bind 10.11.12.9 # 只允许局域网连接, 还有其它服务访问, [推荐] bind 0.0.0.0 # 允许任意连接 # 设置客户端连接后进行任何其他指定前需要使用的密码。 requirepass mypass 限制配置 内存设置 默认redis没有内存上限, 如果超时物理内存就会实例挂掉. 所以勿必设置内存大小, 然后配合淘汰策略使用. # 连接数限制 如果设置 maxclients 0,表示不作限制。 # 注意 2g 和 2gb 是有区别的. 见下面, 大小写不区分. maxclients 1024 maxmemory 2gb 设置完后可以在: info memory看到 maxmemory:2147483648 maxmemory_human:2.00G 配置内存大小参考 # 1k => 1000 bytes # 1kb => 1024 bytes # 1m => 1000000 bytes # 1mb => 1024*1024 bytes # 1g => 1000000000 bytes # 1gb => 1024*1024*1024 bytes 淘汰策略设置 # volatile-lru -> 利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ) # allkeys-lru -> 利用LRU算法移除任何key # volatile-random -> 移除设置过过期时间的随机key # allkeys->random -> remove a random key, any key # volatile-ttl -> 移除即将过期的key(minor TTL) # noeviction -> 不移除任何可以,只是返回一个写错误 maxmemory-policy volatile-lru 快照配置 # save 900 1 900秒内至少有1个key被改变 # save 300 10 300秒内至少有300个key被改变 # save 60 10000 60秒内至少有10000个key被改变 save 900 1 save 300 10 save 60 10000 # 存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes rdbcompression yes # 本地持久化数据库文件名,默认值为dump.

Tcp/Ip

1. 什么是TCP/IPP 1.1. 什么网络协议 网络协议是一组用于网络上的计算机(或其他设备)之间通信的规则和数据格式的集合. 1.2. TCP/IP 在internel和很多其他网络上使用的网络协议族. 1.3. 端口 端口是用来将数据路由到适当网络应用程序的逻辑通道 1.4. DNS 负责将域名映射为IP地址 1.5. 路由器 通过逻辑地址来转发数据的一种网络设备,并且也可以将大型网络分为几个较小的子网.也可以 将一个局域子网从较大的网络中分离出来. 2. TCP/IP如何工作 2.1. tcp/ip四层模型 应用层: 提供网络排错设施,文件传输,远程控制和其他基于网络的工具,此外它还提供应用程序用来访问网络的API 传输层: 提供错误检测,流量控制,确认服务 网际层: 为数据报提供逻辑寻址和路由 网络访问层: 提供物理硬件的接口. 2.2. OSI七层模型 应用层: 为应用程序提供网络接口,支持文件传输,通信等功能的网络应用 表示层:把数据转换为标准格式,管理数据加密与压缩 会话层: 在计算机通信应用程序之间建立会话 传输层: 为网络提供错误控制和数据流控制 网络层: 支持逻辑寻址与路由选择. 数据链路层: 提供与网络适配器相连的接口,维护子网的逻辑链接 物理层:将数据转换为传输介质上的电子流或模拟脉冲,并且监视数据的传输 2.3. 哪一层处理帧 网络访问层. 2.4. 每一层封装数据的真实含义? 在发送端. 数据向下传输到下一层之前,会先在数据中附加一个特定层的报头. 在接收端,数据的还原需要进行一个封装的反过程,从物理层向上直到应用层,随着数据逐层向上传递,协议数据单元的报头及报尾被一层层剥离。 最终实现了数据从发送端到接收端的传递。 2.5. TCP 传输控制协议 传输层中一个可靠的, 面向连接的协议. 面向连接的协议提供更复杂的流量控制和错误控制, 相比UDP更可靠.因额外需要错误检查,所以比UDP慢 2.6. UDP 用户数据报协议 传输层中一个不可靠的,无连接的协议.比TCP快, 它把错误控制的责任推给了应用.
1. 文件类 1.1. 查看文件大小 # 加 h 查看可读性的文件大小 ll -h # 查看文件夹大小 # --max-depth=1 表示查看文件夹的一层 du -h --max-depth=1 /usr 1.2. 压缩 ZIP -r 递归处理,将指定目录下的所有文件和子目录一并处理。 -y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。 -v 显示指令执行过程或显示版本信息。 -j 只保存文件名称及其内容,而不存放任何目录名称。 -b 添加注释 -u 更新文件 # 压缩 # target.zip 是压缩后的文件名 # source-dir 要压缩的文件夹名 zip -r target.zip source-dir # 压缩保留软链, 只对类 unix 系统有效 # -y 保留软链 zip -ry target.zip source-dir # 压缩带注释 zip -ryb target.zip source-dir # 解压 unzip target.zip # 查看压缩文件, 不压缩 unzip -v target.
分析过程 使用 pprof top分析 可见 json.Marshal占第一内存. 为什么呢? 我们进一步分析 使用 tree 分析 查看到 zerolog AppendInterface 方法占用 73.32%的内存量. 而 zerolog 是一个很优秀的日志库, 比 zap 还优秀. 为什么呢?我们需要查看源码 822.70MB 73.32% | github.com/rs/zerolog/internal/json.Encoder.AppendInterface 分析源码 找到 github.com/rs/zerolog/internal/json.Encoder.AppendInterface` 366 行 // AppendInterface marshals the input interface to a string and // appends the encoded string to the input byte slice. func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte { marshaled, err := json.Marshal(i) if err != nil { return e.
查看 Clients 属性 127.0.0.1:6379>info clients # Clients connected_clients:1 # 已连接客户端的数量(不包括通过从属服务器连接的客户端) client_recent_max_input_buffer:2 # 当前连接的客户端当中,最长的输出列表 client_recent_max_output_buffer:0 # 当前连接的客户端当中,最大输入缓存 blocked_clients:0 # 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 查看 Memeory 属性 127.0.0.1:6379>info memory used_memory_human:1.92G # 用户数据所占用的内存,就是你缓存的数据的大小。 used_memory_rss_human:30.73M # 常驻内存, 与top占用内存一致 used_memory_peak_human:1.93G # 内存使用峰值 total_system_memory_human:1.78G # 整个系统的内存 mem_fragmentation_ratio:0.02 # 内存碎片比率. used_memory_rss/used_memory求的值. 如果小于1时,需要优化内存碎片. mem_fragmentation_ratio 查看内存碎片比率, 小于<1时,Redis实例可能会把部分数据交换到硬盘上,内存交换会严重影响Redis的性能,所以应该增加可用物理内存 大于>1时, 说明碎片占用 更多的内存, 需要整理, 在1~1.5 之间比较健康. 重启Redis服务;也能达到碎片整理目的 查看是否开启自动碎片整理: config get activedefrag 设置自动碎片整理: config set activedefrag yes 直接手动整理碎片: memory purge redis.conf配置设置自动整理碎片 redis 4.0 # Enabled active defragmentation # 碎片整理总开关 # activedefrag yes # Minimum amount of fragmentation waste to start active defrag # 当碎片达到 100mb 时,开启内存碎片整理 active-defrag-ignore-bytes 100mb # Minimum percentage of fragmentation to start active defrag # 当碎片超过 10% 时,开启内存碎片整理 active-defrag-threshold-lower 10 # Maximum percentage of fragmentation at which we use maximum effort # #内存碎片超过 100%,则尽最大努力整理 active-defrag-threshold-upper 100 # Minimal effort for defrag in CPU percentage # 内存自动整理占用资源最小百分比 active-defrag-cycle-min 25 # Maximal effort for defrag in CPU percentage # 内存自动整理占用资源最大百分比 active-defrag-cycle-max 75 查看 Stats 属性 只列出部分属性.
参考 Go 单元测试/性能测试 性能测试 go test -test.bench=. -test.benchmem 指定方法 go test -test.bench=MyFunc -test.benchmem cpu 性能分析 go test -test.bench=MyFunc -test.cpuprofile cpu.out 内存分析 go test -test.bench=MyFunc -test.memprofile mem.out goroutine 阻塞分析 go test -test.bench=MyFunc -test.blockprofile block.out ### 指定几个cpu分析 go test -test.bench=MyFunc -test.benchmem -test.cpu 1,2,4