1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/jimit-sparrow

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Sparrow: Распределённая база данных

Введение

В бизнес-среде, подобной заказам, записи о заказах будут постоянно расти со временем. Чем дольше проходит полный цикл заказа, тем меньше вероятность того, что он будет доступен. Но чем новее заказ, тем выше частота доступа к нему. Исходя из этого предположения, можно сделать простой прогноз: если через некоторое время количество заказов накопится до значительного значения, это повлияет на эффективность операций CURD с горячими данными. Тогда необходимо разработать работоспособное решение. Это промежуточное ПО создано для этой цели. Оно разделяет бизнес-данные на лёгкие, тяжёлые, горячие и холодные блоки по вертикали и горизонтали, чтобы каждый блок оставался лёгким. Таким образом, достигается цель обеспечения эффективности.

Установка зависимостей

# Для среды на основе python2.7
pip install -r requirements.txt -i http://pypi.douban.com/simple --trusted-host pypi.douban.com --allow-external mysql-connector-python

Конфигурационный файл

# Конфигурация среды [debug|sandbox|production(по умолчанию)] (можно записать в конкретный файл .bashrc пользователя)
export JI_ENVIRONMENT=debug
# Период переноса из горячей библиотеки в холодную d означает день, w — неделю, m — месяц
DUMP_CYCLE
# Время, необходимое для переноса данных, в секундах
DATA_FLY_TIME
# Имя базы данных по умолчанию (подробная конфигурация может отличаться)
DATABASE
# Порт базы данных по умолчанию
DB_PORT
# Максимальное количество записей, возвращаемых за один раз
DB_RESULT_LIMIT
# Поле временной шкалы в горячих и холодных библиотеках
TIME_LINE_FIELD
# Коэффициент поля временной шкалы для поддержки временных единиц миллисекунды и наносекунды (используется только в скрипте переноса, 1 — нормально, 1000 — миллисекунда...)
TIME_X
# Путь к журналу (обратите внимание на права чтения и записи)
LOG_FILE_BASE
# Ключ идентификатора записи
IDsKeeper
# Связанная с Redis конфигурация
REDIS

DB_S
# Конкретная конфигурация домена [states.DBDomain.light.value|states.DBDomain.hot.value|states.DBDomain.cold.value], соответствующая лёгкому, горячему и холодному
domain
# Режим чтения и записи [states.RWMode.SW_SR.value|states.RWMode.BW_AR.value], соответствующий однократному чтению и однократной записи, сбалансированному чтению и агрегированному чтению, обычному однократному чтению и записи для лёгкой библиотеки, сбалансированному чтению и агрегированному чтению для горячей библиотеки
rw_mode
# Отключить ли этот домен [True|False] Домен, который был отключен, не анализируется конфигурацией
disable
# Размер пула соединений (Примечание: сумма всех размеров пулов соединений не должна превышать переменную max_connections в среде базы данных (команда справки: SHOW VARIABLES LIKE 'max_connections';))
pool_size

Формат холодной библиотеки

Необходимо заранее создать холодную библиотеку. Она должна создаваться ежемесячно, формат — sparrow__2016__1, где имя базы данных, год и месяц разделены двумя символами подчёркивания. Каждая таблица данных и структура таблицы в холодной библиотеке должны соответствовать горячей библиотеке. В противном случае перенос данных завершится неудачно.

Время переноса

Если период переноса равен «w», то можно выполнить скрипт переноса при входе в текущий период. Формат crontab такой: '* * * * 1 cd ~/sparrowt/task_scheduler && /usr/bin/python dump.py', обратите внимание на разрешения пользователя. В конце периода можно выполнить clear_expire_in_hot.py для очистки данных в горячей библиотеке, которые были перенесены. Формат crontab: '* * * * 7 cd ~/sparrowt/task_scheduler && /usr/bin/python clear_expire_in_hot.py', обратите внимание на разрешения пользователя. Удалённые данные будут записаны в файл yyyymm_log_record.record в текущем каталоге в качестве средства восстановления.

Запуск

# HTTP API
python sparrow.py

# zmq API
python zmq_scheduler.py &
python zmq_sparrow.py &

Ограничения проектирования базы данных

  1. Каждая таблица должна иметь поле id в качестве первичного ключа, на основе которого выполняются операции CURD;
  2. Холодные и горячие библиотеки должны иметь поле временной шкалы, которое можно настроить в файле config.py (по умолчанию — create_time);
  3. Поля без индексов не могут использоваться в качестве условий фильтрации;
  4. Составные индексы, несколько полей разделяются символом '__' (двойное подчёркивание, например: ALTER TABLE user_info ADD INDEX first_name__last_name (first_name, last_name);));
  5. При запросе не требуется указывать диапазон времени для лёгкой библиотеки. Для горячих и холодных библиотек необходимо указать диапазон времени, иначе будет возвращён результат только за текущий день.
  6. Данные, попадающие в холодную библиотеку, являются историческими записями. Они не поддерживают операции удаления и изменения.

HTTP API

Вставка

curl -X "POST" "http://localhost:5000/oo/login_auth" \
    -H "Content-Type: application/json" \
    -d "{\"id\":1,\"login_name\":\"fanliang@iqusong.com\",\"password\":\"000000.com\",\"create_time\":0}"

Обновление

curl -X "PATCH" "http://localhost:5000/oo/login_auth/1" \
    -H "Content-Тип: application/json" \
    -d "{\"password\":\"newpswd\"}"

Получение

curl -X "GET" "http://localhost:5000/oo/order_form?filter_str=__order_by__id,__limit__1000,__range__1451197800~1451518200"

Удаление

curl -X "DELETE" "http://localhost:5000/oo/login_auth/1"

zmq API

RPC

    message = dict()
    message['action'] = 'RPC'
    message['object_name'] = 'order_form'
    message['params'] = {
        'function': 'generate_id_by',       # Поддерживаемые методы 'generate_id_by | get_id_of_max_by'
    }
    socket.send_json(message)
    result = socket.recv_json()
    
    
    результат:
    {
        state: {
            code: "200",
            zh-cn: "успех",
            en-us: "ОК"
        }
        id: 1
    }

Вставка

message = dict()
message['action'] = 'POST'
message['object_name'] = 'order_form'
message['params'] = {
    'id': 1,
    'create_time': 0,
    'finished_time': 0
}
socket.send_json(сообщение)
socket.recv_json()

результат:
{
    state: {
        code: "200",
        zh-cn: "успех",
        en-us: "OK"
    }
}

Обновление

message = dict()
message['action'] = 'PATCH'
message['object_name'] = 'order_form'
message['params'] = {
    'id': 1,
    'create_time': 0,
    'finished_time': 0
}
socket.send_json(сообщение)
socket.recv_json()

результат:
{
    state: {
        code: "200",
        zh-cn: "успех",
        en-us: "OK"
    }
}

Получение

message = dict()
message['action'] = 'GET'
message['object_name'] = 'order_form'
message['params'] = {
    'filter_str': '__order_by__id,__limit__1000,__range__1451197800~1451518200'
}
socket.send_json(сообщение)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
GPL-3.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/jimit-sparrow.git
git@api.gitlife.ru:oschina-mirror/jimit-sparrow.git
oschina-mirror
jimit-sparrow
jimit-sparrow
master