Я настраиваю массив серверов 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, но мне нужен сертификат для каждой машины, верно? Я надеюсь, что это будет массив из 20 машин, но они будут работать в локальной сети. Облегчает ли это задачу получения и настройки сертификатов?
Да, очевидно, мне нужно было посмотреть на это повнимательнее. Я собираюсь следовать этому руководству сегодня вечером и посмотреть, смогу ли я сделать это эффективно. Спасибо за толчок. jelastic.com/blog/…
Вы можете использовать самозаверяющий сертификат для сервера - для этого в документации есть кулинарная книга. Сертификат на стороне клиента не требуется. Это действительно просто, если вам нужно только сжатие.
Понятия не имею, как заставить его работать, учитывая эту проблему .... dba.stackexchange.com/questions/174000/…
Я не верю, что переменная среды OPENSSL_DEFAULT_ZLIB что-нибудь для меня сделает. Я использовал Ubuntu 18.04, и он шел с OpenSSL 1.1.0g. Я считаю, что мне нужно вернуться к 16.04 ... security.stackexchange.com/questions/137182/…
Что ж, слабая безопасность здесь не ваша забота, потому что вы ищете транспортную компрессию. Правда, вы должны использовать OpenSSL, построенный с включенной поддержкой сжатия. В будущих версиях PostgreSQL вполне может быть новая функция транспортного сжатия без OpenSSL.
Что не так со сжатием SSL?