ElasticSearch必知必会-进阶篇

京东物流:康睿 姚再毅 李振 刘斌 王北永

说明:以下全部均基于elasticsearch8.1 版本

一.跨集群检索 - ccr

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cross-cluster-search.html

跨集群检索的背景和意义

跨集群检索定义

跨集群检索环境搭建

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/modules-cross-cluster-search.html

步骤1:搭建两个本地单节点集群,本地练习可取消安全配置

步骤2:每个集群都执行以下命令

PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster_one": { "seeds": [ "172.21.0.14:9301" ] },"cluster_two": { "seeds": [ "172.21.0.14:9302" ] } } } } }

步骤3:验证集群之间是否互通

方案1:Kibana 可视化查看:stack Management -> Remote Clusters -> status 应该是 connected! 且必须打上绿色的对号。

​ 方案2:GET _remote/info

跨集群查询演练

# 步骤1 在集群 1 中添加数据如下
PUT test01/_bulk
{"index":{"_id":1}}
{"title":"this is from cluster01..."}

# 步骤2 在集群 2 中添加数据如下:
PUT test01/_bulk
{"index":{"_id":1}}
{"title":"this is from cluster02..."}

# 步骤 3:执行跨集群检索如下: 语法:POST 集群名称1:索引名称,集群名称2:索引名称/_search
POST cluster_one:test01,cluster_two:test01/_search
{
  "took" : 7,
  "timed_out" : false,
  "num_reduce_phases" : 3,
  "_shards" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0,
    "failed" : 0
  },
  "_clusters" : {
    "total" : 2,
    "successful" : 2,
    "skipped" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "cluster_two:test01",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "title" : "this is from cluster02..."
        }
      },
      {
        "_index" : "cluster_one:test01",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "title" : "this is from cluster01..."
        }
      }
    ]
  }
}


二.跨集群复制 - ccs - 该功能需付费

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-ccr.html

如何保障集群的高可用

  1. 副本机制
  2. 快照和恢复
  3. 跨集群复制(类似mysql 主从同步)

跨集群复制概述

跨集群复制配置

  1. 准备两个集群,网络互通
  2. 开启 license 使用,可试用30天
  • 开启位置:Stack Management -> License mangement.

3.定义好谁是Leads集群,谁是follower集群

4.在follower集群配置Leader集群

5.在follower集群配置Leader集群的索引同步规则(kibana页面配置)

a.stack Management -> Cross Cluster Replication -> create a follower index.

6.启用步骤5的配置


三索引模板

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-templates.html

8.X之组件模板

1.创建组件模板-索引setting相关

# 组件模板 - 索引setting相关
PUT _component_template/template_sttting_part
{
  "template": {
    "settings": {
      "number_of_shards": 3,
      "number_of_replicas": 0
    }
  }
}

2.创建组件模板-索引mapping相关

# 组件模板 - 索引mapping相关
PUT _component_template/template_mapping_part
{
  "template": {
    "mappings": {
      "properties": {
        "hosr_name":{
          "type": "keyword"
        },
        "cratet_at":{
          "type": "date",
          "format": "EEE MMM dd HH:mm:ss Z yyyy"
        }
      }
    }
  }
}

3.创建组件模板-配置模板和索引之间的关联

// **注意:composed_of 如果多个组件模板中的配置项有重复,后面的会覆盖前面的,和配置的顺序有关**
# 基于组件模板,配置模板和索引之间的关联
# 也就是所有 tem_* 该表达式相关的索引创建时,都会使用到以下规则
PUT _index_template/template_1
{
  "index_patterns": [
    "tem_*"
  ],
  "composed_of": [
    "template_sttting_part",
    "template_mapping_part"
  ]
}

4.测试

# 创建测试
PUT tem_001

索引模板基本操作

实战演练

需求1:默认如果不显式指定Mapping,数值类型会被动态映射为long类型,但实际上业务数值都比较小,会存在存储浪费。需要将默认值指定为Integer

索引模板,官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-templates.html

mapping-动态模板,官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/dynamic-templates.html

# 结合mapping 动态模板 和 索引模板
# 1.创建组件模板之 - mapping模板
PUT _component_template/template_mapping_part_01
{
  "template": {
    "mappings": {
      "dynamic_templates": [
        {
          "integers": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "integer"
            }
          }
        }
      ]
    }
  }
}

# 2. 创建组件模板与索引关联配置
PUT _index_template/template_2
{
  "index_patterns": ["tem1_*"],
  "composed_of": ["template_mapping_part_01"]
}

# 3.创建测试数据
POST tem1_001/_doc/1
{
  "age":18
}

# 4.查看mapping结构验证
get tem1_001/_mapping


