第七周作业
- PostgreSQL与MySQL优劣对比。
PostgreSQL相对于MySQL的优势
1.PostgreSQL遵循BSD协议,这意味着使用 PostgreSQL 无任何限制。
2.可支持 C、C++、Java、PHP、Python 及 Perl 等,使您的业务开发更简单更易用。
3.PostgreSQL 是架构、语法、数据类型等与 Oracle 最接近的开源数据库。
4.兼容 SQL 标准:SQL2003,支持 SQL2011 的主要特性;
5.除了支持传统 SQL 的 LIKE 操作符、还支持 SQL99 新增的 SIMILAR TO 操作符和 POSIX 风格的正则表达式。
6.丰富的数据类型:几何、网络地址、XML、JSON、RANGE、数组等。
7.支持复合类型(自定义数据类型)。
8.支持复杂的多表 JOIN 查询 SQL:JOIN 算法支持 hash join、merge join 等。
9.支持窗口函数,可以改成复杂分析函数,因为分析函数包括了窗口函数。
10.支持函数索引、部分(行)索引、自定义索引、全文索引。
11.多进程的架构,更加稳定,单机可以支持更高访问量的数据库。
12.有功能强大,性能优秀的插件,如 PostGIS 是一个空间数据库扩展程序插件,它增加了对地理对象的支持,允许您以 SQL 运行位置查询。
13.达到商用级别,基于 Synchronous Replication 复制技术,数据做到零丢失,即使类似于资金交易系统,也可以使用 PostgreSQL。
MySQL相对于PG的优势
1.innodb的基于回滚段实现的MVCC机制,相对PG新老数据一起存放的基于XID的MVCC机制,是占优的。新老数据一起存放,需要定时触 发VACUUM,会带来多余的IO和数据库对象加锁开销,引起数据库整体的并发能力下降。而且VACUUM清理不及时,还可能会引发数据膨胀。
2.MySQL采用索引组织表,这种存储方式非常适合基于主键匹配的查询、删改操作,但是对表结构设计存在约束。
3.MySQL的优化器较简单,系统表、运算符、数据类型的实现都很精简,非常适合简单的查询操作。
4.MySQL相对于PG在国内的流行度更高,PG目前在国使用量相对少。
5.MySQL的存储引擎插件化机制,使得它的应用场景更加广泛,比如除了innodb适合事务处理场景外,myisam适合静态数据的查询场景。
二.总结pg二进制安装和编译安装。
安装方法分为两种:
二进制安装包进行安装
各linux发行版中大多都内置了PGsql的二进制安装包,但内置版本相对旧一些,对于二进制包的安装方法是通过不同发行版本的Linux下的包管理器进行的,如在THEL系统相关版本下用yum命令,在Ubuntu下用apt命令。
源码编译安装
使用源码编译安装更为灵活,用户可以有更多的选择,可以选择较新的版本、配置不同的编译选项,编译出用户喜欢的功能
利用官方源安装PGsql-12
[root@Rocky8~]#dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
禁用内置的PGsql数据库。
[root@Rocky8 ~]#dnf -qy module disable postgresql
[root@Rocky8 ~]# dnf install -y postgresql12-server
初始化数据库
[root@Rocky8 ~]# /usr/pgsql-12/bin/postgresql-12-setup initdb
启动数据库
[root@Rocky8 ~]# systemctl enable postgresql-12
Created symlink /etc/systemd/system/multi-user.target.wants/postgresql-12.service → /usr/lib/systemd/system/postgresql-12.service.
[root@Rocky8 ~]# systemctl start postgresql-12
验证成功
- 总结pg服务管理相关命令 pg_ctl 和pgsql命令选项及示例和不同系统的初始化操作。
初始化数据库 initdb -D $PGDATA #
-D 指定数据库实例的数据目录,使用环境变量PGDATA指定的路径 pg_ctl init
查看服务状态 pg_ctl status #-D
启动服务 pg_ctl -D $PGDATA -l logfile start
-D datadir#指定数据库实例的数据目录 -l #服务器日志输出到logfile中
停止数据库服务 pg_ctl stop -D $PGDATA -m #指定数据库停止方法 smart:等待所有连接终止后,关闭数据库 fast:快速关闭数据库,断开客户端的连接 immediate:立刻关闭数据库
重启服务 pg_ctl restart
加载配置 pg_ctl reload
将从服务器提升为主服务器,恢复读写操作 pg_ctl promote
psql命令 psql -h <ip or hostname> -p<端口> [数据库名称] -U [用户名称] -h #指定要连接的数据库主机名或IP地址 -p #指定连接的数据库端口
- 总结pg数据库结构组织
在一个PGsql数据库中,数据的组织结构可以分为以下五个:
- 实例:一个PGsql数据库对应一个安装目录$PGDATA,即一个instance实例.
- 数据库:一个PGsql数据库服务可以管理多个数据库,当应用连接到一个数据库时,只能访问当前数据库中的数据,而不能访问其他数据库中的数据。
默认情况下初始实例只有三个数据库:postgres;template0; template1.
- 模式:一个数据库可以创建多个不同名称空间即Schema,用于分割不同的业务数据。
- 表和索引:一个数据库可以有多个表和索引,在PGsql中表的术语称之为Relation,而在其他数据库中称之为tables.
- 行和列:每张表中有很多行和列数据,在PGsql中行的术语一般为Tuple,而在其他数据库中称之为Row.
- 实现pg远程连接。输入密码和无密码登陆。
修改用户postgres密码
在vim /var/lib/pgsql/12/data/postgresql.conf修改此项配置
在/var/lib/pgsql/12/data/pg_hba.conf配置中添加此项配置
完成配置后重启PGsql数据库服务,测试远程连接。
[root@Rocky8 ~]# psql -d postgres -h 10.0.0.18 -p 5432 -U postgres
利用.pgpass文件实现免密远程登录PGsql数据库。
Psql默认连接本机,需要指定和.Pgpass文件内容相匹配信息才可以使用.Pgpass文件连接。
[root@Rocky8 ~]# psql -U postgres -h 10.0.0.18 -d soam -w
- 总结库,模式,表的添加和删除操作。表数据的CURD。同时总结相关信息查看语句。
表的添加:
通用:CREATE DATABASE ; PostgreSQL专用:CREATEDB
表的删除:
DROP DATABASE
查看数据库相关命令:
(1)列出所有数据库:\l
(2)查看当前连接信息:\c
(3)查看详细的信息:\conninfo
(4)连接数据库:\c db_name 相当于mysql中的use
查看表和表信息命令:
(1)列出所有表,视图,序列:\d
(2)查看表信息:\dt tb_name
(3)查看表结构:\d tb_name 相当于mysl中的desc
表的CRUD:
INSERT UPDATA DELETE SELECT
注意:PostgreSQL用INSERT时,一定加上INTO。
- 总结pg的用户和角色管理。
创建用户后直接可以用密码登录。
创建角色以后需要授权才可以登录。
授权角色让其具有登录权限。
删除角色
添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zibbix库有所有权限。
postgres=#CREATE USER mage password '123456'; 创建mage用户
postgres=# create database zabbix owner mage; 创建zabbix数据库并属于mage.
postgres=# CREATE SCHEMA magedu AUTHORIZATION mage; 将mage用户的默认模式为magedu
- 总结pgsql的进程结构,说明进程间如何协同工作的。
PGsql是进程架构模型,MYsql是线程架构模型。
- Postmaster主进程
A.它是整个数据库实例的主控制进程,负责启动和关闭改数据库实例。
B.实际上在使用pg_ctl来启动数据库时,pg_ctl也是通过运行postgrestl来启动数据库的,只是它做了一些包装,更容易启动数据库。
C.它是第一个PGsql的进程,此主进程还会fork出其他子进程,并管理它们。
D.当用户和PGsql建立连接时,首先是和Postmaster进程建立连接,首先客户端会发出身份验证的信息给Postmaster进程,Postmaster进程根据消息中的信息进行身份验证判断,如果验证通过,它会fork出一个会话子进程为这个连接服务。
E.当有服务进程出现错误时,Postmaster主进程会自动完成系统的恢复。恢复过程中会停掉所有的进程,然后进行数据库的一致性恢复,待恢复完成后,数据库又可以接受新的连接。
F.验证功能是通过配置文件pg_hba.conf和用户验证模块来提供。
G.Postmaster程序是指向postagres的软连接。
- BgWriter后台写进程
- 为了提高,插入,删除和更新数据的性能,当数据更新时,并不会马上把数据持久化到数据文件中,而是先写入Buffer中。
- 改辅助进程可以周期性的把内存中的数据刷新到磁盘中。
- WaWriter预写式日志进程
- WAL是write ahead log的缩写,WAL log旧版中称为xlog相当于MYsql中的Redo log.
- 预写式日志是在修改数据之前,必须把这些修改记录到磁盘中,这样更新实际数据时,就不需要把数据实时到持久化到文件中,即使出现异常,导致部分数据没有刷新到文件中,在数据库重启时,通过读取WAL日志,把最后一部分WAL日志重新执行一遍,就能恢复到异常时的状态。
- WAL日志保存在pg_wal目录中(早期版本为pg_xlog).文件默认16MB,为了满足恢复要求,在pg_log下会产生多个日志,未持久化的数据都可以通过WAL日志来恢复,那些不需要的WAL日志将会自动覆盖。
- Checkpointer检查进程点。
- 检查点是事务序列中的点,保证在改检查点之前的日志信息都更新到文件中。
- 在检查点时,所有脏数据都冲刷到磁盘并向日志文件中写入一条特殊的检查点记录。
- 检查点进程(CKPT)在特定时间执行一个检查点,通过向数据库写入进程(BgWirter)传递消息来启动检查点请求。
- AutoVacuum自动清理进程。
- 执行删除操作时,旧数据不会被立即删除,在更新数据时,也不会在旧数据上做更新,而是新生成一行数据。旧的数据只是被标识为删除状态,在没有并发的其他事务读到这些旧数据时,它们才会被清除掉。
- Autovacuum launcher 负责回收垃圾数据的worker进程,如果开启了Autovacuum的话,Postmaster就会fork这个进程。
- Autovacuum worker负责回收垃圾数据的worker进程,是launcher进程fork出来的。
- PgStat统计数据收集进程。
- 此进程主要做数据的统计收集工作。
- 收集的信息主要用于查询优化时的代价估算。
- 系统表pg_statistic中存储了PgStat收集的各类统计信息。
- PgArch归档进程
- 默认没有此进程,开启归档功能后才会启动改进程。
- WAL日志文件会被循环利用,也就是说WAL文件会被覆盖,利用PgArxh进程会在覆盖前把WAL日志备份出来,类似于binlog,可以用来备份。
- PGsql从8.0版本开始提供了PITR技术,就是对数据库做一次全量备份后,该技术将备份时间点后面的WAL日志通过备份归档来进行备份,将来可以用数据库的全量备份再加上后面产生的WAL日志,即可把数据库向前恢复到全量备份的任意一个时间点的状态。
- Syslogger系统日志进程。
- 默认没有此进程,在配置文件postgresql.conf中将logging_collerct设置为‘on’时,主进程才会启动Syslogger辅助进程。
- 它从Postmaster主进程,所有服务进程以及其他的辅助进程收集所有的stderr输出,并将这些输出写入到日志文件中。
- Starup启动进程。
- 用户数据库恢复的进程。
- Session会话进程。
- 每一个用户发起连接后,一旦验证成功Postmaster进程就会fork一个新的子进程负责连接此用户。
- 通常表现为进程形式:postgres postgrest [local] idle
- 总结pgsql的数据目录中结构,说明每个文件的作用,并可以配上一些示例说明文件的作用。
数据库存放在环境变量PGDATA指向数据目录。这个目录在安装时指定的,所以在安装时需要指定一个合适的目录作为数据库目录的根目录,而其每一个实例都要有一个对应的目录,目录的初始化用initdb来完成。
初始化完成后,PGDATA目录下就会生成三个配置文件。
Postgresql.conf 数据库实例的主配置文件,基本上所有的配置项都在此文件中。
Pg_hba.conf 认证配置文件,配置了那些IP允许访问数据库,通过那种认证方式等。
Pg_ident.conf 认证方式ident的用户映射文件。
此外在PGDATA目录下还会生成一下子目录
base 默认表空间目录,每个数据库都对应一个base目录下的子目录,每个表和索引对应一个独立文件。
global 这个目录对应pg_golbal表空间,存放对象中的共享对象。
Pg_clog 存储事务提交状态数据。
Pg_bba.conf 数据访问控制文件。
Pg_log 数据库系统日志目录,在查询一些系统错误信息时就可以查看此目录文件中的上下文日志。
Pg_xact t提交日志commit log的目录,pg9之前是pg_clog.
Pg_multixact 共享行锁的事务状态数据。
Pg_notify 异步消息相关的状态数据,pg_serial 串行隔离级别的事务状态数据。
Pg_snaoshot 存储执行了事务snaoshot导出的状态数据pg_stat_tmp 统计信息的临时文件
Pg_subtrans 子事务数据状态。
Pg_stat 统计信息的存储目录,关闭服务时,将pg_stat_tmp目录中的内容移动至此目录实现保存。
Pg_tblsp 存储了指向各用户自建表空间实际目录的链接文件。
Pg_twophase 使用两阶段提交功能时分布事务的存储目录。
Pg_wal WAL日志的目录,早期版本目录为pg_xlog.
PG_VERSION 数据库版本信息。
Postmaster.opst 记录数据库启动时的命令行选项。
Postmaster.pid 数据库启动时的主进程信息文件,包括PID,SPGDATA目录,数据库启动时间,监听端口,socket文件路径,监听地址,共享内存的地址信息(ipsc可查看),主进程状态。
postgresql.conf 常用配置说明:
(1) listen_addresses='*' #监听客户端的地址,默认是本地的,需要修改为*或者0.0.0.0
(2) port = 5432 #pg端口,默认是5432
(3) max_connections = 2000 #最大连接数,默认100
(4) unix_socket_directories #socket文件的位置,默认在/tmp下面
(5) shared_buffers #数据缓存区,建议值1/4--1/2主机内存,和Oracle的buffer cache类似
(6) maintenance_work_mem #维护工作内存,用于vacuum,create index,reindex等。建议值 (1/4主机 内存)/autovacuum_max_workers
(7) max_worker_processes #总worker数
(8) max_parallel_workers_per_gather #单条QUERY中,每个node最多允许开启的并行计算 WORKER数
(9) wal_level #wal级别,版本11+默认是replica
(10) wal_buffers #类似Oracle的log buffer
(11) checkpoint_timeout #checkpoint时间间隔
(12) max_wal_size #控制wal的最大数量
(13) min_wal_size #控制wal的最小数量
(14) archive_command #开启归档命令,示例:'test ! -f /arch/%f && cp %p /arch/%f'
(15) autovacuum #开启自动vacuum
pg_ident.conf 配置文件使用说明:
pg_ident.conf是用户映射配置文件。结合pg_hba.conf文件,method为ident可以用特定的操作系统用 户以指定的数据库用户身份登录数据库。 这个文件记录着与操作系统用户匹配的数据库用户,如果某操作系统用户在本文件中没有映射用户,则 默认的映射数据库用户与操作系统用户同名。比如,服务器上有名为user1的操作系统用户,同时数据 库上也有同名的数据库用户user1,user1登录操作系统后可以直接输入psql,以user1数据库用户身份 登录数据库且不需密码。
数据文件说明:
PostgreSQL中的每个索引和表都是一个单独的文件,称为Segment。默认是每个大于1G的Segment会 被分割pg_class.efilenode.1这样的文件。Segment的大小可以在initdb时通过选项---withsegsize=SEGSIZE指定 注意:truncate表之后relfilenode会变。对应的物理文件名字也会变。
控制文件说明:
控制文件存放了数据库当前的状态,存放在PGDATA/global/pg_control
日志文件说明:
(1)运行日志:$PGDATA/log (pg10之前为$PGDATA/pg_log),默认不存在,需要开启配置项 logging_collector
(2)在线重做日志:$PGDATA/pg_wal (pg10之前为$PGDATA/pg_xlog)
(3)事务提交日志:$PGDATA/pg_xact (pg10之前为$PGDATA/pg_clog)
(4)服务器日志:可以在启动的时候指定:pg_ctl start -l ./logfile
十一. 尝试将pgsql新版本的运行日志存储到数据库。
将配置文件vim /var/lib/pgsql/12/data/postgresql.conf中的配置项做更改。
重启数据库服务,并创建对应的表结构。
CREATE TABLE postgres_log (log_time timestamp(3) with time zone,user_name text,database_name text,process_id integer,connection_from text,session_id text,session_line_num bigint,command_tag text,session_start_time timestamp with time zone,virtual_transation_id text,transaction_id bigint,error_severity text,sql_state_code text,message text,detail text,hint text,internal_query text,internal_query_pos integer,context text,query text,query_pos integer,location text,application_name text,backend_type text,leader_pid integer,query_id bigint,PRIMARY KEY (session_id,session_line_num) );
查看表结构
把csv文件导入到postgrst.log表中。
COPY postgres_log FROM '/var/lib/pgsql/12/data/log/postgresql-Tue.csv' WITH csv;
查询导入日志
postgres=# select * from postgres_log ;
十二. 图文并茂总结LSN和WAL日志相关概念
LSN: Log Sequence Number(日志序列号),用于记录WAL文件当前的位置,这是WAL日志唯一的,全局的标识。
WAL:日志中写入是有顺序的,所以必须记录WAL日志的写入顺序,而LSN就是负责给每条产生的WAL日志记录唯一的编号。
pg_current_wal_lsn():查看当前WAL日志的写入位置
pg_walfile_name(pg_current_wal_lsn()):查看WAL日志文件的名称
pg_walfile_NAME_OFFSET(pg_current_wal_lsn()):查看WAL日志的偏移量
pg_ls_waldir ():查看WAL目录中的普通文件名称,大小和最后修改时间
pg_switch_wal ():强制生成新的WAL日志文件
pg_create_restore_point ( name text ):创建恢复点
pg_current_xact_id ():返回当前事务ID
WAL日志的LSN编号规则:
高32位/低32位。
WAL文件名称为16进制的24个字符组成,每8个字符一组。
每组的意义如下:
00000000 00000001 000000001
时间戳 逻辑ID 物理ID
其中前8位:表示timeline
中间8位:表示logid 即LSN高32位
最后8位:表示logseg 即LSN低32位。
查看当前LSN
select pg_current_wal_lsn();
查看WAL日志文件的名称
postgres=# SELECT pg_walfile_name(pg_current_wal_lsn());
十三. 实现WAL日志多种类型的备份,及数据还原。
归档日志记录的是checkpoint前的WAL日志,即数据的历史日志,即把pg_wal里面的在线日志备份出来,功能上归档日志相当于MYsql的二进制日志。
生产环境中为了保证数据的高可用,通常需要开启归档,当系统故障后可以通过归档的日志文件对数据进行恢复。
配置归档需要开启如下参数:
本地归档备份:
archive_mode = on 表示打开归档备份
archive_command = `cp %p /var/lib/pgsql/%f` 配置一个Unix的cp命令,%p表示在线WAL日志文件的全路径名称;%f 表示不包括路劲的WAL日志文件名。
远程归档备份
archive_mode = on
archive_command = `scp %p postgres@10.0.0.8:/var/lib/pgsql/%f`
1.逻辑备份及还原:pg_dump和pg_dumpall工具
(1)pg_dump 默认文本格式的备份和还原(远程):指定单个数据库进行备份和还原
#本地主机(rocky):10.0.0.10 远程主机(ubuntu):10.0.0.20
#在远程主机上创建/backup文件夹及更改所属者和所属组
root@ubuntu2004 ~]#mkdir /backup/;chown postgres. /backup/
#在远程主机上备份hellodb数据库,备份格式为默认的文本格式
postgres@ubuntu2004:~$ pg_dump -h 10.0.0.10 -U postgres -C -f /backup/hellodb2 hellodb
#模拟删掉本地主机上的hellodb数据库
postgres=# drop database hellodb ;
#远程恢复数据库
postgres@ubuntu2004:~$ psql -h 10.0.0.10 -U postgres -f /backup/hellodb2
(2)pg_dump为定制格式的备份和还原(远程):指定单个数据库进行备份和还原
#本地主机(rocky):10.0.0.10 远程主机(ubuntu):10.0.0.20
#在远程主机上创建/backup文件夹及更改所属者和所属组
root@ubuntu2004 ~]#mkdir /backup/;chown postgres. /backup/
#在远程主机上进行hellodb数据库的备份,备份文件的格式为定制格式
postgres@ubuntu2004:~$ pg_dump -Fc -h 10.0.0.10 -U postgres -C -f /backup/hellodb3 hellodb
#查看一下格式
postgres@ubuntu2004:/backup$ file hellodb3
hellodb3: PostgreSQL custom database dump - v1.14-0
#用psql命令先从远程主机上给本地主机创建一个hellodb3的数据库
postgres@ubuntu2004:~$ psql -h 10.0.0.10 -U postgres -c 'create database hellodb3'
CREATE DATABASE
#从远程主机上恢复数据
postgres@ubuntu2004:~$ pg_restore -h 10.0.0.10 -U postgres -d hellodb3 /backup/hellodb3
(3)pg_dumpall 备份全部数据库:
#备份全部数据库,每个数据库都需要输入密码,有N个数据库,就需要输入N次密码
pg_dumpall -h 10.0.0.10 -U postgres -f /backup/full_backup.sql
#恢复
psql -h 10.0.0.10 -U postgres -f /backup/full_backup.sql
2.完全备份和恢复:
******************************备份*******************************
#本地主机(rocky):10.0.0.10 远程主机(ubuntu):10.0.0.20
#更改配置文件,允许所有用户连接
[root@Rocky8 ~]#vim /pgsql/data/postgresql.conf
listen_addresses = '*'
#允许远程用户可以用流复制的方式备份数据库。
[root@Rocky8 ~]#vim /pgsql/data/pg_hba.conf
# IPv4 local connections:
host all all 0.0.0.0/0 md5
# replication privilege.
host replication all 0.0.0.0/0 md5
#重启服务
[postgres@Rocky8 ~]$ pg_ctl restart
#创建备份文件夹及更改所属者和所属组。注意:文件夹必须为空。
root@ubuntu2004 ~]#mkdir -p /backup/pgdata/
root@ubuntu2004 ~]#chown postgres. /backup/pgdata/
#开始备份
postgres@ubuntu2004:~$ pg_basebackup -D /backup/pgdata -Ft -U postgres -h 10.0.0.10 -p 5432 -R
Password: #输入密码
#查看备份文件
postgres@ubuntu2004:~$ ll /backup/pgdata/
total 50384
-rw------- 1 postgres postgres 182456 Jan 28 9:56 backup_manifest
-rw------- 1 postgres postgres 34616832 Jan 28 9:56 base.tar
-rw------- 1 postgres postgres 16778752 Jan 28 9:56 pg_wal.tar
**********************还原***********************************
#创建存放归档日志的文件夹及更改所属者和所属组
root@ubuntu2004 ~]#mkdir /archive ; chown postgres. /archive
#模拟删掉原数据库文件
root@ubuntu2004 ~]#rm -rf /pgsql/data/*
#把base.tar文件解压缩到数据库的文件夹下
root@ubuntu2004 ~]#tar xf /backup/pgdata/base.tar -C /pgsql/data/
#把pg_wal.tar文件解压缩到/archive文件夹下
root@ubuntu2004 ~]#tar xf /backup/pgdata/pg_wal.tar -C /archive/
#修改postgresql.conf配置文件,修改两行参数。
root@ubuntu2004 ~]#vim /pgsql/data/postgresql.conf
restore_command = 'cp /archive/%f %p'
recovery_target = 'immediate'
#启动数据库,数据已还原
postgres@ubuntu2004:~$ pg_ctl start
十四.实现WAL日志完成主从流复制,要求在从节点上进行crontab数据备份,同时手工让主节点宕机,让从节点切换为主节点,并添加新的从节点。
两个主机节点
Master:10.0.0.38
Standby:10.0.0.48
Master节点配置
创建复制的用户并授权
postgres=# create role repluser with replication login password'123456';
修改pg_hba.conf配置进行授权
修改pg_postgresql.conf相关配置项
Standby节点配置
备份主数据库到备库
[root@Rocky8 ~]# pg_basebackup -D /pgsql/bachup/ -Ft -Pv -U repluser -h 10.0.0.38 -p 5432 -R
还原备份的数据到备库
修改postgrsql.conf配置文件
primary_conninfo = 'host=10.0.0.38 prot=5432 user=repluser password=123456'
restore_command = 'cp /archive/%f %p'
修改相关配置
十五. 总结日志记录的内容包含什么
历史事件:时间,地点,人物,事件
日志级别:事件的关键性程度,Loglevel
十六. 总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。
(1)日志分类:
#内置分类
Faclility:设施,从功能或程序上对日志进行分类。
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog #自定义的分类
local0-local7
(2)优先级别:
Priority优先级别,从低到高排序。
debug,info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
十七. 总结rsyslog配置文件格式。
/etc/rsyslog.conf配置文件格式:由三部分组成
- MODULER:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置。
RULESPES配置格式:
Facility.priorty;facility.priority……target
Facility格式
* #所有的facility
Facility1,facility2,facility3,….. 指定的facility列表。
Priority格式:
*: 所有级别
None: 没有级别,即不记录。
PRIORITY: 指定级别(含)以上的所有级别。
= PRIORITY:仅记录指定级别的日志信息。
Target格式:
文件路劲:通常在/var/log/,文件路径前的-表示异步写入。
用户:将日志事件通知给指定用户,*表示登录的所有用户。
日志服务器:@host把日志传送给指定的远程UDP日志服务器,@@host将日志传送给指定的TCP日志服务器。
管道: | COMMAND ,转发给其他命令处理。
十八. 完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
修改sshd服务的配置文件。
新建一个配置文件,用来专门存放和ssh相关的日志。
重启sshd服务和rsyslog服务
[root@Rocky8 ~]# systemctl restart sshd rsyslog.service
查/var/log/ssh.log日志
十九. 完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件.
集中日志服务器:rsyslog-server 10.0.0.18
三台服务器:10.0.0.8;10.0.0.28;10.0.0.38;
修改集中日志服务器的配置
新建一个配置文件,用来专门存放和ssh相关的日志。
重启rsyslog服务,并且查看服务端口
另外三台服务器修改日志服务配置,并且重启服务
在集中日志服务器查看
二十. 总结/var/log/目录下常用日志文件作用。
/var/log/secure 系统安全日志,文本格式,应周期性分析。
/var/log/btmp 当前系统上,用户的失败尝试登录相关的日志,二进制格式,lastb可进行查看。
/var/log/wtmp 当前系统上,用户正常登录的相关日志信息,二进制格式,last可进行查看。
/var/log/lastlog 每一个用户最近一次的登录信息,二进制格式,lastlog可进行查看。
/var/log/dmesg Centos7之前版本系统引导过程的日志信息,文本格式,开机后的硬件变化不在记录,也可以通过命令dmesg查看,可持续查看硬件变化的信息。
/var/log/boot.log 系统启动的相关信息,文本格式。
/var/log/messages 系统中的大部分日志信息。
/var/log/anaconda anaconda的日志信息。
二十一. 总结journalctl命令的选项及示例
Centos7版以后,利用Systemd来统一管理所有的Unit的启动日志,带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)
日志的配置文件
/etc/systemd/journald.conf
Journalctl [options….] [MATCHES….]
查看所有日志(默认情况下只保存本次启动的日志)
Journalctl
查看内核日志(不显示应用日志)
Journalctl –k
查看系统本次启动的日志
Journalctl –b
Journalctl –b -0
查看上一次启动的日志(需更改设置)
查看指定时间的日志
journalctl --since='2023-8-15 07:00:00'
journalctl –since '20 min ago'
journalctl –since 'yesterday'
journalctl –since '2023-8-10 07:00:00' –until '2023-8-15 07:00:00'
journalctl –since 09:00 –until ‘1 hour ago’ journalctl
显示尾部最新10行日志
Journalctl –n
显示尾部指定行数的日志
Journalctl –n 20
实时动态显示日志
Journalctl –f
查看指定服务的日志
Journalctl /usr/lib/system/system
查看指定进程的日志
Journalctl _PID=1000
查看某个路劲的脚本日志
Journalctl /usr/bin/bash
查看指定用户的日志
Journalctl _UID=1000 –since tody
查看某个Unit的日志
Journalctl -u nginx.server
Journalctl -u nginx.server –since today
合并显示多个Unit的最新日志
Journalctl -u nginx.server –u php-fpm.server --since today
查看指定优先级(及以上级别)的日志,共有8级。
0:emerg
1: alert
2:crit
3:err
4:warning
5:notice
6:info
7:debug
日志默认分页输出,--no-pager 改为正常的标准输出。
Journalctl –-no-pager
日志管理Journalctl
以json格式(单行)输出
Journalctl –b –u nginx.server –o json
以json格式(多行)输出,可读性更好
Journalctl –b –u nginx.server –o json-pretty
显示日志占据的硬盘空间
Journalctl –disk-usage
指定日志占据的最大空间
Journalctl --vacuum-size=1G
指定日志文件保存多久
Journalctl –vacuum-time=1years
二十二. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中
提供MYSQL服务的主机10.0.0.8
日志集中管理的主机10.0.0.18
远程主机10.0.0.28;10.0.0.38
在MYSQL主机上安装数据库及做相关配置
[root@Rocky8 ~]# yum install mysql-server
启动数据库服务
创建用户和授权,并将SQL脚本导入。
mysql> create user rsyslog@'10.0.0.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
mysql> grant all on Syslog.* to rsyslog@'10.0.0.%';
Query OK, 0 rows affected (0.01 sec)
mysql> source /opt/mysql-createDB.sql
Query OK, 1 row affected (0.00 sec)
Database changed
Query OK, 0 rows affected (0.06 sec)
Query OK, 0 rows affected (0.19 sec)
mysql>
在10.0.0.18上安装数据库日志模块
将所需要的脚本复制到MYSQL数据库。
配置rsyslog的远程存储配置。
module(load="ommysql")
*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.8,Syslog,rsyslog,123456
查看数据库中记录的日志信息
二十三. 尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。
创建一个nginx应用的转储文件(测试用的)
[root@Rocky8 ~]#vim /etc/logrotate.d/nginx
/var/log/nginx.log {
daily #每天转储
rotate 90 #转储的次数
size 3M #每个文件大小为3M
dateext #旧文件带日期
missingok #日志不存在,不提示错误,继续处理下一个
notifempty #空文件不转储
compress #压缩
delaycompress #延时压缩
# create 644 nginx nginx #转储旧文件以后,创建新的文件并更改对应的属性
# postrotate
# if [ -f /apps/nginx/logs/nginx.pid ]; then #针对nginx特有的设置
# kill -USR1 `cat /apps/nginx/logs/nginx.pid` #针对nginx特有的设置
# if
# endscript
}
在/var/log/nginx中写入一个4M的文件
[root@Rocky8 ~]#dd if=/dev/zero of=/var/log/nginx.log bs=4M count=1
测试转储功能
[root@Rocky8 ~]#/usr/sbin/logrotate /etc/logrotate.d/nginx
查看转储文件
[root@Rocky8 ~]#ll /var/log/nginx.log-20230816
-rw-r--r-- 1 root root 4194304 Jan 31 11:09 /var/log/nginx.log-20230816
二十四. 总结DAS, NAS, SAN区别,使用场景
SAN与NAS的主要区别体现在文件系统所在的位置。
三种存储架构的应用场景
DAS虽然比较古老,但还是很适用于哪些数据量不大,对磁盘访问速度要求较高的中小企业。
NAS 多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成本低。
SAN适用于大型应用或数据库系统,成本高,较为复杂。
二十五. 实现nfs共享/data/nfs目录,所有压缩为666用户。并配置其他虚拟机自动挂载。
共三台主机
一台主机nfs server 10.0.0.8
另外两台nfs client 10.0.0.18;10.0.0.28
NFS服务器创建用户和相应的家目录,将/data/nfs目录共享
在NFS客户端机器上安装服务
创建用户,并将挂载写到配置文件中
执行挂载,并查看是否成功
二十六. 总结inotify原理,命令及使用
工作原理:
要利用监控服务(inotify),监控同步数据服务器目录中信息的变化。
发现目录中数据产生变化,就利用rsync服务推送到备份服务器上。
Inotify-tools包主要工具
Inotifywait 在被监控的文件或目录上等待特定事件的发生,常用于实时同步目录的监控。
Inotifywatch 收集被监控的文件系统使用的统计数据,指文件系统事件发生的次数。
二十七. 总结rsync原理,命令及ssh命令和rsync协议使用。完成目录文件同步。
Rsync常用于作为linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH,rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或sersync,可实现触发时的数据实时同步。
在备份服务器上启动rsync进程
[root@18 ~]# rsync --daemon
Failed to parse config file: /etc/rsyncd.conf
[root@18 ~]# touch /etc/rsyncd.conf
[root@18 ~]# rsync --daemon
[root@18 ~]# ss -ntl | grep rsync
[root@18 ~]# ss -ntlp | grep rsync
LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=9173,fd=4))
LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=9173,fd=5))
[root@18 ~]#
访问rsync的共享目录
二十八. 总结sersync的配置,同时基于sersync替换inotify+rsync.
Sersync类似于inotify,同样用于监控,但它克服了inotify的缺点
将sersync软件下载到服务器,并且将解压的文件拷贝到相应目录,设置PATH变量
[root@8 opt]# tar -xzvf sersync2.5.4_64bit_binary_stable_final.tar.gz
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml
[root@8 opt]# cp -a GNU-Linux-x86/ /usr/local/sersync
[root@8 opt]# echo 'PATH=/usr/local/sersync:$PATH' > /etc/profile.d/sersync.sh
[root@8 opt]# source /etc/profile.d/sersync.sh
创建连接rsync服务器的用户密码文件,并修改权限。
查看帮助
修改sersync配置文件
以后台方式执行同步
[root@8 opt]# sersync2 -dro /usr/local/sersync/confxml.xml
在远程主机查看文件同步成功

浙公网安备 33010602011771号