一意のクラスタ名

一意のクラスタ名

複数のクラスタ化されたサーバーがあり、各クラスターで1つのサーバーを確認する必要があります。リスト内のエントリを比較して各クラスタに1つのサーバーのみを返すにはどうすればよいですか?すべてのサーバー名は[az]-[az]-[az][0-9].domain_nameに従います。

サーバーリストの例。

test-rac-1.domain_name
test-rac-2.domain_name
test-rac-3.domain_name
test-rac-dg1.domain_name
test-rac-dg2.domain_name
test-rac-dg3.domain_name
qat-rac-1.domain_name
qat-rac-2.domain_name
qat-rac-3.domain_name
ser-ser-ser.domain_name
long-serv-name.domain_name

結果サーバーのリスト。

test-rac-1.domain_name
test-rac-dg1.domain_name
qat-rac-1.domain_name
ser-ser-ser.domain_name
long-serv-name.domain_name

- 結果はクラスタ内の任意のサーバーになります。

答え1

正規表現を使用して、grepを使用してすべての行をフィルタリングできます。

grep '[a-z-]1\?\.domain_name' file > newfile

1これにより、前に文字またはマイナス記号があり、オプションで ".domain_name" を含むすべての行が返されます。


逆の操作は、「.domain_name」の前の数字> 1を含むすべての行を削除することです。

grep -v '\([2-9]\|[0-9]1\)\.domain_name' file > newfile

これは、「.domain_name」の前の最後の数字が2〜9、または最後の数字が少なくとも2桁1(11または21などに一致)の行と一致します。この-vオプションは、一致しない行を選択するために使用されます。

答え2

すべてのクラスタにホスト番号が含まれているかどうかわからない場合は、1このクラスタを追跡する必要があります。awk特に、連想配列を使用してこれを行うことができます。

awk '{o=$0; sub(/[0-9]+/,"",o)} !a[o]++ {print}' file

答え3

Freddyの答えは、各ノードの最初のノードのみを提供します。これが必要な場合がありますが、各クラスタでノードをランダムに選択します。

# iterate through unique list of cluster stub names, assuming a digit marks the node number
for cluster in $(sed -e 's/.domain_name//' serverlist|tr -d '[[:digit:]]'|sort -u)
  do
  # for this cluster, get the list of all node names if indexed
  nodes=( $(grep $cluster'[[:digit:]]' serverlist) )
  # if there wasn't a match it's because it's a cluster of one without a node number
  if (( ${#nodes[@]} == 0 )); then
    # cluster of one
    echo $cluster
  else
    # pick a random number from 1 to number of nodes
    # subtract one to make it an array index
    n=$(( $(shuf -i"1-${#nodes[@]}" -n1) -1 ))
    echo ${nodes[$n]}
  fi
done

関連情報