Prometheus 从入门到入土 -----入土_prometheus 重启_忙碌滴比特流的博客-程序员资料

技术标签: 运维  Prometheus  prometheus  

目录

一、Prometheus的部署

1、实验环境

2、环境初始话

3、上传prometheus安装包到opt下,进行安装(192.168.159.68)

4、配置node_exporter(192.168.159.11、192.168.159.10) 

5、配置prometheus节点的配置文件(192.168.159.68)

6、重启prometheus,查看页面

7、采集数据流向

二、配置文件解析

prometeus配置文件prometeus.yml的组成

三、表达式浏览器(prometheusUI控制台)

prometheus UI控制台上可以进行数据过滤

1、CPU使用总量

四、Prometheus discovery 服务发现

1、静态发现(上文自定义的指定抓取目标信息为静态方式)

2、动态发现

2.1、基于文件服务发现

2.1.1、动态发现基于文件服务发现实验部分

3、基于DNS发现

4、基于consul发现

4.1、consul服务部署

五、grafana部署

1、grafana简介

2、部署grafana

六、部署alertmanager,告警对接邮箱


一、Prometheus的部署

1、实验环境

主机 IP 安装包
prometheus 192.168.159.68 prometheus
server1 192.168.159.11 node_exporter
server2 192.168.159.10 node_exporter

2、环境初始话

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

ntpdate ntp1.aliyun.com    ####时间同步,必须要做的

3、上传prometheus安装包到opt下,进行安装(192.168.159.68)

[[email protected]_docker opt]# rz -E
rz waiting to receive.
[[email protected]_docker opt]# tar zxvf prometheus-2.27.1.linux-amd64.tar.gz -C /usr/local/

安装完成,启动prometheus

[[email protected]_docker prometheus-2.27.1.linux-amd64]# ./prometheus

prometheus启动后会占用前端界面,复制会话,重新打开另一个界面进行操作。

查看端口是否开启

[[email protected]_prometheus ~]# ss -antp | grep 9090
LISTEN     0      128         :::9090                    :::*                   users:(("prometheus",pid=11006,fd=8))
ESTAB      0      0        ::ffff:192.168.159.68:9090                  ::ffff:192.168.159.1:62136               users:(("prometheus",pid=11006,fd=21))
ESTAB      0      0          ::1:9090                   ::1:51520               users:(("prometheus",pid=11006,fd=13))
ESTAB      0      0        ::ffff:192.168.159.68:9090                  ::ffff:192.168.159.1:62135               users:(("prometheus",pid=11006,fd=18))

查看WEB页面

http://192.168.159.68:9090/

4、配置node_exporter(192.168.159.11、192.168.159.10) 

两个节点的配置方法一样

[root@zwb opt]# rz -E            ### 上传
rz waiting to receive.
[[email protected] opt]# tar zxvf node_exporter-1.1.2.linux-amd64.tar.gz    ### 解压
-C /usr/local/
[[email protected] opt]# cd /usr/local/node_exporter-1.1.2.linux-amd64/   

[[email protected] node_exporter-1.1.2.linux-amd64]# mv node_exporter /ur/bin/   

                                                         #############移动执行脚本到全局环境变量下 

开启node_exporter

[[email protected] node_exporter-1.1.2.linux-amd64]# node_exporter

5、配置prometheus节点的配置文件(192.168.159.68)

6、重启prometheus,查看页面

如果整体关机后,开机需要重新启动prometheus和exporter

7、采集数据流向

prometheus节点通过收集。被监测点的node_exporter周期性抓取数据并转化为prometheus兼容格式。node_exporter被监测点的信息需要在prometheus节点配置。

二、配置文件解析

prometeus配置文件prometeus.yml的组成

## 用于定义全局配置,主要定义的是周期。一个是scrape周期,一个自动识别、更新配置文件的周期

# my global config
global:
  scrape_interval:     15s

       # Set the scrape interval to every 15 seconds. Default is every 1 minute.

       # 用来指定Prometheus从监控端抓取数据的时间间隔 
  evaluation_interval: 15s

       # Evaluate rules every 15 seconds. The default is every 1 minute.

       # 用于指定检测告警规则的时间间隔,每15s重新检测告警规则,并对变更进行更新
  # scrape_timeout is set to the global default (10s).

  # 定义拉取实例指标的超时时间

