Задать вопрос
  • Pgpool2 multy-master mode где искать мануалы по настройке? Как вы масштабируете базу(под запись)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как вы масштабируете базу(под запись)?

    В основном никак. У нас нет баз на столько десятков террабайт данных чтобы внятно настроенный единственный мастер с парой обычных потоковых ro-реплик не справлялся.

    Если у вас столько данных пишется что одного мастера действительно мало - то репликация вам не подходит по своему определению, она не про масштабирование записи, а только чтения и high availability (репликация = копия. Копию нельзя сделать, если писать не все данные).

    А те базы что у нас распиливались - распиливались они не потому что в мастер упёрлись:
    Что-то пилится на горячее-архивное: отдельные одна или несколько машин на более дешёвых (медленных) дисках, куда переносятся данные старше какого-то времени, к которым обращаются редко.
    Что-то пилится на части функционально. Например, сайт - один кластер, данные для окружающих некритичных сервисов - другой кластер. Или данные ru-сайта - один кластер, данные нескольких других стран - отдельные базы на другом кластере.

    Ещё можно пилить по каким-нибудь другим динамическим критериям. Например, данные всех пользователей от 1 до 1000 - на один кластер, от 1000 до 2000 - на другой. Плюс пара машин с данными координатора какой id на какой машине и авторизации. Это уже эталонное горизонтальное масштабирование. Крайне редко кому действительно нужно и собирается типично вручную с пониманием что и зачем делается.

    Сильно ли нагружает сервер процес синхронной репликация?

    Железо - не очень. Со стороны приложения кажется что очень. Потому что латентность коммита локально и согласовать коммит с даже хотя бы одной синхронной репликой - вещи очень сильно расходящиеся по латентности.

    чаще всего используеться репликация на уровне приложения

    Репликация чаще всего используется штатная потоковая.
    Запросы от приложения удобнее направлять именно из приложения не из-за сырости прокси, а потому что именно приложению лучше знать, нужно ли запрос отправлять на реплику (и если реплику - то какую, боевую? отдельную для медленных запросов аналитики?) или его вообще можно выполнять только на мастере.

    какие есть угрозы при такой балансировке базы?

    В смысле при мультимастере? Кучу головной боли вам доставит CAP теорема, из-за которой внятного мультимастера нет.
    Самое весёлое - split brain, когда у вас образовались противоречащие друг другу данные на двух мастерах.
    Или триггерная репликация внезапно встала колом и надо разбираться, из-за чего.
    Отправлять пишущие запросы синхронно на несколько хостов и предполагать, что там будут сходиться данные в итоге - это надо быть или большим оптимистом или очень внимательно проверять каждый запрос на предмет что именно он будет делать и как себя поведёт при конкурентном доступе.
    Ответ написан
    4 комментария
  • Postgresql как ограничить общий размер WAL-файлов?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Один сегмент WAL обычно имеет фиксированный размер 16мб (опция компиляции postgresql with-wal-segsize, если вы её указывали - вы должны об этом знать, плюс она требует initdb делать заново). Поэтому их количество пересчитывается в объём банальным умножением.

    Ограничить максимальный занимаемый объём wal сверху - нельзя. Такой единой гайки нет, даже если вас устраивает переход базы в readonly по достижении этого лимита. И есть довольно много гаек, которые при своём использовании могут попросить базу не вычищать старые wal ещё какое-то время.

    Гайки, на которые надо обращать внимание:
    wal_keep_segments - база оставляет на диске не меньше этого числа wal, что позволяет реплике штатно на некоторое время терять мастера и затем догонять
    replication slots - если вы сделаете слот репликации и его никто не будет читать - база будет сохранять wal пока не закончится диск. Если вы используете слоты репликации, то у вас в мониторинге обязана быть отдельная проверка что слот вычитывается
    max_wal_size - несмотря на название - объём wal, по накоплению которого происходит checkpoint. (либо по таймеру checkpoint_timeout смотря что случится раньше). Реально объём wal может быть выше, т.к. автоматический checkpoint намеренно не выполняется моментально, а размазан во времени.
    min_wal_size - этот объём wal всегда будет на диске занят и будет переписываться по кругу. Как гарантия того, что на диске есть место под столько wal
    archive_command - если включен и команда возвращает ненулевой статус возврата - то будет накапливать wal без ограничений. wal будут удалены (если только ещё не нужны какой из других настроек) когда archive_command получает от команды 0 код возврата.

    Если не хочется много денег тратить на резерв свободного места на хороших SSD - разместите на SSD саму базу данных, а WAL перенесите (симлинком директории pg_xlog (до 10.0) или pg_wal (10.0 и выше)) на отдельные HDD. WAL пишутся строго последовательно, вполне возможно жить с WAL на механических дисках и держать хорошую нагрузку.
    Плюс если работаете не с деньгами, можно сделать synchronous_commit = off. Что увеличит производительность всех пишущих транзакций. Но в случае фатального краха железа вы потеряете последние 3*wal_writer_delay транзакции (т.е. до 3*200мс = 600мс).
    Ответ написан
    2 комментария
  • Не могу понять что не так? json_decode почему не работает?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    $result = curl_exec($ch);
    if (!$result) {
    $result = curl_error($ch);
    }

    return $result;

    Оригинально. И нафига?

    Разделите мухи и котлеты. Что именно вам приходит в ответ после http запроса? Что именно вы передаёте json_decode?

    Спойлер: CURLOPT_RETURNTRANSFER
    Ответ написан
    4 комментария
  • Проблема с блоком питания, как решить???

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    напряжения измеряете хорошим мультиметром?
    Если смотрите софтовые показатели какого-то мониторинга - не обращайте внимания. Могут безбожно врать и показывать ничего общего с реальными электрическими характеристиками.

    Если мультиметр показывает 11,5В - это нормально и все потребители должны в номинальном режиме работать штатно. Стандарт ATX (2.01 для примера (стр 12), в остальных 2.х те же допуски) допускает 5% отклонения по +12В, т.е. от 11,4В до 12,6В

    (В любом замесе фпс дропается со 80 до 15, и после замеса восстанавливается). Хотя стресс тест аида64 всей системы проходит бесконечно долго

    Выглядит как защита от перегрева. Что с температурами под нагрузкой?
    Ответ написан
  • Какой размер резервной области жесткого диска HDD?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Если вам данные нужны - диск в утиль.
    Если не нужны - использовать дальше пока не пойдёт в утиль.
    В обоих случаях число ремапов и что будет после них - сугубо академический интерес.

    В наиболее подробной официальной доке таких сведений нет: https://www.seagate.com/staticfiles/support/disc/m...
    Вероятно не публикуется вовсе. 3000 ремапов помню на аналогичном seagate, без вопросов забрали по гарантии.
    Ответ написан
    2 комментария
  • Е5-2640v4 6 ядер ощутимо мощнее, чем Е5-1650v3 6 ядер или нет?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Странные участники вопроса.
    https://ark.intel.com/compare/82765,92984
    E5-1650V3 - 6 ядер + HT. Ну ладно, пусть в маркетинговом языке будет 12 ядер
    Но у E5-2640V4 ой как далеко не 6 ядер, а 10 + HT. Потому он и дороже.

    Ну а дальше вопрос к задачам. Еслии нужны высокочастотные ядра в малом количестве или побольше памяти - то конфиг с 1650V3 выглядит интереснее. Если надо побольше ядер на вычислительные задачи, но не так много памяти требуется - 2640V4 интереснее. (плюс учитывать, а сколько именно надо переплачивать)
    Ответ написан
    7 комментариев
  • PDO при bindValue выдаёт false?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    При чём тут bindValue?
    execute возвращает всегда boolean. php.net/manual/en/pdostatement.execute.php
    Разумеется у bool нет методов, это не объект.
    Ответ написан
    1 комментарий
  • Как сделать DELETE с вложенным SELECT`ом?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Исторически mysql сообщает об ошибке синтаксиса начиная с того места, где эта ошибка случилась.
    Т.е. парсер mysql не умеет использовать алиас таблицы для delete запросов.

    Или, как следует из документации
    Table aliases in a multiple-table DELETE should be declared only in the table_references part of the statement. Elsewhere, alias references are permitted but not alias declarations.

    Возможно сделать вырожденный случай мультитабличного удаления с одной таблицей, тогда алиас для таблицы задать возможно:
    delete t from test as t where t.i = 100;
    Ответ написан
  • Как хранить базу postgres 8.4 в памяти?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Закупаете железку с 256гб ram и выше. Ставите shared_buffers в 200гб. Всё. Со временем все данные к каким обращались будут подтянуты в память. А поскольку буферов больше чем база - база их не будет вытеснять из памяти.

    Можно было бы воспользоваться pg_prewarm для более удобного подтягивания данных в память после старта СУБД - да у вас какая-то ископаемая, давно уже не поддерживаемая версия. pg_prewarm для такой древности нет. (если, конечно, вы не опечатались в 9.4)
    Для такого объёма shared_buffers желательно huge pages сделать по объёму на пару процентов больше чем shared_buffers. А вот как - может для 8.4 и никак, я не настолько старый DBA, не знаю.
    Ответ написан
    4 комментария
  • Выводит id все продуктов по id категории?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    надо выбрать все продукты по category_id

    WHERE product_id =

    Ну в самом же деле?

    Сходите отдохните, погулять или поспать.
    Ответ написан
    4 комментария
  • Как сделать правильно check constraint?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    next_month := date_part( 'year', NEW.dtime)::text ||'-'|| date_part( 'month', NEW.dtime )::text ||'-31';

    Какой удивительно-непроверенный способ выстрелить себе в ногу. Половина года просто не нужна? Ни февраль ни ноябрь?

    При этом же
    table_part := table_master
    || '' || to_char(NOW(), 'YYYY')::text
    || 'm' || to_char(NOW(), 'MM')::text;

    INSERT INTO ' || table_part || '
    Какой дважды отважный способ отстрелить ногу. Дебажить что у вас получается не пробовали в принципе?
    И с чего же это действительно violates check constraint? Вообще не понятно. И вас ничего на насторожило даже в попытке вставить августовские данные в m10 раздел? Ну нельзя же так, в самом деле.

    Про race condition не упоминаю даже, он хотя бы действительно не для всех применений имеет значение.
    Ответ написан
  • Как работать с Ltree?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Это реализация материализованного пути. Ветка удалена если в ней нет элементов. Перенос - перенести каждый элемент. subpath функция в помощь например
    update tablename set tree = concat('newbranch.', subpath(tree, 1))::ltree where tree <@ 'origbranch';
    Ответ написан
    Комментировать
  • Как ограничить поиск в партиции таблицы?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Перепроверил догадку
    melkij=> create table events2016m11 (check (dtime >= '2016-11-01'::date AND dtime < '2016-12-01'::date)) inherits(events);
    melkij=> insert into events2016m11 values ('2016-11-20');
    INSERT 0 1
    melkij=> explain (analyze) select * from events where dtime > '2016-12-05';
                                                       QUERY PLAN                                                   
    ----------------------------------------------------------------------------------------------------------------
     Append  (cost=0.00..38.25 rows=754 width=8) (actual time=0.013..0.013 rows=0 loops=1)
       ->  Seq Scan on events  (cost=0.00..0.00 rows=1 width=8) (actual time=0.004..0.004 rows=0 loops=1)
             Filter: (dtime > '2016-12-05 00:00:00+03'::timestamp with time zone)
       ->  Seq Scan on events2016m11  (cost=0.00..38.25 rows=753 width=8) (actual time=0.009..0.009 rows=0 loops=1)
             Filter: (dtime > '2016-12-05 00:00:00+03'::timestamp with time zone)
             Rows Removed by Filter: 1
     Planning time: 0.127 ms
     Execution time: 0.032 ms
    (8 строк)
    melkij=> drop table events2016m11 ;
    DROP TABLE
    melkij=> create table events2016m11 (check (dtime >= '2016-11-01'::timestamptz AND dtime < '2016-12-01'::timestamptz)) inherits(events);
    CREATE TABLE
    melkij=> insert into events2016m11 values ('2016-11-20');INSERT 0 1
    melkij=> explain (analyze) select * from events where dtime > '2016-12-05';                                              QUERY PLAN                                              
    ------------------------------------------------------------------------------------------------------
     Append  (cost=0.00..0.00 rows=1 width=8) (actual time=0.004..0.004 rows=0 loops=1)
       ->  Seq Scan on events  (cost=0.00..0.00 rows=1 width=8) (actual time=0.004..0.004 rows=0 loops=1)
             Filter: (dtime > '2016-12-05 00:00:00+03'::timestamp with time zone)
     Planning time: 0.301 ms
     Execution time: 0.024 ms
    (5 строк)
    
    melkij=> show constraint_exclusion ;
     constraint_exclusion 
    ----------------------
     partition

    Внимательнее с явным приведением типов. У планировщика достаточно работы и не всё эквивалентное он считает идентичным. К тому же timestamp with timezone и date (без времени вовсе) надо сравнивать аккуратно.
    Ответ написан
    Комментировать
  • Как правильно поставить индексы у MySQL?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    create index crm_exchanges_bittrex_currencies_market_time_idx on crm_exchanges_bittrex_currencies (MarketName, TimeStamp);
    Ответ написан
    2 комментария
  • Помрёт ли HDD при постоянной работе через USB?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Регулярный старт-стоп нужен для энергосбережения - то есть может быть нужен, не факт что на регулярный старт не будет потрачено больше энергии чем на поддержание постоянной скорости вращения - в зависимости от частоты уходя в сон.
    Для самого диска - исключительно вредно. Количество циклов парковки головок ограничено возможностями механики, старт массивного массива дисков даёт заметную нагрузку на двигатель (в серверах диски не редко сыпятся именно при старте, тогда как 5 минут до выключения были живые), при выключении диск остывает, при старте резко нагревается - а температурные колебания так же вредны для механики. В отличии от поддержания постоянной скорости вращения с примерно постоянной температурой - тепличные условия.

    1) долго ли протянет мой hdd при подключении через sata-usb с учётом того, что он никогда не прекращает вращение?

    Если не помрёт БП вместе с диском - то скорей всего дольше, чем при постоянной старт-стопе.

    2) можно ли получить доступ к данным SMART при таком подключении?

    Зависит от переходника, только экспериментировать.
    Ответ написан
    3 комментария
  • Можно ли сделать такой SQL-запрос?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    select org from tablename group by org having count(distinct active) > 1;
    Ответ написан
    2 комментария
  • Когда имеет смысл делать несколько таблиц с комментариями?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    И получается дико неудобно и значительно медленнее в итоге.
    Не касаясь лимита на число открытых файловых дескрипторов, кучу internal статистики планировщика и прочих деталей реализации.

    Форум. Банальная страница профиля пользователя, достать последние 10 сообщений этого пользователя - как? union all по всем темам с filesort последующим вместо простого index scan по составному ключу даже без необходимости в сортировке?
    Статьи. Показать для модерации последние комментарии

    А распилить большую таблицу (только на самом деле большую, а не в смешные лям строк) на части - вещь неплохая. Только не так надо пилить. Есть у mysql штатное партицирование.
    Ответ написан
    Комментировать
  • Что учить администратору баз данных?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Как человек в этом году неожиданно сменивший деятельность с senior php dev на DBA - хочу задать встречный вопрос:
    а вы вообще видите вакансии на начинающего-студента-DBA? Целую одну или хотя бы даже две? Для увидевшего SQL вот только что студента и уже желающего быть DBA всего через пару месяцев? Человека, который даже не написал, какую именно СУБД ему интересно изучать до уровня DBA?

    Отдельная позиция DBA в проекте - значит ни штатные системные администраторы (со стороны администрирования) ни старшие разработчики (со знанием SQL) уже не обладают достаточными познаниями в используемой СУБД. Но эта БД важна для бизнеса и ищется специалист по ней, который будет обеспечивать хорошую работу этой базы.
    Несколько позиций DBA в кампании чтобы брать стажера - это очень большой проект. Эти могут себе позволить отвлекать своих специалистов от работы и вкладывать деньги в выращивание нового специалиста. Если вы чем-то сильно заинтересуете кампанию.

    Я не знаю как стать DBA с нуля. Похоже DBA становятся только имея за плечами заметный опыт администрирования или разработки.

    Определитесь с конкретной СУБД и прочитайте полностью её мануал. Например мануал postgresql 10 в pdf занимает свыше 3 тысяч страниц A4. На пару месяцев этого уже хватит. А это только мануал. Только по непосредственно СУБД.
    Плюс необходимо знать базовое администрирование той ОС под которой эта СУБД используется (например, я как postgresql dba даже близко не представляю что делать с windows - такая экзотика в жизни не встречается. А вот для MS SQL наверняка необязательно разбираться в linux).
    Плюс теория: реляционная логика, обеспечение транзакционного, конкурентного доступа, восстановление после сбоев
    Плюс практика - активность в профильных сообществах, форумах. Читаете, проверяете, запоминаете, вежливо переспрашиваете в комментариях если вам кажется что предыдущий отвечающий ошибся, отвечаете на вопросы.

    Интересно? Вперёд. Но в DBA за 3 месяца из нулевого студента - не верю.
    Ответ написан
    2 комментария
  • Как посмотреть существующие триггеры событий (Event Trigger, postgresql)?

    Melkij
    @Melkij
    DBA для вашего PostgreSQL?
    Они прописываются в системной view pg_event_trigger
    https://www.postgresql.org/docs/9.6/static/catalog...

    В psql есть сокращение \dy выполняющее вот такой запрос:
    SELECT evtname as "Name", evtevent as "Event", pg_catalog.pg_get_userbyid(e.evtowner) as "Owner",
     case evtenabled when 'O' then 'enabled'  when 'R' then 'replica'  when 'A' then 'always'  when 'D' then 'disabled' end as "Enabled",
     e.evtfoid::pg_catalog.regproc as "Procedure", pg_catalog.array_to_string(array(select x from pg_catalog.unnest(evttags) as t(x)), ', ') as "Tags"
    FROM pg_catalog.pg_event_trigger e ORDER BY 1
    Ответ написан
    Комментировать