etcd несоответствие идентификатора кластера

Эй, у меня по какой-то причине несоответствие идентификатора кластера, он был на 1 узле, а затем исчез после очистки каталога данных несколько раз, изменения токена кластера и имен узлов, но появился на другом

вот скрипт, который я использую

IP0=10.150.0.1
IP1=10.150.0.2
IP2=10.150.0.3
IP3=10.150.0.4
NODENAME0=node0
NODENAME1=node1
NODENAME2=node2
NODENAME3=node3

# changing these on each box
THISIP=$IP2
THISNODENAME=$NODENAME2

etcd --name $THISNODENAME --initial-advertise-peer-urls http://$THISIP:2380 \
 --data-dir /root/etcd-data \
 --listen-peer-urls http://$THISIP:2380 \
 --listen-client-urls http://$THISIP:2379,http://127.0.0.1:2379 \
 --advertise-client-urls http://$THISIP:2379 \
 --initial-cluster-token etcd-cluster-2 \
 --initial-cluster $NODENAME0=http://$IP0:2380,$NODENAME1=http://$IP1:2380,$NODENAME2=http://$IP2:2380,$NODENAME3=http://$IP3:2380 \
 --initial-cluster-state new

я получил

2016-11-11 22:13:12.090515 I | etcdmain: etcd Version: 2.3.7   
2016-11-11 22:13:12.090643 N | etcdmain: the server is already initialized as member before, starting as etcd member...
2016-11-11 22:13:12.090713 I | etcdmain: listening for peers on http://10.150.0.3:2380
2016-11-11 22:13:12.090745 I | etcdmain: listening for client requests on http://10.150.0.3:2379
2016-11-11 22:13:12.090771 I | etcdmain: listening for client requests on http://127.0.0.1:2379
2016-11-11 22:13:12.090960 I | etcdserver: name = node2
2016-11-11 22:13:12.090976 I | etcdserver: data dir = /root/etcd-data
2016-11-11 22:13:12.090983 I | etcdserver: member dir = /root/etcd-data/member
2016-11-11 22:13:12.090990 I | etcdserver: heartbeat = 100ms
2016-11-11 22:13:12.090995 I | etcdserver: election = 1000ms
2016-11-11 22:13:12.091001 I | etcdserver: snapshot count = 10000
2016-11-11 22:13:12.091011 I | etcdserver: advertise client URLs = http://10.150.0.3:2379
2016-11-11 22:13:12.091269 I | etcdserver: restarting member 7fbd572038b372f6 in cluster 4e73d7b9b94fe83b at commit index 4
2016-11-11 22:13:12.091317 I | raft: 7fbd572038b372f6 became follower at term 8
2016-11-11 22:13:12.091346 I | raft: newRaft 7fbd572038b372f6 [peers: [], term: 8, commit: 4, applied: 0, lastindex: 4, lastterm: 1]
2016-11-11 22:13:12.091516 I | etcdserver: starting server... [version: 2.3.7, cluster version: to_be_decided]
2016-11-11 22:13:12.091869 E | etcdmain: failed to notify systemd for readiness: No socket
2016-11-11 22:13:12.091894 E | etcdmain: forgot to set Type=notify in systemd service file?
2016-11-11 22:13:12.096380 N | etcdserver: added member 7508b3e625cfed5 [http://10.150.0.4:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.099800 N | etcdserver: added member 14c76eb5d27acbc5 [http://10.150.0.1:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.100957 N | etcdserver: added local member 7fbd572038b372f6 [http://10.150.0.2:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.102711 N | etcdserver: added member d416fca114f17871 [http://10.150.0.3:2380] to cluster 4e73d7b9b94fe83b
2016-11-11 22:13:12.134330 E | rafthttp: request cluster ID mismatch (got cfd5ef74b3dcf6fe want 4e73d7b9b94fe83b)

другие участники даже не бегают, как это возможно?

Спасибо


person davidear    schedule 14.11.2016    source источник


Ответы (6)


Для всех тех, кто наткнулся на это из Google:

Ошибка связана с идентификатором однорангового элемента, который пытается присоединиться к кластеру с тем же именем, что и другой элемент (возможно, старый экземпляр), который уже существует в кластере (с таким же именем однорангового узла, но с другим идентификатором, в этом проблема).

вам следует удалить узел и добавить его повторно как показано в этом полезном посте:

Чтобы исправить это, было довольно просто, сначала нам нужно было войти на существующий рабочий сервер в остальной части кластера и удалить server00 из его списка участников:

etcdctl member remove <UID>

Это освобождает возможность разрешить присоединяться новому server00, но нам нужно было просто сообщить кластеру, что это возможно, введя команду add:

etcdctl member add server00 http://1.2.3.4:2380

Если вы будете следить за журналами на server00, вы увидите, что все оживает. Вы можете подтвердить это с помощью команд:

etcdctl member list

etcdctl cluster-health

Используйте «список участников etcdctl», чтобы узнать идентификаторы текущих участников, и найдите того, который пытается присоединиться к кластеру с неправильным идентификатором, затем удалите этот одноранговый узел из «членов» с помощью «etcdctl member remove» и попытайтесь снова присоединиться к нему. Надеюсь, поможет.

person Dmitry Shmakov    schedule 12.03.2017

в моем случае я получил ошибку

rafthttp: несоответствие идентификатора кластера запроса (получил 1b3a88599e79f82b хочет b33939d80a381a57)

из-за неправильной конфигурации на одном узле

две мои ноды попали в конфиг

env ETCD_INITIAL_CLUSTER="etcd-01=http://172.16.50.101:2380,etcd-02=http://172.16.50.102:2380,etcd-03=http://172.16.50.103:2380"

и один узел получил

env ETCD_INITIAL_CLUSTER="etcd-01=http://172.16.50.101:2380"

чтобы решить проблему, я остановил etcd на всех узлах, отредактировал неверную конфигурацию, удалил папку /var/lib/etcd/member на всех узлах, перезапустил etcd на всех узлах и вуаля!

p.s.

/var/lib/etcd - это папка, в которой etcd сохраняет свои данные в моем случае

person Alex    schedule 12.11.2017

Я только что столкнулся с этой же проблемой, 2 года спустя. Ответ Дмитрия в порядке, но он упускает из виду то, что ОП, вероятно, сделал неправильно при настройке кластера etcd.

Запуск экземпляра etcd с параметром --cluster-state new в любой момент сгенерирует идентификатор кластера в каталоге данных. Если вы попытаетесь затем или позже присоединиться к существующему кластеру, он будет использовать этот старый сгенерированный идентификатор кластера (когда возникает ошибка несоответствия). Да, технически у OP был «старый кластер», но более вероятно и на 100% распространено то, что когда кто-то пытается поднять свой первый кластер, он не замечает, что процедура должна измениться. Я считаю, что etcd обычно не обеспечивает хорошую модель использования.

Таким образом, удаление члена (вам действительно не нужно, если новый узел никогда не присоединялся успешно) и/или удаление каталога данных нового узла «решит» проблему, но то, как OP настраивает 2-й узел кластера, проблема .

Вот пример нюанса настройки: (вздох... спасибо за это etcd...)

# On the 1st node (I used Centos7 minimal, with etcd installed)
sudo firewall-cmd --permanent --add-port=2379/tcp
sudo firewall-cmd --permanent --add-port=2380/tcp
sudo firewall-cmd --reload

export CL_NAME=etcd1
export HOST=$(hostname)
export IP_ADDR=$(ip -4 addr show ens33 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

# turn on etcdctl v3 api support, why is this not default?!
export ETCDCTL_API=3

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=http://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380 --initial-cluster-state new

Хорошо, первый узел запущен. Данные кластера находятся в каталоге ~/data. В будущих запусках вам нужно только (обратите внимание, что состояние кластера не требуется):

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=http://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380

Затем добавьте ожидаемое имя кластера второго узла и URL-адреса одноранговых узлов:

etcdctl --endpoints="https://127.0.0.1:2379" member add etcd2 --peer-urls="http://<next node's IP address>:2380"

Добавление члена важно. Вы не сможете успешно присоединиться, не сделав этого сначала.

# Next on the 2nd/new node
export CL_NAME=etcd1
export HOST=$(hostname)
export IP_ADDR=$(ip -4 addr show ens33 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=https://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380 --initial-cluster-state existing --initial-cluster="etcd1=http://<IP of 1st node>:2380,etcd2=http://$IP_ADD:2380"

Обратите внимание на раздражающие дополнительные аргументы. --initial-cluster должен иметь 100% всех идентифицированных узлов в кластере... что не имеет значения после того, как вы присоединитесь к кластеру, потому что данные кластера в любом случае будут реплицированы... Также необходимо "--initial-cluster exists" .

Опять же, после первого запуска/присоединения второго узла вы можете запустить его без каких-либо аргументов кластера:

sudo etcd --name $CL_NAME --data-dir ~/data --advertise-client-urls=http://127.0.0.1:2379,https://$IP_ADDR:2379 --listen-client-urls=https://0.0.0.0:2379 --initial-advertise-peer-urls https://$IP_ADDR:2380 --listen-peer-urls https://$IP_ADDR:2380

Конечно, вы можете продолжать запускать etcd со всеми настройками кластера, но они «могут» игнорироваться для того, что находится в каталоге данных. Помните, что если вы присоединяетесь к третьему узлу, информация о новом члене узла реплицируется на оставшийся узел, и эти «начальные» настройки кластера могут быть полностью ложными/вводить в заблуждение в будущем, когда ваш кластер изменится. Поэтому запускайте присоединенные узлы без начальных настроек кластера, если только вы не присоединяетесь к одному из них.

Кроме того, последнее, что нужно сообщить, вы должны / должны запустить как минимум 3 узла в кластере, иначе процесс выбора лидера RAFT все сломает. С 2 узлами, когда 1 узел выходит из строя или они отключаются, узел не будет выбирать себя и вращаться в цикле выборов. Клиенты не могут общаться со службой etcd, находящейся в режиме выборов... Отличная доступность! Вам нужно как минимум 3 узла для обработки, если 1 выйдет из строя.

person dubmojo    schedule 21.08.2019

Я столкнулся с той же проблемой, наш ведущий сервер etcd вышел из строя, и после замены его новым мы получили ошибку

 rafthttp: request sent was ignored (cluster ID mismatch)

Он искал старый идентификатор кластера и генерировал какой-то случайный локальный кластер с некоторой неправильной конфигурацией.

Выполните следующие действия, чтобы устранить проблему.

  1. Войдите в другой рабочий кластер и удалите недостижимого члена из кластера

    etcdctl cluster-health etcdctl member remove member-id

  2. Войдите на новый сервер и остановитесь, если запущен процесс etcd systemctl etcd2 stop

  3. Удалить данные из каталога данных rm -rf /var/etcd2/data Перед удалением сохраните резервную копию этих данных где-нибудь в другой папке.

  4. Теперь запустите свой кластер с параметром --initial-cluster-state existing, не используйте --initial-cluster-state new, если вы уже добавляете сервер в существующий кластер.

  5. Теперь вернитесь к одному из запущенных серверов etcd и добавьте этого нового члена в кластер etcdctl member add node0 http://$IP:2380.

Я потратил много времени на отладку этой проблемы, и теперь мой кластер работает исправно со всеми участниками. Надеюсь, эта информация поможет.

person skipper21    schedule 08.09.2017

Мой --data-dir=/var/etcd/data, удалите и создайте его заново, это работает для меня. Кажется, что-то из предыдущего созданного мной кластера etcd осталось в этом каталоге, что может повлиять на настройки etcd.

person Yitong Feng    schedule 08.08.2017

  1. Добавьте новый узел в существующий кластер etcd.

    etcdctl member add <new_node_name> --peer-urls="http://<new_node_ip>:2380"

Внимание, если вы включаете TLS, замените http на https.

  1. Запустите etcd в новом узле. Важно добавить существующий --initial-cluster-state, чтобы сообщить новому узлу, что он присоединится к существующему кластеру, вместо создания нового кластера.

    etcd --name <new_node_name> --initial-cluster-state existing ...

  2. Проверить результат

    etcdctl member list

person Chen Meng    schedule 08.07.2021