
# 安装PostgreSQL
1. 服务信息如下：
   表1服务信息2 
   | 服务名              | 服务器                                                     | 安装目录            | 端口   | 账号/密码                 |
   |:---|:---|:---|:---|:---|
   | Postgresql-9.6.8 | 10.190.x.x（主库） 10.190.x.x（从库） | /app/postgresql | 5432 | Postgres/\*\*\*\*\*\* |
      
   
2. 安装PG
   1. 准备安装包 将编译好的在ARM架构欧拉系统编译通过的PostgreSQL+[PostGIS](http://www.refractions.net/products/postgis/)软件包放到服务器/app目录下并解压：
      ```
      tar xf postgresql_9.6.8_arm_eulerOS.tar.gz
      ```
      
   
   2. 添加用户并授权
      ```
      groupadd  postgres
      useradd postgres -g postgres -m -d /home/postgres
      chown -R postgres:postgres /app/postgresql
      ```
      
   
   3. 切换用户，启动PG
      ```
      su - postgres
      cd /app/postgresql
      ./bin/pg_ctl -D data -l logfile start
      ```
      
   
   4. 配置主从同步 以172.16.1.22（主），172.16.1.21（从）为例，编辑主节点配置
      ```
      vi /app/pg/data/pg_hba.conf   #如下：
      host     all      all       slave1ip/32       trust   #允许连接到主服务器
      host   replication    replica     slave1ip/32      md5   #允许用replica复制
      ```
      这里在最下面添加两行：
      ```
      host     all             all             172.16.1.21/32          trust
      host     replication     replica         172.16.1.21/32          trust
       
      vi /app/postgresql/data/postgresql.conf     #如下：
      data_directory = '/app/postgresql/data'             #自定义data目录
      listen_addresses = '*'                           #监听所有ip
      archive_mode = on                             #允许归档
      archive_command = 'cp %p /app/postgresql/data/pg_archive/%f'   #使用命令归档
      wal_level = replica                            #选择热备replica或logical
      max_wal_senders = 16                         #最多多少个流复制链接
      wal_keep_segments = 256                      #流复制保留最多的xlog数
      wal_sender_timeout = 60s                      #流复制主机发送数据超时时间
      max_connections = 5000               #从库的max_connections必须大于主库的
      ```
      
   
   5. 创建用户replica进行主从同步，并赋予登录和复制的权限
      - 登录到数据库里(主节点)
        ```
        su postgres
        cd  /app/postgresql/
        ./bin/psql
        CREATE ROLE replica login replication encrypted password 'replica';
        ./bin/pg_ctl -D data -l logfile restart
        ```
        
      
      - slave1部分：#先备份数据，再同步数据
        ```
        ./bin/pg_ctl -D data -l logfile stop   ## 保持服务处于关闭状态
        #自定义存档目录，先把旧的data全部移走
        mkdir /home/postgres/pg_archive/
        mv  /app/postgresql/data/  /home/postgres/pg_archive/
        chmod 700 pg_archive && chown postgres:postgres pg_archive/
        su  postgres
        rm -rf  /app/postgresql/data/*   #先将data目录下的数据都清空
        #为空的情况下，把主节点的数据用pg_basebackup同步到从节点
        cd /app/postgresql/bin
        pg_basebackup -P -h masterip -U replica -D /app/postgresql/data -X stream
        ./pg_basebackup -P -h 172.16.1.22 -U replica -D /app/postgresql/data -X stream
        #配置recovery.conf，最底下添加三行。
        cp /app/postgresql/share/recovery.conf.sample /app/postgresql/data/recovery.conf
        vi /app/postgresql/data/recovery.conf
        standby_mode = on        #该节点为从
        primary_conninfo = 'host=$masterip port=5432 user=replica password=replica'
                                #主服务器的ip、user
        recovery_target_timeline = 'latest'
        ##trigger_file = '/tmp/trigger_file0'
        #配置postgresql.conf   ## 添加到75行位置，其余内容不需修改。
        vi /app/postgresql/data/postgresql.conf
        max_connections = 5500     #尽量大于主连接数的10%
        max_standby_streaming_delay = 30s
        wal_receiver_status_interval = 10s
        hot_standby = on    ##从节点默认用off , 配置on启动psql可查询数据。
        hot_standby_feedback = on  #出现错误复制，向主机反馈
        #开启从数据库.
        ./bin/pg_ctl -D data -l logfile start
        netstat  -tlnp
        ```
        
       
   
   6. 查看复制状态（主库172.16.1.22）
      ```
      ./bin/psql
      select client_addr,sync_state from pg_stat_replication;
      ```
      图1查看复制状态   
      ![](https://support.huaweicloud.com/sfmcdtp-mapslt/zh-cn_image_0000001698748577.png)
      ```
      ##主从节点的进程多了wal进程：
      ps -ef | grep postgres
      postgres: wal sender process replica 172.16.1.21
      postgres: wal receiver process   streaming
      #用pg_controldata命令查询主从集群运行状态
      [postgres@host-172-16-1-22 bin]$ ./pg_controldata /app/postgresql/data/
      pg_control version number:            960
      Catalog version number:               201608131
      Database system identifier:           7127200572656879006
      Database cluster state:               in production
      [postgres@host-172-16-1-21 bin]$ ./pg_controldata /app/postgresql/data/
      pg_control version number:            960
      Catalog version number:               201608131
      Database system identifier:           7127200572656879006
      Database cluster state:               in archive recovery
      ```
      主从搭建成功后，主库的集群状态是in production，从库是in archive recovery，当主库崩溃，可以切换从库为主库。这时候主库状态是shut down，而从库是in production。
      
    
 