## 用于设置Prometheus与Alertmanager的通信,在Prometheus的整体架构中,Prometheus会根据配置的告警规则触发警报并发送到独立的Alertmanager组件,Alertmanager将对告警进行管理并发送给相关的用户

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:        ###  配置alertmanager的地址信息
    - 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:         ###  指定Prometheus抓取的目标信息(采集数据的配置) 
  # 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: 'nodes'  ###  自定义指定Prometheus抓取的目标信息       
    static_configs:        
    - targets:
      - 192.168.159.11:9100 
      - 192.168.159.10:9100

三、表达式浏览器(prometheusUI控制台)

http://192.168.159.68:9090/

prometheus UI控制台上可以进行数据过滤

1、CPU使用总量

node_cpu_seconds_total

进阶1:计算过去5分钟内的CPU使用速率

PromQL:irate(node_cpu_seconds_total{mode="idle"}[5m])

irate:速率计算函数

node_cpu_seconds_total:node节点CPU使用总量

mode="idle" 空闲指标

5m:过去的5分钟内,所有CPU空闲数的样本值,每个数值做速率运算

四、Prometheus discovery 服务发现

prometheus指标抓取的生命周期

发现——》配置——》relabel——》指标数据抓取——》metrics relabel

发现:当peometheus启动,启动后发现被监控端

配置:定义怎么采集。怎么监控(周期),监控哪些节点

relabel:例如exporter采集数据后,需要转换成Pro能兼容识别的格式(时序数据格式),而这种转换就是聚合数据》

指标数据的抓取:pro pull数据

metrics relabel:重组

1、静态发现(上文自定义的指定抓取目标信息为静态方式)

  - job_name: 'nodes'  ###  自定义指定Prometheus抓取的目标信息       
    static_configs:        
    - targets:
      - 192.168.159.11:9100 
      - 192.168.159.10:9100

2、动态发现

2.1、基于文件服务发现

基于文件的服务发现仅仅略优于静态配置的服务发现方式,它不依赖于任何平台或第三方服务,
因而也是最为简单和通用的实现方式。

2.1.1、动态发现基于文件服务发现实验部分

##  进入普罗米修斯的工作目录

[[email protected]_prometheus prometheus]# mkdir file_sd                 ## 创建file_sd目录
[[email protected]_prometheus prometheus]# ls
console_libraries  consoles  data  file_sd  LICENSE  nohup.out  NOTICE  prometheus  prometheus.yml  promtool

[[email protected]_prometheus prometheus]# cd file_sd/
[[email protected]_prometheus file_sd]# ls
[[email protected]_prometheus file_sd]# pwd
/usr/local/prometheus/file_sd
[[email protected]_prometheus file_sd]# mkdir targets                          ### 创建 targets目录
[[email protected]_prometheus file_sd]# ls
targets

### 编辑3个配置文件

## 编辑 prometheus.yml文件

[[email protected]_prometheus file_sd]# vim /usr/local/prometheus/file_sd/prometheus.yml

[[email protected]_prometheus file_sd]# cat prometheus.yml 
# my global config
# Author: MageEdu <[email protected]>
# Repo: http://gitlab.magedu.com/MageEdu/prometheus-configs/
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'                    ### 指定job为prometheus

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

    file_sd_configs:                          ### 将原先的静态改为文件发现
    - files:                                               
      - targets/prometheus_*.yaml             ### 指定加载的文件位置
      refresh_interval: 2m                    ### 2分钟刷新一次

  # All nodes 
  - job_name: 'nodes'                         ### 指定job为nodes
    file_sd_configs:   
    - files:                                               
      - targets/nodes_*.yaml                  ### 指定加载的文件位置
      refresh_interval: 2m                    ### 2分钟刷新一次

[[email protected]_prometheus file_sd]# vim /usr/local/prometheus/file_sd/targets/prometheus_servers.yaml

- targets:                     
  - 192.168.159.68:9090                ### 指定prometheus的位置
  labels:
    app: prometheus                    
    job: prometheus                    ### 定义job为prometheus

[[email protected]_prometheus file_sd]# vim /usr/local/prometheus/file_sd/targets/nodes_linux.yaml

