vitabaks / postgresql_cluster

PostgreSQL High-Availability Cluster (based on "Patroni" and DCS "etcd" or "consul"). Automating with Ansible.
MIT License
1.29k stars 352 forks source link

Consul вместо etcd #316

Closed erzhick10 closed 12 months ago

erzhick10 commented 1 year ago

Здравствуйте чтоб использовать установка с помощью consul нужно заранее настроить их на каждом сервере днс для работы consul и после уже можно установить кластер postgresql patroni?

vitabaks commented 1 year ago

Здравствуйте.

Чтобы развернуть кластер, необходимо только указать переменную dcs_type: "consul"

vitabaks commented 1 year ago

Также нужно настроить consul клиента на серверах приложений чтобы они могли резолвить dns записи сервисов consul.

Для этого, укажите сервера приложений в файле inventory

пример 10.128.64.144/145 это сервера приложений на которые устанавливается consul в режиме клиента (consul_node_role=client)

# Please specify the ip addresses and connection settings for your environment
# The specified ip addresses will be used to listen by the cluster components.

# "postgresql_exists='true'" if PostgreSQL is already exists and running
# "hostname=" variable is optional (used to change the server name)
# "new_node=true" to add a new server to an existing cluster using the add_pgnode.yml playbook

# In this example, all components will be installed on PostgreSQL nodes.
# You can deploy the haproxy balancers and the etcd or consul cluster on other dedicated servers (recomended).

# if dcs_exists: false and dcs_type: "etcd"
[etcd_cluster]  # recommendation: 3, or 5-7 nodes

# if dcs_exists: false and dcs_type: "consul"
[consul_instances]  # recommendation: 3 or 5-7 nodes
10.128.64.140 consul_node_role=server consul_bootstrap_expect=true
10.128.64.142 consul_node_role=server consul_bootstrap_expect=true
10.128.64.143 consul_node_role=server consul_bootstrap_expect=true
10.128.64.144 consul_node_role=client
10.128.64.145 consul_node_role=client

# if with_haproxy_load_balancing: true
[balancers]
10.128.64.140
10.128.64.142
10.128.64.143

# PostgreSQL nodes
[master]
10.128.64.140 hostname=pgnode01 postgresql_exists='false'

[replica]
10.128.64.142 hostname=pgnode02 postgresql_exists='false'
10.128.64.143 hostname=pgnode03 postgresql_exists='false'

[postgres_cluster:children]
master
replica

# if pgbackrest_install: true and "repo_host" is set
[pgbackrest]  # optional (Dedicated Repository Host)

# Connection settings
[all:vars]
ansible_connection='ssh'
ansible_ssh_port='22'
ansible_user='root'
ansible_ssh_pass='secretpassword'  # "sshpass" package is required for use "ansible_ssh_pass"
#ansible_ssh_private_key_file=
#ansible_python_interpreter='/usr/bin/python3'  # is required for use python3

[pgbackrest:vars]
ansible_user='postgres'
ansible_ssh_pass='secretpassword'
erzhick10 commented 1 year ago

а днс тоже ролями устанавливается или это дело не автоматизирована просто я сейчас попробовал у меня днс перестал резолвится на серверах

vitabaks commented 1 year ago

автоматизировано.

см переменные

consul_recursors: []  # List of upstream DNS servers
consul_dnsmasq_enable: true  # Enable DNS forwarding with Dnsmasq
consul_dnsmasq_cache: 0  # dnsmasq cache-size (0 - disable caching)
consul_dnsmasq_servers:  # Upstream DNS servers used by dnsmasq
  - "8.8.8.8"
  - "9.9.9.9"
erzhick10 commented 1 year ago

а этот метод пойдет если у меня в разных географический и в разных подсетях сервера имею виду дата центры будет работать просто я другому варианту меня Keeeplived не работает так как разные подсети тут же vip manager и сonsul Должно работать ? Спасибо

vitabaks commented 1 year ago

Схема с consul не использует ничего кроме consul service discovery для обеспечения единой точки входа в базу данных. Да, эта схема прекрасно подходит для разных ДЦ, о чем уже было упомянуто в README.

erzhick10 commented 1 year ago

Здравствуйте ! не совсем понял я сonsul на Вы пока что изучаю !

[consul_instances]  # recommendation: 3 or 5-7 nodes
10.128.64.140 consul_node_role=server consul_bootstrap_expect=true consul_datacenter=dc1
10.128.64.142 consul_node_role=server consul_bootstrap_expect=true consul_datacenter=dc1
10.128.64.143 consul_node_role=server consul_bootstrap_expect=true consul_datacenter=dc1
#10.128.64.144 consul_node_role=client consul_datacenter=dc1
#10.128.64.145 consul_node_role=client consul_datacenter=dc2

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

