PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Bắt đầu với PostgreSQL Streaming Replication

Trong bài đăng trên blog này, chúng tôi đi sâu vào các vấn đề cơ bản của việc thiết lập tính năng Sao chép trực tuyến (SR) trong PostgreSQL. Nhân rộng luồng là khối xây dựng cơ bản để đạt được tính khả dụng cao trong lưu trữ PostgreSQL của bạn và được tạo ra bằng cách chạy cấu hình chủ-nô lệ.

Thuật ngữ Master-Slave

Máy chủ chính / Máy chủ chính

  • Máy chủ có thể ghi.
  • Còn được gọi là máy chủ đọc / ghi.

Máy chủ Slave / Dự phòng

  • Máy chủ nơi dữ liệu được giữ đồng bộ liên tục với máy chủ.
  • Còn được gọi là máy chủ dự phòng hoặc bản sao.
  • Máy chủ dự phòng ấm là máy chủ không thể kết nối với nó cho đến khi nó được thăng cấp trở thành máy chủ chính.
  • Ngược lại, một máy chủ ở chế độ chờ nóng có thể chấp nhận các kết nối và phục vụ các truy vấn chỉ đọc. Đối với phần còn lại của cuộc thảo luận này, chúng tôi sẽ chỉ tập trung vào các máy chủ nóng ở chế độ chờ.

Dữ liệu được ghi vào máy chủ chính và được truyền tới các máy chủ phụ. Trong trường hợp xảy ra sự cố với máy chủ chính hiện có, một trong các máy chủ phụ sẽ tiếp quản và tiếp tục ghi để đảm bảo tính khả dụng của hệ thống.

Sao chép dựa trên vận chuyển của WAL

WAL là gì?

  • WAL là viết tắt của Write-Ahead Logging.
  • Đây là tệp nhật ký nơi tất cả các sửa đổi đối với cơ sở dữ liệu được ghi trước khi chúng được áp dụng / ghi vào tệp dữ liệu.
  • WAL được sử dụng để khôi phục sau sự cố cơ sở dữ liệu, đảm bảo tính toàn vẹn của dữ liệu.
  • WAL được sử dụng trong các hệ thống cơ sở dữ liệu để đạt được tính nguyên tử và độ bền.

WAL được sử dụng như thế nào để nhân rộng?

Bản ghi nhật ký ghi trước được sử dụng để giữ cho dữ liệu được đồng bộ hóa giữa các máy chủ cơ sở dữ liệu. Điều này đạt được bằng hai cách:

Vận chuyển nhật ký dựa trên tệp

  • Các tệp nhật ký WAL được chuyển từ máy chủ đến máy chủ dự phòng để giữ cho dữ liệu được đồng bộ hóa.
  • Master có thể sao chép trực tiếp nhật ký vào bộ nhớ máy chủ dự phòng hoặc có thể chia sẻ bộ nhớ với máy chủ dự phòng.
  • Một tệp nhật ký WAL có thể chứa tối đa 16 MB dữ liệu.
  • Tệp WAL chỉ được gửi sau khi đạt đến ngưỡng đó.
  • Điều này sẽ gây ra sự chậm trễ trong quá trình sao chép và cũng làm tăng khả năng mất dữ liệu nếu bản chính gặp sự cố và nhật ký không được lưu trữ

Truyền trực tuyến các bản ghi WAL

  • Các đoạn bản ghi WAL được máy chủ cơ sở dữ liệu truyền trực tuyến để giữ cho dữ liệu được đồng bộ hóa.
  • Máy chủ dự phòng kết nối với máy chủ để nhận các phần WAL.
  • Các bản ghi WAL được truyền trực tuyến khi chúng được tạo.
  • Việc truyền trực tuyến các bản ghi WAL không cần đợi tệp WAL được lấp đầy.
  • Điều này cho phép máy chủ dự phòng luôn được cập nhật nhiều hơn mức có thể với việc vận chuyển nhật ký dựa trên tệp.
  • Theo mặc định, sao chép trực tuyến là không đồng bộ mặc dù nó cũng hỗ trợ sao chép đồng bộ.

Cả hai phương pháp đều có ưu và nhược điểm. Sử dụng vận chuyển dựa trên tệp cho phép khôi phục tại thời điểm và lưu trữ liên tục, trong khi truyền trực tuyến đảm bảo dữ liệu sẵn có ngay lập tức trên các máy chủ dự phòng. Tuy nhiên, bạn có thể cấu hình PostgreSQL để sử dụng cả hai phương pháp cùng một lúc và tận hưởng những lợi ích. Trong blog này, chúng tôi tập trung chủ yếu vào việc sao chép trực tuyến để đạt được tính khả dụng cao của PostgreSQL.