- targets:                               ### 指定nodes的位置
  - 192.168.159.10:9100             
  - 192.168.159.11:9100
  labels:
    app: node-exporter
    job: nodes                           ###指定job为nodes

### 新建目录和文件的存放位置关系

[email protected]_prometheus file_sd]# pwd
/usr/local/prometheus/file_sd
[[email protected]_prometheus file_sd]# tree ./
./
├── prometheus.yml
└── targets
    ├── nodes_linux.yaml
    └── prometheus_servers.yaml

1 directory, 3 files

启动prometheus

[[email protected]_prometheus prometheus]# pwd               ###当前位置
/usr/local/prometheus
[[email protected]_prometheus prometheus]# ./prometheus --config.file=./file_sd/prometheus.yml

                          ### 通过指定启动文件的位置来启动,不让其启动时加载原先得配置文件

实验结构和配置文件自行对比;

3、

3、基于DNS发现

基于DNS的服务发现针对一组DNS域名进行定期查询,以发现待监控的目标查询时使用的DNS服务器由/etc/resolv.conf文件指定:该发现机制依赖于A、AAAA和SRv资源记录,且仅支持该类方法,尚不支持RFC6763中的高级DNS发现方式。

4、基于consul发现

consul是一款基于golang开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务一发现和配置管理的功能提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能

原理:通过定义json文件将可以进行数据采集的服务注册到consul中,用于自动发现同时使用prometheus做为client端获取consul上注册的服务,从而进行获取数据

4.1、consul服务部署

第一步:上传安装包(安装于prometheus主机上)

[[email protected]_prometheus opt]# rz -E
rz waiting to receive.
[[email protected]_prometheus opt]# ls
consul_1.9.0_linux_amd64.zip

第二步:解压安装包

[[email protected]_prometheus opt]# unzip consul_1.9.0_linux_amd64.zip

[[email protected]_prometheus opt]# unzip consul_1.9.0_linux_amd64.zip    ## 解压
Archive:  consul_1.9.0_linux_amd64.zip
  inflating: consul                  
[[email protected]_prometheus opt]# ls          
consul  consul_1.9.0_linux_amd64.zip  containerd  lnmp.sh  mysql-5.7.20  nginx-1.15.9  php-7.1.10  rh
[[email protected]_prometheus opt]# mv consul /usr/bin/         ## 加入到环境变量

第三步:配置consul的配置文件

[[email protected]_prometheus opt]# mkdir -pv /etc/consul/data
mkdir: 已创建目录 "/etc/consul"
mkdir: 已创建目录 "/etc/consul/data"
[[email protected]_prometheus opt]# cd /etc/consul/

第四步:启动consul

[[email protected]_prometheus consul]# consul agent \ 
> -dev \
> -ui \
> -data-dir=/consul/data/ \
> -config-dir=/etc/consul/ \
> -client=0.0.0.0 &
注释:

agent -dev:运行开发模式
agent -server:运行server模式
-ui:ui界面
-data-dir:数据位置
/etc/consul:可以以文件形式定义各个services的配置,也可以基于api接口直接配置
-client:监听地址

第五步:创建/etc/consul目录下的prometheus-servers.json配置文件

[[email protected]_prometheus consul]# vim /etc/consul/prometheus-servers.json

{
  "services": [
    {
      "id": "prometheus-server-node01",
      "name": "prom-server-node01",
      "address": "192.168.159.68",
      "port": 9090,
      "tags": ["prometheus"],
      "checks": [{
        "http": "http://192.168.159.68:9090/metrics",
        "interval": "5s"

第六步:重载consul配置文件

[[email protected]_prometheus consul]# consul reload

第七步:创建consul自动发现的prometheus.yml文件

[[email protected]_prometheus console_sd]# vim prometheus.yml 
# my global config
# Author: MageEdu <[email protected]>
# Repo: http://gitlab.magedu.com/MageEdu/prometheus-configs/
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'.

    consul_sd_configs:
    - server: "192.168.159.68:8500"
      tags:
      - "prometheus"
      refresh_interval: 2m 

  # All nodes
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "192.168.159.68:8500"
      tags:
      - "nodes"
      refresh_interval: 2m 

                                                 

 第八步:重启prometheus和consul

[[email protected]_prometheus console_sd]# killall prometheus

[[email protected]_prometheus prometheus]# ./prometheus --config.file=./consul_sd/prometheus.yml   ### 指定上面配置的prometheus.yml启动时加载

第九步:注册其他node节点在Pro节点下consul的配置文件下配置

[[email protected]_prometheus consul_sd]# cd /etc/consul/
[[email protected]_prometheus consul]# vim nodes.json
{
  "services": [
    {
      "id": "node_exporter-node01",
      "name": "node01",
      "address": "192.168.159.11",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://192.168.226.11:9100/metrics",
        "interval": "5s"
      }]
    },
    {
      "id": "node_exporter-node02",
      "name": "node02",
      "address": "192.168.159.10",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://192.168.159.10:9100/metrics",
        "interval": "5s"
      }]
    },
    {
      "id": "node_exporter-node03",
      "name": "node03",
      "address": "192.168.159.68",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://192.168.159.68:9100/metrics",
        "interval": "5s"
      }]
    }
  ]
}