vitabaks commented 1 year ago

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

это опционально. Можете представить себе это обычной меткой, задаете любое имя для Датацентра и далее используете это в строке соединения, чтобы коннектиться только к той реплике, которая находится в том же ДЦ что и приложение.

Пример

Надеюсь теперь стало понятнее )

erzhick10 commented 1 year ago

вопрос в как отслеживать в consul кто мастер и кто реплика ? вроде у консул есть веб интерфейс для просмотра тут откл ? и еще вопрос обращение можно делать по доменному имени если сервера в домене к базе ? просто с вариантом А и Б понятно все ! тут не совсем понимаю!

erzhick10 commented 1 year ago

"disable_update_check": true, "domain": "consul", а тут нужно указать домен ? replica.postgres-cluster.service.dc1.consul это я так понял конкретное доменное имя для каждого сервера а как теперь проходить конект если он был доступен по одному серверу мастер переключился консул знает и перезапишет конфиг ? спасибо

vitabaks commented 1 year ago

вопрос в как отслеживать в consul кто мастер и кто реплика ?

это автоматизировано c помощью проверки Patroni REST API вот описание сервисов и их проверки https://github.com/vitabaks/postgresql_cluster/blob/master/vars/main.yml#L107

для коннекта к мастеру используйте master.postgres-cluster.service.consul (он автоматически переключит на сервер с ролью leader)

вроде у консул есть веб интерфейс для просмотра тут откл

Вы можете включить UI если Вам это необходимо consul_ui: true

и еще вопрос обращение можно делать по доменному имени если сервера в домене к базе ?

да в DNS имени сервиса есть доменное имя. Вы можете переопределись его.

просто с вариантом А и Б понятно все ! тут не совсем понимаю!

рекомендую изучить consul перед тем как внедрять эту схему в production. Либо рассмотрите варианты спонсорства которые включают персональную поддержку.

"domain": "consul", а тут нужно указать домен ?

да Вы можете указать здесь другое имя домена для cunsul службы.

replica.postgres-cluster.service.dc1.consul это я так понял конкретное доменное имя для каждого сервера а как теперь проходить конект если он был доступен по одному серверу мастер переключился консул знает и перезапишет конфиг ?

я не понял вопроса. В любом случае, обновление записей dns автоматизировано, исходя из роли сервера Postgres.

erzhick10 commented 1 year ago

master.postgres-cluster.service.consul где можно изменить на свое имя !?и вопрос спонсорства там будет какой то чат для поддержки ?

vitabaks commented 1 year ago

master.postgres-cluster.service.consul где можно изменить на свое имя !?

Вы можете сделать это в переменной consul_services https://github.com/vitabaks/postgresql_cluster/blob/master/vars/main.yml#L104

вопрос спонсорства там будет какой то чат для поддержки ?

Да, все верно.

erzhick10 commented 1 year ago

Здравствуйте не подскажите Ubuntu20 после установки кластере как бы все работает но после ребута сетевая карта не поднимается и не резолвится днс может ли проблема быть конфликтах там автоматизировано под какой днс ?

erzhick10 commented 1 year ago

может быть иза того что уже есть у меня свои днс и вместе этого прописать свои днс при установки ansible по этому и конфликт ?

erzhick10 commented 1 year ago

у меня systemd-resolved может иза этого а consul использует dnsmaq

erzhick10 commented 1 year ago

netplan нужно удалять? просто сетевая карта ложится послу удаление кластере после ребута все так происходить может дадите какие то рекомендации по этому поводу

vitabaks commented 1 year ago

пример

consul_dnsmasq_servers:  # Upstream DNS servers used by dnsmasq
  - "8.8.8.8"
  - "9.9.9.9"
vitabaks commented 1 year ago

Подробнее про Forward DNS for Consul Service Discovery

пожалуйста, ознакомьтесь с документацией Consul.

erzhick10 commented 1 year ago

Здравствуйте спасибо Вам теперь разобрался ! но есть вопрос например по стандарту "A" есть haproxy и keepalived мы виртуальный ip address указываем в приложении. а с consul получается нужно указать конкретно сервер приложение и от туда уже будет идти коннект я так понимаю ! с других серверов как раньше уже не получится потому что я пробовал при коннектится и только со серверов те что указал с инвентори а именно с дс1 дс2 как вы и говорили получается мне нужно будет например заранее установить если у меня уже есть кластер туда consul clients через что и буду подключаться по master.postgres-cluster.service.consul ссылкам?

vitabaks commented 1 year ago

точка доступа для приложения - dns имя consul сервиса. Нет необходимости указывать конкретный сервер, dns записи обновляются автоматически (исходя из роли сервера)

пример

Этот пример описан в README, старнно что Вы задаете такие вопросы.

