Решил поделиться с вами опытом настройки кластера PostgreSQL 9.3, состоящего из двух нод, управлением которого занимается pgpool-II, без использования Stream Replication (WAL). Надеюсь, кому-нибудь будет интересно.
Схема:
Как Вы понимаете, это будут два отдельно стоящих сервера, которыми будет управлять 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/
Добавить комментарий