{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом бази даних",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/bazi-danih\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/bazi-danih\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "119852",
            "url": "https:\/\/stefaniuk.website\/all\/gcp-databases\/",
            "title": "GCP: Databases",
            "content_html": "<p>Google Cloud Platform предоставляет большой выбор разных способов хранить данные. Некоторые из них построены на базе существующих продуктов, другие — собственная разработка гугла.<\/p>\n<p>Для начала нужно понять, что такое managed databases. Это услуга по настройке и администрированию баз данных. Облачный провайдер сам отвечает за работу сервера, установку патчей безопасности, доступность сервиса. Для того чтобы достичь такого же результата с помощью self hosted, нужно иметь в штате специалиста, который умеет администрировать сервера, закупить железо и подготовить инфраструктуру. В случае с managed databases платишь только за то количество ресурсов, которое используешь.<\/p>\n<h2>Cloud SQL<\/h2>\n<p>Cloud SQL это классический managed database сервис. Он позволяет развернуть 3 самые популярные базы данных. Такие как:<\/p>\n<ul>\n<li>MySQL (5.6, 5.7 и 8.0)<\/li>\n<li>PostgreSQL (9.6, 10, 11, 12)<\/li>\n<li>MS SQL Server 2017<\/li>\n<\/ul>\n<p>Также гугл гарантирует доступность базы данных на уровне 99,95%. Дополнительно получаем автоматическую репликацию и бекапы.<\/p>\n<p><b>Ограничения<\/b><\/p>\n<ul>\n<li>30 Tb хранилища<\/li>\n<li>60,000 IOPS<\/li>\n<li>624 Gb RAM<\/li>\n<li>Реплики БД только для чтения<\/li>\n<\/ul>\n<h2>Cloud Spanner<\/h2>\n<p>Spanner — реляционная база данных, разработка Google. Spanner позиционирует себя как горизонтально масштабируемая база данных, способна хранить петабайты информации, гарантирует строгую согласованность данных. А также доступность 99.999%.<\/p>\n<p>По своей природе Cloud Spanner это распределённая база данных с автоматическим шардированием и репликацией, которые скрыты под капотом. Чтобы создать БД, нужно выбрать локацию (region или multi-region) и количество нод. Количество нод влияет на размер данных, которые кластер способен хранить и его доступность. Каждая нода может обслуживать до 2 Тб данных.<\/p>\n<p>Пример кластера, который состоит из 4 нод. Каждая зона содержит полную копию базы данных и 4 процесса, которые обслуживают эти данные.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/stefaniuk.website\/pictures\/gcp-db-regional-instance-config.png\" width=\"734\" height=\"365\" alt=\"\" \/>\n<\/div>\n<p>Гугл советует иметь минимум 3 ноды для прода. Но есть один нюанс — цена. Cloud Spanner очень дорогое решение, созданное для работы с огромным количеством данных. За 1 петабайт данных прийдется отдать ......... 1 645 568 $ ......... в месяц.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/stefaniuk.website\/pictures\/gcp-db-spanner-price.png\" width=\"420\" height=\"327\" alt=\"\" \/>\n<\/div>\n<h2>Cloud Big Table<\/h2>\n<p>Столбцовая NoSQL база данных, которая масштабируется до миллиарда строк и тысяч колонок. Способна хранить петабайты информации.<\/p>\n<p>Основная фича — наличие интерфейса HBase и нативная поддержка Hadoop. Это позволяет перенести данные с собственного кластера в Big Table без каких либо изменений. Big Table идеально подойдёт для очень быстрой записи и чтения, а также хранения данных типа ключ\/значения, размер которых не превышает 10 Мб.<\/p>\n<p>Данные внутри базы данных лежат в огромных таблицах. Грубо говоря, таблица в HBase представлена в виде огромного словаря словарей. Таблица состоит из строк, каждая из которых обычно описывает одну сущность, и столбцов, которые содержат отдельные значения для каждой строки. Каждая строка индексируется одним ключом, а столбцы, которые связаны друг с другом, обычно группируются в семейство столбцов.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/stefaniuk.website\/pictures\/gcp-db-big-table.png\" width=\"658\" height=\"372\" alt=\"\" \/>\n<\/div>\n<p>Для более глубокого ознакомления советую прочитать главу «HBase» из книги «7 баз данных за 7 недель». Также советую ознакомится с <a href=\"https:\/\/cloud.google.com\/bigtable\/docs\/overview\">официальной документацией<\/a>.<\/p>\n<h2>Cloud Firestore<\/h2>\n<p>Cloud Firestore — это полностью управляемая,документоориентированная serverless база данных, предназначена для разработки serverless приложений. Структура данных сильно напоминает такую в MongoDB.<\/p>\n<p>Firestore поддерживает офлайн режим и живую синхронизацию. С помощью этих фич удобно строить приложения, которые предназначены для совместного использования, например, Google Docs или другие похожие варианты.<\/p>\n<p>А также она пришла на замену предыдущего сервиса — Cloud Datastore. В 2021 году гугл обещает автоматически всех мигрировать с Datastore на Firestore. Это возможно благодаря обратной совместировать с Datastore API.<\/p>\n<p>Firestore имеет два режива работы:<\/p>\n<ul>\n<li><b> Datastore mode<\/b>, создан для серверных приложений, совместим с Cloud Datastore. Поддерживает согласованность в конечном счёте.<\/li>\n<li><b>Native mode<\/b>, создан для веб и мобильных платформ. Поддерживает строгую согласованость и все основные фичи Firestore.<\/li>\n<\/ul>\n<p>Детальнее с режимами можно ознакомится в <a href=\"https:\/\/cloud.google.com\/firestore\/docs\/firestore-or-datastore\">официальной документации<\/a>.<\/p>\n<h2>Cloud Memorystore<\/h2>\n<p>Управляемый in-memory сервис, построенный на базе Redis и memcached.<\/p>\n<h2>Сравнение<\/h2>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/stefaniuk.website\/pictures\/gcp-db-compare.png\" width=\"961\" height=\"495\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-10-15T01:24:00+05:00",
            "date_modified": "2023-06-03T05:29:41+05:00",
            "tags": [
                "cloud",
                "google cloud platform",
                "бази даних"
            ],
            "author": {
                "name": "Bohdan Stefaniuk",
                "url": "https:\/\/stefaniuk.website\/",
                "avatar": "https:\/\/stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
            },
            "_date_published_rfc2822": "Thu, 15 Oct 2020 01:24:00 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119852",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119854",
            "url": "https:\/\/stefaniuk.website\/all\/sharding\/",
            "title": "Шардинг",
            "content_html": "<p>Шардинг (иногда шардирование) — это другая техника масштабирования работы с данными. Суть его в разделении (партиционирование) базы данных на отдельные части так, чтобы каждую из них можно было вынести на отдельный сервер. Этот процесс зависит от структуры базы данных и выполняется прямо в приложении в отличие от репликации<\/p>\n<h2>Вертикальный шардинг<\/h2>\n<p>Вертикальный шардинг — это выделение таблицы или группы таблиц на отдельный сервер. Например, в приложении есть такие таблицы:<\/p>\n<ul>\n<li><i>users<\/i> — данные пользователей<\/li>\n<li><i>photos<\/i> — фотографии пользователей<\/li>\n<li><i>albums<\/i> — альбомы пользователей<\/li>\n<\/ul>\n<p>Таблицу users Вы оставляете на одном сервере, а таблицы <i>photos<\/i> и <i>albums<\/i> переносите на другой. В таком случае в приложении Вам необходимо будет использовать соответствующее соединение для работы с каждой таблицей<\/p>\n<h2>Горизонтальный шардинг<\/h2>\n<p>Горизонтальный шардинг — это разделение одной таблицы на разные сервера. Это необходимо использовать для огромных таблиц, которые не умещаются на одном сервере. Разделение таблицы на куски делается по такому принципу:<\/p>\n<ul>\n<li>На нескольких серверах создается одна и та же таблица (только структура, без данных).<\/li>\n<li>В приложении выбирается условие, по которому будет определяться нужное соединение (например, четные на один сервер, а нечетные — на другой).<\/li>\n<li>Перед каждым обращением к таблице происходит выбор нужного соединения.<\/li>\n<\/ul>\n<h2>Совместное использование<\/h2>\n<p>Шардинг и репликация часто используются совместно. В нашем примере, мы могли бы использовать по два сервера на каждый шард таблицы<\/p>\n<h2>Key-value базы данных<\/h2>\n<p>Следует отметить, что большинство Key-value баз данных поддерживает шардинг на уровне платформы. Например, Memcache. В таком случае, Вы просто указываете набор серверов для соединения, а платформа сделает все остальное<\/p>\n<h2>Итог<\/h2>\n<p>Не следует применять технику шардинга ко всем таблицам. Правильный подход — это поэтапный процесс разделения растущих таблиц. Следует задумываться о горизонтальном шардинге, когда количество записей в одной таблице переходит за пределы от нескольких десятков миллионов до сотен миллионов.<\/p>\n<h2>P.S.<\/h2>\n<p>Помните, процесс масштабирования данных — это архитектурное решение, оно не связано с конкретной технологией. Не делайте ошибок наших отцов — не переезжайте с известной Вам технологии на новую из-за поддержки или не поддержки шардинга. Проблемы обычно связаны с архитектурой, а не конкретной базой данных<\/p>\n<h2>Ссылки<\/h2>\n<ol start=\"1\">\n<li><a href=\"https:\/\/ruhighload.com\/%D0%92%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B9+%D1%88%D0%B0%D1%80%D0%B4%D0%B8%D0%BD%D0%B3\">Вертикальный шардинг<\/a><\/li>\n<li><a href=\"https:\/\/ruhighload.com\/%D0%A8%D0%B0%D1%80%D0%B4%D0%B8%D0%BD%D0%B3+%D0%B8+%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F\">Шардинг и репликация<\/a><\/li>\n<\/ol>\n",
            "date_published": "2019-04-05T02:26:34+05:00",
            "date_modified": "2023-06-03T05:29:59+05:00",
            "tags": [
                "system-design",
                "бази даних"
            ],
            "author": {
                "name": "Bohdan Stefaniuk",
                "url": "https:\/\/stefaniuk.website\/",
                "avatar": "https:\/\/stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
            },
            "_date_published_rfc2822": "Fri, 05 Apr 2019 02:26:34 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119854",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "119853",
            "url": "https:\/\/stefaniuk.website\/all\/db-replication\/",
            "title": "Репликация данных",
            "content_html": "<p>Репликация — одна из техник масштабирования баз данных. Состоит эта техника в том, что данные с одного сервера базы данных постоянно копируются (реплицируются) на один или несколько других. Для приложения появляется возможность использовать не один сервер для обработки всех запросов, а несколько. Таким образом появляется возможность распределить нагрузку с одного сервера на несколько.<\/p>\n<p>Существует два основных подхода при работе с репликацией данных:<\/p>\n<ol start=\"1\">\n<li>Репликация Master-Slave;<\/li>\n<li>Репликация Master-Master.<\/li>\n<\/ol>\n<h2>Master-Slave репликация<\/h2>\n<p>В этом подходе выделяется один основной сервер базы данных, который называется Мастером. На нем происходят все изменения в данных (любые запросы INSERT\/UPDATE\/DELETE). Слейв сервер постоянно копирует все изменения с Мастера. С приложения на Слейв сервер отправляются запросы чтения данных. Таким образом Мастер сервер отвечает за изменения данных, а Слейв за чтение.<\/p>\n<h2>Несколько Слейвов<\/h2>\n<p>Преимущество этого типа репликации в том, что Вы можете использовать более одного Слейва. Обычно следует использовать не более 20 Слейв серверов при работе с одним Мастером.<br \/>\nТогда из приложения выбирает случайным образом один из Слейвов для обработки запросов, тем самым распределяя нагрузку на БД.<\/p>\n<h2>Выход из строя<\/h2>\n<p>При выходе из строя Слейва, достаточно просто переключить все приложение на работу с Мастером. После этого восстановить репликацию на Слейве и снова его запустить.<br \/>\nЕсли выходит из строя Мастер, нужно переключить все операции (и чтения и записи) на Слейв. Таким образом он станет новым Мастером. После восстановления старого Мастера, настроить на нем реплику, и он станет новым Слейвом.<\/p>\n<h2>Master-Master репликация<\/h2>\n<p>В этой схеме, любой из серверов может использоваться как для чтения так и для записи.<\/p>\n<h2>«Ручная» репликация<\/h2>\n<p>Некоторые технологии вообще не имеют встроенной репликации. В таких случаях, следует использовать самостоятельную реализацию репликации. В самом простом случае, приложение будет дублировать все запросы сразу на несколько серверов базы данных.<\/p>\n<h2>Итог<\/h2>\n<p>Репликация используется в большей мере для резервирования баз данных и в меньшей для масштабирования. Master-Slave репликация удобна для распределения запросов чтения по нескольким серверам. Подход ручной репликации позволит использовать преимущества репликации для технологий, которые ее не поддерживают. Зачастую репликация используется вместе с шардингом при решении вопросов масштабирования.<\/p>\n<p>Следует отметить, что репликация сама по себе не очень удобный механизм масштабирования. Причиной тому — рассинхронизация данных и задержки в копировании с мастера на слейв. Зато это отличное средство для обеспечения отказоустойчивости. Вы всегда можете переключиться на слейв, если мастер ломается и наоборот. Чаще всего репликация используется совместно с шардингом именно из соображений надежности.<\/p>\n",
            "date_published": "2019-04-05T02:23:42+05:00",
            "date_modified": "2023-06-03T05:29:49+05:00",
            "tags": [
                "system-design",
                "бази даних"
            ],
            "author": {
                "name": "Bohdan Stefaniuk",
                "url": "https:\/\/stefaniuk.website\/",
                "avatar": "https:\/\/stefaniuk.website\/pictures\/userpic\/userpic@2x.jpg?1565716580"
            },
            "_date_published_rfc2822": "Fri, 05 Apr 2019 02:23:42 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "119853",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}