五、grafana部署

1、grafana简介

grafana是一款基于go语言开发的通用可视化工具,支持从不同的数据源加载并展示数据,可作为其数据源的部分储存系统如下所示:

TSDB:Prometheus、IfluxDB、OpenTSDB和Graphit
日志和文档存储:Loki和ElasitchSearch
分布式请求跟踪:Zipkin、Jaeger和Tenpo
SQL DB:Mysql、PostgreSQL和Microsoft SQL server
grafana基础默认监听于TCP协议的3000端口,支持集成其他认证服务,且能够通过/metrics输出内建指标;

数据源(Data Source):提供用于展示的数据的储存系统
仪表盘(Dashboard):组织和管理数据的可视化面板(Panel)
团队和用户:提供了面向企业组织层级的管理能力;

2、部署grafana

第一步:上传安装包

[[email protected] opt]# rz -E
rz waiting to receive.

第二步:第一种方法:直接在虚拟机环境安装。第二种方法:跑容器中

本实验中直接安装虚拟机环境中

[[email protected] opt]# yum -y install grafana-7.3.6-1.x86_64.rpm
      #### yum 指定本地安装包,他在安装的同时会自动升级

第三步:开启grafana 服务

[[email protected] opt]# systemctl start grafana-server.service 

[roo[email protected] opt]# vim /etc/grafana/grafana.ini     

         ### 默认用户admin,密码admin。在配置文件中可修改密码

 打开web:

第四步:创建监控的展现仪表盘

 

点击 

等待几分钟。会自行跳转

结果:

六、部署alertmanager,告警对接邮箱

第一步:安装在prometheus客户端处

[[email protected]_prometheus opt]# rz -E
rz waiting to receive.
[[email protected]_prometheus opt]# tar zxvf alertmanager-0.22.2.linux-amd64.tar.gz -C /usr/local/

[[email protected]_prometheus local]# mv alertmanager-0.22.2.linux-amd64/ alertmanager

                                                                                                           ### 修改目录名

### 查看配置文件

cat /usr/local/alertmanager/alertmanager.yml
route:            #路由信息
  group_by: ['alertname']        #分组
  group_wait: 30s         #分组缓冲/等待时间
  group_interval: 5m     #重新分组时间
  repeat_interval: 1h     #重新告警间隔
  receiver: 'web.hook'     #接收方/媒介
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'    #标注5001端口
inhibit_rules:        #抑制规则的策略
  - source_match:    #匹配项
      severity: 'critical'    #严重的级别
    target_match:
      severity: 'warning'    #target匹配warning级别
    equal: ['alertname', 'dev', 'instance']        #符合alertname、dev、instance

第二步:邮箱设置

往下翻

 

 记录授权码 

第三步:备份配置文件、配置alertmanager.yml文件

[[email protected]_prometheus alertmanager]# mv alertmanager.yml alertmanager.yml.bck

第四步:启动alertmanager

[[email protected]_prometheus alertmanager]# ./alertmanager 

第五步:定义告警发送条件

[[email protected]_prometheus prometheus]# pwd                       
/usr/local/prometheus

####  定义一个目录用于配置告警促发条件
[[email protected]_prometheus prometheus]# mkdir alert-config
[[email protected]_prometheus prometheus]# cd alert-config/
[[email protected]_prometheus alert-config]# mkdir alert_rules targets

