Я устанавливаю массив серверов postgresql 10 на нескольких планшетах Android, работающих под управлением Ubuntu 18.04 через Linux Deploy. Я хочу отправить с локального сервера полную справочную таблицу на удаленные серверы. Затем я отправлю осколки другой таблицы, которую я хочу присоединить к справочной таблице, используя широкий спектр алгоритмов связывания записей. Наконец, результаты с каждого сервера будут отправлены обратно на локальный сервер. Различное программное обеспечение MPP, на которое я смотрел, не будет соответствовать моим требованиям, особенно учитывая широкий диапазон объединений, которые я хочу использовать.
Самая большая проблема связана с пропускной способностью. Все планшеты подключаются через Wifi, что медленно. Кроме того, таблетки имеют ограниченное хранение, которое не может быть расширено. Поэтому было бы очень полезно отправлять сжатые данные непосредственно на удаленные серверы, а также обратно на локальный сервер.
Самое близкое, что, я думаю, я получил, это передача данных от и к командам 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 на удаленном сервере. Удаленные машины также могут быть настроены как узлы дисплеев, если это помогает, но все задания, которые мне нужно выполнять удаленно, специфичны для каждой машины, что, как я полагаю, делает дисплеи менее полезными.
Примечательно, что эта настройка не очень хорошо работает с сетевыми ресурсами. Возможно, вы захотите использовать локальный FTP-сервер, к которому удаленные машины могут получить доступ. Локальная машина - Windows, но я открыт для использования виртуальной машины Ubuntu.
Есть идеи?