2013-05-14 41 views
7

Điều này đặc biệt về việc duy trì sự tự tin trong việc sử dụng các giải pháp sao chép khác nhau mà bạn có thể chuyển đổi sang máy chủ khác mà không bị mất dữ liệu. Hoặc trong một tình huống tổng thể mà bạn có thể biết trong một khoảng thời gian hợp lý nếu một trong các cơ sở dữ liệu không đồng bộ.xác minh tính nhất quán dữ liệu giữa hai cơ sở dữ liệu postgresql

Có bất kỳ công cụ nào ở đó cho điều này hay không, hay mọi người thường phụ thuộc vào bản thân hệ thống sao chép để cảnh báo về sự mâu thuẫn? Tôi hiện đang quen thuộc nhất với postgresql WAL vận chuyển trong một thiết lập tổng thể-standby, nhưng tôi đang xem xét một thiết lập master-master với một cái gì đó giống như PgPool. Tuy nhiên, vì giải pháp đó ít liên quan trực tiếp với PostgreSQL hơn (sự hiểu biết cơ bản của tôi là nó cung cấp kết nối mà một ứng dụng sẽ sử dụng, do đó ngăn chặn các câu lệnh SQL khác nhau và sau đó gửi chúng đến bất kỳ máy chủ nào trong hồ bơi của nó) , nó khiến tôi suy nghĩ nhiều hơn về việc thực sự xác minh tính nhất quán của dữ liệu.

yêu cầu cụ thể:

  1. Tôi không nói về cấu trúc chỉ bảng. Tôi muốn biết rằng dữ liệu bản ghi thực tế là như nhau, vì vậy mà tôi biết nếu hồ sơ bị hỏng hoặc bị mất (trong trường hợp này, tôi sẽ khởi tạo lại cơ sở dữ liệu xấu với một tệp sao lưu + WAL gần đây trước khi đưa nó trở lại vào hồ bơi)

  2. Cơ sở dữ liệu có thứ tự 30-50 GB. Tôi nghi ngờ rằng các truy vấn SELECT nguyên sẽ hoạt động rất tốt.

  3. Tôi không thấy cần kiểm tra thời gian thực (mặc dù nó sẽ, tất nhiên, sẽ tốt đẹp). Hàng giờ hoặc thậm chí hàng ngày sẽ tốt hơn là không có gì.

  4. Kiểm tra cấp khối sẽ không hoạt động. Nó sẽ là hai cơ sở dữ liệu với bộ nhớ độc lập.

Hoặc loại xác minh này chỉ đơn giản là không thực tế?

+0

suy nghĩ đầu tiên xuất hiện trong đầu tôi đó là cơ sở dữ liệu thuyết bất khả tri là để băm hàng trên cả hai mặt và tìm ra cách để so sánh băm cho mỗi hàng trong db1 để dB2. Tải ban đầu của điều này sẽ là chậm nhưng nếu bạn đã làm điều này từng bước đi về phía trước có thể không phải là xấu. – Kuberchaun

+0

Đây là liên kết đáng quan tâm để mở rộng nhận xét trước của tôi. http: // stackoverflow.com/questions/9607063/checksum-field-in-postgresql-to-content-so sánh – Kuberchaun

Trả lời

0

Nếu bạn đang tìm kiếm toàn bộ bảng bạn sẽ có thể làm điều gì đó như thế này (giả sử một bảng khá dễ dàng phù hợp trong RAM):

SELECT md5(array_to_string(array_agg(mytable), ' ')) 
    FROM mytable order by id; 

Điều đó sẽ cung cấp cho bạn một hash trên đại diện tuple trên bàn.

Lưu ý rằng bạn có thể chia nhỏ xuống theo phạm vi, v.v. Tùy thuộc vào loại sao chép bạn thậm chí có thể chia nhỏ theo phạm vi trang (để nhân bản trực tuyến).

+0

Tất nhiên ORDER BY cần phải đi vào bên trong array_agg(), nếu không truy vấn này sẽ không hoạt động chút nào. – intgr

3

Bạn có thể kiểm tra các địa điểm WAL hiện trên cả các máy ... Nếu họ đại diện cho giá trị như nhau, có nghĩa là cơ sở dữ liệu cơ bản của bạn phù hợp với nhau ...

$ psql -c "SELECT pg_current_xlog_location()" -h192.168.0.10 (do it on primary host) 
pg_current_xlog_location 
-------------------------- 
0/2000000 
(1 row) 

$ psql -c "select pg_last_xlog_receive_location()" -h192.168.0.20 (do it on standby host) 
pg_last_xlog_receive_location 
------------------------------- 
0/2000000 
(1 row) 

$ psql -c "select pg_last_xlog_replay_location()" -h192.168.0.20 (do it on standby host) 
pg_last_xlog_replay_location 
------------------------------ 
0/2000000 
(1 row) 

bạn cũng có thể kiểm tra này với sự giúp đỡ của các quá trình walsender và walreceiver:

[do it on primary] $ ps -ef | grep sender 
postgres 6879 6831 0 10:31 ?  00:00:00 postgres: wal sender process postgres 127.0.0.1(44663) streaming 0/2000000 

[ do it on standby] $ ps -ef | grep receiver 
postgres 6878 6872 1 10:31 ?  00:00:01 postgres: wal receiver process streaming 0/2000000 
Các vấn đề liên quan