Распределенная база данных не имеет общих дисков или межсетевых соединений. По соображениям безопасности и производительности вы, вероятно, используете VPC в регионе облака, пиринговые VPC между регионами и прямое соединение между облачными провайдерами. Но можно также развернуть кластер через публичный интернет. Это пример для демонстрации.
У меня есть две учетные записи Oracle Cloud free tier, одна во Франкфурте (eu-fra-1
) и одна в Цюрихе (eu-zrh-1
). Бесплатный уровень позволяет 2 публичных IP, и я создал 2 бесплатные виртуальные машины в eu-fra-1
и одну в eu-zrh-1
, которые могут быть постоянно включены, без какого-либо риска платить что-либо. Вот необходимая информация для одного из них в Цюрихе:
Это небольшие машины (CPU — 20% одного ядра AMD EPYC 7551, и 686MB доступной RAM), конечно, не для выполнения высокой нагрузки, но достаточно для запуска YugabyteDB для тестирования развертывания в публичной сети. Я открыл порты YugabyteDB, используемые для межузловой связи (7100 для yb-master и 9100 для yb-tserver), а также для Web UI (соответственно 7000 и 9000) и порт YSQL для протокола PostgreSQL (5433) для узлов, к которым я хочу подключиться с помощью клиента PostgreSQL.
Вот узлы, которые я буду использовать:
Регион | Зона (AD) | Публичный IP | Частный IP |
---|---|---|---|
eu-fra-1 | ад-3 | yb1.pachot.net | 10.0.0.231 |
эу-фра-1 | объявление-3 | yb2.pachot.net | 10.0.0.200 |
eu-zrh-1 | объявление-1 | yb3.pachot.net | 10.0.0.14 |
Я имею доступ по ssh ко всем и быстро проверяю соединение (я открыл все порты, требуемые YugabyteDB, включая 7100)
for public in yb1.pachot.net yb2.pachot.net yb3.pachot.net
do
for private in 10.0.0.231 10.0.0.200 10.0.0.14
do
ssh $public bash -c "echo > /dev/tcp/$private/7100" 2> /dev/null
echo "$? $public -> $private" &
done
done | awk '/0 /{$1="ok"}/1 /{$1=" "}{print}'
Вот результат:
ok yb1.pachot.net->10.0.0.231
ok yb1.pachot.net->10.0.0.200
yb1.pachot.net->10.0.0.14
ok yb2.pachot.net->10.0.0.231
ok yb2.pachot.net->10.0.0.200
yb2.pachot.net->10.0.0.14
yb3.pachot.net->10.0.0.231
yb3.pachot.net->10.0.0.200
ok yb3.pachot.net->10.0.0.14
Это подтверждает, что я могу подключаться по частному IP в пределах одной зоны, но мне нужно использовать публичный IP между зонами. Цель этой статьи — показать, как запустить yb-master и yb-tserver так, чтобы межузловая связь использовала частный IP при включении в одной зоне, и публичный IP в разных зонах.
размещение
Вот параметры, используемые как yb-master, так и yb-tserver.
По сути, при подключении с одного сервера к другому, YugabyteDB будет сравнивать имена облака/региона/зоны и использовать частный IP, если значение параметра use_private_ip
одинаково, в противном случае используется публичный IP.
yb-master
yb-master
являются плоскостью управления кластера. Они должны знать друг о друге, чтобы выбрать одного из них лидером. При пересечении зоны они будут использовать публичный IP, но локальный сервер также должен быть в списке со своим частным IP (иначе вы получите None of the local addresses are present in master_addresses
). Однако каждый сервер должен быть в списке только один раз, что означает, что на кластере RF=3 у вас есть 3 значения с хотя бы одним частным IP. Вы можете получить ошибку Found multiple peers with uuid
при упоминании одного и того же узла с разными IP-адресами. --master_addresses
перечисляет все 3 мастера, включая запущенный этой командой, используя его частный IP, но публичный IP для остальных
запуск мастеров
Вот как я запускаю каждый yb-мастер, на каждом узле, с именем соответствующей зоны (placement_zone
), локальным IP (rpc_bind_addresses
), публичным IP (server_broadcast_addresses
) и master_addresses
:
ssh -q opc@yb1.pachot.net /home/opc/yugabyte/bin/yb-master
--master_addresses=10.0.0.231:7100,yb2.pachot.net:7100,yb3.pachot.net:7100 --server_broadcast_addresses=yb1.pachot.net:7100
--rpc_bind_addresses=10.0.0.231:7100 --use_private_ip=zone
--placement_cloud oci --placement_region eu-fra-1
--placement_zone eu-fra-1-ad-3 --fs_data_dirs=/home/opc/var/data
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.20 </dev/null &
ssh -q opc@yb2.pachot.net /home/opc/yugabyte/bin/yb-master
--master_addresses=yb1.pachot.net:7100,10.0.0.200:7100,yb3.pachot.net:7100 --server_broadcast_addresses=yb2.pachot.net:7100
--rpc_bind_addresses=10.0.0.200:7100 --use_private_ip=zone
--placement_cloud oci --placement_region eu-fra-1
--placement_zone eu-fra-1-ad-3 --fs_data_dirs=/home/opc/var/data
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.20 </dev/null &
ssh -q opc@yb3.pachot.net /home/opc/yugabyte/bin/yb-master
--master_addresses=yb1.pachot.net:7100,yb2.pachot.net:7100,10.0.0.14:7100 --server_broadcast_addresses=yb3.pachot.net:7100
--rpc_bind_addresses=10.0.0.14:7100 --use_private_ip=zone
--placement_cloud oci --placement_region eu-zrh-1
--placement_zone eu-zrh-1-ad-1 --fs_data_dirs=/home/opc/var/data
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.20 </dev/null &
Помните, что это лаборатория, и я запускаю все по ssh, с моего хоста bastion. Вы не будете делать этого в реальном развертывании: об этом позаботится system ctl, или kubernetes, или наша платформа.
Один из мастеров избирается лидером. Вы можете открыть Web UI на каждом сервере, и на главной странице должно отображаться состояние кластера:
- http://yb1.pachot.net:7000/
- http://yb2.pachot.net:7000/
- Лаборатория http://yb3.pachot.net:7000/My является публичной, посмотрите на нее, если хотите.
Это показывает, что главным лидером является 10.0.0.200 в eu-fra-1-ad-3
. Публичные IP не указаны, но я знаю, что это yb2.pachot.net (я также мог получить эту информацию из gflags:
curl -Ls http://yb2.pachot.net:7000/varz?raw | grep -E "master_addresses|rpc_bind_addresses|server_broadcast_addresses|tserver_master_addrs|placement"
Обратите внимание, что вы можете получить этот WebGUI от последователей, которые действуют как прокси для лидера, но для этого используются частные IP. Например, при моей конфигурации и yb2.pachot.net
в качестве лидера, Web UI на yb3.pachot.net
показывает:
Error retrieving leader master URL: http://10.0.0.200:7000/?raw
Error: Network error (yb/util/curl_util.cc:55): curl error: Couldn't connect to server.
У меня есть вопрос https://github.com/yugabyte/yugabyte-db/issues/11603 по этому поводу.
входящий/исходящий
Я быстро проверяю входящие/исходящие соединения.
for h in http://yb{1..3}.pachot.net:7000
do
curl -Ls $h/rpcz |
awk -F: '/_connections/{w=$1}/remote_ip/{print h,w,$2}' h=$h
done | sort -u
Вот результат:
http://yb1.pachot.net:7000 "inbound_connections" "10.0.0.200
http://yb2.pachot.net:7000 "outbound_connections" "10.0.0.231
http://yb2.pachot.net:7000 "outbound_connections" "152.67.80.204
http://yb3.pachot.net:7000 "inbound_connections" "150.230.147.84
Последователи имеют входящее соединение от лидера:
Они также видны из yb2.pachot.net
как исходящие соединения (152.67.80.204 — IP yb3.pachot.net
)
yb-сервер
Серверы tservers, или серверы планшетов, представляют собой плоскость данных. Это место, где хранятся, разделяются и реплицируются данные, а также место, куда вы подключаетесь и где обрабатывается ваш SQL. Их может быть много, здесь я начинаю с минимального, чтобы обеспечить высокую доступность на кластере RF=3:
ssh -q opc@yb1.pachot.net /home/opc/yugabyte/bin/yb-tserver
--tserver_master_addrs=yb1.pachot.net:7100,yb2.pachot.net:7100,yb3.pachot.net:7100
--server_broadcast_addresses=yb1.pachot.net --rpc_bind_addresses=10.0.0.231:9100
--use_private_ip=zone --placement_cloud oci
--placement_region eu-fra-1 --placement_zone eu-fra-1-ad-3
--fs_data_dirs=/home/opc/var/data --replication_factor=3
--default_memory_limit_to_ram_ratio=0.30 --enable_ysql=true </dev/null &
ssh -q opc@yb2.pachot.net /home/opc/yugabyte/bin/yb-tserver
--tserver_master_addrs=yb1.pachot.net:7100,yb2.pachot.net:7100,yb3.pachot.net:7100 --server_broadcast_addresses=yb2.pachot.net
--rpc_bind_addresses=10.0.0.200:9100 --use_private_ip=zone
--placement_cloud oci --placement_region eu-fra-1
--placement_zone eu-fra-1-ad-3 --fs_data_dirs=/home/opc/var/data
--replication_factor=3 --default_memory_limit_to_ram_ratio=0.30
--enable_ysql=true </dev/null &
ssh -q opc@yb3.pachot.net /home/opc/yugabyte/bin/yb-tserver --tserver_master_addrs=yb1.pachot.net:7100,yb2.pachot.net:7100,yb3.pachot.net:7100
--server_broadcast_addresses=yb3.pachot.net --rpc_bind_addresses=10.0.0.14:9100
--use_private_ip=zone --placement_cloud oci
--placement_region eu-zrh-1 --placement_zone eu-zrh-1-ad-1
--fs_data_dirs=/home/opc/var/data --replication_factor=3
--default_memory_limit_to_ram_ratio=0.30 --enable_ysql=true </dev/null &
Каждый tserver должен иметь список мастеров, с --tserver_master_addrs
, и я использую здесь публичные IP, чтобы все они были видны. Они слушают локальный IP, определенный --rpc_bind_addresses
и доступны из публичной сети с публичным IP, заданным в --server_broadcast_addresses
. Выбор того, какой IP использовать, зависит от параметров размещения.
Это означает, что вы можете запустить сервер tserver с любого узла, имеющего VNIC в публичной сети, и подключить его к моим мастерам, и вы станете частью базы данных, в своем краевом расположении. Опять же, это лаборатория. Вы не должны открывать эти порты на 0.0.0.0/0, как это сделал я.