В AWS Redshift, как можно полностью автоматизировать отмену запросов? - PullRequest
0 голосов
/ 23 января 2020

В AWS Redshift. Я могу завершить запрос с помощью команды pg_terminate_backend(pid);.

Проблема в том, что pid можно получить только после запуска запроса путем запроса таблицы stv_recents.

Это создает проблему в автоматизации. Как программно завершить запрос (возможно, из-за превышения лимита времени)? Насколько я вижу, я могу получить pid, отфильтровав столбцы запроса, пользователя и времени начала (в pid). Проблема в том, что все запросы поступают от пользователя приложения (одного и того же пользователя), и некоторые пользователи могут выполнять один и тот же запрос.

Есть ли способ поразить некоторый тип обратного вызова и получить pid во время или после выполнения запроса? Иначе, как можно автоматизировать отмену запроса?

Заранее спасибо.

1 Ответ

2 голосов
/ 23 января 2020

Я реализовал себе подобный подход и рекомендую его вам. Я определил группы в Redshift WLM . Например, если пользователь БД принадлежит к одной указанной группе c, он может выполнять запросы без ограничения по времени, все другие запросы пользователя БД будут отменены через определенное время. Недостаток этого подхода заключается в том, что вам нужно будет настроить все вручную, включая максимальное количество параллельных запросов на группу. Но это должно быть сделано только один раз. Это файл конфигурации, созданный для наших целей:

[
  {
    "query_concurrency": 13,
    "memory_percent_to_use": 87,
    "query_group": [],
    "query_group_wild_card": 0,
    "user_group": [
      "wlm_main"
    ],
    "user_group_wild_card": 0
  },
  {
    "query_concurrency": 2,
    "max_execution_time": 300000,
    "query_group": [],
    "query_group_wild_card": 0,
    "user_group": [],
    "user_group_wild_card": 0
  },
  {
    "short_query_queue": true
  }
]

Он говорит, что пользователи, назначенные группе wlm_main , будут назначены в первую очередь. Все остальные будут назначены во вторую очередь, где параллельно может выполняться не более 2 запросов, все остальные ожидают в очереди. В дополнение к этому также используется ускорение коротких запросов . Как вы можете видеть - первая очередь не имеет ограничения по времени, вторая очередь имеет ограничение 300000 миллисекунд (5 минут).

Редактировать: Расширение ответа относительно этого конкретного c варианта использования.

Для получить pid (идентификатор процесса) запроса, отправленного в базу данных. Вы можете добавить комментарий перед оператором SQL с уникальным значением (ха sh или последовательность), например: /* d131dd02c5e6eec4 */ select .... И затем, основываясь на этом, вы можете найти его в stv_recents или stv_inflight и получить pid. После получения pid его можно использовать для завершения сеанса: pg_terminate_backend(pid)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...