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.
Jawaban:
Pada PostgreSQL 9.3, Anda bisa menggunakan
postgres_fdw
kueri tabel asing di komputer lain secara transparan.Pada versi yang lebih lama,
dblink
bisa 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.
sumber
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.
sumber