美文网首页
Centos7搭建postgresql10主从复制

Centos7搭建postgresql10主从复制

作者: liurongming | 来源:发表于2021-08-20 11:53 被阅读0次

    一、 环境准备

    1、系统及安装包

    操作系统:CentOS Linux release 7.9.2009 (虚拟机)
    数据库版本:postgresql-10.18-1-linux-x64.run
    主服务器IP:172.18.5.129
    从服务器IP:172.18.5.137

    备注:
    1、由于要做主从复制,因此操作系统和数据库版本以及安装路径,均建议保持一致。
    2、下载PostgreSQL:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

    2、配置防火墙及selinux

    关闭防火墙和selinux【不推荐】

    #关闭防火墙
    systemctl stop firewalld
    
    #开机禁用防火墙
    systemctl disable firewalld
    
    #临时关闭selinux
    setenforce 0
    
    #重启机器
    reboot
    

    或者不关闭打开端口【推荐】

    # 打开端口
    firewall-cmd --zone=public --add-port=5432/tcp --permanent
    firewall-cmd --reload
    

    注意:每台机器都需要执行相同的操作。

    编辑selinux 提醒级别 【推荐】

    vim /etc/selinux/config

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=permissive
    # SELINUXTYPE= can take one of three values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    

    二、 安装记录

    快捷安装

    一键方式安装,相对比较简单,但需要注意几个设置选项。
    【推荐】字符集选择es_US.utf8,仅安装PostgreSQL Server 及Command Line Tools即可。

    cd /opt 
    wget https://get.enterprisedb.com/postgresql/postgresql-10.18-1-linux-x64.run
    chmod +x postgresql-10.18-1-linux-x64.run
    ./postgresql-10.18-1-linux-x64.run
    [root@itdev7003 tmp]# ./postgresql-10.18-1-linux-x64.run
    ----------------------------------------------------------------------------
    Welcome to the PostgreSQL Setup Wizard.
    
    ----------------------------------------------------------------------------
    Select the components you want to install; clear the components you do not want
    to install. Click Next when you are ready to continue.
    
    PostgreSQL Server : Y (Cannot be edited)
    
    pgAdmin 4 [Y/n] :n
    
    Stack Builder [Y/n] :n
    
    Command Line Tools : Y (Cannot be edited)
    
    Is the selection above correct? [Y/n]:
    

    安装结束后,查看系统启动文件

    [root@itdev9903 ~]# systemctl list-units | grep postgres
    postgresql-10.service                                                                            loaded active running   PostgreSQL 10 database server
    [root@itdev9903 ~]#
    

    安装完成后,记录安装信息:【每台路径和配置都应相同】

    Installation Directory: /opt/PostgreSQL/10
    Server Installation Directory: /opt/PostgreSQL/10
    Data Directory: /opt/PostgreSQL/10/data
    Database Port: 5432
    Database Superuser: postgres
    Operating System Account: postgres
    Database Service: postgresql-10
    Command Line Tools Installation Directory: /opt/PostgreSQL/10
    

    打开远程访问

    # 添加授权
    vim pg_hba.conf
    host    all             all             0.0.0.0/0               md5
    
    # 检出是否为 *  
    vim postgresql.conf
    listen_addresses = '*'
    
    # 重启
    [root@itdev9903 ~]# systemctl list-units | grep postgres
    postgresql-10.service                                                                            loaded active running   PostgreSQL 10 database server
    [root@itdev9903 ~]#
    systemctl restart postgresql-10.service
    

    设置环境变量

    vim /etc/profile
    # 设置内容
    PG_HOME=/opt/PostgreSQL/10
    PATH=$PATH:$PG_HOME/bin
    export PATH PG_HOME
    # 立即生效
    source /etc/profile
    

    登录数据库

    1、切换用户登录

    su - postgres
    bin/psql
    

    2、不切换用户登录

    psql -h hostname -U username -d dbname -p port
    

    三、主从设置

    Master:172.18.5.129
    Standby:172.18.5.137

    1、主库设置

    • 创建同步账号
      登陆Master库,创建具有用于传递数据的具有replication权限的用户【也可以直接用Super user当作replication用户,但不推荐】。
    CREATE ROLE repl login replication password '123456';
    
    postgres=# CREATE ROLE repl login replication password '123456';
    CREATE ROLE
    postgres=# \du
                                       List of roles
     Role name |                         Attributes                         | Member of
    -----------+------------------------------------------------------------+-----------
     postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
     repl      | Replication                                                | {}
    
    postgres=#
    
    • Master库网络策略

    1、修改Master库的pg_hba.conf,把Master库和Standby库的IP地址添加进Master库网络策略白名单中,使Standby库可以连上 Master库,同时便于主备切换。
    添加内容:

    # 开启远程访问
    host    all             all             0.0.0.0/0               md5
    # 主从库地址均配上
    host    replication     repl            172.18.5.129/32         md5
    host    replication     repl            172.18.5.137/32         md5
    
    cd /opt/PostgreSQL/10/data
    vi pg_hba.conf
    
    # TYPE  DATABASE        USER            ADDRESS                 METHOD
    
    # "local" is for Unix domain socket connections only
    local   all             all                                     md5
    # IPv4 local connections:
    host    all             all             127.0.0.1/32            md5
    host    all             all             0.0.0.0/0               md5
    # IPv6 local connections:
    host    all             all             ::1/128                 md5
    # Allow replication connections from localhost, by a user with the
    # replication privilege.
    local   replication     all                                     md5
    host    replication     all             127.0.0.1/32            md5
    host    replication     all             ::1/128                 md5
    # user add
    host    replication     repl            172.18.5.129/32         md5
    host    replication     repl            172.18.5.137/32         md5
    

    2、修改master库:postgresql.conf文件 。
    3、新建归档目录: mkdir /opt/PostgreSQL/10/data/arch_dir /opt/PostgreSQL/10/data/arch_dir_master

    cd /opt/PostgreSQL/10/data
    mkdir {arch_dir,arch_dir_master}
    chown -R postgres:postgres  arch_dir
    chown -R postgres:postgres  arch_dir_master
    
    vim postgresql.conf
    wal_level = logical
    max_wal_senders = 10
    archive_mode = on 
    archive_command =  'test ! -f /opt/PostgreSQL/10/data/arch_dir/%f && cp %p /opt/PostgreSQL/10/data/arch_dir/%f'
    synchronous_standby_names = ''  # standby servers that provide sync rep
    hot_standby = on 
    

    4、当master切换作为standby库时,使用同步配置文件为recovery.done。

    cd /opt/PostgreSQL/10/data
    vi recovery.done
    standby_mode=on
    restore_command = 'cp /opt/PostgreSQL/10/data/arch_dir_master/%f %p'
    primary_conninfo='application_name=pg2 host=172.18.5.137 port=5432 user=repl password=123456'
    archive_cleanup_command ='pg_archivecleanup /opt/PostgreSQL/10/data/arch_dir_master %r'
    recovery_target_timeline = 'latest'
    
    # 改变用户及属组
    chown postgres:postgres recovery.done
    

    5、重启master主库systemctl restart postgresql-10.service 。至此主库上的操作已完成。接下来看看standby备库的。

    2、从库设置

    standby库需要以master库的完整备份+归档日志恢复而来,如果master库尚未对外提供服务,也可以直接复制master库的数据文件目录,这里采用第一种方法,更贴近实际环境。
    使用主库的热备创建standby库(此步骤在主库执行)

    # 从库直接连接主库
    psql -h 172.18.5.129 -p 5432 -U postgres -d postgres
     
    postgres=# select pg_start_Backup('backuptag',true);
     pg_start_backup
    -----------------
     0/2000028
    (1 row)
    
    postgres=#
    

    回到从库机器

    # 停止数据库
    systemctl stop postgresql-10.service
    
    # 进入目录
    cd /opt/PostgreSQL/10/data
    # 备份
    mv data/ data.bak
    # 拷贝主
    scp -r root@172.18.5.129:/opt/PostgreSQL/10/data /opt/PostgreSQL/10
    # 改变权限
    chown -R postgres:postgres data
    
    # 切换主库
    psql -h 172.18.5.129 -p 5432 -U postgres -d postgres
    # 停止主库的热备锁定
    [root@itdev7003 10]# psql -h 172.18.5.129 -p 5432 -U postgres -d postgres
    Password for user postgres:
    psql.bin (10.18)
    Type "help" for help.
    
    postgres=# select pg_stop_backup();
    NOTICE:  pg_stop_backup complete, all required WAL segments have been archived
     pg_stop_backup
    ----------------
     0/2000130
    (1 row)
    
    postgres=#
    

    清理复制过来的主库文件

    rm -rf /opt/PostgreSQL/10/data/pg_wal
    rm -rf /opt/PostgreSQL/10/data/postmaster.pid
    rm -rf /opt/PostgreSQL/10/data/arch_dir/*
    

    修改备库的recovery文件

    # 进入目录
    cd /opt/PostgreSQL/10/data
    mv recovery.done recovery.conf
    # 修改IP指向主
    standby_mode=on
    restore_command = 'cp /opt/PostgreSQL/10/data/arch_dir_master/%f %p'
    primary_conninfo='application_name=pg3 host=172.18.5.129 port=5432 user=repl password=123456'
    archive_cleanup_command ='pg_archivecleanup /opt/PostgreSQL/10/data/arch_dir_master %r'
    recovery_target_timeline = 'latest'
    

    模拟刷新的wal和归档文件

    # 清空主库复制文件
    rm -rf /opt/PostgreSQL/10/data/pg_wal
    rm -rf /opt/PostgreSQL/10/data/postmaster.pid
    rm -rf /opt/PostgreSQL/10/data/arch_dir/*
    
    # 物理拷贝
    scp -r root@172.18.5.129:/opt/PostgreSQL/10/data/pg_wal /opt/PostgreSQL/10/data/
    scp -r root@172.18.5.129:/opt/PostgreSQL/10/data/arch_dir/. /opt/PostgreSQL/10/data/arch_dir_master
     
    # 更换权限
    chown -R postgres:postgres /opt/PostgreSQL/10/data
    

    或者是使用basebackup命令进行热备【不推荐】:默认只复制更改部分,当前从库提升为主库时,可能会有问题。

    pg_basebackup -D /opt/PostgreSQL/10/data/ -F p -X stream -v -P -h 172.18.5.129 -p 5432 -U repl
    

    启动备库,观察备库日志

    # 启动数据库
    systemctl  start postgresql-10.service
    # 查看日志
    cd /opt/PostgreSQL/10/data/log
    ll -t |grep .log| awk 'NR==1{print$NF}'|xargs -i tail -f {}
    
    # 可以看到 database system is ready to accept read only connections 
    # 和 started streaming WAL from primary at 0/F000000 on timeline 1 
    # 从库启动成功
    [root@itdev7003 log]# ll -t |grep .log| awk 'NR==1{print$NF}'|xargs -i tail -f {}
    2021-08-20 11:43:01.711 CST [5941] LOG:  database system was shut down in recovery at 2021-08-20 11:43:01 CST
    cp: no se puede efectuar `stat' sobre «/opt/PostgreSQL/10/data/arch_dir_master/00000002.history»: No existe el fichero o el directorio
    2021-08-20 11:43:01.739 CST [5941] LOG:  entering standby mode
    cp: no se puede efectuar `stat' sobre «/opt/PostgreSQL/10/data/arch_dir_master/00000001000000000000000F»: No existe el fichero o el directorio
    2021-08-20 11:43:01.746 CST [5941] LOG:  redo starts at 0/F0004A0
    2021-08-20 11:43:01.746 CST [5941] LOG:  consistent recovery state reached at 0/F000580
    2021-08-20 11:43:01.746 CST [5941] LOG:  invalid record length at 0/F000580: wanted 24, got 0
    2021-08-20 11:43:01.746 CST [5939] LOG:  database system is ready to accept read only connections
    2021-08-20 11:43:01.754 CST [5947] LOG:  started streaming WAL from primary at 0/F000000 on timeline 1
    

    至此,主从同步搭建完毕。接下来还可以通过进程检查。

    # 主库相关进程 【注writer process已启动】
    [root@itdev9903 ~]#  ps -ef | grep postgres
    postgres 30570 30734  0 11:43 ?        00:00:00 postgres: wal sender process repl 172.18.5.137(53308) streaming 0/F000580
    postgres 30734     1  0 Aug18 ?        00:00:01 /opt/PostgreSQL/10/bin/postgres -D /opt/PostgreSQL/10/data
    postgres 30735 30734  0 Aug18 ?        00:00:00 postgres: logger process
    postgres 30737 30734  0 Aug18 ?        00:00:00 postgres: checkpointer process
    postgres 30738 30734  0 Aug18 ?        00:00:01 postgres: writer process
    postgres 30739 30734  0 Aug18 ?        00:00:01 postgres: wal writer process
    postgres 30740 30734  0 Aug18 ?        00:00:00 postgres: autovacuum launcher process
    postgres 30741 30734  0 Aug18 ?        00:00:00 postgres: archiver process   last was 00000001000000000000000E.00000028.backup
    postgres 30742 30734  0 Aug18 ?        00:00:01 postgres: stats collector process
    postgres 30743 30734  0 Aug18 ?        00:00:00 postgres: bgworker: logical replication launcher
    root     30865 30823  0 11:48 pts/0    00:00:00 grep --color=auto postgres
    [root@itdev9903 ~]#
    
    # 从库相关进程 【注wal receiver process已启动】
    [root@itdev7003 ~]#  ps -ef | grep postgres
    root      5674  5646  0 11:38 pts/1    00:00:00 grep --color=auto postgres
    postgres 28138     1  0 Aug18 ?        00:00:00 /opt/PostgreSQL/10/bin/postgres -D /opt/PostgreSQL/10/data
    postgres 28139 28138  0 Aug18 ?        00:00:00 postgres: logger process
    postgres 28140 28138  0 Aug18 ?        00:00:01 postgres: startup process   recovering 00000001000000000000000F
    postgres 28144 28138  0 Aug18 ?        00:00:01 postgres: checkpointer process
    postgres 28145 28138  0 Aug18 ?        00:00:01 postgres: writer process
    postgres 28146 28138  0 Aug18 ?        00:00:00 postgres: stats collector process
    postgres 28158 28138  0 Aug18 ?        00:01:33 postgres: wal receiver process   streaming 0/F000580
    [root@itdev7003 ~]#
    

    3、从库测试

    Master建立T1表,并插入数据:

    psql -U postgres
    postgres=# create table t1(id varchar(32),name varchar(64));
    postgres=# \d t1
                            Table "public.t1"
     Column |         Type          | Collation | Nullable | Default
    --------+-----------------------+-----------+----------+---------
     id     | character varying(32) |           |          |
     name   | character varying(64) |           |          |
    
    postgres=#
    # 插入数据后,查询
    postgres=# insert into t1 values('1','zhangsan');
    postgres=# insert into t1 values('2','lisi');
    postgres=# select * from t1;
     id |   name
    ----+-----------
     1  | zhangshan
     2  | lisi
    (2 rows)
    
    postgres=#
    

    在Slaves数据中查看:【从库:提示只读】

    psql -U postgres
    postgres=# \d
            List of relations
     Schema | Name | Type  |  Owner
    --------+------+-------+----------
     public | t1   | table | postgres
    (1 row)
    
    postgres=# select * from t1;
     id |   name
    ----+-----------
     1  | zhangshan
     2  | lisi
    (2 rows)
    
    postgres=#
    postgres=# create table t1(id varchar(32),name varchar(64));
    ERROR:  cannot execute CREATE TABLE in a read-only transaction
    postgres=#
    postgres=# insert into t1 values('3','wangwu');
    ERROR:  cannot execute INSERT in a read-only transaction
    postgres=
    

    通过测试情况可知:
    1、主库建表及插入数据,从库可以同步获得。
    2、从库无论建表还是插入数据,均提示只读。

    至此,postgresql10 主从数据库 成功搭建完成。

    附录:

    • psql常用命令
    # (1)列出所有的数据库
    mysql: show databases
    psql: \l或\list
    
    # (2)切换数据库
    mysql: use dbname
    psql: \c dbname
     
    # (3)列出当前数据库下的数据表
    mysql: show tables
    psql: \d
     
    # (4)列出指定表的所有字段
    mysql: show columns from table name
    psql: \d tablename
     
    # (5)查看指定表的基本情况
    mysql: describe tablename
    psql: \d+ tablename
     
    # (6)退出登录
    mysql: quit 或者\q
    psql:\q
    

    相关文章

      网友评论

          本文标题:Centos7搭建postgresql10主从复制

          本文链接:https://www.haomeiwen.com/subject/xdhtiltx.html