Mereplikasi beberapa tabel dari satu database postgres ke yang lain

9

Saya mendapatkan situasi berikut: Saya memiliki tiga mesin yang menjalankan database postgresql. Satu mesin menyimpan informasi akun klien (panggil mesin ini C), dua mesin lainnya menyimpan informasi logging klien (sebut ini L1 dan L2). Alasan pemisahan adalah untuk memisahkan pemuatan melalui beberapa mesin (sehingga beberapa klien mengirim informasi logging ke L1, sebagian ke L2 ... dan mungkin beberapa waktu L3, L4, ...).

Saat mengambil informasi logging, pada prinsipnya saya ingin dapat BERGABUNG antara tabel logging pada Ln dan tabel akun klien pada C. Pada kenyataannya saya tidak dapat melakukan GABUNGAN seperti ini (dan bahkan jika saya bisa, saya ingin untuk menghindari pemuatan C).

Pikiranku adalah untuk mereplikasi tabel pada C ke masing-masing L1, L2, ... sehingga aku bisa melakukan penggabungan. Sejauh tabel dari C yang bersangkutan, C adalah master dan L1, L2, ... adalah budak. Tetapi untuk tabel lainnya pada L1, L2, ... mesin ini adalah master. Ini bukan replikasi master-master, dan apakah itu bukan master-budak.

Dapatkah postgres (saya menjalankan 9.1) replikasi dibujuk untuk melakukan ini, atau jika tidak ada paket lain yang akan melakukan pekerjaan. Pada langkah terakhir, saya dapat menulis beberapa kode yang secara berkala menyinkronkan tabelnya (saya bisa mentolerir penundaan), tetapi akan lebih baik jika tidak melakukannya!

Terima kasih sebelumnya.


sumber
1
Mungkin menggunakan FDW pada mesin logging untuk mengakses C? Meskipun, itu akan menimbulkan hit kinerja pada C. Tampilan Terwujud mungkin mengurangi hit kinerja, tapi saya tidak yakin bagaimana PostgreSQL mendeteksi pembaruan ke tabel asing. Jika tidak secara otomatis (yang disarankan oleh akhir dari dokumentasi Tampilan Terwujud), ini dapat menyelesaikan masalah Anda sepenuhnya. Ini adalah 9,3 fitur. Milis yang sangat aktif mungkin juga bisa membantu.
jpmc26

Jawaban:

4

Pada PostgreSQL 9.3, Anda bisa menggunakan postgres_fdwkueri tabel asing di komputer lain secara transparan.

Pada versi yang lebih lama, dblinkbisa menjadi opsi seperti yang disebutkan oleh Andrew.

Opsi lain adalah menggunakan alat seperti Londiste atau Slony-I untuk mereplikasi tabel yang Anda inginkan. Saya sarankan menggunakan Londiste untuk ini, ini akan menjadi jauh lebih sederhana. Itu menciptakan pemicu di atas meja untuk mendeteksi insert / update / delete, dan mereplikasi ini menggunakan klien / server sendiri dan sistem antrian ke database lain, di mana ia memasukkan / memperbarui / menghapus yang sesuai. Saya menggunakannya dalam produksi di beberapa situs klien dan berfungsi dengan sangat baik.

Opsi masa depan (mudah-mudahan dalam PostgreSQL 9.5) akan menjadi log streaming replikasi logis, ekstraksi changeset logis dan replikasi dua arah, yang akan memungkinkan basis data atau tabel individual untuk direplikasi di tingkat SQL. Sebagian dari pekerjaan untuk ini dilakukan pada PostgreSQL 9.4, tetapi tidak cukup untuk membuatnya berguna untuk apa yang ingin Anda lakukan.

Craig Ringer
sumber
3

Anda harus menggunakan dblinks dan pandangan terwujud untuk mencapai ini. Kedua fitur ini terintegrasi dengan versi terbaru dari Postgres:

http://www.postgresql.org/docs/9.3/static/rules-materializedviews.html

http://www.postgresql.org/docs/9.3/static/dblink.html

Pada dasarnya Anda membangun Mview pada setiap basis data L1, L2 ... dengan data diekstraksi dari tabel di C, lalu gunakan Mview refresh untuk memperbarui Mviews secara berkala sesering yang diperlukan. Data disimpan secara lokal sehingga mengaksesnya sangat cepat. Ini hanya cocok jika datanya relatif statis dan Anda tidak keberatan dengan database lokal yang terkadang memiliki info yang sedikit ketinggalan zaman. Anda harus mengatur frekuensi penyegaran untuk mengelola ini dengan tepat, dan jika tidak dapat diterima maka Anda harus menggunakan tautan basis data dan menangani kelambatan yang dihasilkan.

Jika Anda memerlukan fungsionalitas tambahan, proyek snapshots menyediakan fitur-fitur canggih seperti refresh cepat dan snapshot:

http://pgfoundry.org/projects/snapshot/

Dengan ini, Anda dapat membuat pembaruan hanya memperbarui baris yang perlu diperbarui, yang dapat membuatnya sangat cepat untuk dataset besar, inelastik, meminimalkan gangguan pada aplikasi Anda. Secara default, Mviews sepenuhnya dihapus dan diciptakan kembali di Postgres, yang bisa sangat buruk untuk kinerja karena alasan yang jelas.

Andrew Brennan
sumber