[[email protected]_prometheus alert-config]# ls
alert_rules  targets
[[email protected]_prometheus alert-config]# vim instance_down.yml
[[email protected]_prometheus alert-config]# cd alert_rules/

#### 定义告警条件

[[email protected]_prometheus alert_rules]# vim instance_down.yml    

groups:
- name: AllInstances
  rules:
  - alert: InstanceDown                                                                     #节点服务挂掉 
    # Condition for alerting
    expr: up == 0                                                                             #up状态为0时
    for: 1m
    # Annotation - additional informational labels to store mo
    annotations:
      title: 'Instance down'
      description: Instance has been down for more than 1 minu
    # Labels - additional labels to be attached to the alert
    labels:
      severity: 'critical'                                                                #告警级别

[[email protected]_prometheus alert_rules]# cd ../targets/

[[email protected]_prometheus targets]# vim alertmanagers.yaml

- targets:
  - 192.168.159.68:9093
  labels:
    app: alertmanager

[[email protected]_prometheus targets]# vim nodes-linux.yaml

- targets:
  - 192.168.159.68:9100
  - 192.168.159.10:9100
  - 192.168.159.11:9100
  labels:
    app: node-exporter
    job: node

[[email protected]_prometheus targets]# vim prometheus-servers.yaml

- targets:
  - 192.168.159.68:9090
  labels:
    app: prometheus
    job: prometheus

[[email protected]_prometheus alert-config]# pwd
/usr/local/prometheus/alert-config

### 定义启动prometheus

[[email protected]_prometheus alert-config]# vim prometheus.yml 

# my global config
# Author: MageEdu <[email protected]>
# Repo: http://gitlab.magedu.com/MageEdu/prometheus-configs/
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:
  - file_sd_configs:
    - files:
      - "targets/alertmanagers*.yaml"

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "rules/*.yaml"
  - "alert_rules/*.yaml" 

# 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'.

    file_sd_configs:
    - files:                                               
      - targets/prometheus-*.yaml  
      refresh_interval: 2m 

  # All nodes
  - job_name: 'nodes'
    file_sd_configs:
    - files:                                               
      - targets/nodes-*.yaml  
      refresh_interval: 2m 

  - job_name: 'alertmanagers'
    file_sd_configs:
    - files:
      - targets/alertmanagers*.yaml
      refresh_interval: 2m 

[[email protected]_prometheus prometheus]# ./prometheus --config.file=./alert-config/prometheus.yml            ### 再pro工作目录下启动

第六步:模拟单节点宕机

killall node_exporter

[[email protected] ~]# ss -antp | grep node_exporter
[[email protected] ~]#                                                     ##端口已经关闭

第七步:验证

查看PrometheusUI

查看邮箱 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_62948770/article/details/127538414

智能推荐

第3章 AI技术在RPA中的应用_Sunshine_ysc的博客-程序员资料

企业在梳理如何实现业务流程自动化的过程中,面临着很多挑战,其中之一便是RPA仅能够处理规则明确的、高重复性的流程,这让流程自动化很受限。随着人工智能技术的快速发展,如何将其合理有效地与RPA相结合,从而完成更多、更复杂、更智能的业务流程,是现阶段商业应用探索的主要方向,也是本章中我们将要共同探讨的核心问题。...

很多人都不知道外包公司居然有两种,真的要去该怎么选择?_外包公司分为哪几种_程序员徐小白的博客-程序员资料

前言经常会听说,程序员进外包毁一生,程序员进入外包就会被鄙视。。。这些彷佛说的外包公司十分的差劲,一旦有程序员去了外包公司就不得翻身了所以我结合我的亲身经历和对外包的认识,给出我的一些见解,希望对大家有帮助。什么是外包公司想要知道该不该去外包,不得先知道什么是外包吗?外包公司分为两种,一种承包人力的,另一种是承包项目的。承包人力的公司就是那种A公司跟你签合同,A公司给你发工资,但是你是去B公司上班的,你不属于B公司的员工,可能工牌都不一样,如果B公司没活干了。你就会被派到其他公司去干活。

使用天乐软件加密狗(JDProtect)保护您的软件,防止程序被跟踪/逆向/反编译/破解_maikforever的博客-程序员资料

