【现象】
3月1日10:02、10:52用户反馈部分查询减慢,超过预设超时间(6万 ms)
【调查进展】
- refresh queue原因有待分析
- Cpu load10/16显著增加(load值/核数未达到理论瓶颈)
- Io明显增高,达到600(未达到理论瓶颈)
- Search queue明显增加,达到10(未达到理论瓶颈)
- 用户反馈业务量通常每分钟3次.5万左右每分钟增加到7万左右
【可能原因分析(非最终结论)】
业务查询语句涉及检索和排序。通过监控,我们可以看到索引每秒大约写入100个文档,这将潜在更新每个片段segment,然后需要频繁阅读段文件来更新排序树。当内存有限时,磁盘会被引起io增大,因此cpu和load随着查询流量的增加(达到1166 qps,几乎是正常流量的两倍),部分查询可能需要很长时间。
【短期解决方案】
- 扩展CPU,提高集群整体计算能力(由于集群所在基础设施资源不足,暂时未完成)
- 尽可能减少磁盘io(已完成)
【3月2日排查方向建议】
- 密切关注集群级和节点级等相关指标的反馈,如cpu load、search queue、磁盘io等
- 当负载高或用户反馈超时时,检查慢查句子,同时针对DSL进行profile分析,定位耗时的原因;结合jstack、arthas分析高消耗或等待线程,进一步确定资源瓶颈点
【后续可考虑的优化点】
- 排名优化:index sorting实现写入预排序,提高包括排序在内的并发查询效率
- 其它优化点需要分析
一、集群层面
GET _all 查询集群的所有信息
GET _search 查询集群中的一切documents
GET _cat/count 查询集群documents数量
GET _cat/indices?v&pretty 查询集群中存在的所有索引
GET /index 查询索引
DELETE /index 删除单个索引
DELETE /index1,index2或index* 删除多个索引
DELETE /_all或DELETE /* 删除所有索引
二、索引水平
GET index/…
GET index/_mapping
GET index/type/_mapping
GET index/type/_search 查询索引中的所有documents
GET index/type/_count 查询该索引中documents数量
GET index/type/_mapping 查询索引各字段的数据类型
GET index/type/id 查询特定的document
GET index/type/id?routing=rid 查询特定的document,带路由规则
查询所有文件
POST index/type/_search
{
“query”: {
“match_all”: {}
}
}
删除所有文档
DELETE index/type/_delete_by_query
{
“query”: {
“match_all”: {}
}
}
三、query-context通用非结构化子查询
查询匹配单个字段值的文档
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”:{
“match”:{
“trx_nbr”:“123456”
}
}
}
查询匹配多个字段值的文档
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”:{
“multi_match”:{
“query”: 人民币,
“fields”:[“fuzzy_search”,“fuzzy_search2”]
}
}
}
查询匹配习语的文档
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”:{
“match_phrase”:{
“fuzzy_search人民币 手机银行”
}
}
}
语法查询,AND OR NOT
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“query_string”: {
“query”: “人民币 AND (0131 OR 555)”
}
}
}
多字段语法查询
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“query_string”:{
“query”: “(人民币 AND 本人资金往来),
“fields”: [“fuzzy_search”,“fuzzy_search2”]
}
}
}
四、query-context通用结构化子查询
查询特定字段
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“term”:{
“trx_nbr”:“C911338448501”
}
}
}
范围查询
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“range”:{
“trx_tim”:{
“gte”: “2019-04-19 00:00:00”,
“lte”: “2019-04-19 14:19:03”
}
}
}
}
五、filter-context通用子查询
过滤出某个字段的值
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“bool”:{
“filter”:{
“term”: {
“crd_nbr”: “1111111111111111”
}
}
}
}
}
布尔计算查询should,must,must_not
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“bool”:{
“should”:[{
“match”: {
“crd_nbr”: “111111111111111”
}
},{
“match”: {
“trx_nbr”:“C911338448501”
}
}]
}
}
}
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“bool”:{
“must_not”:[{
“term”: {
“crd_nbr”: “111111111111111”
}
}]
}
}
}
六、组合查询
POST szjy_lst_dtl_wrt/szjy_lst_dtl_wrt/_search
{
“query”: {
“bool”:{
“should”:[{
“match”: {
“crd_nbr”: “111111111111111”
}
},{
“match”: {
“trx_nbr”:“C911338448501”
}
}]
, “filter”: [
{
“term”: {
“usr_id”: “012377316192”
}
}
]
}