vitabaks commented 1 year ago

с других серверов как раньше уже не получится потому что я пробовал при коннектится и только со серверов те что указал с инвентори а именно с дс1 дс2 как вы и говорили получается мне нужно будет например заранее установить если у меня уже есть кластер туда consul clients

да, необходимо установить consul клиент на все сервера приложений. Чтобы получить доступ к dns записям в consul. Либо, попробуйте перенаправлять на удаленный consul сервер с помощью dnsmaq вместо установки локального клиента. Чтобы разобраться во всем этом, Вам необходимо хорошо изучить документацию по consul.

erzhick10 commented 1 year ago

Извините за такой вопрос!)я все понял я не там смотрел !!! теперь понял суть работы ! Вы правы нужно делально изучить сonsul ! я теперь понял суть всего как это работает спасибо!!!

erzhick10 commented 12 months ago

Здравствуйте как изменить master.postgres-cluster.service.consul чтоб было просто доменное имя или если изменить "domain": "consul", а тут то изменится лишь master.postgres-cluster.service.consul service.consul можно или где просто сделать подключение через доменное имя или только через master.postgres-cluster.service.consul происходить подключение перелопатил плейбук че то не могу найти

vitabaks commented 12 months ago

Имена сервисов настраиваются в переменной consul_services (name)

можете cократить имя конечной точки, например, переопределив name и убрав tags

erzhick10 commented 12 months ago

у меня вопрос по поводу спонсорства Вы на юр лицо заключается договор ?

vitabaks commented 12 months ago

Вы на юр лицо заключается договор ?

Спонсорство предполагает формат донатов через Patreon или GitHub sponsor и не требует заключения договора. Некоторые уровни членства включают в себя контакт со мной в slack (или telegram) и индивидуальную поддержку от меня лично.

Если Вам необходим контракт, обращайтесь по адресу team@postgres.ai

erzhick10 commented 12 months ago

Если Вам необходим контракт, обращайтесь по адресу team@postgres.ai

это ваша почта?

vitabaks commented 12 months ago

Это не лично моя почта, это адрес компании Postgres.ai частью команды которой я также являюсь. https://postgres.ai/consulting

Я лично оказываю индивидуальную поддержку только спонсорам проекта.

erzhick10 commented 11 months ago

Здравствуйте такой вот вопрос установили кластер с сonsul на сервер приложение поставили haproxy для обращение к бд по master.postgres-cluster.service.consul суть в том что если предоставлять доступ к клентам пользователям нужно устанавливать сonsul clienta и на виндовые сервера чтоб это обойти через хапроки плюс для аутентификации gss
все работает но если переключем лидера чтоб подключение было к мастеру наужно рестартить haproxy все время ! или как вы говорили перенаправление портов как бы делал все работает для линуксовых серверов а для виндовых если только не прописывать файл system32/etc/hosts файл днс сonsul ?

erzhick10 commented 11 months ago

parameters: krb_server_keyfile: /etc/postgresql-common/keytab.file
сгенерировал с ад файл закинул по пути и patroni указал работает аутентификация по kerberos про тестировали работает просто через haproxy не работает наверное нужно коммерческая версия ! на прямую работает подключение

vitabaks commented 11 months ago

Не понимаю зачем такая гибридная схема. Если Вы не можете себе позволить схему с Consul (хотя странно) то используйте схему Type А в которой и вовсе нет Consul, там etcd.

Возможно я не совсем понимаю что Вы хотите от кластера базы данных.

erzhick10 commented 11 months ago

ну вообщем попробую. объяснить обращение к бд через консул master.postgres-cluster.service.consul с точки зрение приложение да ! а если к примеру пользователи рядовые хаять доступ к базе то мне так же на те же винловые сервера нужно либо перенаправление делать либо клиенту так же консул агента ставить верно?а чтоб не ставить например 100 пользователей все в домене имею виду все подряд консул или пренаправление в днс указывать имею виду или как вы реализуете тут для виндовых серверов ?просто через haproxy все один ip или домен вот так имею виду

resolvers consul nameserver dns1 192.168.1.59:8600 nameserver dns2 192.168.1.43:8600 frontend frontend_postgres bind 192.168.1.80:5432 default_backend backend_postgres

backend backend_postgres balance roundrobin option tcp-check server postgres_server1 master.postgres-cluster.service.consul:6432 check resolvers consul server postgres_server2 replica.postgres-cluster.service.consul:6432 check resolvers consul

vitabaks commented 11 months ago

Верно, для резолвинга dns имени consul service нужен consul клиент, или перенаправление dns на consul сервер.

Windows не используется в моем случае. Но поддержка windows для установки consul client имеется.

При необходимости, думаю и там можно решить вопрос с dns resolving.