Специалистам по DNS давно известно, что если вам нужна отказоустойчивость службы DNS в любой сети, вы не оставляете это решение на усмотрение клиента.
Это слишком важное решение — оставить на усмотрение распознавателя реализацию клиентов.
Хотя теоретически клиенты должны возвращаться ко 2-му DNS в случае сбоя 1-го, часто этого не происходит по нескольким причинам. За годы своей карьеры я видел огромные сбои в полных сетях, когда люди реализовывали вещи, рассчитывая на то, что распознаватель клиентской операционной системы достаточно умен.
Обычно вы делаете то же, что и корневые серверы имен, то есть создаете DNS-кластеры для получения виртуальных IP-адресов ваших DNS-серверов. Чаще всего для этого используется технология DNS anycast. Вы также можете попробовать более простые архитектуры, такие как использование keepdalived.
Однако, что бы вы ни делали, я подчеркиваю, что не оставляйте это решение на усмотрение клиента.
см. Anycast IPv4 с Linux и Quagga
The traditional safeguard is to establish multiple DNS servers for a given site. Each DNS client on the network is configured with each of those servers' IP addresses. The chances of all of those servers failing in a catastrophic way are fairly small, so you have a margin of safety.
On the other hand, many stub resolvers will take only two DNS servers, making it nearly impossible to have any meaningful geographical dispersion in your DNS topology. DNS stub resolvers generally use the first of two configured DNS servers exclusively. Consequently, you end up with one server taking the entire query load and one idling, waiting for a failure. Not optimal, but hey, that's the price of redundancy...right? It doesn't have to be.
DNS redundancy and failover is a classic use case for anycast. Anycast is the concept of taking one IP address and sharing it between multiple servers, each unaware of the others. The DNS root nameservers make extensive use of anycast.
ПС. В прошлом я внедрил Anycast DNS с iBGP и OSPF у двух интернет-провайдеров и в одном университете, что значительно улучшило доступность службы DNS во время безотказной работы.
С помощью zsh
можно сделать:
for dir in **/*(NDodoN/e['[[ $REPLY:t = $REPLY:h:t ]]']); do
contents=($dir/*(NDoN))
(( $#contents == 0 )) ||
mv -- $contents $dir:h/ &&
rmdir -- $dir
done
Где:
**/*(qualifiers)
рекурсивная подстановка с помощью квалификаторов подстановки N
:nullglob :не жаловаться, если совпадений нет D
:dotglob :включает скрытые файлы od
:порядок глубины сначала (уходит перед ветвями, на которых они находятся ). oN
:В противном случае не беспокойтесь об упорядочении списка файлов. /
:ограничиться файлами типа каталог. e['expression']
:ограничиться файлами, для которых код expression
возвращает true (, внутри которых текущий путь к файлу хранится в$REPLY
). $REPLY:t
:хвост (базовое имя )файла $REPLY:h:t
:хвост головы (имя каталога )файлов)С bash
4.4+ и GNU find
или find
или большинством BSD вы можете сделать что-то подобное с:
shopt -s nullglob dotglob
readarray -td '' dirs < <(
LC_ALL=C find. -depth -regex '.*\(/[^/]*\)\1' -type d -print0
)
for d in "${dirs[@]}"; do
contents=("$d"/*)
(( ${#contents[@]} == 0 )) ||
mv -- "${contents[@]}" "${d%/*}/" &&
rmdir -- "$d"
done
На этот раз с использованием регулярного выражения для сопоставления файлов ./path/to/dir/dir
с использованием базового регулярного выражения обратно -ссылок.
Попробуйте это на основе GNU find
v4.8.0 и Bash v5.1.8
Предположим, что определенный каталог в вашем дереве имеет следующую структуру:
./
|__test1/
|__dirname with space
| |__test2
| |__ test2
|__dirname **
| |__test1
|
|__reboot
| |__test1
|
|__test2/
|__test3/
|__test2/
|__test1/
|__test1/
(Странные имена каталогов используются для демонстрации безопасности кода.)
Вы видите, что некоторые подкаталоги -(подкаталоги )повторяются по-разному. Некоторые повторяются несколько раз, а не только один раз (, например. test1
), один не повторяется (test3
), и они могут повторяться либо как родительский и дочерний, либо разделены произвольным числом промежуточных подкаталогов.
Приведенный ниже код детально выявляет повторяющиеся имена подкаталогов в структуре каталогов.
$PWD
$PWD
. В моем эксперименте самый длинный путь к подкаталогу — :./test1/test2/test1/test3/test2/test1/test1
[Код]
$ find./* -type d -exec bash -c 'set -o noglob; IFS="/" subdir=($(printf "%s " "$1")); dirlevels=$((${#subdir[@]}-1)); dupe="$(awk '\''!($1 in sd) {sd[$1];next} {print $1}'\'' < <(printf "%s\n" ${subdir[@]:1}))";[ $dirlevels -ge 2 ] && [ ! -z "$dupe" ] && (printf "%s/" "${subdir[@]:1}";printf " ;; %s\n" "$(tail -n 1 < <(printf "%s\n" "$dupe"))";)' shellexec {} \; | tac >| tmp.data
$ cat -n tmp.data
1 test1/reboot/test1/ ;; test1
2 test1/dirname with space/test2/test2/ ;; test2
3 test1/test2/test1/test3/test2/test1/test1/ ;; test1
4 test1/test2/test1/test3/test2/test1/ ;; test1
5 test1/test2/test1/test3/test2/ ;; test2
6 test1/test2/test1/test3/ ;; test1
7 test1/test2/test1/ ;; test1
8 test1/dirname **/test1/ ;; test1
Обработка выполняется в порядке, указанном в tmp.data
.
tmp.data
, первое дублированное имя на пути ./test1/test2/test1/test3/test2/test1/test1
— test1
. Мы можем перенести его содержимое на самый левый подкаталог с тем же именем:./test1/
test1
удаляется.tmp.data
и повторяем вышеуказанные шаги. tmp.data
. На данном этапе вопрос (к автору вопроса :@TomDerks )заключается в том, что делать с правильным -большинством test1/*
в строке 6 ? Следует ливсеего содержимое перемещать в самый левый -каталог с таким же именем, который в данном случае является первым уровнем подкаталога на пути? Включает ли «все» файлы в ./test1/test2/test1/
, а также подкаталог test3
и его содержимое?
Полное решение (Часть 2 )зависит от этого.