• 0x10


    PostgreSQL + CentOS7 + Patroni

    背景

    PostgreSQL 的高可用环境

    环境

    • CentOS 7
      • pg01 (192.168.1.120)
      • pg02 (192.168.1.121)
      • pg03(192.168.1.122)
    • PostgreSQL 11.2
    • Patroni 1.6.0
    • Python 2.7
    • etcdctl version: 3.3.11,API version: 2
    • 有效的时钟同步服务

    安装配置 etcd 服务

    在每个节点上安装服务,配置成集群模式。
    参考内链:ETCD 集群安装
    参考外链:ETCD 集群安装

    安装配置 patroni 服务

    • 注意:所有的操作都是在 root 用户下运行。
    • 注意:在三个节点上都需要安装并进行配置。

    准备数据目录

    这个目录就是数据库存放数据的位置,根据实际需要进行配置。

    mkdir -p /opt/data/patroni
    chown -R postgres:postgres /opt/data
    chmod -R 700 /opt/data

    安装软件包

    yum install -y gcc python-devel epel-release
    yum install -y python2-pip
    pip install --upgrade setuptools
    pip install psycopg2-binary
    pip install python-etcd
    pip install patroni

    配置启动脚本

    为 patroni 服务创建启动脚本:vi /etc/systemd/system/patroni.service 添加如下内容。

    [Unit]
    Description=Runners to orchestrate a high-availability PostgreSQL
    After=syslog.target network.target
    
    [Service]
    Type=simple
    User=postgres
    Group=postgres
    ExecStart=/bin/patroni /etc/patroni.yml
    KillMode=process
    TimeoutSec=30
    Restart=no
    
    [Install]
    WantedBy=multi-user.targ

    禁止 postgresql 的自启动,使用 patroni 来管理

    # 关闭 postgresql 的自动启动配置
    systemctl disable postgresql-11

    配置启动文件

    创建配置文件 vi /etc/patroni.yml ,这个文件控制 postgresql 实例的启动关闭等等。

    • 留意配置文件上:password 的值需要加上单引号。

    第一个节点的配置:192.168.1.120 - pg01

    scope: postgres
    name: pg01
    
    restapi:
        listen: 192.168.1.120:8008
        connect_address: 192.168.1.120:8008
    
    etcd:
        host: 192.168.1.120:2379
    
    bootstrap:
        dcs:
            ttl: 30
            loop_wait: 10
            retry_timeout: 10
            maximum_lag_on_failover: 1048576
            postgresql:
                use_pg_rewind: true
    
        initdb:
        - encoding: UTF8
        - data-checksums
    
        pg_hba:
        - host replication replica 127.0.0.1/32 md5
        - host replication replica 192.168.1.120/0 md5
        - host replication replica 192.168.1.121/0 md5
        - host replication replica 192.168.1.122/0 md5
        - host all all 0.0.0.0/0 md5
    
        users:
            admin:
                password: admin
                options:
                    - createrole
                    - createdb
    
    postgresql:
        listen: 192.168.1.120:5432
        bin_dir: /usr/pgsql-11/bin
        connect_address: 192.168.1.120:5432
        data_dir: /opt/data/patroni
        pgpass: /tmp/pgpass
        authentication:
            replication:
                username: replica
                password: 'replica'
            superuser:
                username: postgres
                password: '123456'
        parameters:
            unix_socket_directories: '.'
    
    tags:
        nofailover: false
        noloadbalance: false
        clonefrom: false
        nosync: false

    第二个节点的配置:192.168.1.121 - pg02

    scope: postgres
    name: pg02
    
    restapi:
        listen: 192.168.1.121:8008
        connect_address: 192.168.1.121:8008
    
    etcd:
        host: 192.168.1.121:2379
    
    bootstrap:
        dcs:
            ttl: 30
            loop_wait: 10
            retry_timeout: 10
            maximum_lag_on_failover: 1048576
            postgresql:
                use_pg_rewind: true
    
        initdb:
        - encoding: UTF8
        - data-checksums
    
        pg_hba:
        - host replication replica 127.0.0.1/32 md5
        - host replication replica 192.168.1.120/0 md5
        - host replication replica 192.168.1.121/0 md5
        - host replication replica 192.168.1.122/0 md5
        - host all all 0.0.0.0/0 md5
    
        users:
            admin:
                password: admin
                options:
                    - createrole
                    - createdb
    
    postgresql:
        listen: 192.168.1.121:5432
        bin_dir: /usr/pgsql-11/bin
        connect_address: 192.168.1.121:5432
        data_dir: /opt/data/patroni
        pgpass: /tmp/pgpass
        authentication:
            replication:
                username: replica
                password: 'replica'
            superuser:
                username: postgres
                password: '123456'
        parameters:
            unix_socket_directories: '.'
    
    tags:
        nofailover: false
        noloadbalance: false
        clonefrom: false
        nosync: false

    第三个节点的配置:192.168.1.122 - pg03

    scope: postgres
    name: pg03
    
    restapi:
        listen: 192.168.1.122:8008
        connect_address: 192.168.1.122:8008
    
    etcd:
        host: 192.168.1.122:2379
    
    bootstrap:
        dcs:
            ttl: 30
            loop_wait: 10
            retry_timeout: 10
            maximum_lag_on_failover: 1048576
            postgresql:
                use_pg_rewind: true
    
        initdb:
        - encoding: UTF8
        - data-checksums
    
        pg_hba:
        - host replication replica 127.0.0.1/32 md5
        - host replication replica 192.168.1.120/0 md5
        - host replication replica 192.168.1.121/0 md5
        - host replication replica 192.168.1.122/0 md5
        - host all all 0.0.0.0/0 md5
    
        users:
            admin:
                password: admin
                options:
                    - createrole
                    - createdb
    
    postgresql:
        listen: 192.168.1.122:5432
        bin_dir: /usr/pgsql-11/bin
        connect_address: 192.168.1.122:5432
        data_dir: /opt/data/patroni
        pgpass: /tmp/pgpass
        authentication:
            replication:
                username: replica
                password: 'replica'
            superuser:
                username: postgres
                password: '123456'
        parameters:
            unix_socket_directories: '.'
    
    tags:
        nofailover: false
        noloadbalance: false
        clonefrom: false
        nosync: false

    启动并验证服务

    现在我们可以启动 patroni 服务,它会在后台创建新的数据库,根据配置文件( /etc/patroni.yml )里面的内容创建用户。
    注意:这里建议不要设置开机自启动,因为不需要,手动调试的时候就手动启动,如果宕机了,需要手动处理之后再启动。

    # 启动服务(会自动启动 pg 实例)
    systemctl start patroni
    # 关闭服务(会自动关闭 pg 实例)
    systemctl stop patroni
    
    # 查看集群状态
    patronictl -c /etc/patroni.yml list
    [root@postgres0 patroni]# patronictl -c /etc/patroni.yml list
    +----------+--------+---------------+--------+---------+----+-----------+
    | Cluster  | Member |      Host     |  Role  |  State  | TL | Lag in MB |
    +----------+--------+---------------+--------+---------+----+-----------+
    | postgres |  pg01  | 192.168.1.120 | Leader | running |  1 |       0.0 |
    | postgres |  pg02  | 192.168.1.121 |        | running |  1 |       0.0 |
    | postgres |  pg03  | 192.168.1.122 |        | running |  1 |       0.0 |
    +----------+--------+---------------+--------+---------+----+-----------+
    

    你可以在 /var/log/messages 里面看到启动信息,也可以通过命令查看启动信息()。

    JDBC连接

    PG的 jdbc 中有一个targetServerType参数,设置这里,它会自动寻找 master 节点,也就是可以写入数据的节点。
    jdbc:postgresql://192.168.1.120:5432,192.168.1.121:5432,192.168.1.122:5432/test1?targetServerType=master&user=postgres&password=123456

    Patroni 命令

    # 可以查看命令的使用说明
    patronictl --help
    # 查看版本号
    patronictl -c /etc/patroni.yml version
    # 查看所有成员信息
    patronictl -c /etc/patroni.yml list
    # 重新加载配置
    patronictl -c /etc/patroni.yml reload
    # 移除集群,重新配置的时候使用
    patronictl -c /etc/patroni.yml remove postgres
    # 重启数据库集群
    patronictl -c /etc/patroni.yml restart postgres
    # 切换 Leader,将一个 slave 切换成 leader。
    patronictl -c /etc/patroni.yml switchover

    参考文档

    利用Restful API 动态修改数据库属性
    https://patroni.readthedocs.io/en/latest/dynamic_configuration.html#dynamic-configuration

    官方文档
    https://patroni.readthedocs.io/en/latest/

    JDBC参数,如何使用HA环境。
    https://jdbc.postgresql.org/documentation/head/connect.html

  • 相关阅读:
    python基础:多进程讲解
    vue 导出数据
    vue 导入excel数据组件
    vue 分页组件
    vue 点击空白区域隐藏div
    vue 类似淘宝选择地址组件
    js基础练习经典题(数组,质数,数组的遍历等等)
    js去重复
    理解CSS3里的Flex布局用法
    书写HTML5/CSS3的命名规则
  • 原文地址:https://www.cnblogs.com/duchaoqun/p/12058010.html
Copyright © 2020-2023  润新知