zoukankan      html  css  js  c++  java
  • postgresql主从复制

    本文章以rpm包方式安装,版本为9.3.4

    一、postgresql安装

    postgresql93-9.3.4-1PGDG.rhel6.x86_64.rpm

    postgresql93-libs-9.3.4-1PGDG.rhel6.x86_64.rpm test.sneaky.bak

    postgresql93-devel-9.3.4-1PGDG.rhel6.x86_64.rpm

    postgresql93-server-9.3.4-1PGDG.rhel6.x86_64.rpm

    步骤:

    1、rpm -ihv postgresql93-*

    2、修改postgres用户密码:echo "peiwo" | passwd --stdin postgres

    3、修改环境变量:echo 'export PATH=$PATH:/usr/pgsql-9.3/bin' >> /var/lib/pgsql/.bash_profile

    4、用postgres用户运行 su – postgres,执行数据库初始化

    initdb --encoding=UTF8 --no-locale --auth=ident   -D  /data/pg_data1 

    -D:为自定义指定的目录

    5、修改安全配置,修改/var/lib/pgsql/9.3/data/pg_hba.conf(访问权限控制,根据实际情况配置):

    # "local" is for Unix domain socket connections only

    # TYPE  DATABASE        USER            ADDRESS                 METHOD

    #配置用户访问权限

    local   all              all                                     trust                                 #所有用户通过本地(本主机)均信任,即可无密码验证登录

    host    all             all         127.0.0.1/32          md5                                  #所有用户使用md5密码通过localhost均可访问

    host    all             all         0.0.0.0/0          md5                                        #所有用户使用md5密码通过ipv4地址均可访问

    host    all             all         ::1/128               md5                                     #所有用户使用md5密码通过ipv6地址均可访问

    host    sneaky         sneaky         172.16.10.193/32               md5               #sneaky用户使用md5密码通过172.16.10.193地址可访问sneaky数据库

    host    sneaky         sneaky         172.16.10.194/32               md5               #neaky用户使用md5密码通过172.16.10.194地址可访问sneaky数据库

    #配置从库数据同步权限

    host    replication     replication      172.16.10.194/32               md5           #replication用户使用md5密码通过172.16.10.194地址可访问replication数据库

    #以最后一段字段意思解释:允许172.16.10.194此台主机使用replication通过md5加密的密码访问replication数据库(主从复制用)

    6、启动postgresql,切换到postgres用户:su postgres(数据库路径自定义)

            pg_ctl -D /data/pg_data1/ start

    7、登陆数据库,创建角色与数据库:psql -U postgres postgres

    create user sneaky with password '123456';

    create database sneaky with owner sneaky;

    8、退出数据库(Ctrl+d)导入初始化数据:

     psql -d sneaky -U postgres -f   /data/pg_data/test.sneaky

    二、postgresql主数据库配置

    172.16.10.193 主数据库地址

    1.首先需要配置一个账号进行主从同步,有多个从库则可以配置多条安全规则。

    修改pg_hba.conf,增加replication用户,进行同步。

    host    replication     replication     172.16.10.194/32                 md5

    五个字段的条目:类型    指定数据库    授权用户    授权主机    认证方式

    这样,就设置了replication这个用户可以从172.16.10.194对应的机器(也可以设置网段)进行流复制请求。

     

    2、给replication设置密码,登录和备份权限。

    postgres# CREATE ROLE replication login replication encrypted password'replication';

     

    3、修改postgresql.conf,注意设置下下面几个地方:

    listen_addresses = '172.16.10.193,localhost'

    wal_level = hot_standby      #这个是设置主为wal的主机

    max_wal_senders = 32         #这个设置了可以最多有几个流复制连接,差不多有几个从,就设置几个

    wal_keep_segments = 256      #设置流复制保留的最多的xlog数目

    wal_sender_timeout = 60s     #设置流复制主机发送数据的超时时间

    max_connections = 100        #这个设置要注意下,从库的max_connections必须要大于主库的

    4、重启主库

    pg_ctl -D /data/pg_data1/ restart

     

    三、postgresql从数据库配置

    172.16.10.194 从数据库地址

    1、创建的目录为 /data/pg_data2并通过pg_basebackup从主库同步

     pg_basebackup -h 172.16.10.193 -U replication -F p -P -x -R  -D /data/pg_data2

    #这里使用了pg_basebackup这个命令,/data/pg_data2这个目录是空的

    成功之后,就可以看到这个目录中现有的文件都是一样的了。

    2、进入/data/pg_data2目录,修改recovery.conf,只要修改几个地方就行了

    standby_mode = on                                               #这个说明这台机器为从库

    primary_conninfo = 'host=172.16.10.193 port=5432 user=replication password=replication'  #这个说明这台机器对应主库的信息

    recovery_target_timeline = 'latest'                             #这个说明这个流复制同步到最新的数据

    trigger_file = ‘/data/pg_data2/trigger/trigger_file’       #标识触发器文件,指定一个触发文件让备服务器感觉到它的时候就会停止流复制(即:故障转移),不要创建这个文件。当你想主从切换的时候才需要创建它。

     

    3.postgresql.conf中也有几个地方要进行修改

    listen_addresses = '172.16.10.143,localhost'      #表示监听地址

    #max_wal_senders = 32                             #注释掉此项

    max_connections = 1000                            #一般查多于写的应用从库的最大连接数要比较大

    hot_standby = on                                  #说明这台机器不仅仅是用于数据归档,也用于数据查询

    max_standby_streaming_delay = 30s                 #数据流备份的最大延迟时间,默认30s

    wal_receiver_status_interval = 1s                 #多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,这里只是设置最长的间隔时间

    hot_standby_feedback = on                         #如果有错误的数据复制,是否向主进行反馈

    4、重启从库

    pg_ctl -D /data/pg_data2/ restart

     

    四、确认主从是否配置完成情况

    查看进程,主库所在的机器中会看到sender进程

    postgres  4843  0.0  0.1 325316  3432 ?        Ss   07:45   0:00 postgres: wal sender process replica 172.16.10.194(43312) streaming 0/1101C9C0

    从库所在的机器中会看到receiver进程

    postgres  2147  0.0  0.1 371432  3316 ?        Ss   07:46   0:00 postgres: wal receiver process   streaming 0/1101C9C0

    五、查看复制状态

    主库中执行

    postgres=# select * from pg_stat_replication;     

    -[ RECORD 1 ]----+------------------------------

    pid              | 4843           # sender的进程

    usesysid         | 17363          # 复制的用户id

    usename          | replicatiion        # 复制的用户用户名

    application_name | walreceiver 

    client_addr      | 172.16.10.194  # 复制的客户端地址

    client_hostname  |

    client_port      | 43312         # 复制的客户端端口

    backend_start    | 2017-01-06 07:45:58.771604+08  # 这个主从搭建的时间

    state            | streaming      # 同步状态 startup: 连接中、catchup: 同步中、streaming: 同步

    sent_location    | 0/1101C9C0        # Master传送WAL的位置

    write_location   | 0/1101C9C0     # Slave接收WAL的位置

    flush_location   | 0/1101C9C0     # Slave同步到磁盘的WAL位置

    replay_location  | 0/1101C9C0     # Slave同步到数据库的WAL位置

    sync_priority    | 0              #同步Replication的优先度

                         0:          #异步、1~?: 同步(数字越小优先度越高)

    sync_state       | async          # 有三个值,async: 异步、sync: 同步、potential: 虽然现在是异步模式,但是有可能升级到同步模式

     

    六、查看主从同步状态

    主数据库执行:

    postgres=> CREATE TABLE products (
    postgres(> product_no integer,
    postgres(> name text,
    postgres(> price numeric
    postgres(> );

    在从数据库查看数据:

    postgres=> select * from products ;
    product_no | name | price
    ------------+--------+-------
    1 | Cheese | 9.99
    (1 行记录)

    表示主从数据同步,流复制成功

    在从库插入数据

     postgres=> insert into products values(2,apple,7) ;

    cannot execute INSERT in a read-only transaction

    七、主从切换

    1.模拟主机故障

    -bash-4.1$ pg_ctl stop -D /data/pg_data/ -m fast

    2、提升备库状态

    pg_ctl promote -D /data/pgsql/data2

    3、查看状态

    postgres=# select pg_is_in_recovery();
    pg_is_in_recovery
    -------------------
    f
    (1 行记录)

    注:主库返回f,备库返回t

  • 相关阅读:
    stream流
    python笔记:str.contains小坑之 UserWarning To actually get the groups, use str.extract.
    获取excel的行索引值
    Pandas学习(4、数据载入、存储及文件格式
    python中如何压缩和解压缩文件
    保持服务器屏幕可控制状态
    python判断文件和文件夹是否存在、创建文件夹
    PDF处理
    selenium+python配置chrome浏览器的选项
    python实现复制粘贴
  • 原文地址:https://www.cnblogs.com/xiaoyu866/p/6294209.html
Copyright © 2011-2022 走看看