Как синхронизировать базу данных Redmine Pacemaker/pcs/corosync?

На данный момент у меня 3 сервера: один мастер и 2 клиента. Я установил redmine 3.3.1.stable с postgresql 9.6 и установил кардиостимулятор на 3 сервера. Чтобы синхронизировать базу данных, я следую документация. Все работает нормально, пока я не остановлю активный сервер. Redmine server2 показывает ошибку аутентификации.

Ошибка Redmine, когда я пытаюсь войти в форму клиента после подключения серверов.

Completed 500 Internal Server Error in 11ms (ActiveRecord: 3.5ms)

ActiveRecord::StatementInvalid (PG::ReadOnlySqlTransaction: ERROR:  cannot execute UPDATE in a read-only transaction
: UPDATE "users" SET "last_login_on" = '2020-08-17 13:05:11.001886' WHERE "users"."type" IN ('User', 'AnonymousUser') AND "users"."id" = $1):
  app/models/user.rb:238:in `try_to_login'
  app/controllers/account_controller.rb:204:in `password_authentication'
  app/controllers/account_controller.rb:199:in `authenticate_user'
  app/controllers/account_controller.rb:40:in `login'
  lib/redmine/sudo_mode.rb:63:in `sudo_mode'

на данный момент я понимаю, что redmine разрешает доступ только к серверу 1. почему redmine не может дать доступ к server2 или server3

Ниже я даю больше информации о моем шаге до сих пор.

Конфигурация компьютеров

pcs config
Cluster Name: mycluster
Corosync Nodes:
 server1 server2 server3
Pacemaker Nodes:
 server1 server2 server3

Resources:
 Resource: MasterVip (class=ocf provider=heartbeat type=IPaddr2)
  Attributes: ip=101.226.189.208 nic=lo cidr_netmask=32 iflabel=pgrepvip
  Meta Attrs: target-role=Started
  Operations: start interval=0s timeout=20s (MasterVip-start-interval-0s)
              stop interval=0s timeout=20s (MasterVip-stop-interval-0s)
              monitor interval=90s (MasterVip-monitor-interval-90s)
 Resource: Apache (class=ocf provider=heartbeat type=apache)
  Attributes: configfile=/etc/apache2/apache2.conf statusurl=http://localhost/server-status
  Operations: start interval=0s timeout=40s (Apache-start-interval-0s)
              stop interval=0s timeout=60s (Apache-stop-interval-0s)
              monitor interval=1min (Apache-monitor-interval-1min)

Stonith Devices:
Fencing Levels:

Location Constraints:
  Resource: Apache
    Enabled on: server1 (score:INFINITY) (role: Started) (id:cli-prefer-Apache)
Ordering Constraints:
Colocation Constraints:
  Apache with MasterVip (score:INFINITY) (id:colocation-Apache-MasterVip-INFINITY)
Ticket Constraints:

Alerts:
 No alerts defined

Resources Defaults:
 migration-threshold: 5
 resource-stickiness: 10
Operations Defaults:
 No defaults set

Cluster Properties:
 cluster-infrastructure: corosync
 cluster-name: mycluster
 dc-version: 1.1.16-94ff4df
 have-watchdog: false
 no-quorum-policy: ignore
 stonith-enabled: false

Quorum:
  Options:

главный postgresql.conf

# Add settings for extensions here
listen_addresses = '*'
wal_level = hot_standby
synchronous_commit = local
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/9.6/main/archive/%f'
max_wal_senders = 10
wal_keep_segments = 30
synchronous_standby_names = 'server2'
synchronous_standby_names = 'server3'
hot_standby = on

основной файл pg_hba.conf

    # Localhost
    host    replication     postgres     127.0.0.1/32            md5
    
    # PostgreSQL Master IP address
    host    replication     postgres      101.226.189.205/32            md5
    
    # PostgreSQL SLave IP address
    host    replication     postgres         101.226.189.206/32            md5
    ho

st    replication     postgres          101.226.189.207/32            md5

скопировать конфигурацию в клиент с Мастера

pg_basebackup -h server1 -U postgres -D /var/lib/postgresql/9.6/main -X stream -P

Статус подключения к базе данных

postgres@oreo:/etc/postgresql/9.6/main$ psql -x -c "select * from pg_stat_replication;"
-[ RECORD 1 ]----+------------------------------
pid              | 18174
usesysid         | 10
usename          | postgres
application_name | server3
client_addr      | 101.226.189.207
client_hostname  |
client_port      | 35236
backend_start    | 2020-08-17 15:56:40.687282+02
backend_xmin     |
state            | streaming
sent_location    | 0/7005430
write_location   | 0/7005430
flush_location   | 0/7005430
replay_location  | 0/7005430
sync_priority    | 1
sync_state       | sync
-[ RECORD 2 ]----+------------------------------
pid              | 18175
usesysid         | 10
usename          | postgres
application_name | server2
client_addr      | 101.226.189.206
client_hostname  |
client_port      | 45862
backend_start    | 2020-08-17 15:56:40.717087+02
backend_xmin     |
state            | streaming
sent_location    | 0/7005430
write_location   | 0/7005430
flush_location   | 0/7005430
replay_location  | 0/7005430
sync_priority    | 0
sync_state       | async

person Karippery    schedule 17.08.2020    source источник
comment
Это не похоже на проблему входа в БД. Ошибка говорит о том, что не удается выполнить update в копии базы данных, доступной только для чтения. Тот факт, что вы получаете сообщение об ошибке PostgreSQL с сервера, указывает на то, что учетные данные работают. Эта проблема вызвана тем, что процесс входа в систему вашего приложения должен писать в users для обновления столбца last_login_on.   -  person Mike Organek    schedule 17.08.2020
comment
спасибо за повтор. мы знаем, что на самом деле вы написали здесь. Можете ли вы дать более подробное объяснение того, как заставить сервер работать в режиме чтения и записи. мы попытались изменить default_transaction_read_only = off, но получили ошибку, не можем установить режим чтения-записи транзакции во время восстановления   -  person Karippery    schedule 18.08.2020
comment
Мне жаль, что я не могу вам в этом помочь, так как у меня нет опыта работы с Redmine. Я прокомментировал только потому, что думал, что вы неправильно интерпретируете сообщение об ошибке, которое вы получаете, как проблему с учетными данными БД, когда это не так. Судя по этому последнему сообщению, либо отработка отказа не произошла, либо ваше приложение привязано к реплике, доступной только для чтения.   -  person Mike Organek    schedule 18.08.2020


Ответы (1)


Я нашел ответ на свой вопрос. Я пропускаю один шаг в ресурсах кардиостимулятора.

pgsqld определяет свойства экземпляра PostgreSQL: где он расположен, где находятся его двоичные файлы, его файлы конфигурации, как его контролировать и так далее.

Ресурс pgsql-ha контролирует все экземпляры PostgreSQL pgsqld в вашем кластере, решает, где продвигается основной и где запускаются резервные.

 pcs resource create pgsqld ocf:heartbeat:pgsqlms    \
    bindir="/usr/lib/postgresql/9.6/bin"                            \
    pgdata="/etc/postgresql/9.6/main"                               \
    datadir="/var/lib/postgresql/9.6/main"                          \
    pghost="/var/run/postgresql"                                    \
    recovery_template="/etc/postgresql/9.6/main/recovery.conf.pcmk" \
    op start timeout=60s                                            \
    op stop timeout=60s                                             \
    op promote timeout=30s                                          \
    op demote timeout=120s                                          \
    op monitor interval=15s timeout=10s role="Master"               \
    op monitor interval=16s timeout=10s role="Slave"                \
    op notify timeout=60s


pcs  resource master pgsql-ha pgsqld notify=true
pcs  resource cleanup
pcs status
person Karippery    schedule 09.09.2020