作者:庄晓立(liigo)日期:2011-4-8原创链接:http://blog.csdn.net/liigo/archive/2011/04/08/6310677.aspx转换请注明出处:http://blog.csdn.net/liigo   天乐软件加密狗(JDProtect),貌似几年前的软件,也很久没人更新了,这个暂且不管。本文并非推荐软件,而是介绍软件用法。本人(l

ruby安装报错ERROR: While executing gem ... (Gem::Exception) Unable to require openssl......................_weixin_30655219的博客-程序员资料

今天在centOS7上安装ruby3.2.0时,gem install redis 出现ERROR: While executing gem ... (Gem::Exception) Unable to require openssl....................试了网上很多的方法还是出现了这个问题。最后索性删除了本来的ruby,重新安装后就可以了。正确的安装步骤是先安装开发...

分布式系统概念_alenlyx_Alenlyx的博客-程序员资料

一 分布式系统分布式系统的由来:国内来讲,移动互联网的爆发伴随着分布式系统的突现,移动互联网最大的特点是2(to)c的o2o产品越来越多,这跟传统2B的系统最大区别就是用户量的不同,2C系统的用户量远远要高于2b系统,这就对系统提出了各种各样的高标准,响应时间,性能,灾备,吞吐量等等,各种分布式技术也是为了这些标准而服务。分布式架构的应用:分布式文件系统分布式缓存系统分布式数据库分布...

javap查看java字节码_csdn_dengyu的博客-程序员资料

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。 语法:   javap [ 命令选项 ] class…   javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。 命令选项   -...

随便推点

百度新站提交助手_dlm92376的博客-程序员资料

如果是你批量上站的话,可以用这个提交助手批量提交,等待百度收录,但不建议多次重复提交。转载于:https://www.cnblogs.com/renzhe/archive/2013/06/02/3113592.html...

宝塔面板搭建密码管理bitwarden_宝塔反代 bitwarden不显示_vv1025的博客-程序员资料

宝塔面板搭建密码管理bitwardenBitwarden 是一款开源密码管理器,它会将所有密码加密存储在服务器上,它的工作方式与 LastPass、1Password 或 Dashlane 相同。官方的版本搭建对服务器要求很高,搭建不容易,github上有人用 Rust 实现了 Bitwarden 服务器,项目叫 bitwarden_rs,并且提供了 Docker 镜像,这个实现更进一步降低了对机器配置的要求,并且 Docker 镜像体积很小,部署非常方便。此外,官方服务器中需要付费订阅的一些功能,

Timer & TimerTask 源码分析_Young.Chen的博客-程序员资料

承接上一篇,看一看 Timer 和 TimerTask 内部的实现。之前说了我自己极少使用这个,目前在 Java 开发中使用 Timer 应该也非常少见了,既然是这样一个夕阳组件,为什么还要写个源码分析呢?主要是由于这部分的实现非常有借鉴意义,如果你工作中需要开发一个自动化流程,让它每一步都能定时执行,那么其实现方式和 Timer、TimerTask 的内部实现其实大同小异,都是维护一个 Task...

javascript时间戳和日期字符串相互转换_风神修罗使的博客-程序员资料

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script type="text/javascript"> // 获取当前时间戳(以s为单位) var timesta

基于用户的协同过滤算法(及3种计算用户相似度的方法)__苏沐的博客-程序员资料

本文参考《推荐系统实践》中基于用户的协同过滤算法内容。基于老师上课讲解,自己实现了其中的代码,了解了整个过程。UserCF算法实现实现原理模拟数据两两用户之间计算优化后的倒查表方式计算用户相似度采用惩罚热门物品和倒查表方式计算用户相似度方法推荐函数实现原理基于用户的协同过滤算法:第一步,找到和目标用户兴趣相似的用户集合第二步,找到这个集合中的用户喜欢的物品,然后过滤掉目标用户已经看到过或听说过的物品(发生过用户行为的),把没有听说过的物品推荐给目标用户模拟数据数据格式为 u-i(用户-物品)字

DOM4j解析XML文件_旧城以西林的博客-程序员资料

XML文件样例:&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;&amp;lt;books&amp;gt; &amp;lt;book id=&quot;001&quot;&amp;gt; &amp;lt;bookName&amp;gt;java从入门到精通&amp;lt;/bookName&amp;gt; &amp;lt;authors&amp;gt; &amp;lt;author&amp;g

推荐文章

热门文章

相关标签