1. 构架图 本文档由 postgresql 专业群深圳 -GS 初稿, PostgreSQL 群 beta 2015-01-18 日修订 主要工作有 GS 完成 2. 主机宕机后构架图
3. 恢复完成后构架图 4. 实际部署图 5. 操作步骤 1. 安装 pg a) apt-get install postgresql-9.1 b) :apt-get install postgresql-contrib-9.1
c) :apt-get install libpq-dev d) :apt-get install postgresql-server-dev-9.1 e) : 配置系统用户 postgres 密码 :pg f) : 使用 root 用户, 创建目录用来做后面的归档目录 g) : 进入 postgres 的 home 目录,vim.bash_profile 添加环境变量, 修改完成后使用 source.bash_profile 激活环境变量 h) : 配置数据库超级用户 postgres 密码 :pgdb, 并使用 \q 推出 SQL 命令模式 i) 进入 postgres 配置目录 ( 下面目录只针对 pg 在 ubuntu 上的 apt-get 默认安装 ) j) 修改 :pg_hba.conf: 添加行 : host replication postgres 192.168.141.142/32 trust host replication postgres 192.168.141.140/32 trust host replication postgres 192.168.141.141/32 trust k) 修改 postgresql.conf
i. 启用参数 :listen_addresses ii. 配置端口 :port = 5432 iii. iv. 启用参数 :wal_level = hot_standby 启用参数 :archive_mode = on v. 启用参数 :hot_standby = on archive_command = 'cp %p /opt/archivedir/%f' vi. 启用参数 :max_wal_senders = 2 l) 推出当前 shell 连接, 重新登录系统用户 postgres, 确保环境变量生效 m) 创建配置文件 postgres.conf 软连接文件到 $PGDATA 目录 : ln /etc/postgresql/9.1/main/postgresql.conf /var/lib/postgresql/9.1/main/ 否则在使用 pg_ctl start 启动数据库是出现如下错误 : n) 启动数据库 ( 系统用户 postgres 下执行 pg_ctl restart)
2. 配置 ssh 无密码连接 (postgres) 把 B 主机的公钥文件拷贝到 A 主机的 authorized_keys, 这样 B 主机可以 ssh 免密码登录 A 可以通过查看 /var/log/secure 来查看登录信息, 这种方式为 publickey a) 安装 ssh 服务 :apt-get install ssh b) 切换到系统用户 postgres, 执行 ssh-keygen -t rsa 命令, 后续默认回车, 并生成类似二维码的 东西 c) 进入用户的 home 目录, 用 ls 可以看到.ssh 的文件夹, 进入.ssh 文件夹, 查看文件 : a) 使用 cat id_rsa.pub >> authorized_keys (#### 名称必须是 authorized_keys)
b) 使用 scp authorized_keys node2_ip:~/.ssh/node1 将当前的 authorized_keys 发送到 node2 和 node3 的 postgres 主目录下面的.ssh 文件夹下, 并命名为 node1 c) 使用同样的方法, 在 node2,node3 上面将 authorized_keys 传送给其他的 2 个节点上面, 并使用 cat node* >> authorized_keys 追加到 authorized_keys 里面 d) 测试无密码连接是否生效 : 在第一次连接输入密码后, 以后的连接都不用输入密码 3. 配置 pg 流复制模式 (@slave1,@slave2) a) 使用 pg_ctl 命令, 停止 slave1,slave2 的 PG 服务 (@slave) b) 返回 master 服务器, 执行如下命令 postgres@xelg-linux:~/.ssh$ psql psql (9.1.13) Type "help" for help.
postgres=# select pg_start_backup('stream_bak'); pg_start_backup ----------------- 0/2000020 (1 row) postgres=# \q c) 使用命令 scp -r 9.1/ 192.168.141.140: 和 scp -r 9.1/ 192.168.141.141: 将备份文件分别传送给 slave1 slave2(@master) d) 在 master 上面执行如下命令 (@master) postgres@xelg-linux:~$ psql psql (9.1.13) 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/2000168 (1 row) postgres=#
e) 切换终端到 slave1 和 slave2, 进入 ~/9.1/main 目录, 并执行 vi recovery.conf(@slave1 slave2) f) 添加行 : 编辑文件 $PGDATA/recovery.conf standby_mode = 'on' primary_conninfo = 'host=192.168.141.142 port=5432 user=postgres password=pgdb' restore_command = 'scp 192.168.141.142:/opt/archive/%f %p' recovery_target_timeline='latest' trigger_file=/tmp/trigger_file0 g) 使用 pg_ctl 启动 slave1,slave2 数据库, 并出现流复制成功连接到主节点, 表示已经 成功配置了 pg 的复制模式 h) 测试 : 返回 master 节点, 执行创建数据库命令, 并在 slave1,slave2 上查看, 是否已经同时创建该数据库 i) 测试 : 返回 slave1,slave, 执行创建数据库命令, 出现如下提示 : 到现在 PG 流复制已经成功配置
4. 安装 pgpool( 执行 pgpool 的系统用户必须有 ssh 无密码连接的权利, 建议使用 postgres 用户安装 pgpool) 在 master 执行命令./configure --with-pgsql=/var/lib/postgresql --with-pgsql-libdir=/usr/lib/postgresql/9.1/lib --withpgsql-includedir=/usr/include/postgresql 安装 pgpool 5. 配置 pgpool, 实现主备自动切换 ( 原 master 宕机, 以下统称 M-1) a) 使用 Root 用户进入目录 :/usr/local/etc b) 用户命令 :pg_md5 获取数据库用户 postgres 密码 pgdb 的 MD5 值 c) 执行修改 pcp.conf d) 执行修改 pgpool.conf e) 执行修改 poo_hba.conf f) 按照 pgpool.conf 里面配置的 failover_command 参数, 在对应的目录下创建脚本文件 g) 参考下面内容 : h) pcp.conf pgpool.conf pool_hba.conf mkdir /var/run/pgpool 配置完成后, 使用 root 用户创建文件夹 : i) 使用 pgpool 命令启动 pgpool j) 切换系统用户到 postgrs, 执行命令 psql p 9999, 看到如下界面是表示 pgpool 已经安 装 OK
6. 恢复并挂载宕机服务器 a) 返回 master 服务器, 切换到系统用户 postgres, 执行 pg_ctl-m fast stop b) 切换到 slave1, 出现如下提示 : 首先提示主连接失去连接, 然后开始启动本地编辑 c) 切换到 slave2, 出现如下提示 d) 回到 master 服务器, 执行 psql -p 9999, 并创建 table:test1, 如下提示已经成功创建 e) 到目前位置, 已经完成主备机切换, 以下步骤开始挂载原 master 为 slave21
f) 进入 postgres 的 data 目录 :/var/lib/postgresql/9.1/main,vim recovery.conf, 内容如下 : standby_mode = 'on' primary_conninfo = 'host=192.168.141.140 port=5432 user=postgres password=pgdb' restore_command = 'scp 192.168.141.140:/opt/archive/%f %p' recovery_target_timeline='latest' trigger_file='/tmp/trigger_file0' g) 执行 pg_ctl start, 启动数据库, 并执行 psql,select * from test1, 查看在原 master 停 止后创建的表 test1 是否恢复到该数据库上面, 如下图所示 :test1 已经成功出现在原 master( 现 slave21) 上面 h) 执行创建表语句, 出现当期数据库为读模式的警告 : i) 在原主节点上执行命令 :/usr/local/bin/pcp_attach_node 5 localhost 9898 postgres pgdb 0 重新将丢失的节点添加到 pgpool 上面 ( 必须步骤, 否则以下步骤会出错 ) 5: 超时时间 Localhost: 安装 pgpool 的服务器 ip 或名称
9898:pcp 端口号 Postgres: 数据库超级管理员 Pgdb: 数据库超级管理员密码 0: 需要重新加载服务器在 pgpool.conf 中对应的 backend0 的 0( 就是 id) 7. 新 master 宕机后, 主备机切换 ( 新 master 宕机, 以下统称 M-2,slave 21 重新升级为 master) a) 准备工作 : 切换到 slave21 的服务器 ( 原 master) 上面, 修改 /var/lib/postgresql 的 failover.sh 文件 修改如下 : b) 切换到 M-2 服务器 ( 原 slave1), 执行命令 :pg_ctl m fast stop c) 切换到 slave21 服务器, 出现如下提示
d) 在 slave21 上执行 psql -p 9999, 并执行 :insert into test1 values(1); 如下图, 我们就胜 利的完成了第二次的主备切换, 这个步骤和第一次的主板切换步骤差不多, 但是关键 是将 M-2 重新挂载为 slave2 e) 检查 slave2, 中是否有数据插入 : f) 移动 data 目录文件 recovery.done 为 recovery.conf g) 使用 root 用户执行命令 :rm /tmp/trigger_file0, 或者重启服务器, 重启后系统将自动删除该文件, 如果不执行该动作, 我们在启动数据库的时候, 就会出现错误 ( 具体情况在 J 步骤中说明 ) h) 执行命令 pg_ctl start i) 成功竟然流复制模式, 查看 slave2 中是否有数据插入 : j) 忽略 f 步骤中, 在 M-2 上不执行删除 /tmp/trigger_file0 的动作, 数据库启动, 完成恢 复后, 直接进入可以读写模式, 这不是我们想要的流模式, 因为流模式只能进行读操
作 具体的大家可以去试试, 这里就不做了 因为这个问题, 纠结了我 2 天 囧 好了, 到这里, 我们已经完整的配置好了 pgpool 的流复制模式