【第七周】基于流复制完成postgresql的高可用

目录

一、postgresql架构与原理。

二、基于流复制完成postgresql的高可用。

三、实现postgresql的时间点还原。

四、规划高可用的LAMP,要求wordpress网站放在NFS共享存储上,并且用户可以正常发布博客,上传图片。尝试更新wordpress版本,测试网站仍可用。

五、redis数据类型有哪些?

六、redis RDB和AOF比较?

七、redis配置文件详解。


一、postgresql架构与原理。

 postgresql架构

postgresql和mysql相似,也采用典型的C/S模型

postgresql体系结构分两部分

1.实例instance

2.磁盘存储

 PostgreSQL是进程架构模型,MySQL是线程架构模型

postgresql特征

函数:通过函数,可以在数据库服务器端执行指令程序。

索引:用户可以自定义索引方法,或使用内置的 B 树,哈希表与 GiST 索引。

触发器:触发器是由SQL语句查询所触发的事件。如:一个INSERT语句可能触发一个检查数据完整性的触发器。触发器通常由INSERT或UPDATE语句触发。

多版本并发控制:PostgreSQL使用多版本并发控制(MVCC,Multiversion concurrency control)系统进行并发控制,该系统向每个用户提供了一个数据库的"快照",用户在事务内所作的每个修改,对于其他的用户都不可见,直到该事务成功提交。

规则:规则(RULE)允许一个查询能被重写,通常用来实现对视图(VIEW)的操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)。

数据类型:包括文本、任意精度的数值数组、JSON 数据、枚举类型、XML 数据

等。
全文检索:通过 Tsearch2 或 OpenFTS,8.3版本中内嵌 Tsearch2。

NoSQL:JSON,JSONB,XML,HStore 原生支持,至 NoSQL 数据库的外部数据包装器。

数据仓库:能平滑迁移至同属 PostgreSQL 生态的 GreenPlum,DeepGreen,HAWK 等,使用 FDW 进行 ETL。

二、基于流复制完成postgresql的高可用。

流复制原理

备库不断的从主库同步相应的数据,并在备库apply每个WAL record,这里的流复制每次传输单位是WAL日志的record

 流复制特点

延迟低,不怕大事务

支持断点续传

支持多副本

配置简单

备库与主库物理安全一致,并支持只读

 流复制实现

1.基础环境准备

 两个主机节点

10.0.0.101  mastr
10.0.0.102 stadby

两主机postgresql版本必须一致

 2.master节点配置

#创建复制的用户并授权
[13:02:13 root@master ~]#sudo -i -u postgres
[13:02:34 postgres@master ~]$psql
psql (15.1, server 14.6)
Type "help" for help.


postgres=# create role repluser with replication login password '123456';
CREATE ROLE


#修改pg_hba.conf进行授权
[14:02:34 postgres@master ~]$vim /pgsql/data/pg_hba.conf
host replication repluser 0.0.0.0/0 md5

[16:02:34 postgres@master ~]$pg_ctl restart -D /pgsql/data

3.standby节点配置

