Распределенные базы и хранилища данных

Архитектура и принципы распределенного подхода. Требования и критерии построения информационных систем на базе распределенных баз данных (РБД)

Показывать лекцию целиком

Под распределенной (Distributed DataBase - DDB) обычно понимают базу данных, декомпозированную и фрагментированную на несколько узлов вычислительной сети, с возможным управлением различными СУБД.

РБД должна обладать (требования):

  • Локальными и глобальными(распределенными) средствами доступа к данным(СУБД).
  • Единообразной логикой прикладных программ во всех АРМах сети.
  • Малым временем реакции на запросы пользователей
  • Надежностью, исключающей разрушения целостности системы в случае выхода из строя ее отдельных компонент(узлов)
  • Открытостью, позволяющей наращивать объем локальных БД и добавлять новые АРМ
  • Развитой системой управления резервным копированием и восстановления данных на случай сбоев
  • Защищенностью, следящей за соблюдением привилегий доступа к данным
  • Высокой эффективностью, за счет выбора оптимальных алгоритмов использования сетевых ресурсов
  • Развитым репликационным механизмом, позволяющим размещать обновленные копии данных в сети оптимальным образом.
  • Принципы построения РБД.

  • Минимизация интенсивности обмена данными (сетевого трафика)
  • Оптимальным размещением серверных и клиентских приложений в сети
  • Декомпозиция данных на часто и редко используемые сегменты (для правильной настройки репликации - размещение наиболее часто используемых данных на АРМ конечных пользователей)
  • Периодическое сохранение копий данных и выполнение действий по поддержке целостности распределенной информационной системы.
  • Критерии построения РБД.

  • Всесторонний анализ информационных потребностей предметной области с выявлением объемов хранимых данных, их сложности, достоверности, взаимосвязанности.
  • Моделирование предполагаемого сетевого трафика при работе РБД с различными моделями репликации данных.
  • Кластеризация элементов данных и программ их обработки. Цель- добиться максимальной автономности и слабосвязанности кластеров.
  • Привязка кластеров данных к вероятным пользователям или АРМ.
  • Поддержка эталонной копии данных и ограничение репликационного механизма
  • Разработка и реализация правил приведения локальных и центральной БД в непротиворечивое состояние.
  • Распределенные архитектуры БД принято подразделять по типам на

  • Системы недублирующего разбиения (при большом объеме часто меняющихся данных)
  • Системы частичного дублирования (при небольшом объеме часто меняющихся данных)
  • Системы полного дублирования (при небольшом объеме редко меняющихся данных)
  • В заключении сформулируем ряд свойств, которым по К. ДейтуК. Дж. Дейт Введение в системы баз данных, 8-е издание.: Пер. с англю - М.: Издательский дом "Вильямс", 2005.-1328с.: ил. должна удовлетворять РБД:

  • Локальная автономия

    Это качество означает, что управление данными на каждом из узлов распределенной системы выполняется локально. База данных, расположенная на одном из узлов, является неотъемлемым компонентом распределенной системы. Будучи фрагментом общего пространства данных, она, в то же время функционирует как полноценная локальная база данных; управление ею выполняется локально и независимо от других узлов системы.

  • Независимость узлов

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

  • Непрерывные операции

    Это качество можно трактовать как возможность непрерывного доступа к данным (известное "24 часа в сутки, семь дней в неделю") в рамках DDB вне зависимости от их расположения и вне зависимости от операций, выполняемых на локальных узлах. Это качество можно выразить лозунгом "данные доступны всегда, а операции над ними выполняются непрерывно".

  • Прозрачность расположения

    Это свойство означает полную прозрачность расположения данных. Пользователь, обращающийся к DDB, ничего не должен знать о реальном, физическом размещении данных в узлах информационной системы. Все операции над данными выполняются без учета их местонахождения. Транспортировка запросов к базам данных осуществляется встроенными системными средствами.

  • Прозрачная фрагментация

    Это свойство трактуется как возможность распределенного (то есть на различных узлах) размещения данных, логически представляющих собой единое целое. Существует фрагментация двух типов: горизонтальная и вертикальная. Первая означает хранение строк одной таблицы на различных узлах (фактически, хранение строк одной логической таблицы в нескольких идентичных физических таблицах на различных узлах). Вторая означает распределение столбцов логической таблицы по нескольким узлам.

  • Прозрачное тиражирование

    Тиражирование данных - это асинхронный (в общем случае) процесс переноса изменений объектов исходной базы данных в базы, расположенные на других узлах распределенной системы. В данном контексте прозрачность тиражирования означает возможность переноса изменений между базами данных средствами, невидимыми пользователю распределенной системы. Данное свойство означает, что тиражирование возможно и достигается внутрисистемными средствами.

  • Обработка распределенных запросов

    Это свойство DDB трактуется как возможность выполнения операций выборки над распределенной базой данных, сформулированных в рамках обычного запроса на языке SQL. То есть операцию выборки из DDB можно сформулировать с помощью тех же языковых средств, что и операцию над локальной базой данных.

  • Обработка распределенных транзакций

    Это качество DDB можно трактовать как возможность выполнения операций обновления распределенной базы данных ( INSERT, UPDATE, DELETE ), не разрушающее целостность и согласованность данных. Эта цель достигается применением двухфазового или двухфазного протокола фиксации транзакций (two-phase commit protocol), ставшего фактическим стандартом обработки распределенных транзакций. Его применение гарантирует согласованное изменение данных на нескольких узлах в рамках распределенной (или, как ее еще называют, глобальной) транзакции.

  • Прозрачность сети

    Доступ к любым базам данных может осуществляться по сети. Спектр поддерживаемых конкретной СУБД сетевых протоколов не должен быть ограничением системы с распределенными базами данных. Данное качество формулируется максимально широко - в распределенной системе возможны любые сетевые протоколы.

  • Независимость от оборудования

    Это свойство означает, что в качестве узлов распределенной системы могут выступать компьютеры любых моделей и производителей - от мэйнфреймов до "персоналок".

  • Независимость от операционных систем

    Это качество вытекает из предыдущего и означает многообразие операционных систем, управляющих узлами распределенной системы.

  • Независимость от систем управления

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

  • Практические занятия

    Постановка задачи. Проектирование данных на концептуальном и логическом уровнях. Нормализация отношений.

    Презентация по ER-моделированию

    ER нотации

    Пример модели в ERwin

    Подготовка SQL скриптов генерации схемы отношений БД в ERwin. Разработка скрипта для ввода тестовой информации.

    Видео-презентация (Для проигрывания требуется Windows Media Player)

    Архитектура MS SQL Server 2005. Настройка и использование основных компонент среды. Создание учебной базы данных.

    Видео-презентация (Для проигрывания требуется Windows Media Player)

    Работа с СУБД MS SQL Server 2005, ORACLE 10g. Примеры соединений с БД, технологии разработки клиентского приложения

    Использование технологии Java Database Connectivity (JDBC) для работы с базами данных

    Презентация

    Примеры к презентации

    SQL-скрипты, проект и исходные коды

    package org.mai806.jdbcsample;
    
    import java.sql.*;
    
    public class QuerySample {
        
        public static void main(String[] args) throws Exception {
            
            /* ======== Подключение к MS SQL Server ===== */
            // Загрузка драйвера
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            // Соединение с базой данных
            Connection connection = DriverManager.getConnection(
                    "jdbc:sqlserver://localhost:1433;databaseName=o01;", 
                    // localhost - сервер СУБД, o01 - имя базы данных
                    "sa", "123"); // пользователь, пароль
            
            /* ======== Подключение к Oracle ============
            // Загрузка драйвера
            Class.forName("oracle.jdbc.OracleDriver");
            // Соединение с базой данных
            Connection connection = DriverManager.getConnection(
                            "jdbc:oracle:thin:@localhost:1521:orcl", 
                            // localhost - сервер СУБД, orcl - SID базы оракла
                            "o01", "o01"); // пользователь, пароль         
            
            // Создание Statement
            PreparedStatement stmt = connection.prepareStatement
            ("select ID, NAME from PERSON where NAME like ?");
            stmt.setString(1, "%S%");
            // Выполнение запроса
            ResultSet rs = stmt.executeQuery();
            // Перебор результата выполнения запроса
            while(rs.next()) {
                // Пример выбора параметра по номеру или по имени
                System.out.println("ID: " +
                        rs.getLong(1) + "; NAME="+
                        rs.getString("NAME"));
            }
            
            // закрытие использованных ресурсов БД
            rs.close();
            stmt.close();
            connection.close();
        }
    }
    package org.mai806.jdbcsample;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class StoredProcedureSample {
        
        private static Connection connection = null;
        public static void main(String[] args) throws Exception {
            // Получение соединения из значений параметров в файле properties
            ResourceBundle properties = ResourceBundle.getBundle("database");
            Class.forName(properties.getString("driver"));
            connection = DriverManager.getConnection(
                    properties.getString("url"),
                    properties.getString("user"),
                    properties.getString("password"));
            
            transferAmount(1,2,100.0);
            connection.close();
        }
        
        /**
         * Переводит указанную сумму с одного счета на другой
         * @param from счет плательщика
         * @param to счет получателя
         * @param amount сумма
         */
        public static void transferAmount(long from, long to, double amount)
        throws Exception {
            // Создание Statement
            CallableStatement stmt
                    = connection.prepareCall("{call TransferAmount(?,?,?)}");
            // Установка параметров
            stmt.setLong(1, from);
            stmt.setLong(2, to);
            stmt.setDouble(3, amount);
            // Выполнение процедуры
            stmt.execute(); 
        }
    }
    package org.mai806.jdbcsample;
    
    import java.sql.*;
    import java.util.ResourceBundle;
    
    public class TransactionalSample {
        
        private static Connection connection = null;
        public static void main(String[] args) throws Exception {
            
            // Получение соединения из значений параметров в файле properties
            ResourceBundle properties = ResourceBundle.getBundle("database");
            Class.forName(properties.getString("driver"));
            connection = DriverManager.getConnection(
                    properties.getString("url"),
                    properties.getString("user"),
                    properties.getString("password"));
            
            // Ручное управление транзакциями
            connection.setAutoCommit(false);
            
            try {
                transferAmount(2, 1, 10.0);
            } finally {
                connection.close();
            }
        }
        
        /**
         * Переводит указанную сумму с одного счета на другой
         * @param from счет плательщика
         * @param to счет получателя
         * @param amount сумма
         */
        public static void transferAmount(long from, long to,
                double amount) throws Exception {
            PreparedStatement stmt = null;
            Statement query = null;
            try {
                stmt = connection.prepareStatement
                ("update ACCOUNT set AMOUNT=AMOUNT+? where ID=?");
                // Забираем сумму со счета плательщика
                stmt.setDouble(1, -amount);
                stmt.setLong(2, from);
                stmt.execute();
                
                // Добавляем сумму на счет получателя
                stmt.setDouble(1, amount);
                stmt.setLong(2, to);
                stmt.execute();
                
                // Пост-проверка: отрицательность счета плательщика
                query = connection.createStatement();
                ResultSet rs = query.executeQuery(
                        "select AMOUNT from ACCOUNT where ID="+from+" and AMOUNT<0");
                if (rs.next()) {
                    throw new Exception("На счете №"+from+" 
                    недосточно средств ["+(amount+rs.getDouble(1))+"] 
                    для снятия суммы ["+amount+"]");
                }
                connection.commit();
                System.out.println("Перечисление средств успешно выполнено");
            } catch(Exception e) {
                e.printStackTrace();
                connection.rollback();
            } finally {
                if (stmt!=null)
                    stmt.close();
                if (query!=null)
                    query.close();
            }
        }
        
    }

    Работа с базами данных из J2EE Web-контейнера

    Презентация

    Объектно-реляционное отображения для работы с базами данных

    Презентация

    Использование препроцессора для работы с API СУБД

    Презентация

    Вернуться к учебному плану