0 Обзор альбома
etcd является важным базовым компонентом облачной архитектуры, которая инкубируется и размещается CNCF. etcd можно использовать не только для регистрации и обнаружения сервисов в микросервисах и кластерах Kubernetes, но и как промежуточное ПО для хранения ключей и значений.
"Понимание статей серии etcd" познакомит с etcd с точки зрения базовой функциональной практики etcd, интерфейса API, принципа реализации, анализа исходного кода и опыта преодоления ям в реализации. Ожидается, что статей будет около 20, автор будет обновлять каждую неделю, прошу обратить внимание.
1 etcd установка и использование
В предыдущей статье я в основном представил связанные концепции и сценарии использования etcd, а в этой статье в основном представлены различные методы установки и использования etcd.
1.1 Глоссарий концепций etcd
Прежде чем приступить к установке и использованию etcd, давайте сначала разберемся со словарем понятий etcd, чтобы облегчить последующее понимание.
- Raft: Алгоритм, используемый etcd для обеспечения строгой согласованности в распределенных системах.
- Узел: экземпляр конечного автомата Raft.
- Участник: Экземпляр etcd. Он управляет узлом и может обслуживать запросы клиентов.
- Кластер: несколько участников образуют кластер etcd, который может работать вместе.
- Peer: Имя другого члена в том же кластере etcd.
- Клиент: клиент, который отправляет HTTP-запросы в кластер etcd.
- WAL: журнал упреждающей записи, формат журнала, используемый etcd для постоянного хранения.
- Снимок: Снимок, установленный etcd для предотвращения слишком большого количества файлов WAL и сохранения состояния данных etcd.
- Прокси: Режим etcd, который предоставляет услуги обратного прокси для кластеров etcd.
- Лидер: Узел, который обрабатывает все отправленные данные, сгенерированные выбором в алгоритме Raft.
- Подчиненный: узлы, не прошедшие выборы, служат подчиненными узлами в Raft, обеспечивая надежные гарантии согласованности для алгоритма.
- Кандидат: когда последователь не получает сердцебиение лидера в течение определенного периода времени, он превращается в кандидата и начинает кампанию.
- Срок: узел становится лидером до следующего времени выборов, которое называется сроком.
- Индекс: номер элемента данных. В Raft Term и Index используются для поиска данных.
2 etcd автономная установка и развертывание
Есть много способов установить etcd, в качестве примеров автор берет Centos 7 и MacOS 10.15.yum install etcdиbrew install etcdустановить.
Однако версия etcd, установленная через системные инструменты, отстает.Если вам нужно установить последнюю версию etcd, мы можем установить ее через бинарные пакеты, компиляцию исходного кода и контейнеры docker.
2.1 Бинарная установка
Последняя версия etcd на данный момент 3.4.4. В macOS выполните следующий скрипт:
ETCD_VER=v3.4.4
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}
rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
Можно вывести следующие результаты:
etcd Version: 3.4.4
Git SHA: c65a9e2dd
Go Version: go1.12.12
Go OS/Arch: darwin/amd64
Как видите, мы успешно упаковали etcd 3.4.4, и эта версия основана на версии Go.1.12.12.
Точно так же мы используем следующий скрипт для установки на Centos 7:
ETCD_VER=v3.4.4
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
Загрузка может быть медленной.После выполнения результат такой:
etcd Version: 3.4.4
Git SHA: e784ba73c
Go Version: go1.12.12
Go OS/Arch: linux/amd64
Таким образом, мы успешно установили как на macOS, так и на Linux.Установка в системе Windows относительно проста.После загрузки установочного пакета запустите его напрямую. Где etcd.exe — сервер, etcdctl.exe — клиент.
2.2 Установка источника
Чтобы установить из исходного кода, вам сначала нужно обеспечить локальную языковую среду Go. Если не установлено, см.golang.org/doc/install…
Для тех, кто хочет попробовать последнюю версию, etcd можно собрать из ветки master. Go версии 1.13+ требуется для сборки последней версии etcd. Локальная версия Go:
$ go version
$ go version go1.13.6 linux/amd64
Собираем etcd на основе ветки master, скрипт такой:
git clone https://github.com/etcd-io/etcd.git
cd etcd
./build
Выполните тестовую команду, чтобы убедиться, что etcd успешно скомпилирован и установлен:
$ ./etcdctl version
etcdctl version: 3.4.4
API version: 3.4
После вышеуказанных шагов etcd был успешно установлен путем компиляции исходного кода.
2.3 установка докер-контейнера
использование etcdgcr.io/etcd-development/etcdв качестве источника репозитория контейнеров, аquay.io/coreos/etcdВ качестве вторичного реестра контейнеров.
REGISTRY=quay.io/coreos/etcd
# available from v3.2.5
REGISTRY=gcr.io/etcd-development/etcd
rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
docker rmi gcr.io/etcd-development/etcd:v3.4.7 || true && \
docker run \
-p 2379:2379 \
-p 2380:2380 \
--mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
--name etcd-gcr-v3.4.7 \
gcr.io/etcd-development/etcd:v3.4.7 \
/usr/local/bin/etcd \
--name s1 \
--data-dir /etcd-data \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://0.0.0.0:2379 \
--listen-peer-urls http://0.0.0.0:2380 \
--initial-advertise-peer-urls http://0.0.0.0:2380 \
--initial-cluster s1=http://0.0.0.0:2380 \
--initial-cluster-token tkn \
--initial-cluster-state new \
--log-level info \
--logger zap \
--log-outputs stderr
docker exec etcd-gcr-v3.4.7 /bin/sh -c "/usr/local/bin/etcd --version"
docker exec etcd-gcr-v3.4.7 /bin/sh -c "/usr/local/bin/etcdctl version"
docker exec etcd-gcr-v3.4.7 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
docker exec etcd-gcr-v3.4.7 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
docker exec etcd-gcr-v3.4.7 /bin/sh -c "/usr/local/bin/etcdctl get foo"
Выполните следующую команду, чтобы подтвердить статус etcd, установленного в контейнере:
$ etcdctl --endpoints=http://localhost:2379 version
etcdctl version: 3.4.4
API version: 3.4
3. развертывание кластера etcd
В производственной среде для обеспечения высокой доступности всего кластера etcd обычно развертывается в кластере, чтобы избежать единой точки отказа. В этом разделе рассказывается, как развернуть кластер etcd.
3.1 Локальный запуск кластера etcd
Если вы хотите попрактиковаться в построении кластера etcd на одной машине, вы можете использовать инструмент goreman.
goreman — инструмент управления несколькими процессами, написанный на языке Go, который представляет собой переписанный под Ruby широко используемый foreman (первоначальный автор foreman также реализовал Go-версию: forego, но он не так прост в использовании, как goreman).
Мы уже подтвердили среду установки Go и выполняем ее напрямую:
go get github.com/mattn/goreman
Скомпилированный файл помещается в$GOPATH/binсередина,$GOPATH/binКаталог добавлен в систему$PATH, поэтому мы можем легко выполнить командуgoremanЗаказ. Далее следует написать скрипт Procfile, запускаем три etcd, конкретное соответствие следующее:
| HostName | ip | Порт взаимодействия с клиентом | одноранговый коммуникационный порт |
|---|---|---|---|
| infra1 | 127.0.0.1 | 12379 | 12380 |
| infra2 | 127.0.0.1 | 22379 | 22380 |
| infra3 | 127.0.0.1 | 32379 | 32380 |
Сценарий Procfile выглядит следующим образом:
etcd1: etcd --name infra1 --listen-client-urls http://127.0.0.1:12379 --advertise-client-urls http://127.0.0.1:12379 --listen-peer-urls http://127.0.0.1:12380 --initial-advertise-peer-urls http://127.0.0.1:12380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd2: etcd --name infra2 --listen-client-urls http://127.0.0.1:22379 --advertise-client-urls http://127.0.0.1:22379 --listen-peer-urls http://127.0.0.1:22380 --initial-advertise-peer-urls http://127.0.0.1:22380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
etcd3: etcd --name infra3 --listen-client-urls http://127.0.0.1:32379 --advertise-client-urls http://127.0.0.1:32379 --listen-peer-urls http://127.0.0.1:32380 --initial-advertise-peer-urls http://127.0.0.1:32380 --initial-cluster-token etcd-cluster-1 --initial-cluster 'infra1=http://127.0.0.1:12380,infra2=http://127.0.0.1:22380,infra3=http://127.0.0.1:32380' --initial-cluster-state new --enable-pprof --logger=zap --log-outputs=stderr
Описание элемента конфигурации:
- --name: Имя узла в кластере etcd, которое может быть произвольным, различимым и не повторяющимся.
- --listen-peer-urls: отслеживаемые URL-адреса для связи между узлами, которые можно отслеживать для нескольких, и кластер будет использовать эти URL-адреса для взаимодействия с данными (например, выборы, синхронизация данных и т. д.)
- --initial-advertise-peer-urls: предлагаемые URL-адреса для связи между узлами, которые будут использоваться для связи между узлами.
- --listen-client-urls: отслеживаемые URL-адреса для связи с клиентом, а также могут отслеживать несколько.
- --advertise-client-urls: рекомендуемые URL-адреса для связи с клиентом. Это значение используется агентами etcd или членами etcd для связи с узлами etcd.
- --initial-cluster-token: etcd-cluster-1, значение токена узла. После установки этого значения кластер будет генерировать уникальный идентификатор, а также уникальный идентификатор будет генерироваться для каждого узла. При использовании одного и того же файл конфигурации, чтобы снова запустить кластер. Пока значения токенов разные, кластеры etcd не будут влиять друг на друга.
- --initial-cluster: коллекция всех начальных-рекламных-равных-адресов в кластере.
- --initial-cluster-state: new, флаг нового кластера
Обратите внимание на приведенный выше сценарий, команду etcd необходимо настроить в соответствии с фактическим локальным адресом установки при выполнении команды etcd. Далее мы запускаем кластер etcd.
goreman -f /opt/procfile start
Используйте приведенную выше команду, чтобы запустить кластер etcd и просмотреть элементы в кластере после завершения запуска.
$ etcdctl --endpoints=http://localhost:22379 member list
8211f1d0f64f3269, started, infra1, http://127.0.0.1:12380, http://127.0.0.1:12379, false
91bc3c398fb3c146, started, infra2, http://127.0.0.1:22380, http://127.0.0.1:22379, false
fd422379fda50e48, started, infra3, http://127.0.0.1:32380, http://127.0.0.1:32379, false
Мы успешно построили псевдокластер на одной машине.Следует отметить, что при запуске кластера мы указываем членов кластера статическим образом.В реальной среде ip членов кластера может быть неизвестен заблаговременно. В настоящее время необходимо принять механизм динамического обнаружения.
4. Резюме
Эта глава относительно проста и носит практический характер, и читатели лучше всего смогут попрактиковаться в ней самостоятельно. В этой статье в основном представлены различные методы установки etcd: автономный и кластерный etcd. Установка кластера etcd также должна взаимодействовать с динамическим механизмом обнаружения служб, который будет объяснен в следующей статье Добро пожаловать, обратите внимание и лайкните.
Подписывайтесь на свежие статьи, приглашаю обратить внимание на мой публичный номер
Рекомендуемое чтение
- Сравнение etcd с другими компонентами k-v, такими как Zookeeper и Consul
- Тщательно изучите серию статей etcd (1): первое знакомство с etcd