目录
四、规划高可用的LAMP,要求wordpress网站放在NFS共享存储上,并且用户可以正常发布博客,上传图片。尝试更新wordpress版本,测试网站仍可用。
一、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 #快照文件名