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

Thiết lập và bảo trì bản sao PostgreSQL bằng Ansible

Sao chép là một tính năng chính cho hầu hết các thiết lập và nó được hỗ trợ bởi hầu hết các công nghệ cơ sở dữ liệu trên thị trường. Cộng đồng PostgreSQL đã giới thiệu bản sao trong phiên bản 9.0 (được gọi là Streaming Replication hoặc SR), kể từ đó bản sao trong PostgreSQL đã phát triển với các tính năng bổ sung như Cascading Replication, Logical Decoding và một số tối ưu hóa khác.

Trong blog này, chúng ta sẽ xem xét việc sử dụng vai trò Ansible postgresql được phát triển bởi “Demonware” (một nhánh của vai trò “ANXS / postgresql”). Tôi đã nói về việc sử dụng vai trò “ANXS / postgresql” trong blog trước đây của mình nhưng tôi chưa thảo luận về tính năng sao chép. Vai trò Ansible “postgresql” bổ sung khả năng thiết lập bản sao PostgreSQL bằng cách sử dụng repmgr.

Giới thiệu về Repmgr

Repmgr là một công cụ dòng lệnh mã nguồn mở được phát triển và duy trì bởi 2ndQuadrant. Công cụ tự động hóa hầu hết các tác vụ liên quan đến quản lý cụm sao chép PostgreSQL. Dưới đây là danh sách các tác vụ có thể được thực hiện trơn tru bằng cách sử dụng lệnh repmgr và repmgrd daemon.

  • Khởi động cụm sao chép PostgreSQL.
  • Thực hiện tự động chuyển đổi dự phòng và chuyển đổi thủ công phiên bản chính.
  • Thêm và xóa các bản sao (bản sao đọc) ở chế độ chờ.

Chuẩn bị nút điều khiển

Chuẩn bị nút điều khiển với vai trò Ansible PostgreSQL, sách vở, hàng tồn kho và bản sao PostgreSQL tùy chỉnh.

$ mkdir demo
$ pushd demo
$ mkdir roles
$ git clone https://github.com/Demonware/postgresql roles/postgresql
$ pushd roles/postgresql
$ git checkout add-repmgr-extension

Trong vai trò đã tải xuống, có hai tệp biến mặc định là main.yml và tệp repmgr.yml. Tuy nhiên, Ansible sẽ chỉ xem xét tệp main.yml. Để tạo Ansible cũng sử dụng tệp repmgr.yml, chúng tôi đang di chuyển cả hai tệp trong thư mục defaults / main.

$ mkdir defaults/main
$ mv defaults/main.yml defaults/repmgr.yml defaults/main
$ popd

Tệp kiểm kê an toàn

Đối với bản demo, chúng tôi sẽ thiết lập cụm sao chép PostgreSQL trên ba nút. Tôi đã tạo ba máy ảo CentOS vm-01, vm-02 và vm-03, tất cả chúng đều được liệt kê trong nhóm postgres_cluster trong tệp development.yaml.

$ cat development.yaml
all:
  children:
    postgres_cluster:
      hosts:
        vm-01:
        vm-02:
        vm-03:
      vars:
        ansible_user: "vagrant"

Thực hiện ping Ansible và đảm bảo rằng chúng tôi có thể liên hệ với tất cả các máy chủ trong nhóm postgres_cluster.

$ ansible -i development.yaml -m ping  postgres_cluster
vm-01 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
vm-03 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
vm-02 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Tệp biến tùy chỉnh

Trong tệp biến tùy chỉnh custom-vars.yaml, chúng tôi sẽ xác định những điều sau:

  • Phiên bản PostgreSQL để cài đặt và mã hóa để sử dụng
  • Sửa đổi cấu hình PostgreSQL để cho phép sao chép, chúng tôi sẽ sửa đổi các tham số như wal_level, max_wal_senders, max_replication_slots, hot_standby, archive_mode, archive_command
  • Tạo người dùng và cơ sở dữ liệu cần thiết
  • Sửa đổi tệp pg_hba.conf để cho phép kết nối cần thiết từ ứng dụng và bản sao repmgr
  • Một số biến liên quan đến repmgr
$ cat custom-vars.yaml 
# Basic settings
postgresql_version: 11
postgresql_encoding: "UTF-8"
postgresql_locale: "en_US.UTF-8"
postgresql_ctype: "en_US.UTF-8"
postgresql_admin_user: "postgres"
postgresql_default_auth_method: "peer"
postgresql_listen_addresses: "*"
postgresql_wal_level: "replica"
postgresql_max_wal_senders: 10
postgresql_max_replication_slots: 10
postgresql_wal_keep_segments: 100
postgresql_hot_standby: on
postgresql_archive_mode: on
postgresql_archive_command: "/bin/true"
postgresql_shared_preload_libraries:
  - repmgr

