Мне нужно получить статус узла Cassandra в некоторой переменной для дальнейшего использования в сценарии bash. Как сделать это наиболее эффективным способом?

Я знаю, что могу получить статус от

# nodetool status
Datacenter: DC1
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns    Host ID                               Rack
UJ  10.131.75.142  698.74 KB  256          ?       d032b36b-ffb6-496a-b814-bab399ce8a1f  RAC2
UN  10.131.75.141  729.76 KB  256          ?       739c1e5f-2ff4-4bfa-9ae8-4f64ff061ce9  RAC1
Datacenter: DC2
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns    Host ID                               Rack
UN  10.131.75.144  19.12 MB   256          ?       47430976-dee6-40bb-bce2-2a9f8d401aba  RAC2
UN  10.131.75.143  28.98 MB   256          ?       7b3faef4-ba62-4d1d-87f8-9b0b082a0011  RAC1

Или (значение режима)

# nodetool netstats
Mode: NORMAL
Not sending any streams.
Read Repair Statistics:
Attempted: 0
Mismatch (Blocking): 0
Mismatch (Background): 0
Pool Name                    Active   Pending      Completed
Large messages                  n/a         0              0
Small messages                  n/a         0              7
Gossip messages                 n/a         0          12199

Но может быть есть способ лучше?

1
ipeacocks 29 Дек 2015 в 19:32

2 ответа

Лучший ответ

Думаю, так лучше:

mode=$(nodetool netstats | grep 'Mode')
if [[ $mode != *"NORMAL"* ]]; then
  echo "Aborting backup!"
  exit 1
fi
1
ipeacocks 7 Янв 2016 в 23:23

Я обнаружил, что наиболее простой способ сделать это - обернуть команды nodetool внутри сценария Bash и вытащить определенные поля, которые вам нужны, с помощью комбинации grep и awk. Если есть способ получше, то я о нем не знаю. И если вы собирались пойти именно так, то вы, вероятно, знаете, как все это сделать.

Но все равно приведу пример. Вот отрывок из написанного мной сценария, в котором мне нужны IP-адреса узлов в моем кластере для проверки пропускной способности / статистики уплотнения на них:

#!/bin/bash
STATUS_FILE="nodetool_status.txt"
#get IP addresses, store in file
(~/local/$CASS_VERSION/bin/nodetool status 2> /dev/null | grep "UN " | awk '{print $2}' > $STATUS_FILE)

printf "%15s: %3s %4s\n" "IP" "MB/s" "Pending"

while read -r LINE
do
  COMPACTION_THROUGHPUT=$(~/local/$CASS_VERSION/bin/nodetool getcompactionthroughput -h $LINE 2> /dev/null | awk '{print $4}')
  PENDING_COMPACTIONS=$(~/local/$CASS_VERSION/bin/nodetool compactionstats -h $LINE 2> /dev/null | grep pending | awk '{print $3}')
  printf "%15s: %3s %4s\n" $LINE $COMPACTION_THROUGHPUT $PENDING_COMPACTIONS
done < "$STATUS_FILE"

В основном, я обрабатываю результаты nodetool status, отправляю вывод ошибки в / dev / null, grep для "UN" (потому что меня интересует только проверка исправных / нормальных узлов), и я экономлю второй поле (IP-адрес) в файле. Затем я читаю этот файл для обработки каждого IP-адреса, беру определенные значения из вывода nodetool getcompactionthroughput и nodetool compactionstats и отображаю их.

С точки зрения эффективности, сохранение вывода nodetool status в файл позволяет легко использовать его повторно. Для nodetool netstats вам нужно будет запустить его один раз для каждого узла в вашем кластере, тогда как nodetool status нужно будет вызвать только один раз.

В вашем случае, поскольку "status" - это поле, которое вам нужно, вы захотите найти что-нибудь еще, чтобы grep (чтобы упростить игнорирование дополнительных строк вывода из nodetool status). Возможно, вам подойдет счетчик токенов («256») или подсеть («10.131.75.»)?

2
Aaron 29 Дек 2015 в 17:35