Cách thiết lập tính năng Sao chép phát trực tuyến trong PostgreSQL để có tính khả dụng caoNhấp vào Tweet

Cách thiết lập tính năng sao chép phát trực tuyến?

Việc thiết lập sao chép luồng trong PostgreSQL rất đơn giản. Giả sử PostgreSQL đã được cài đặt trên tất cả các máy chủ, bạn có thể làm theo các bước sau để bắt đầu:

Cấu hình trên Master Node

  • Khởi tạo cơ sở dữ liệu trên nút chính bằng tiện ích initdb.
  • Tạo một vai trò / người dùng với các đặc quyền sao chép bằng cách chạy lệnh dưới đây. Đăng chạy lệnh, bạn có thể xác minh nó bằng cách chạy \ du để liệt kê chúng trên psql.
    • TẠO NGƯỜI DÙNG THAY THẾ MẬT KHẨU ĐĂNG NHẬP '';
  • Định cấu hình các thuộc tính liên quan đến sao chép trực tuyến trong tệp cấu hình PostgreSQL chính (postgresql.conf):
    # Giá trị có thể là bản sao | tối thiểu | lôgic
    wal_level =replica # cần thiết cho khả năng pg_rewind khi chế độ chờ không đồng bộ với
    wal_log_hints chính =on # đặt số lượng kết nối đồng thời tối đa từ các máy chủ dự phòng.
    max_wal_senders =3
    # Tham số dưới đây được sử dụng để yêu cầu cái chính giữ số lượng tối thiểu
    # phân đoạn của nhật ký WAL để chúng không bị xóa trước khi sử dụng chúng ở chế độ chờ.
    # mỗi phân đoạn là 16 MB
    wal_keep_searies =8
    # Tham số dưới đây cho phép kết nối chỉ đọc trên nút khi nó ở vai trò
    # chờ. Điều này bị bỏ qua khi máy chủ đang chạy dưới dạng chính.
    hot_standby =trên
  • Thêm mục sao chép trong tệp pg_hba.conf để cho phép kết nối sao chép giữa các máy chủ:
    # Cho phép kết nối sao chép từ localhost,
    # bởi người dùng với đặc quyền sao chép.
    # TYPE DỮ LIỆU ĐỊA CHỈ NGƯỜI DÙNG PHƯƠNG PHÁP
    host replication repl_user IPaddress (CIDR) md5
  • Khởi động lại dịch vụ PostgreSQL trên nút chính để các thay đổi có hiệu lực.

Cấu hình trên (các) Nút chờ

  • Tạo bản sao lưu cơ sở của nút chính bằng tiện ích pg_basebackup và sử dụng nó làm điểm khởi đầu cho chế độ chờ.
    # Giải thích một số tùy chọn được sử dụng cho tiện ích pg_basebackup
    # -X option được sử dụng để bao gồm các tệp nhật ký giao dịch bắt buộc (tệp WAL) trong bản sao lưu
    #. Khi bạn chỉ định luồng, thao tác này sẽ mở kết nối thứ hai tới máy chủ
    # và bắt đầu phát trực tuyến nhật ký giao dịch cùng lúc với việc chạy bản sao lưu.
    # -c là tùy chọn điểm kiểm tra. Đặt nó thành nhanh sẽ buộc điểm kiểm tra sớm được tạo
    #.
    # -W buộc pg_basebackup phải nhắc nhập mật khẩu trước khi kết nối
    # với cơ sở dữ liệu.
    pg_basebackup -D -h -X stream -c nhanh -U repl_user -W
  • Tạo tệp cấu hình sao chép nếu không có (tệp này được tạo tự động nếu tùy chọn -R được cung cấp trong pg_basebackup):
    # Chỉ định xem có khởi động máy chủ hay không một chế độ chờ. Trong sao chép trực tuyến,
    # thông số này phải được đặt thành bật.
    chế độ chờ =‘On’ # Chỉ định một chuỗi kết nối được sử dụng cho máy chủ dự phòng để kết nối
    # với chính / master.
    primary_conninfo =‘Host = port = user = password = application_name =” host_name ”’ # Chỉ định khôi phục vào một dòng thời gian cụ thể. Mặc định là khôi phục cùng dòng thời gian
    # hiện tại khi sao lưu cơ sở được thực hiện.
    # Đặt chế độ này thành khôi phục mới nhất về dòng thời gian mới nhất được tìm thấy
    # trong kho lưu trữ, đó là hữu ích trong máy chủ dự phòng.
    recovery_target_timeline =‘Mới nhất’
  • Bắt đầu ở chế độ chờ.

Cấu hình chờ phải được thực hiện trên tất cả các máy chủ dự phòng. Sau khi cấu hình xong và bắt đầu ở chế độ chờ, nó sẽ kết nối với bản chính và bắt đầu phát trực tuyến nhật ký. Điều này sẽ thiết lập bản sao và có thể được xác minh bằng cách chạy câu lệnh SQL “ SELECT * FROM pg_stat_replication; “.

