第七周作业

一、postgresql架构与原理

1.体系架构概览

PostgreSQL和MySQL相似,也采用典型的C/S模型。
PostgreSQL体系结构分两部分

  • 实例 instance(内存)
  • 磁盘存储
  • 实例 instance 包括
  • 进程(客户端的响应进程,服务端的处理进程)
  • 内存存储结构
  •  

    1.2 进程
    Postmaster 主进程
    它是整个数据库实例的主控制进程,负责启动和关闭该数据库实例。
    实际上,使用pg ctl来启动数据库时,pg_ctl也是通过运行postgres来启动数据库的,只是它做了一些包装,更容易启动数据库。
    它是第一个PostgreSQL进程,此主进程还会fork出其他子进程,并管理它们。
    当用户和PostgreSQL建立连接时,首先是和Postmaster进程建立连接。首先,客户端会发出身份验证的信息给Postmaster进程,Postmaster进程根据消息中的信息进行身份验证判断,
    如果验证通过,它会fork出一个会话子进程为这个连接服务。
    当某个服务进程出现错误的时候,Postmaster主进程会自动完成系统的恢复。恢复过程中会停掉所有的服务进程,然后进行数据库数据的一致性恢复,等恢复完成后,数据库又可以接受新的连接。
    验证功能是通过配置文件pg_hba.conf和用户验证模块来提供。
    postmaster 程序是指向postgres的软链接
    2. 基于流复制完成postgresql的高可用

  • 2.2 Master 节点配置

  • #创建复制的用户并授权
    [postgres@master ~]$ psql
    postgres=#create role repluser with replication login password '123456';
    #修改pg_hba.conf进行授权
    [postgres@master ~]$vi /pgsql/data/pg_hba.conf
    host replication repluser 0.0.0.0/0 md5

    2.3 Standby 节点配置

  • #清空数据和归档
    [postgres@standby ~]$ pg_ctl stop -D $PGDATA
    [postgres@standby ~]$ rm -rf /pgsql/data/*
    [postgres@standby ~]$ rm -rf /archive/*
    [postgres@standby ~]$ rm -rf /pgsql/backup/*
    #备份主库数据到备库
    [postgres@standby ~]$ pg_basebackup -D /pgsql/backup/ -Ft -Pv -Urepluser -h
    10.0.0.101 -p 5432 -R
    #还原备份的数据,实现初始的主从数据同步
    [postgres@standby ~]$ tar xf /pgsql/backup/base.tar -C /pgsql/data
    [postgres@standby ~]$ tar xf /pgsql/backup/pg_wal.tar -C /archive/
    #修改postgresql.conf文件
    [postgres@standby ~]$ vi /pgsql/data/postgresql.conf
    #添加下面两行
    primary_conninfo = 'host=10.0.0.101 port=5432 user=repluser password=123456'
    restore_command = 'cp /archive/%f %p' 
    #修改postgresql.auto.conf
    [postgres@standby ~]$ vi /pgsql/data/postgresql.auto.conf
    primary_conninfo = 'host=10.0.0.101(主节点ip) port=54321 user=repluser password=123456
    sslmode=disable sslcompression=0 gssencmode=disable
    krbsrvname=post_session_attrs=any' #此行自动生成,只修改用户名即可
    restore_command = 'cp /archive/%f %p'
    [postgres@standby ~]$ pg_ctl -D /pgsql/data start

  • 在主库查看状态

  • [root@master ~]#pg_controldata
  • 3. 实现postgresql的时间点还原
  • #在PG服务器开启归档
    [postgres@pgserver ~]$ vim /pgsql/data/postgresql.conf
    archive_mode = on
    archive_command = 'test ! -f /archive/%f &&cp %p /archive/%f'
    [postgres@gpserver ~]$pg_ctl restart -D $PGDATA
    #在PG服务器上创建测试数据
    postgres=#create database testdb;
    postgres=#\c testdb
    testdb=# create table t1(id int);
    testdb=# insert into t1 values(1);
    #在备份服务器对PG数据库进行远程完全备份
    [postgres@backup ~]$pg_basebackup -D /pgsql/backup/ -Ft -Pv -Upostgres -h
    10.0.0.200 -p 5432 -R
    #在PG服务器上继续生成测试数据
    testdb=# insert into t1 values(2);
    #模拟数据库删除
    postgres=# drop database testdb;
    #发现故障,停止用户访问
    #查看当前日志文件
    postgres=# select pg_walfile_name(pg_current_wal_lsn());
    -[ RECORD 1 ]---+-------------------------
    pg_walfile_name | 000000020000000000000020
    #查看当前事务ID
    postgres=# select txid_current();
    txid_current
    --------------
    521
    (1 row)

    #在PG服务器上切换归档日志(好处是以后这个文件不再使用)
    postgres=#select pg_switch_wal();
    #在要还原的服务器停止服务,准备还原
    [postgres@pgserver ~]$pg_ctl stop -D $PGDATA
    [postgres@pgserver ~]$rm -rf /pgsql/data/*
    #在测试的还原服务器进行还原
    [postgres@backup ~]$tar xf /pgsql/backup/base.tar -C /pgsql/data/
    #此步可以不执行
    [postgres@backup ~]$tar xf /pgsql/backup/pg_wal.tar -C /archive/
    #复制PG服务器的归档日志到还原的测试服务器
    [postgres@pgserver ~]$rsync -a 10.0.0.200:/archive/ /archive/
    #查看故障点事务ID
    [postgres@backup ~]$pg_waldump /archive/000000020000000000000020 |grep -B 10
    "DROP dir"
    rmgr: Database len (rec/tot): 34/ 34, tx: 521, lsn: 0/3D000828,
    prev 0/3D0007B0, desc: DROP dir 1663/16445
    #查看此指令的事务ID为521,前一个事务为520
    #修改配置文件postgresql.conf,或者postgresql.auto.conf文件也可以
    [postgres@backup ~]$vi /pgsql/data/postgresql.conf
    #加下面两行
    restore_command = 'cp /archive/%f %p'
    #指定还原至上面查到的事务ID
    recovery_target_xid = '520'
    #也可以通过下面方式指定还原至的位置
    recovery_target_name = 'restore_point' #指定还原点名称
    recovery_target_time = '2021-01-17 16:26:12' #指定还原至时间点
    recovery_target_lsn = '0/3E000148' #指定还原到LSN号的位置
    #启动服务
    [postgres@backup ~]$pg_ctl start -D $PGDATA
    #验证数据
    [postgres@backup ~]$psql
    psql (12.9)
    Type "help" for help.
    postgres=# \c testdb
    You are now connected to database "testdb" as user "postgres".
    testdb=# select * from t1;
    id
    ----
    1
    2
    (2 rows)
    #验证数据是否还原,恢复后读取正常
    testdb=# select * from t1;
    id
    ----
    1
    2
    3
    (3 rows)
    #当前无法写入
    testdb=# insert into t1 values(4);
    ERROR: cannot execute INSERT in a read-only transaction
    [postgres@pgserver ~]$pg_controldata
    pg_control version number: 1300
    Catalog version number: 202107181
    Database system identifier: 7064396403376562327
    Database cluster state: in archive recovery
    #恢复正常模式
    postgres=# select pg_wal_replay_resume();
    [postgres@pgserver ~]$pg_controldata
    pg_control version number: 1300
    Catalog version number: 202107181
    Database system identifier: 7064396403376562327
    Database cluster state: in production
    #恢复正常写入
    testdb=# insert into t1 values(4);

  • 4. 规划高可用的LAMP,要求wordpress网站放在NFS共享存储上,并且用户可以正常发布博客,上传图片。尝试更新wordpress版本,测试网站仍可用。
  • #NFS服务器创建用户和相应的家目录,将用户wang的家目录共享
    [root@centos8 ~]#yum -y install nfs-utils
    [root@centos8 ~]#systemctl enable --now nfs-server
    [root@centos8 ~]#mkdir -pv /data/home
    [root@centos8 ~]#useradd -d /data/home/wang -u 2000 wang
    [root@centos8 ~]#Vim /etc/exports.d/test.exports
    /data/home *(rw)
    [root@centos8 ~]#exportfs -r
    #在第一台NFS客户端主机10.0.0.7上实现
    [root@centos7 ~]#yum -y install nfs-utils
    [root@centos7 ~]#useradd -u 2000 wang
    [root@centos7 ~]#vim /etc/fstab
    10.0.0.8:/data/home/wang /home/wang nfs _netdev 0 0
    [root@centos7 ~]#mount -a
    [root@centos7 ~]#su - wang
    Last login: Fri Jul 3 16:33:34 CST 2020 on pts/0
    [wang@centos7 ~]$pwd
    /home/wang
    [wang@centos7 ~]$df /home/wang -T
    Filesystem Type 1K-blocks Used Available Use% Mounted on
    10.0.0.8:/data/home/wang nfs4 52403200 398464 52004736 1% /home/wang
    #在第二台NFS客户端主机10.0.0.6上实现
    [root@centos6 ~]#yum -y install nfs-utils
    [root@centos6 ~]#useradd -u 2000 wang
    [root@centos6 ~]#vim /etc/fstab
    10.0.0.8:/data/home/wang /home/wang nfs _netdev 0 0
    [root@centos6 ~]#su - wang
    [wang@centos6 ~]$pwd
    /home/wang
    [wang@centos6 ~]$df -T /home/wang
    Filesystem Type 1K-blocks Used Available Use% Mounted on
    10.0.0.8:/data/home/wang nfs 52403200 398464 52004736 1% /home/wang
    5. redis数据类型有哪些?

  • 字符串 string   列表 list   集合 set**    有序集合 sorted se   消息队列

  • 6. redis RDB和AOF比较
  • 如果主要充当缓存功能,或者可以承受较长时间,比如数分钟数据的丢失, 通常生产环境一般只需启用RDB即可,此也是默认值
    如果一点数据都不能丢失,可以选择同时开启RDB和AOF一般不建议只开启AOF
  • 7. redis配置文件详解。
  • Units   配置数据单位换算关系

  • Network 网络相关
    GENERAL 通用配置
    SNAPSHOTTING 快照相关
    SECURITY 安全相关
    CLIENTS 客户端配置
    MEMORY MANAGEMENT 内存管理
    LAZY FREEING 懒惰删除
    THREADED I/O
    KERNEL OOM CONTROL 设置OOM时终止哪些进程
    APPEND ONLY MODE AOF持久化配置
    LUA SCRIPTING-LUA脚本相关
    REDIS CLUSTER 集群配置
    CLUSTER DOCKER/NAT support
    SLOW LOG 慢日志
    LATENCY MONITOR 延迟监控
    EVENT NOTIFICATION 事件通知
    GOPHER SERVER Gopher协议
    ADVANCED CONFIG 高级设置
    ACTIVE DEFRAGMENTATION 碎片整理

posted @ 2023-08-13 22:46  痛要忍着  阅读(42)  评论(0)    收藏  举报