postgresql_users:
  - name: "{{repmgr_user}}"
    pass: "password"
postgresql_databases:
  - name: "{{repmgr_database}}"
    owner: "{{repmgr_user}}"
    encoding: "UTF-8"
postgresql_user_privileges:
  - name: "{{repmgr_user}}"
    db: "{{repmgr_database}}"
    priv: "ALL"
    role_attr_flags: "SUPERUSER,REPLICATION"
postgresql_pg_hba_custom:
  - { type: "host", database: "all", user: "all", address: "192.168.0.0/24", method: "md5" }
  - { type: "host", database: "replication", user: "repmgr", address: "192.168.0.0/24", method: "md5" }  
  - { type: "host", database: "replication", user: "repmgr", address: "127.0.0.1/32", method: "md5" }  

# repmgr related variables
postgresql_ext_install_repmgr: yes
repmgr_target_group: "postgres_cluster"
repmgr_target_group_hosts: "{{ groups[repmgr_target_group] }}"
repmgr_master: "vm-03"

Sau đây là một số biến đáng chú ý được xác định trong custom-vars.yaml:

  • postgresql_version:11 - Cài đặt PostgreSQL phiên bản 11
  • postgresql_ext_install_repmgr:yes - Cài đặt tiện ích mở rộng repmgr trên cụm PostgreSQL
  • repmgr_target_group:"postgres_cluster" - Repmgr hoạt động trên các máy chủ được xác định trong nhóm "postgres_cluster" được xác định trong tệp khoảng không quảng cáo
  • repmgr_master:"vm-03" - Máy chủ vm-03 sẽ là phiên bản chính của PostgreSQL, vm-01 và vm - 02 sẽ sao chép từ vm-03

Ansible Playbook

Trong playbook postgres-play.yaml dưới đây, tôi đã gán vai trò postgresql chống lại nhóm máy chủ postgres_cluster. Tôi cũng đã bao gồm tệp biến tùy chỉnh custom-vars.yaml có cấu hình cho PostgreSQL và repmgr.

$ cat postgres-play.yaml 
- hosts: postgres_cluster
  become: yes
  vars_files:
    - ./custom-vars.yaml
  roles:
    - postgresql

Chạy Ansible Playbook

Hiện chúng tôi đã tạo các tạo tác Ansible sau đây và chúng tôi đã sẵn sàng chạy playbook Ansible.

  • role / postgresql, thư mục vai trò Ansible.
  • custom-vars.yaml, tệp biến Ansible.
  • development.yaml, tệp khoảng không quảng cáo Ansible.
  • postgres-play.yam, tệp sách phát Ansible.

Chạy lệnh ansible-playbook dưới đây từ nút điều khiển. Vì vai trò postgresql mong đợi quyền truy cập sudo của bộ điều khiển, chúng tôi đang chỉ định tùy chọn -K trong lệnh, tùy chọn này sẽ yêu cầu chúng tôi nhập mật khẩu SUDO của nút bộ điều khiển.

$ ansible-playbook -Ki development.yaml postgres-play.yaml 
SUDO password: 

PLAY [postgres_cluster] ********************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************************************************
ok: [vm-01]
ok: [vm-02]
ok: [vm-03]
...
...
PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
vm-01                      : ok=41   changed=4    unreachable=0    failed=0
vm-02                      : ok=41   changed=5    unreachable=0    failed=0
vm-03                      : ok=43   changed=5    unreachable=0    failed=0

Kiểm tra PLAY RECAP trong đầu ra lệnh và đảm bảo rằng số không thành công là 0.

Kiểm tra bản sao PostgreSQL

Với lệnh hiển thị cụm repmgr dưới đây, chúng ta có thể kiểm tra trạng thái của cụm sao PostgreSQL. Nó hiển thị vai trò, trạng thái, dòng thời gian của tất cả phiên bản PostgreSQL trong cụm sao chép.

$ sudo -u postgres /usr/pgsql-11/bin/repmgr -f /etc/postgresql/11/data/repmgr.conf cluster show
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                     
----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------
 1  | vm-01 | standby |   running | vm-03    | default  | 100      | 1        | host=vm-01 user=repmgr dbname=repmgr connect_timeout=2
 2  | vm-02 | standby |   running | vm-03    | default  | 100      | 1        | host=vm-02 user=repmgr dbname=repmgr connect_timeout=2
 3  | vm-03 | primary | * running |          | default  | 100      | 1        | host=vm-03 user=repmgr dbname=repmgr connect_timeout=2

Từ đầu ra của lệnh trên, vm-03 là chính và vm-01, vm02 là phiên bản dự phòng sao chép từ nút thượng lưu vm-03. Tất cả các phiên bản PostgreSQL đều ở trạng thái đang chạy.