Theo mặc định, sao chép trực tuyến là không đồng bộ. Nếu bạn muốn làm cho nó đồng bộ, thì bạn có thể định cấu hình nó bằng các tham số sau:

# num_sync là số lượng dự phòng đồng bộ mà từ đó các giao dịch
# cần chờ phản hồi.
# standby_name giống với giá trị application_name trong recovery.conf
# Nếu tất cả các máy chủ dự phòng phải được xem xét đồng bộ thì hãy đặt giá trị '*'
# Nếu chỉ các máy chủ dự phòng cụ thể cần được xem xét, thì chỉ định chúng là
# danh sách được phân tách bằng dấu phẩy của standby_name .
# Tên của máy chủ dự phòng cho mục đích này là cài đặt tên_ ứng dụng của chế độ chờ
#, như được đặt trong_conninfo chính của bộ thu WAL của
# chế độ chờ.

> sync_standby_names =‘Num_sync (standby_name [, ...])’

Synchronous_commit phải được đặt thành bật để sao chép đồng bộ và đây là giá trị mặc định. PostgreSQL cung cấp các tùy chọn rất linh hoạt cho cam kết đồng bộ và có thể được cấu hình ở cấp người dùng / cơ sở dữ liệu. Các giá trị hợp lệ như sau:

  • Tắt - Cam kết giao dịch được xác nhận với khách hàng ngay cả trước khi bản ghi giao dịch đó thực sự được chuyển vào tệp nhật ký WAL trên nút đó.
  • Địa phương - Cam kết giao dịch chỉ được xác nhận với khách hàng sau khi bản ghi giao dịch đó được chuyển vào tệp nhật ký WAL trên nút đó.
  • Remote_write - Giao dịch cam kết chỉ được xác nhận cho máy khách sau khi (các) máy chủ được chỉ định bởi sync_standby_names xác nhận rằng bản ghi giao dịch đã được ghi vào bộ đệm đĩa, nhưng không nhất thiết phải sau khi được chuyển vào tệp nhật ký WAL.
  • Bật - Cam kết giao dịch chỉ được xác nhận với máy khách sau khi (các) máy chủ được chỉ định bởi sync_standby_names xác nhận rằng bản ghi giao dịch được chuyển vào tệp nhật ký WAL.
  • Remote_apply - Cam kết giao dịch chỉ được xác nhận cho máy khách sau khi (các) máy chủ được chỉ định bởi sync_standby_names xác nhận rằng bản ghi giao dịch được chuyển vào tệp nhật ký WAL và nó được áp dụng cho cơ sở dữ liệu.

Đặt sync_commit thành tắt hoặc cục bộ trong chế độ sao chép đồng bộ sẽ làm cho nó hoạt động như không đồng bộ và có thể giúp bạn đạt được hiệu suất ghi tốt hơn. Tuy nhiên, điều này sẽ có nguy cơ mất dữ liệu cao hơn và đọc chậm trễ trên các máy chủ dự phòng. Nếu được đặt thành remote_apply, nó sẽ đảm bảo dữ liệu sẵn có ngay lập tức tại các máy chủ dự phòng, nhưng hiệu suất ghi có thể giảm vì nó sẽ được áp dụng trên tất cả / máy chủ dự phòng đã đề cập.

Bạn có thể bật chế độ lưu trữ nếu định sử dụng tính năng lưu trữ liên tục và khôi phục tại chỗ. Mặc dù không bắt buộc phải sao chép trực tuyến, nhưng việc bật chế độ lưu trữ có thêm lợi ích. Nếu chế độ lưu trữ không được bật, thì chúng tôi cần sử dụng vị trí sao chép làm nổi bật hoặc đảm bảo rằng wal_keep_searies giá trị được đặt đủ cao dựa trên tải.

Hãy tham khảo bài thuyết trình xuất sắc này để đi sâu hơn vào chi tiết về tính khả dụng cao trong PostgreSQL. Trong bài đăng blog tiếp theo của chúng tôi, chúng tôi sẽ giới thiệu cho bạn thế giới các công cụ được sử dụng để quản lý tính khả dụng cao cho PostgreSQL bằng cách sử dụng tính năng sao chép trực tuyến.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Createuser:không thể kết nối với cơ sở dữ liệu postgres:FATAL:role tom không tồn tại

  2. Tạo bảng tổng hợp với PostgreSQL

  3. Trừ số năm cho một ngày trong PostgreSQL

  4. PG ::Lỗi:SELECT DISTINCT, ORDER BY biểu thức phải xuất hiện trong danh sách lựa chọn

  5. Sử dụng PostgreSQL Replication Slots