需求2:date_*开头的字段,统一匹配为date日期类型。

索引模板,官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-templates.html

mapping-动态模板,官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/dynamic-templates.html

# 结合mapping 动态模板 和 索引模板
# 1.创建组件模板之 - mapping模板
PUT _component_template/template_mapping_part_01
{
  "template": {
    "mappings": {
      "dynamic_templates": [
        {
          "integers": {
            "match_mapping_type": "long",
            "mapping": {
              "type": "integer"
            }
          }
        },
        {
        "date_type_process": {
          "match": "date_*",
          "mapping": {
            "type": "date",
            "format":"yyyy-MM-dd HH:mm:ss"
          }
        }
      }
      ]
    }
  }
}

# 2. 创建组件模板与索引关联配置
PUT _index_template/template_2
{
  "index_patterns": ["tem1_*"],
  "composed_of": ["template_mapping_part_01"]
}


# 3.创建测试数据
POST tem1_001/_doc/2
{
  "age":19,
  "date_aoe":"2022-01-01 18:18:00"
}

# 4.查看mapping结构验证
get tem1_001/_mapping

四.LIM 索引生命周期管理

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-lifecycle-management.html

什么是索引生命周期

索引的 生-> 老 -> 病 -> 死

是否有过考虑,如果一个索引,创建之后,就不再去管理了?会发生什么?

什么是索引生命周期管理

索引太大了会如何?

大索引的恢复时间,要远比小索引恢复慢的多的多索引大了以后,检索会很慢,写入和更新也会受到不同程度的影响索引大到一定程度,当索引出现健康问题,会导致整个集群核心业务不可用

最佳实践

集群的单个分片最大文档数上限:2的32次幂减1,即20亿左右官方建议:分片大小控制在30GB-50GB,若索引数据量无限增大,肯定会超过这个值

用户不关注全量

某些业务场景,业务更关注近期的数据,如近3天、近7天大索引会将全部历史数据汇集在一起,不利于这种场景的查询

索引生命周期管理的历史演变

LIM前奏 - rollover 滚动索引

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/index-rollover.html

# 0.自测前提,lim生命周期rollover频率。默认10分钟
PUT _cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval": "1s"
  }
}

# 1. 创建索引,并指定别名
PUT test_index-0001
{
  "aliases": {
    "my-test-index-alias": {
      "is_write_index": true
    }
  }
}

# 2.批量导入数据
PUT my-test-index-alias/_bulk
{"index":{"_id":1}}
{"title":"testing 01"}
{"index":{"_id":2}}
{"title":"testing 02"}
{"index":{"_id":3}}
{"title":"testing 03"}
{"index":{"_id":4}}
{"title":"testing 04"}
{"index":{"_id":5}}
{"title":"testing 05"}

# 3.rollover 滚动规则配置
POST my-test-index-alias/_rollover
{
  "conditions": {
    "max_age": "7d",
    "max_docs": 5,
    "max_primary_shard_size": "50gb"
  }
}

# 4.在满足条件的前提下创建滚动索引
PUT my-test-index-alias/_bulk
{"index":{"_id":7}}
{"title":"testing 07"}

# 5.查询验证滚动是否成功
POST my-test-index-alias/_search

LIM前奏 - shrink 索引压缩

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/ilm-shrink.html

核心步骤:

1. 将数据全部迁移至一个独立的节点

2. 索引禁止写入

3. 方可进行压缩

# 1.准备测试数据
DELETE kibana_sample_data_logs_ext
PUT kibana_sample_data_logs_ext
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 0
  }
}
POST _reindex
{
  "source": {
    "index": "kibana_sample_data_logs"
  },
  "dest": {
    "index": "kibana_sample_data_logs_ext"
  }
}


# 2.压缩前必要的条件设置
# number_of_replicas :压缩后副本为0
# index.routing.allocation.include._tier_preference 数据分片全部路由到hot节点
# "index.blocks.write 压缩后索引不再允许数据写入
PUT kibana_sample_data_logs_ext/_settings
{
  "settings": {
    "index.number_of_replicas": 0,
    "index.routing.allocation.include._tier_preference": "data_hot",
    "index.blocks.write": true
  }
}

# 3.实施压缩
POST kibana_sample_data_logs_ext/_shrink/kibana_sample_data_logs_ext_shrink
{
  "settings":{
    "index.number_of_replicas": 0,
    "index.number_of_shards": 1,
    "index.codec":"best_compression"
  },
  "aliases":{
    "kibana_sample_data_logs_alias":{}
  }
}

LIM实战

全局认知建立 - 四大阶段

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/overview-index-lifecycle-management.html

生命周期管理阶段(Policy):
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/ilm-index-lifecycle.html

Hot阶段(生)