#清空数据和归档
postgres@ubuntu:~$ pg_ctl stop -D $PGDATA
postgres@ubuntu:~$ rm -rf /pgsql/data/*
postgres@ubuntu:~$ rm -rf /archive/*
postgres@ubuntu:~$ rm -rf /pgsql/backup/*

#备份主库数据到备库
postgres@ubuntu:~$pg_basebackup -D /pgsql/backup/ -Ft-Pv -Urepluser -h 10.0.0.101 -p 5432 -R

#还有备份的数据,实现初始的主从数据同步
postgres@ubuntu:~$ tar xf /pgsql/backup/base/tar -C /pgsql/data
postgres@ubuntu:~$ tar xf /pgsql/backup/pg_wal.tar -C /archive/

#修改postgresql.conf文件
postgres@ubuntu:~$ vim /pgsql/data/postgresql.comf
#添加下面两行
primary_conninfo = 'host=10.0.0.101 port=5432 user=repluser password=123456'
restore_command = 'cp /archive/%f %p' #此项可不配置

4.监控同步状态

在主库查看状态

[root@master ~]#pg_controldata

postgresql=#select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;

#下面只在主节点查看同步模式,注意:如果无从节点连接,将无任何信息显示
postgres=# SELECR pg_current_wal_insert_lsn(),* from pg_stat_replication;

#服务器查看数据库是否为备库,f表主库,t表示为备库
postgres=# select * from pg_is_inrecovery();

postgres=# select * application_name,client_addr,sync_state from pg_stat_replication;

[root@master ~]#ps aux |grep walsender

在从库查看状态

#从节点可以读
hellodb=# select * from teachers;

#从节点不支持写
hellodb=# delete from teachers where tid=4;

postgres@ubuntu:~$ pg_controldata

postgres=# select * from pg_is_in_recovery();

postgres=# select * from pg_stat_wal_recriver;


#查看进程
[root@ubuntu ~]ps aux|grep postgres

5.切换主从

将从库切换为主库

postgres@ubuntu:~$pg_ctl promote

postgres@ubuntu:~$pg-controldata

postgres@ubuntu:~$pg_ctl restart

#恢复正常模式( )
postgres=$ select pg_wal_replay_resume();

将主库切换为从库

#在原主库修复故障后,在主库服务器重复上面standby节点的6.2.3的步骤

#在原主库服务器创建 standby.signal文件
[root@master ~]$touch $PGDATA/standby.signal

#在原主库服务器启动服务
[root@master ~]$pg_ctl -D /pgsql/data restart

#在原主库服务器查看状态
[root@master ~]$/pgsql/data$ pg_controldata

hellodb=# select * from pg_is_recovery();
pg_is_in_recovery

6.重新验证同步状态

在新主库创建数据,验证是否能同步至原主库

配置同步的流复制

主节点需要特殊的如下配置,从节点同6.2.3配置

[root@master ~]$vim /pgsql/data/postgresql.conf
synchronous_standby_names = '*' #开启此项,表示同步方式,默认是异步方式
synchronous_commit = on #开启同步模式

 验证同步状态

#在主节点查看sync状态
postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;

#从节点停止服务
postgres@ubuntu:~$ pg_ctl stop

#主节点只支持读,但写入时会处于卡顿状态,直至从节点恢复正常同步
hellodb=# delect from teachers where tid=4;

三、实现postgresql的时间点还原。

 场景说明

每天2:00备份,第二天10:00误删除数据库,如何恢复?

故障恢复过程

备份数据和归档

还有流程

        还有完全备份

        归档日志恢复

                备份中的归档

                恢复2:00到10:00之间的归档

                恢复在线redo

备份

#在PG服务器开启归档
[postgresql@server ~]$vim /pgsql/data/postgresql.conf
archive_mode = on
archive_command = 'test ! -f /archive/%f && cp %p /aechive/%f'
[postgresql@server ~]$pg_ctl restart -D $PGDATA

#在PG服务器上创建测试数据
postgres=#create database testdb;
postgres=#\c testdb
postgres=# create table t1(id int);
postgres=# insert into t1 values(1);

#在备份服务器对PG数据库进行远程完全备份
[postgres@backup ~]$pg_basebackup -D /pgsql/backup/ -Ft -Pv -Upostgre -h 10.0.0.200 -p 5432 -R

#在PG服务器上继续生成测试数据
testdb=# insert into t1 values(2);

#模拟数据库删除
testdb=# drop t1 values(2);

#发现故障,停止用户访问
#查看当前日志文件
postgres=# select pg_walfile_name(pg_current_wal_lsn());

#查看当前事务ID
postgres=# select txid_current();

故障还原

#在PG服务器上切换归档日志
postgres=#select pg_swith_wql();

#在要还原的服务器停止服务,准备还原
[postgre@server ~]$pg_ctl stop -D $PGDATA
[postgre@server ~]$rm -rf /pgsql/data/*

#在测试的还原服务器进行还原
[postgres@backup ~]$tar xf /pgsql/backup/base.tar -C /pgsql/data/

#启动服务
[postgre@backup ~]$pg-ctl start -D $PGDATA

#验证数据
[postgres@backup ~]$psql

四、规划高可用的LAMP,要求wordpress网站放在NFS共享存储上,并且用户可以正常发布博客,上传图片。尝试更新wordpress版本,测试网站仍可用。

安装并配置wordpress

yum -y install httpd php php-mysqlnd php-json
systemctl --now httpd 
systemctl enable --now httpd 
ls /var/www/html
wget https://wordpress.org/latest.zip
wget https://cn.wordpress.org/latest-zh_CN.tar.gz
tar xf latest-zh_CN.tar.gz 
 mv wordpress/* /var/www/html/

chown apache.apache /var/www/html -R

五、redis数据类型有哪些?

5种常见redis数据类型:字符串(Strings)、哈希(Hashes)、 列表(Lists)、集合(Sets)、有序集合(Sorted sets) 

 字符串(Strings)

字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据,例如: 一张JPEG格式的图片或者一个序列化的Ruby对象。

一个字符串类型的值最多能存储512M字节的内容。

哈希(Hashes) 

Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象(eg:一个有名,姓,年龄等属性的用户)的数据类型。

集合(Sets) 

Redis集合是一个无序的字符串合集。你可以以O(1) 的时间复杂度(无论集合中有多少元素时间复杂度都为常量)完成 添加,删除以及测试元素是否存在的操作。

列表(Lists)

Redis列表是简单的字符串列表,按照插入顺序排序。 你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

有序集合(Sorted sets) 

Redis有序集合和Redis集合类似,是不包含 相同字符串的合集。它们的差别是,每个有序集合 的成员都关联着一个评分,这个评分用于把有序集 合中的成员按最低分到最高分排列。


六、redis RDB和AOF比较?

两者区别 

RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程就是有一个fork子进程,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,用二进制压缩存储。

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。

两者优缺点

RDB的优缺点:

优点:RDB持久化文件,速度比较快,而且存储的是一个二进制文件,传输起来很方便。

缺点:RDB无法保证数据的绝对安全,有时候就是1s也会有很大的数据丢失。

AOF的优缺点:

优点:AOF相对RDB更加安全,一般不会有数据的丢失或者很少,官方推荐同时开启AOF和RDB。

缺点:AOF持久化的速度,相对于RDB较慢,存储的是一个文本文件,到了后期文件会比较大,传输困难。

七、redis配置文件详解。

redis主要配置项

bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听IP

protected-mode yes #redis3.2 之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访问

127.0.0.1:6379,可以远程连接,但当访问将提示警告信息并拒绝远程访问

port 6379 #监听端口

tcp-backlog 511 #三次握手的时候server端收到client ack确认号之后的队列值,即全队列长度

timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时

tcp-keepalive 300 #tcp 会话保持时间300s

daemonize no #默认redis-server不作为守护进程运行的,而前台运行,如果想在后台运行,就把它改成 yes,当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis.pid 文件

supervised no #和OS相关参数,可设置通过upstart和systemd管理Redis守护进程,centos7后都使用systemd

pidfile /var/run/redis_6379.pid #pid文件路径

loglevel notice #日志级别

logfile "/path/redis.log" #日志路径

databases 16 #设置数据库数量,默认:0-15,共16个库

always-show-logo yes #在启动redis 时是否显示redis的logo

save 900 1 #在900秒内有一个键内容发生更改就出就快照机制
save 300 10
save 60 10000  #60秒内如果有10000个健以上的变化,就自动快照备份

stop-writes-on-bgsave-error yes #yes时因空间满等原因快照无法保存出错时,禁止redis写入操作,建议为no

rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之

rdbchecksum yes #是否对备份文件开启RC64校验,默认是开启

dbfilename dump.rdb #快照文件名
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值