Kiểm tra chế độ xem pg_stat_replication trên vm-03 chính để xác nhận rằng cả vm-01 và vm-02 đều đang sao chép tốt.

$ sudo -iu postgres /usr/pgsql-11/bin/psql -h vm-03 -c 'select * from pg_stat_replication'
Password for user postgres: 
 pid  | usesysid | usename | application_name |  client_addr  | client_hostname | client_port |         backend_start         | backend_xmin |   state   | sent_lsn  | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_state 
------+----------+---------+------------------+---------------+-----------------+-------------+-------------------------------+--------------+-----------+-----------+-----------+-----------+------------+-----------+-----------+------------+---------------+------------
 8480 |    16384 | repmgr  | vm-02            | 192.168.0.122 |                 |       59972 | 2019-07-18 09:04:44.315859+00 |              | streaming | 0/A000870 | 0/A000870 | 0/A000870 | 0/A000870  |           |           |            |             0 | async
 8481 |    16384 | repmgr  | vm-01            | 192.168.0.121 |                 |       35598 | 2019-07-18 09:04:44.336693+00 |              | streaming | 0/A000870 | 0/A000870 | 0/A000870 | 0/A000870  |           |           |            |             0 | async
(2 rows)

Thêm một nút chờ khác vào cụm

Để thêm một nút PostgreSQL khác vào cụm, chúng ta chỉ cần chạy lại playbook Ansible sau khi thêm máy chủ cụ thể vào kho. Trong các bước bên dưới, tôi đang thêm vm-04 vào cụm sao chép Repmgr Postgresql hiện có của mình.

  1. Thêm vm-04 vào tệp kiểm kê Ansible Developmeb
    $ cat development.yaml
    all:
      children:
        postgres_cluster:
          hosts:
            vm-01:
            vm-02:
            vm-03:
            vm-04:
          vars:
            ansible_user: "vagrant"
  2. Chạy Ansible playbook
    $ ansible-playbook -Ki development.yaml postgres-play.yaml
    SUDO password:
    
    PLAY [postgres_cluster] ********************************************************************************************************************************************************************************************************************************************************
    
    TASK [Gathering Facts] *********************************************************************************************************************************************************************************************************************************************************
    ok: [vm-01]
    ok: [vm-04]
    ok: [vm-03]
    ok: [vm-02]
    ...
    ...
    RUNNING HANDLER [postgresql : restart postgresql] ******************************************************************************************************************************************************************************************************************************
    changed: [vm-04]
    changed: [vm-02]
    changed: [vm-01]
    changed: [vm-03]
    
    PLAY RECAP *********************************************************************************************************************************************************************************************************************************************************************
    vm-01                      : ok=41   changed=4    unreachable=0    failed=0
    vm-02                      : ok=41   changed=5    unreachable=0    failed=0
    vm-03                      : ok=43   changed=5    unreachable=0    failed=0
    vm-04                      : ok=46   changed=32   unreachable=0    failed=0
  3. Kiểm tra cụm sao chép
    $ sudo -u postgres /usr/pgsql-11/bin/repmgr -f /etc/postgresql/11/data/repmgr.conf cluster show
     ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                     
    ----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------
     1  | vm-01 | standby |   running | vm-03    | default  | 100      | 1        | host=vm-01 user=repmgr dbname=repmgr connect_timeout=2
     2  | vm-02 | standby |   running | vm-03    | default  | 100      | 1        | host=vm-02 user=repmgr dbname=repmgr connect_timeout=2
     3  | vm-03 | primary | * running |          | default  | 100      | 1        | host=vm-03 user=repmgr dbname=repmgr connect_timeout=2
     4  | vm-04 | standby |   running | vm-03    | default  | 100      | 1        | host=vm-04 user=repmgr dbname=repmgr connect_timeout=2

Kết luận

Cho đến nay chúng ta đã thấy về việc thiết lập cụm sao chép Repmgr PostgreSQL bằng Ansible. Khi cụm repmgr đã được thiết lập, chúng ta có thể sử dụng lệnh repmgr để thực hiện các bảo trì khác trên cụm sao giống như thực hiện chuyển đổi dự phòng và chuyển đổi nút chính và thiết lập sao chép theo tầng. Vui lòng kiểm tra tài liệu repmgr để biết thêm chi tiết.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao số nguyên không dấu không có sẵn trong PostgreSQL?

  2. Khắc phục “LỖI:mỗi truy vấn NGOẠI LỆ phải có cùng số cột” trong PostgreSQL

  3. Khi nào sử dụng bảng kế thừa trong PostgreSQL?

  4. Làm cách nào để đặt lại chuỗi khóa chính của postgres khi nó không đồng bộ?

  5. lỗi câu lệnh sql:cột .. không tồn tại