Set priority

Unfollow

Rollover

Read-only

Shrink

Force Merge

Search snapshot

Warm阶段(老)

Set priority

Unfollow

Read-only

Allocate

migrate

Shirink

Force Merge

Cold阶段(病)

Search snapshot

Delete阶段(死)

delete

演练

1.创建policy

  • Hot阶段设置,rollover: max_age:3d,max_docs:5, max_size:50gb, 优先级:100

  • Warm阶段设置:min_age:15s , forcemerage段合并,热节点迁移到warm节点,副本数设置0,优先级:50

  • Cold阶段设置: min_age 30s, warm迁移到cold阶段

  • Delete阶段设置:min_age 45s,执行删除操作

PUT _ilm/policy/kr_20221114_policy
{
  "policy": {
    "phases": {
      "hot": {
        "min_age": "0ms",
        "actions": {
          "set_priority": {
            "priority": 100
          },
          "rollover": {
            "max_size": "50gb",
            "max_primary_shard_size": "50gb",
            "max_age": "3d",
            "max_docs": 5
          }
        }
      },
      "warm": {
        "min_age": "15s",
        "actions": {
          "forcemerge": {
            "max_num_segments": 1
          },
          "set_priority": {
            "priority": 50
          },
          "allocate": {
            "number_of_replicas": 0
          }
        }
      },
      "cold": {
        "min_age": "30s",
        "actions": {
          "set_priority": {
            "priority": 0
          }
        }
      },
      "delete": {
        "min_age": "45s",
        "actions": {
          "delete": {
            "delete_searchable_snapshot": true
          }
        }
      }
    }
  }
}

2.创建index template

PUT _index_template/kr_20221114_template
{
  "index_patterns": ["kr_index-**"],
  "template": {
    "settings": {
      "index": {
        "lifecycle": {
          "name": "kr_20221114_policy",
          "rollover_alias": "kr-index-alias"
        },
        "routing": {
          "allocation": {
            "include": {
              "_tier_preference": "data-hot"
            }
          }
        },
        "number_of_shards": "3",
        "number_of_replicas": "1"
      }
    },
    "aliases": {},
    "mappings": {}
  }
}


3.测试需要修改lim rollover刷新频率

PUT _cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval": "1s"
  }
}

4.进行测试

# 创建索引,并制定可写别名
PUT kr_index-0001
{
  "aliases": {
    "kr-index-alias": {
      "is_write_index": true
    }
  }
}
# 通过别名新增数据
PUT kr-index-alias/_bulk
{"index":{"_id":1}}
{"title":"testing 01"}
{"index":{"_id":2}}
{"title":"testing 02"}
{"index":{"_id":3}}
{"title":"testing 03"}
{"index":{"_id":4}}
{"title":"testing 04"}
{"index":{"_id":5}}
{"title":"testing 05"}
# 通过别名新增数据,触发rollover
PUT kr-index-alias/_bulk
{"index":{"_id":6}}
{"title":"testing 06"}
# 查看索引情况
GET kr_index-0001

get _cat/indices?v

过程总结

第一步:配置 lim pollicy

  • 横向:Phrase 阶段(Hot、Warm、Cold、Delete) 生老病死

  • 纵向:Action 操作(rollover、forcemerge、readlyonly、delete)

第二步:创建模板 绑定policy,指定别名

第三步:创建起始索引

第四步:索引基于第一步指定的policy进行滚动


五.Data Stream

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/ilm-actions.html

特性解析

Data Stream让我们跨多个索引存储时序数据,同时给了唯一的对外接口(data stream名称)

  • 写入和检索请求发给data stream

  • data stream将这些请求路由至 backing index(后台索引)

Backing indices

每个data stream由多个隐藏的后台索引构成

  • 自动创建

  • 要求模板索引

rollover 滚动索引机制用于自动生成后台索引

  • 将成为data stream 新的写入索引

应用场景

  1. 日志、事件、指标等其他持续创建(少更新)的业务数据
  2. 两大核心特点
  3. 时序性数据
  4. 数据极少更新或没有更新

创建Data Stream 核心步骤

官网文档地址:
http://www.elastic.co/guide/en/elasticsearch/reference/8.1/set-up-a-data-stream.html

Set up a data stream

To set up a data stream, follow these steps:

  1. Create an index lifecycle policy
  2. Create component templates
  3. Create an index template
  4. Create the data stream
  5. Secure the data stream

演练

1. 创建一个data stream,名称为my-data-stream

2. index_template 名称为 my-index-template

3. 满足index格式【"my-data-stream*"】的索引都要被应用到

4. 数据插入的时候,在data_hot节点

5. 过3分钟之后要rollover到data_warm节点

