PostgreSQL 9.3 + Pgpool-II

от автора

Решил поделиться с вами опытом настройки кластера PostgreSQL 9.3, состоящего из двух нод, управлением которого занимается pgpool-II, без использования Stream Replication (WAL). Надеюсь, кому-нибудь будет интересно.

Схема:

image

Как Вы понимаете, это будут два отдельно стоящих сервера, которыми будет управлять pgpool-II.

Конфигурация нод с PostgreSQL:
Оба сервера идентичны по своим аппаратным составляющим.

  • 4vCPU;
  • 16 Гб памяти;
  • CentOS 6.5;

Диски:

  • 50 Гб — система;
  • 100 Гб — pg_xlog
  • 500 Гб — каталог с данными

Пример,

 Filesystem      Size  Used Avail Use% Mounted on /dev/sda3        48G  7.4G   38G  17% / tmpfs           7.8G     0  7.8G   0% /dev/shm /dev/sda1       194M   28M  157M  15% /boot /dev/sdb1        99G  4.9G   89G   6% /var/lib/pgsql/9.3/data/pg_xlog /dev/sdc1       493G  234G  234G  50% /var/lib/pgsql/9.3/my_data 

Конфигурация нод с pgpool-II:

  • 4vCPU;
  • 8 Гб памяти;
  • CentOS 6.5;

Диски:

  • 50 Гб — система;

Про установку PostgreSQL в детали вдаваться не буду, так как она стандартная.

Настройка pgpool-II.
За основу настройки pgpool-II, взял инструкцию с официального сайта: www.pgpool.net/pgpool-web/contrib_docs/simple_sr_setting2_3.3/index.html

Хотел бы обратить внимание только самые важные моменты:

#------------------------------------------------------------------------------ # CONNECTIONS #------------------------------------------------------------------------------  # - pgpool Connection Settings -  listen_addresses = '*' port = 9999 socket_dir = '/tmp' pcp_port = 9898 pcp_socket_dir = '/tmp' # - Authentication - enable_pool_hba = off pool_passwd = '' log_destination = 'syslog' #------------------------------------------------------------------------------ # REPLICATION MODE (Говорим pgpool, что все полученные запросы надо транслировать на все ноды кластера) #------------------------------------------------------------------------------ replication_mode = on replicate_select = on insert_lock = on lobj_lock_table = '' replication_stop_on_mismatch = off failover_if_affected_tuples_mismatch = off #------------------------------------------------------------------------------ # LOAD BALANCING MODE (Говорим pgpool, что все запросы SELECT отправлять на все узлы кластера) #------------------------------------------------------------------------------ load_balance_mode = on ignore_leading_white_space = on white_function_list = '' black_function_list = 'nextval,setval' follow_master_command = '/etc/pgpool-II/failover.sh %d "%h" %p %D %m %M "%H" %P' #------------------------------------------------------------------------------ # FAILOVER AND FAILBACK #------------------------------------------------------------------------------ failover_command = '/etc/pgpool-II/failover.sh %d %P %H %R' failback_command = '' fail_over_on_backend_error = on search_primary_node_timeout = 10 #------------------------------------------------------------------------------ # ONLINE RECOVERY (В данном случае, онлайн восстановление, в терминах pgpool, означает вернуть узел в кластер pgpool. Если одна из нод упадет и пролежит долгое время, то догонать эту ноду до актуальных данных придется в ручную) #------------------------------------------------------------------------------ recovery_user = 'postgres' recovery_password = '' recovery_1st_stage_command = 'basebackup.sh' recovery_2nd_stage_command = '' recovery_timeout = 90 client_idle_limit_in_recovery = 0 #------------------------------------------------------------------------------ # WATCHDOG #------------------------------------------------------------------------------ # - Enabling - use_watchdog = off trusted_servers = '10.1.16.12' ping_path = '/bin' wd_hostname = '10.1.16.12' wd_port = 9000 wd_authkey = '' delegate_IP = '10.1.16.16' ifconfig_path = '/home/apache/sbin' if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0' if_down_cmd = 'ifconfig eth0:0 down' arping_path = '/home/apache/sbin' arping_cmd = 'arping -U $_IP_$ -w 1' clear_memqcache_on_escalation = on wd_escalation_command = '' wd_lifecheck_method = 'heartbeat' wd_interval = 10 wd_heartbeat_port = 9694 wd_heartbeat_keepalive = 2 wd_heartbeat_deadtime = 30 wd_life_point = 3 wd_lifecheck_query = 'SELECT 1' wd_lifecheck_dbname = 'template1' wd_lifecheck_user = 'nobody' wd_lifecheck_password = '' ssl_key = '' ssl_cert = '' ssl_ca_cert = '' ssl_ca_cert_dir = '' listen_backlog_multiplier = 2 log_line_prefix = '' log_error_verbosity = 'DEFAULT' client_min_messages = 'notice' log_min_messages = 'warning' database_redirect_preference_list = '' app_name_redirect_preference_list = '' allow_sql_comments = off connect_timeout = 10000 check_unlogged_table = off backend_hostname0 = 'as-msk-at082.maxus.lan' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/pgsql/9.3/data' backend_flag0= 'ALLOW_TO_FAILOVER' backend_hostname1 = 'as-msk-at083.maxus.lan' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/pgsql/9.3/data' backend_flag1= 'ALLOW_TO_FAILOVER' other_pgpool_hostname0 = '' other_pgpool_port0 = other_wd_port0 = heartbeat_destination0 = '' heartbeat_destination_port0 = heartbeat_device0 = '' 

После настройки конфигурационного файла, запускаем службу pgpool. Можно также настроить pgpooladmin для мониторинга состояния нод.

Я это делал по инструкции отсюда:
www.pgpool.net/docs/pgpoolAdmin/en/install.html

Также статус нод с PostgreSQL можно посмотреть, выполнив команду на pgpool:

pcp_node_info 10 "имя pgpool-ноды" 9898 postgres postgres 0 pcp_node_info 10 "имя pgpool-ноды" 9898 postgres postgres 1 

Далее, проверяем работу нашей схемы — создаем пустую БД через pgpool. Сделать это можно двумя способами:
1) через pgadmin, подключившись к IP-адресу pgpool-II;
2) выполнив команду на ноде с pgpool: createdb -p 9999 bench_replication

Минусы:

  • Синхронная репликация
  • В случае выхода из строя одной из нод, над ее возвращением придется попотеть
  • Достаточно мало, где используется такая архитектура
  • Блокировка таблица

Плюсы:

  • Логическая репликация, не уходит на уровень СУБД, снижая на нее нагрузку
  • Балансировка нагрузки
  • Кеширование запросов
  • Объединение соединений

За основу взята инструкция по ссылке: www.pgpool.net/pgpool-web/contrib_docs/simple_sr_setting2_3.3/index.html

ссылка на оригинал статьи http://habrahabr.ru/post/263225/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *