week07

一、postgresql架构与原理

1.postgresql架构分为两部分,实例和存储。数据库启动一个进程即为一个实例,每个实例有单独的文件存储。
2.postgresql为多进程,分为主进程、辅助子进程、会话进程,
主进程负责数据库的启动和停止,客户端连接数据库,首先和主进程建立连接,连接成功后fork()会话进程处理客户端的请求。
辅助子进程分为:
background writer 负责内存数据刷新到磁盘
walwriter 预写日志进程
checkpointer 检查点进程,定期向bgwrite进程请求刷新数据,同时在walwriter日志中写入日志
autovacuum 自动清理垃圾数据进程
stats collector 数据库状态收集进程
archiver 归档进程,开启后可按增量备份
logger 记录日志
session进程 每个用户连接后开启一个session进程
3.内存结构
共享内存,主要用于数据块的缓冲区,提高读写性能。 shared_buffers ,默认128M,可设置为机器内存的50%
本地内存,
temp_buffers 临时表的本地缓冲区 默认8M
work_mem:内部排序操作和hash表,使用临时磁盘文件之前使用的内存缓存区 默认4M
maintenance_work_mem :vacuum create index 等使用的内存缓冲区 默认64M
4.数据更新过程
4.1 客户端发起数据更新数据
4.2 写事务日志缓存
4.3 commit
4.4 刷新事务日志到磁盘
4.5 checkpointer 发起检查点
4.6 刷新缓存数据到磁盘
5.日志文件

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

6.1 建立复制账号

1
create role repluser with replication login password '123456'

6.2配置从节点复制链接数

1
max_wal_senders = 10 //有几个从节点就配置几个

6.3用热备方式备份主库,建立从库

1
备份还原后不要设置recovery_target,即从主库同步数据

6.4配置从库

1
2
3
primary_conninfo='host=10.1.0.18 port=5433 user=repluser password=123456'
restore_command = 'cp /home/backup/wal/%f %p' #从备份的wal中恢复数据

6.6重启从库

1
2
pg_ctl restart -D /home/data/pgsql5

6.7检测是否设置成功

1
2
3
4
select * from pg_stat_replication; #主库查看是否有链接

select * from pg_is_in_recovery();//查看数据库是否是从节点
select * from pg_stat_wal_receiver;//从库查看接收消息

三、实现postgresql的时间点还原

1.修改数据库配置文件,允许远程备份

1
2
#pg_hba.conf 配置文件增加
host replication all 0.0.0.0/0 md5

2.开启归档日志

1
2
archive_mode= on
archive_command=' DIR=/home/postgresql/`date +%F`;[ -d $DIR] || mkdir -p $DIR;cp %p $DIR/%f '

3.远程备份数据库

1
pg_basebackup -D /home/backup/ -Ft -Pv -Upostgres -h 10.1.0.18 -p 5433 -R

4.通过数据库oid和表oid,定位需要还原的时间点

1
2
select oid from pg_database where datname='mfcqc_080201'
SELECT oid FROM PG_class where relname = 'tablename'

5.查看数据库wal日志顺序

1
select * from pg_ls_waldir() order by modification desc

6.按照wal日志顺序和oid,查找需要还原的时间点

1
2
pg_waldump 0000000100000008000000DF |grep 164256/165925
pg_waldump 0000000100000008000000DF |grep 8/DF000060|grep COMMIT

7.解压备份文件

1
2
3
tar xf /home/backup/base.tar -C /home/data/pgsql5/
chown -R postgres:postgres pgsql5
chmod 0700 pgsql5/

8.复制归档文件

1
scp /home/postgresql/2023-08-02/* 10.1.0.19:/home/backup/wal/

9.修改备份数据库配置

1
2
3
4
5
6
restore_command = 'cp /home/backup/wal/%f %p'
recovery_target_time = '2023-08-02 10:07:30'

报错信息:
DETAIL: At most one of recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time, recovery_target_xid may be set.
同时开启一个还原目标方式

10.还原数据库

1
su - postgres -c 'pg_ctl start -D /home/data/pgsql5'

11.恢复可写状态

1
select pg_wal_replay_resume();

12.检查状态

1
pg_controldata -D /home/data/pgsql5|grep 'Database cluster state'

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

1.docker安装mysql数据
https://www.baibao.online/2023/07/19/mysql主从同步/
2.配置nfs共享服务

1
2
/data/wordpress     192.168.1.29(rw,anonuid=33,anongid=33)
33 为www-data 用户,wordpress默认用户

3.挂在共享文件夹

1
mount 192.168.1.120:/data/wordpress /home/wordpress/

4.启动wordpress Docker

1
2
3
4
5
6
7
8
9
docker run -d --name wordpress \
-p 8081:80 \
-e WORDPRESS_DB_HOST=10.1.0.18:3306 \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=123456@Root \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_TABLE_PREFIX=wp_ \
-v /home/wordpress/uploads:/var/www/html/wp-content/uploads \
wordpress

1691050294771

5.更新wordpress主题
1691050619486

五、redis数据类型有哪些

5.1 String(字符串):用于存储文本或二进制数据。

相关命令:SET、GET、INCR、DECR、APPEND、MSET 等。
5.2 List(列表):有序、可重复的字符串元素列表。

相关命令:LPUSH、RPUSH、LPOP、RPOP、LINDEX、LRANGE 等。

5.3 Set(集合):无序、不重复的字符串元素集合。

相关命令:SADD、SREM、SMEMBERS、SISMEMBER、SUNION、SINTER 等。

5.4 Hash(哈希表):键值对的无序散列表。

相关命令:HSET、HGET、HDEL、HGETALL、HKEYS、HVALS 等。

5.5 Sorted Set(有序集合):有序、不重复的字符串元素集合,每个元素关联一个分数,按照分数进行排序。

相关命令:ZADD、ZREM、ZRANGE、ZINCRBY、ZSCORE、ZCOUNT 等。

5.6 Bitmap(位图):由二进制位组成的数据结构,可以对位进行操作。

相关命令:SETBIT、GETBIT、BITCOUNT、BITOP 等。

HyperLogLog(基数估算):用于估算一个集合中不重复元素的个数。

相关命令:PFADD、PFCOUNT、PFMERGE 等。

5.7 Geospatial(地理空间):用于存储地理位置信息。

相关命令:GEOADD、GEORADIUS、GEODIST、GEOHASH 等。

六、redis RDB和AOF比较

RDB
类似于数据库完全备份,以二进制的形式保存在磁盘上。
优点:速度快,节省空间
缺点:恢复时间由文件大小决定,文件越大加载到内存的时间越慢
AOF
日志追加,以文本的方式记录在磁盘。
优点:数据不会丢失,每次操作都有日志。
缺点:文件较大,需要定期重写文件

七、配置文件详解

7.1.修改基本内核参数

1
2
3
4
5
6
7
8
9
cat /etc/sysctl.conf  
/proc/sys/net/core/somaxconn # tcp全连接队列
cat /proc/sys/vm/overcommit_memory # 0 1 2
# 0 内核将检查是否有足够的内存给进程使用,如果有足够的内存,则允许使用,否则把错误返回给相应的进程
# 1 内核允许分配所有的内存,不管当前的内存状态如何
# 2 内核允许超过所有物理内存和交换空间内存的总和
echo never > /sys/kernel/mm/transparent_hugepage/enabled
#关闭数据大页
# 添加到 /etc/rc.d/rc.local 开机启动,每次启动都关闭

7.2.添加密码

1
2
3
4
5
6
7
8
#配置文件修改
requirepass foobared
#命令行修改
CONFIG set requirepass 123456
#用密码登录
redis-cli -a 123456
#获取配置
CONFIG get

7.3.设置最大使用内存

1
CONFIG get maxmemory # 设置成物理内存的50% 按字节为单位

7.4.慢查询

1
2
3
4
5
6
grep slowlog redis_6379.conf
slowlog-log-slower-than 10000 #执行多长时间 单位为微妙
slowlog-max-len 128 #最多记录
SLOWLOG len #查询慢查询记录数
SLOWLOG get 1
SLOWLOG reset # 清空慢查询记录