6. 再过5分钟要到data_cold节点

# 步骤1 。创建 lim policy
PUT _ilm/policy/my-lifecycle-policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_size": "50gb",
            "max_age": "3m",
            "max_docs": 5
          },
          "set_priority": {
            "priority": 100
          }
        }
      },
      "warm": {
        "min_age": "5m",
        "actions": {
          "allocate": {
            "number_of_replicas": 0
          }, 
          "forcemerge": {
            "max_num_segments": 1
          },
          "set_priority": {
            "priority": 50
          }
        }
      },
      "cold": {
        "min_age": "6m",
        "actions": {
          "freeze":{}
        }
      },
      "delete": {
        "min_age": "45s",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}

# 步骤2 创建组件模板 - mapping
PUT _component_template/my-mappings
{
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date",
          "format": "date_optional_time||epoch_millis"
        },
        "message": {
          "type": "wildcard"
        }
      }
    }
  },
  "_meta": {
    "description": "Mappings for @timestamp and message fields",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}

# 步骤3 创建组件模板 - setting
PUT _component_template/my-settings
{
  "template": {
    "settings": {
      "index.lifecycle.name": "my-lifecycle-policy",
      "index.routing.allocation.include._tier_preference":"data_hot"
    }
  },
  "_meta": {
    "description": "Settings for ILM",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}

# 步骤4 创建索引模板
PUT _index_template/my-index-template
{
  "index_patterns": ["my-data-stream*"],
  "data_stream": { },
  "composed_of": [ "my-mappings", "my-settings" ],
  "priority": 500,
  "_meta": {
    "description": "Template for my time series data",
    "my-custom-meta-field": "More arbitrary metadata"
  }
}

# 步骤5 创建 data stream  并 写入数据测试
PUT my-data-stream/_bulk
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:21:15.000Z", "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736" }
{ "create":{ } }
{ "@timestamp": "2099-05-06T16:25:42.000Z", "message": "192.0.2.255 - - [06/May/2099:16:25:42 +0000] \"GET /favicon.ico HTTP/1.0\" 200 3638" }

POST my-data-stream/_doc
{
  "@timestamp": "2099-05-06T16:21:15.000Z",
  "message": "192.0.2.42 - - [06/May/2099:16:21:15 +0000] \"GET /images/bg.jpg HTTP/1.0\" 200 24736"
}


# 步骤6 查看data stream 后台索引信息
GET /_resolve/index/my-data-stream*
本文转载于网络 如有侵权请联系删除

相关文章

  • 动态规划之博弈问题

    预计阅读时间:9分钟上一篇文章一行代码就能解决的智力题中讨论到一个有趣的「石头游戏」,通过题目的限制条件,这个游戏是先手必胜的。但是智力题终究是智力题,真正的算法问题肯定不会是投机取巧能搞定的。所以,本文就借石头游戏来讲讲「假设两个人都足够聪明,最后谁会获胜」这一类问题该如何用动态规划算法解决。 博弈类问题的套路都差不多,下文举例讲解,其核心思路是在二维dp的基础上使用元组分别存储两个人的博弈结果。掌握了这个技巧以后,别人再问你什么俩海盗分宝石,俩人拿硬币的问题,你就告诉别人:我懒得想,直接给你写个算法算一下得了。我们「石头游戏」改的更具有一般性:你和你的朋友面前有一排石头堆,用一个数组piles表示,piles[i]表示第i堆石子有多少个。你们轮流拿石头,一次拿一堆,但是只能拿走最左边或者最右边的石头堆。所有石头被拿完后,谁拥有的石头多,谁获胜。石头的堆数可以是任意正整数,石头的总数也可以是任意正整数,这样就能打破先手必胜的局面了。比如有三堆石头piles=[1,100,3],先手不管拿1还是3,能够决定胜负的100都会被后手拿走,后手会获胜。假设两人都很聪明,请你设计一个算法,返回

  • 【高并发】工作了3年的程序员小菜面试高并发岗位被吊打虐哭。。。

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay PS:欢迎各位Star源码,也可以pr你牛逼哄哄的代码。写在前面PS:一些朋友说我的文章文字性描述比较多,写的太官方了,有些看不懂,有些文章,需要连续看好几遍才理解其中的含义。于是,我痛定思痛,果断删除了一些文章,尽管写这些文章占据了我很多的时间,甚至到半夜一两点都在写文章,但是,为了读者,为了能够让读者更快、更好的吸收文章的精华,我最终还是将之前的一些文章删除了!从头开始,将文章尽量写的简单易懂。不求最好,但求更好!点进来看文章的你,希望能够理解冰河的良苦用心,如果您喜欢冰河写的文章,也希望您能够转发朋友圈和点个在看。程序员小菜是一家互联网公司的开发人员,主要负责后端Java技术开发,平时的工作中以CRUD为主。从刚毕业来到公司,一转眼3年过去了,小菜突然觉得在这

  • 基于Vue-cli3一些常见的优化

    Contents11、配置某些包使用CDN22、使用splitChunks进行代码分割33.UglifyjsWebpackPlugin压缩代码44、开启GZIP优化55、路由懒加载66.CSS是否分离7关于1、配置某些包使用CDN主要借助的是html-webpack-plugin这个插件以及webpackexternals这个属性修改vue.config.js//对应的版本可以看package.json constcdnMap={ css:[], js:[ 'https://cdn.bootcss.com/vue/2.6.10/vue.min.js', 'https://cdn.bootcss.com/vue-router/3.0.3/vue-router.min.js', 'https://cdn.bootcss.com/vuex/3.1.0/vuex.min.js', 'https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js' ] } //哪些资

  • 直播卖货系统源码包含哪些功能?

    一、直播卖货系统是什么?直播卖货系统,简单点讲,就是带有直播功能的在线商城。详细点讲,就是以在线商城为依托,集合了直播(短视频)、商铺建设、商城管理为一体的综合性电商系统。这套系统,主要是以APP、H5或小程序展现。它的功能,主要是为商家或者主播“边直播边卖货”的销售行为进行辅助,从而拉动平台消费,提高商品转化率。直播卖货系统源码二、直播卖货系统源码应包含哪些功能?1、前台店铺店铺在直播间的展示样式和功能布局,是吸引观众视线的关键因素之一。因此,为了实现这一点,在店铺装修上应实现高度自定义化。当主播开通店铺后,除了在后台设置自己小店的名称、图标、简介和背景页外,还应支持界面变更,例如提供装修模板,支持多种图片素材上传等,从而充分打造出自己的独特商铺。2、商城部署商城部署一般分为两种模式,其中一种模式是直接采用类似于淘宝、天猫的第三方商城。这样,用户在店铺前台点击某商品的详情页时,就会自动跳转到主播经营的第三方商城继续查看相关信息。还有一种模式,是接入在线商城的商品ID,这个商城,往往是软件开发商通过微信小程序搭建或者直接在后台开发的第一方在线商城。虽然开发成本要比第一种要高,但是对于用

  • __name__ 到底是个什么玩意?

    大家应该已经在很多Python脚本里见到过__name__变量了吧?它经常是以类似这样的方式出现在我们的程序里:if__name__=='__main__': main()复制今天,我就带大家详细扒一扒这个内置变量的用法,示范一下在你写的Python模组里要怎么用到它。这个__name__拿来做什么的?作为Python的内置变量,__name__变量(前后各有两个下划线)还是挺特殊的。它是每个Python模块必备的属性,但它的值取决于你是如何执行这段代码的。 在许多情况下,你的代码不可能全部都放在同一个文件里,或者你在这个文件里写的函数,在其他地方也可以用到。为了更高效地重用这些代码,你需要在Python程序中导入来自其他文件的代码。所以,在__name__变量的帮助下,你可以判断出这时代码是被直接运行,还是被导入到其他程序中去了。这个__name__变量可能取什么值?当你直接执行一段脚本的时候,这段脚本的__name__变量等于'__main__',当这段脚本被导入其他程序的时候,__name__变量等于脚本本身的名字。下面,让我举两个栗子来说

  • DBbrain诊断日 | 不这么办,数据库敢崩个三天三夜给你看

    为更好的帮助DBA运维数据库,腾讯云将于每月12日开展DBbrain诊断日,腾讯云高级产品经理迪B哥直播解析经典数据库运维难题,结合腾讯云数据库智能管家DBbrain的能力,为大家提供问题优化思路和方法,玩转数据库!本期诊断日主要分享内容:如何解决热点更新导致的雪崩效应。 本期分享是一个真实的现网故障案例,而且在最近几个月内多个客户都出现了相似的故障,对于迪B哥来说更是印象深刻,在刚刚从事DBA工作的前几年,也处理过类似的问题,接下来的分享内容将会从真实案例的复盘为切入点,深入剖析故障原因,为大家提供切实有效的应急降级解决方案,最后回归业务实现层面提供几点启发建议。 1PartⅠ案例分析这个故障的场景比较简单,当时业务出现了大量的请求失败,几乎处于不可用状态。同时对应的MySQL数据库也存在大量的CPU使用率高的告警。1.登上数据库,通过showprocesslist查看到的现场截图如下:2.MySQL版本为5.7,数据库表结构如下:CREATETABLE`docid_generator`(`id`int(4)NOTNULLAUTO_INCREMENT,PRIMARYKEY(`id`)

  • GO-Web 应用简介

    第1章:简介1.1Web应用简介Web应用在我们的生活中无处不在。看看我们日常使用的各个应用程序,它们要么是Web应用,要么是移动App这类Web应用的变种。无论哪一种编程语言,只要它能够开发出与人类交互的软件,它就必然会支持Web应用开发。对一门崭新的编程语言来说,它的开发者首先要做的一件事,就是构建与互联网(Internet)和万维网(WorldWideWeb)交互的库(library)和框架,而那些更为成熟的编程语言还会有各种五花八门的Web开发工具。Go是一门刚开始崭露头角的语言,它是为了让人们能够简单而高效地编写后端系统而创建的。这门语言拥有众多的先进特性,如函数式编程方面的特性、内置了对并发编程的支持、现代化的包管理系统、垃圾收集特性、以及一些包罗万象威力强大的标准库,而且如果需要我们还可以引入第三方开源库。使用Go语言进行Web开发正变得日益流行,很多大公司都在使用,如Google、Facebook、腾讯、百度、阿里巴巴、京东、小米以及360、美团、滴滴以及新浪等。1.2Web应用的工作原理1.3HelloWorld下面,就让我们使用Go语言创建一个简单的Web应用。 1

  • Hbase FAQ热门问答小集合

    这个问答是根据云栖社区上对HBase的FAQ中整理出来的。 问:Hbase大量写入很慢,一个列族,每个200多列,一秒写30000条数据,使用mutate添加数据,clientbuffer缓存大小为10M,四台测试机,128G内存,分配60G给Hbase,该怎么优化?答:可以使用bulkload方式写入,通过mr程序生产hfile文件,直接用bulkload导入生成的hfile文件,速度非常快。问:hbase大规模的丢数据,整个数据库系统都挂掉了,然后发错误日志,说Hdfs内部的配置文件,hbase.version,丢失了。大家有遇到过类似的问题吗?自建的集群。答:检查一下一些服务的端口有没有暴露到公网,是不是集群被攻击了。自建还是有一些风险的。然后检查下自己的hbase配置。看看数据的备份情况。问:start-hbase.sh中有这么一段:if["$distMode"=='false'] then "$bin"/hbase-daemon.sh--config"${HBASE_CONF_DIR}"$comm

  • 怎么样去处理样本不平衡问题 | (文后分享大量检测+分割框架)

    背景2020HappyNewYear《ResidualObjectnessforImbalanceReduction》。样本不平衡问题感觉近期研究的论文相对较多,如:2019AAAIGHM,2019CVPRAP-loss,还有2019DRloss,2019IoU-balancedloss,two-stage中也有LibraRCNN,都是关注样本不平衡的问题。该论文给出了一种可行的方案,即采用学习的方法来处理样本不平衡问题。论文地址:https://arxiv.org/abs/1908.09075动机之前所有处理样本不平衡问题的论文都是采用reweight或者采样的方法,并且都是基于手工调优的,例如RetinaNet需要设置FL的参数,GHM则要设置bins的数目和momentum的大小。该论文则提出了一种基于学习的方法来处理样本不平衡问题,不仅性能更好,而且能自适应不同的数据集。模型框架RetinaNet-Obj作者首先引入了另一种不同于FocalLoss处理样本不平衡问题的方法,即借鉴YOLO的方法,在head部分同时引入Objectnesssubnet的分支,在推理的时候采用如下公

  • css使用for属性美化radio控件

    我们在使用radio,checkbox等控件的时候,需要对原有的样式进行美化,但是此类控件美化程度有限。所以就出来了for属性,需要配置lable标签使用。for属性规定label与哪个表单元素绑定,作用是在点击label时会自动将焦点移动到绑定的元素上。 经常使用在radio和checkbox等input元素上。<inputtype="radio"name="name"id="radio4"/><labelfor="radio4">男</label>复制上述代码就把input和lable绑定起来了,for属性对应的是input的id值。这样我们在点击label的时候,radio就会选中。下图是我使用for属性和css相邻选择器美化了radio选择框:代码如下(可直接复制运行):<!DOCTYPEhtml> <html> <head> <metacharset="utf-8"/> <title>

  • 一文懂 | 数字实现流程各步骤的输入输出

    应某友人要求,写一篇总结数字电路实现流程各个步骤的输入输出文件都有哪些。本文所有输入输出都基于Cadence数字实现工具,其他厂家对应工具需要的输入文件也都大同小异,驴只补充所知道的一些小异,未补充的不代表没有,只代表驴不知。通常在项目起始就需要跟各家vendor搜集输入数据,故每一步将所涉及到的techfile单独列出,因为所涉及文件种类巨多,难免遗漏错误,恳请广大驴友补充更正。 驴按照自己的理解,将数字电路实现流程划分成九大块: 综合,synthesisRTL 功耗分析,RTL Power可测性设计,DFT形式验证,FormalVerify布局布线,PlaceRoute寄生参数抽取,RCextraction静态时序分析,STAIR,EM分析,PowerSignoffDRC,LVS综合:补充,S家工具做物理综合时,不吃QRC, 需要读入tluplus跟 layermapfile.RTL功耗分析: 可测性设计DFT:形式验证跟低功耗检查: 布局布线:补充,S家工具,不吃QRC, 需要读入tluplus跟 layermap file.寄生参数抽取:补充,S家工具,需要nxtgrdtech

  • Spring 源码分析:不得不重视的 Transaction 事务

    业务系统的数据,一般最后都会落入到数据库中,例如MySQL、Oracle等主流数据库,不可避免的,在数据更新时,有可能会遇到错误,这时需要将之前的数据更新操作撤回,避免错误数据。 Spring的声明式事务能帮我们处理回滚操作,让我们不需要去关注数据库底层的事务操作,可以不用在出现异常情况下,在try/catch/finaly中手写回滚操作。Spring的事务保证程度比行业中其它技术(例如TCC/2PC/3PC等)稍弱一些,但使用Spring事务已经满足大部分场景,所以它的使用和配置规则也是值得学习的。接下来一起学习Spring事务是如何使用以及实现原理吧。使用例子1.创建数据库表createtabletest.user( idintauto_increment primarykey, namevarchar(20)null,ageint(3)null) engine=InnoDBcharset=utf8; 复制2.创建对应数据库表的POpublicclassJdbcUser{ privateIntegerid; privateStringname; privateIntegera

  • Apache-Flink深度解析-SQL概览

    SQL简述SQL是StructuredQueryLanguage的缩写,最初是由美国计算机科学家DonaldD.Chamberlin和RaymondF.Boyce在20世纪70年代早期从EarlyHistoryofSQL中了解关系模型后在IBM开发的。该版本最初称为[SEQUEL:AStructuredEnglishQueryLanguage](结构化英语查询语言),旨在操纵和检索存储在IBM原始准关系数据库管理系统SystemR中的数据。SEQUEL后来改为SQL,因为“SEQUEL”是英国HawkerSiddeley飞机公司的商标。我们看看这款用于特技飞行的英国皇家空军豪客SiddeleyHawkT.1A(Looksgreat):第一款SQL数据库在20世纪70年代后期,Oracle公司(当时叫RelationalSoftware,Inc.)开发了基于SQL的RDBMS,并希望将其出售给美国海军,CentralIntelligence代理商和其他美国政府机构。1979年6月,Oracle公司为VAX计算机推出了第一个商业化的SQL实现,即OracleV2。ANSI-SQL标准的采用

  • BZOj1261: [SCOI2006]zh_tree(dp)

    TimeLimit: 10Sec  MemoryLimit: 162MBSubmit: 400  Solved: 272[Submit][Status][Discuss]Description张老师根据自己工作的需要,设计了一种特殊的二叉搜索树。他把这种二叉树起名为zh_tree,对于具有n个结点的zh_tree,其中序遍历恰好为(1,2,3,…,n),其中数字1,2,3,…,n是每个结点的编号。n个结点恰好对应于一组学术论文中出现的n个不同的单词。第j个单词在该组论文中出现的次数记为dj,例如,d2=10表示第2个结点所对应的单词在该组论文中出现了10次。设该组论文中出现的单词总数为S,显然,S=d1+d2+…+dn。记fj=dj/S为第j个单词在该组论文中出现的概率(频率)。张老师把根结点深度规定为0,如果第j个结点的深度为r,则访问该结点的代价hj为hj=k(r+1)+c,其中k,c为已知的不超过100的正常数。则zh_tree是满足以下条件的一棵二叉树:它使h1f1+h2f2+…+hnfn达到最小。我们称上式为访问zh_tree的平均代价。请你根据已知数据为张老师设计一棵zh_

  • iOS保证下载资源的可靠性(二)

    前言前文iOS如何保证下载资源的可靠性介绍了基于RSA的下载资源验证方案,这次详细介绍开发过程中的问题。iOS接入步骤后台上传资源文件,配置平台对文件进行hash并用私钥进行签名得到签名串signature;把文件和signature打包成zip包,下发到客户端;客户端解压zip,得到文件和签名串signature,对文件进行hash,加载本地公钥,把hash值、signature、公钥传给Security.framework;用Security.framework提供的SecKeyRawVerify方法对hash值、signature、公钥进行验证,如果通过则表示文件未修改。1、zip解压iOS平台上可以使用MiniZipArchive进行解压。-(BOOL)unzipFile:(NSString*)filetoFilePath:(NSString*)unZipFilePathoverWrite:(BOOL)overWrite { MiniZipArchive*za=[[MiniZipArchivealloc]init]; BOOLsuccess=NO; if([zaUnzipOpe

  • 【愚公系列】2022年07月 python界面可视化 VS2022配置PyQt5环境

    文章目录一、VS2022配置PyQt5环境1.安装anaconda及opencv-python1.1安装对应的anaconda包1.2安装opencv-python2.安装PyQt53.安装PyQt常用工具4.配置系统环境变量5.配置VS2022中的外部工具6.第一个VS2022下的pyqt5程序一、VS2022配置PyQt5环境本机环境:vs2022anaconda(已经包括opencv和PIL)python1.安装anaconda及opencv-python1.1安装对应的anaconda包anaconda这是一个非常常用的python包集成管理工具,其中预安装了很多python库,使得我们不需要去手动安装各种的第三方库,我们知道自己取手动安装的过程中,很容易就会遇到一些报错,解决起来也非常的麻烦。anaconda官网:https://www.anaconda.com/products/distribution#Downloads 下载完软件包一路点击安装就行了,安装成功后会出现如下界面。 查看是否安装成功命令:conda--version 1.2安装opencv-python

  • C#通用代理-http请求转发

    [HttpPost] [HttpGet] [Route("OaProxy/{*uri}")] [DontWrapResult(WrapOnError=false,WrapOnSuccess=false,LogError=true)] publicasyncTaskOaProxy(stringuri) { varqueryString=HttpUtility.ParseQueryString(Request.QueryString.Value); queryString.Add("key",AppConsts.oaKey); varrequestUri=newUri(String.Format("{0}?{1}",uri,queryString),UriKind.Relative); varrequestMessage=newHttpRequestMessage(); requestMessage.RequestUri=requestUri; requestMessage.Method=newHttpMethod(Request.Method); if(requestMessage.M

  • 20190901-周日,开学的日子,虽然和我没关系.

    周末睡了个懒觉倒是舒服的很   上午玩玩游戏下午朋友过来玩   所以一天也没写代码   讲真真的是感到自己和朋友这一圈年纪上来了   聚在一起手游都没一个玩的   虽说也不至于去玩什么蓝月传奇   但终归都有各自的喜好   玩冒险岛1代的居然还没倒闭还在正常运营   玩暗黑2的居然还有专门的战网服务器??   还带小官方平台的玩飞飞1私服的现在知道这游戏的真不多吧   玩希望OL私服的震惊.jpg   都是匪夷所思五花八门   最多人聚一起的多了上steam找个能多人玩的游戏算是能一起玩玩   反正总的就是跟现在的主流市场八竿子打不着   毕竟掐指一算都是奔3的人了当代的坑钱手游也都略微碰过   后来都不怎么碰了除非是像COCBOB这样的硬盒游戏 不充钱也能公平竞技的做到这样的手游也是凤毛麟角   网游也都不怎么玩了 没有时间去肝大家各自上着班顾着家 都快竭尽了全力放个假宁愿走两步或者闭着眼躺床上等死 都不想被一个过肝或过氪的游

  • 结编程队-五子棋游戏-项目进度

    截止今天: 1.利用H5Canvas画板技术画出棋盘 2.导入黑白棋子图片 3.回顾js基本语法

  • java 面向对象

    3.java面向对象面试 参考 https://mp.weixin.qq.com/s/f-qIQGbzwHcW5Ur51rCqgg 3.1面向过程: 优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。 缺点:没有面向对象易维护、易复用、易扩展 3.2面向对象 3.2.1面向对象的三大特性 封装 继承 关于继承如下3点请记住: 子类拥有父类非private的属性和方法。 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。 子类可以用自己的方式实现父类的方法。(以后介绍)。 多态 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。 多态性:父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性 3.2.2多态 什么是多态机制?Java语言是如

  • pip3 install 报错 error: command &#39;/usr/bin/clang&#39; failed with exit status 1

    就是添加系统的环境变量,使用 vi~/.bash_profile打开环境变量,然后进入插入状态,将下面两条语句插入进去: exportLDFLAGS="-L/usr/local/opt/openssl/lib"exportCPPFLAGS="-I/usr/local/opt/openssl/include"然后保存并退出:   最后不要忘记更新一下文件:source~/.bash_profile ,然后再通过pip3installmysqlclient安装就会成功了————————————————版权声明:本文为CSDN博主「带鱼工作室」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/liaoningxinmin/java/article/details/90410042 既然选择了远方,便是风雨兼程...

相关推荐

推荐阅读