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 &
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"
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 )