Python postgresql КОПИРОВАТЬ В / ИЗ сжатого потока по сети

Я настраиваю массив серверов postgresql 10 на нескольких планшетах Android под управлением Ubuntu 18.04 через Linux Deploy. Я хочу отправить с локального сервера полную справочную таблицу на удаленные серверы. Затем я отправлю фрагменты другой таблицы, которую хочу присоединить, к справочной таблице, используя широкий спектр алгоритмов связывания записей. Наконец, результаты с каждого сервера будут отправлены обратно на локальный сервер. Различное программное обеспечение MPP, на которое я смотрел, не будет работать с моими требованиями, особенно с учетом широкого диапазона объединений, которые я хочу использовать.

Самая большая проблема связана с пропускной способностью. Все планшеты подключаются через Wi-Fi, что работает медленно. Кроме того, планшеты имеют ограниченное хранилище, которое нельзя расширить. Таким образом, было бы очень полезно отправлять сжатые данные непосредственно на удаленные серверы, а также напрямую обратно на локальный сервер.

Насколько я понимаю, самое близкое, что я получил, - это передача данных от и к командам COPY psycopg2 с использованием ответь здесь Арье Лейба Таурога. Но, конечно, это не сжатые данные.

Мой код, использующий этот подход к трубопроводу, приведен ниже. Можно ли сжать поток локально и заставить удаленную машину использовать свой ЦП для распаковки потока? Сообщество postgresql работает над сжатием сети, но оно еще не выпущено. Я не хочу использовать SSL, единственное сжатие, которое, как мне кажется, доступно на сервере.

fromdb = psycopg2.connect("dbname=postgres user=postgres")
todb = psycopg2.connect(f"host = {node['host_ip']} dbname=postgres user=postgres")

r_fd, w_fd = os.pipe()

def copy_from():
    cur = todb.cursor()
    cur.copy_expert(f"COPY {table_name} FROM STDIN WITH CSV HEADER", os.fdopen(r_fd))
    cur.close()
    todb.commit()

to_thread = threading.Thread(target=copy_from)
to_thread.start()

copy_to_stmt = (f"COPY (SELECT * FROM {table_name} LIMIT {limit} OFFSET {offset}) TO STDOUT WITH CSV HEADER")

cur = fromdb.cursor()
write_f = os.fdopen(w_fd, 'w')
cur.copy_expert(copy_to_stmt, write_f)
write_f.close()

to_thread.join()
fromdb.close()
todb.close()

Прямо сейчас мой код Python создает zip-файлы на локальном компьютере. Затем он использует paramiko для передачи файлов через sftp и запускает команду psql COPY FROM PROGRAM 'zcat filename.zip' на удаленном сервере. Но это замедляет работу во многих отношениях, в том числе из-за того, что zip-файлы должны быть сгенерированы и переданы, прежде чем их можно будет импортировать. Он также занимает в два раза больше места в хранилище удаленного компьютера, пока выполняется процесс импорта.

Сценарий, который я пишу, запускается на локальном сервере, но я не против, чтобы он взаимодействовал с кодом Python на удаленном сервере. Удаленные машины также настраиваются как узлы dispy, если это помогает, но задания, которые мне нужно запускать удаленно, специфичны для каждой машины, что, как мне кажется, делает dispy менее полезным.

Примечательно, что эта настройка не очень хорошо работает с сетевыми ресурсами. Однако, возможно, захочется использовать локальный FTP-сервер, к которому могут получить доступ удаленные машины. Локальная машина - это Windows, но я открыт для использования виртуальной машины Ubuntu.

Любые идеи?

Что не так со сжатием SSL?

Laurenz Albe 10.09.2018 07:50

Я не очень хорошо знаком с SSL, но мне нужен сертификат для каждой машины, верно? Я надеюсь, что это будет массив из 20 машин, но они будут работать в локальной сети. Облегчает ли это задачу получения и настройки сертификатов?

mattdatajourno 10.09.2018 23:29

Да, очевидно, мне нужно было посмотреть на это повнимательнее. Я собираюсь следовать этому руководству сегодня вечером и посмотреть, смогу ли я сделать это эффективно. Спасибо за толчок. jelastic.com/blog/…

mattdatajourno 10.09.2018 23:55

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

Laurenz Albe 11.09.2018 12:29

Понятия не имею, как заставить его работать, учитывая эту проблему .... dba.stackexchange.com/questions/174000/…

mattdatajourno 12.09.2018 06:25

Я не верю, что переменная среды OPENSSL_DEFAULT_ZLIB что-нибудь для меня сделает. Я использовал Ubuntu 18.04, и он шел с OpenSSL 1.1.0g. Я считаю, что мне нужно вернуться к 16.04 ... security.stackexchange.com/questions/137182/…

mattdatajourno 12.09.2018 06:29

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

Laurenz Albe 12.09.2018 11:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
646
0

Другие вопросы по теме