第七周作业

1. 总结pg和mysql的优劣势。

特性MySQLPostgreSQL
实例通过执行 MySQL 命令(mysqld)启动实例。一个实例可以管理一个或多个数据库。一台服务器可以运行多个 mysqld 实例。一个实例管理器可以监视 mysqld 的各个实例。
通过执行 Postmaster 进程(pg_ctl)启动实例。一个实例可以管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中。使用 initdb 创建第一个数据库。一台机器上可以启动多个实例。
数据库数据库是命名的对象集合,是与实例中的其他数据库分离的实体。一个 MySQL 实例中的所有数据库共享同一个系统编目。数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目,但是所有数据库共享 pg_databases。
数据缓冲区通过 innodb_buffer_pool_size 配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB 使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高可以设置为机器物理内存量的 80%。Shared_buffers 缓存。在默认情况下分配 64 个缓冲区。默认的块大小是 8K。可以通过设置 postgresql.conf 文件中的 shared_buffers 参数来更新缓冲区缓存。
数据库连接客户机使用 CONNECT 或 USE 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。使用角色管理数据库中的用户和用户组。客户机使用 connect 语句连接数据库,这时要指定数据库名,还可以指定用户 id 和密码。使用角色管理数据库中的用户和用户组。
身份验证MySQL 在数据库级管理身份验证。 基本只支持密码认证。PostgreSQL 支持丰富的认证方法:信任认证、口令认证、Kerberos 认证、基于 Ident 的认证、LDAP 认证、PAM 认证
加密可以在表级指定密码来对数据进行加密。还可以使用 AES_ENCRYPT 和 AES_DECRYPT 函数对列数据进行加密和解密。可以通过 SSL 连接实现网络加密。可以使用 pgcrypto 库中的函数对列进行加密/解密。可以通过 SSL 连接实现网络加密。
审计可以对 querylog 执行 grep。可以在表上使用 PL/pgSQL 触发器来进行审计。
查询解释使用 EXPLAIN 命令查看查询的解释计划。使用 EXPLAIN 命令查看查询的解释计划。
备份、恢复和日志InnoDB 使用写前(write-ahead)日志记录。支持在线和离线完全备份以及崩溃和事务恢复。需要第三方软件才能支持热备份。在数据目录的一个子目录中维护写前日志。支持在线和离线完全备份以及崩溃、时间点和事务恢复。 可以支持热备份。
JDBC 驱动程序可以从 参考资料 下载 JDBC 驱动程序。可以从 参考资料 下载 JDBC 驱动程序。
表类型取决于存储引擎。例如,NDB 存储引擎支持分区表,内存引擎支持内存表。支持临时表、常规表以及范围和列表类型的分区表。不支持哈希分区表。 由于PostgreSQL的表分区是通过表继承和规则系统完成了,所以可以实现更复杂的分区方式。
索引类型取决于存储引擎。MyISAM:BTREE,InnoDB:BTREE。支持 B-树、哈希、R-树和 Gist 索引。
约束支持主键、外键、惟一和非空约束。对检查约束进行解析,但是不强制实施。支持主键、外键、惟一、非空和检查约束。
存储过程和用户定义函数支持 CREATE PROCEDURE 和 CREATE FUNCTION 语句。存储过程可以用 SQL 和 C++ 编写。用户定义函数可以用 SQL、C 和 C++ 编写。没有单独的存储过程,都是通过函数实现的。用户定义函数可以用 PL/pgSQL(专用的过程语言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 编写。
触发器支持行前触发器、行后触发器和语句触发器,触发器语句用过程语言复合语句编写。支持行前触发器、行后触发器和语句触发器,触发器过程用 C 编写。
系统配置文件my.confPostgresql.conf
数据库配置my.confPostgresql.conf
客户机连接文件my.confpg_hba.conf
XML 支持有限的 XML 支持。有限的 XML 支持。
数据访问和管理服务器OPTIMIZE TABLE —— 回收未使用的空间并消除数据文件的碎片
myisamchk -analyze —— 更新查询优化器所使用的统计数据(MyISAM 存储引擎)
mysql —— 命令行工具
MySQL Administrator —— 客户机 GUI 工具
Vacuum —— 回收未使用的空间
Analyze —— 更新查询优化器所使用的统计数据
psql —— 命令行工具
pgAdmin —— 客户机 GUI 工具
并发控制支持表级和行级锁。InnoDB 存储引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 语句在事务级设置隔离级别。支持表级和行级锁。支持的 ANSI 隔离级别是 Read Committed(默认 —— 能看到查询启动时数据库的快照)和 Serialization(与 Repeatable Read 相似 —— 只能看到在事务启动之前提交的结果)。使用 SET TRANSACTION 语句在事务级设置隔离级别。使用 SET SESSION 在会话级进行设置。
 



MySQL相对于PostgreSQL的劣势:

MySQLPostgreSQL
最重要的引擎InnoDB很早就由Oracle公司控制。目前整个MySQL数据库都由Oracle控制。BSD协议,没有被大公司垄断。
对复杂查询的处理较弱,查询优化器不够成熟很强大的查询优化器,支持很复杂的查询处理。
只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash join)。都支持
性能优化工具与度量信息不足
 
提供了一些性能视图,可以方便的看到发生在一个表和索引上的select、delete、update、insert统计信息,也可以看到cache命中率。网上有一个开源的pgstatspack工具。
 

InnoDB的表和索引都是按相同的方式存储。也就是说表都是索引组织表。这一般要求主键不能太长而且插入时的主键最好是按顺序递增,否则对性能有很大影响。

不存在这个问题。

大部分查询只能使用表上的单一索引;在某些情况下,会存在使用多个索引的查询,但是查询优化器通常会低估其成本,它们常常比表扫描还要慢。

不存在这个问题

表增加列,基本上是重建表和索引,会花很长时间。

表增加列,只是在数据字典中增加表定义,不会重建表

存储过程与触发器的功能有限。可用来编写存储过程、触发器、计划事件以及存储函数的语言功能较弱

除支持pl/pgsql写存储过程,还支持perl、python、Tcl类型的存储过程:pl/perl,pl/python,pl/tcl。

也支持用C语言写存储过程。

不支持Sequence。

支持

不支持函数索引,只能在创建基于具体列的索引。

不支持物化视图。

支持函数索引,同时还支持部分数据索引,通过规则系统可以实现物化视图的功能。

执行计划并不是全局共享的, 仅仅在连接内部是共享的。

执行计划共享

MySQL支持的SQL语法(ANSI SQL标准)的很小一部分。不支持递归查询、通用表表达式(Oracle的with 语句)或者窗口函数(分析函数)。


 

都 支持

不支持用户自定义类型或域(domain)

支持。

对于时间、日期、间隔等时间类型没有秒以下级别的存储类型

可以精确到秒以下。

身份验证功能是完全内置的,不支持操作系统认证、PAM认证,不支持LDAP以及其它类似的外部身份验证功能。

支持OS认证、Kerberos 认证 、Ident 的认证、LDAP 认证、PAM 认证

不支持database link。有一种叫做Federated的存储引擎可以作为一个中转将查询语句传递到远程服务器的一个表上,不过,它功能很粗糙并且漏洞很多

有dblink,同时还有一个dbi-link的东西,可以连接到oracle和mysql上。

Mysql Cluster可能与你的想象有较大差异。开源的cluster软件较少。

复制(Replication)功能是异步的,并且有很大的局限性.例如,它是单线程的(single-threaded),因此一个处理能力更强的Slave的恢复速度也很难跟上处理能力相对较慢的Master.

有丰富的开源cluster软件支持。

explain看执行计划的结果简单。

explain返回丰富的信息。

类似于ALTER TABLE或CREATE TABLE一类的操作都是非事务性的.它们会提交未提交的事务,并且不能回滚也不能做灾难恢复

DDL也是有事务的。

PostgreSQL主要优势:
  1. PostgreSQL完全免费,而且是BSD协议,如果你把PostgreSQL改一改,然后再拿去卖钱,也没有人管你,这一点很重要,这表明了PostgreSQL数据库不会被其它公司控制。oracle数据库不用说了,是商业数据库,不开放。而MySQL数据库虽然是开源的,但现在随着SUN被oracle公司收购,现在基本上被oracle公司控制,其实在SUN被收购之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的数据都是放在InnoDB引擎中的,反正我们公司都是这样的。所以如果MySQL的市场范围与oracle数据库的市场范围冲突时,oracle公司必定会牺牲MySQL,这是毫无疑问的。
  2. 与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy等等,很容易做读写分离、负载均衡、数据水平拆分等方案,而这在MySQL下则比较困难。
      3. PostgreSQL源代码写的很清晰,易读性比MySQL强太多了,怀疑MySQL的源代码被混淆过。所以很多公司都是基本PostgreSQL做二次开发的。
      4. PostgreSQL在很多方面都比MySQL强,如复杂SQL的执行、存储过程、触发器、索引。同时PostgreSQL是多进程的,而MySQL是线程的,虽然并发不高时,MySQL处理速度快,但当并发高的时候,对于现在多核的单台机器上,MySQL的总体处理性能不如PostgreSQL,原因是MySQL的线程无法充分利用CPU的能力。


2.  总结pg二进制安装和编译安装。

# 二进制安装
dnf install -y 下载链接

# 禁用内置的postgresql
dnf -qy module disable postgresql
dnf install -y postgresql12-server

# 初始化数据库
/usr/pgsql-12/bin/postgresql-12-setup initdb

# 启动服务
systemctl enable --now postgresql-12

# 验证成功
sodu -u postgresql psql -c "SELECT version();"
su - postgres

# 源码安装
# 安装依赖包
rocky·:yum -y install gcc make readline-devel zlib-devel

Ubuntu: 
apt update
apt -y install gcc make readline-devel zlib-devel

https://www.postgresql.org/ftp/source/右键单击,复制链接
wget +链接
[root@localhost ~]# wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.gz

解压
[root@localhost ~]# tar xf postgresql-14.2.tar.gz

 cd postgresql-14.2
 [root@localhost postgresql-14.2]# cat INSTALL |less
 Short Version

    ./configure
    make
    su
    make install
    adduser postgres
    mkdir /usr/local/pgsql/data
    chown postgres /usr/local/pgsql/data
    su - postgres
    /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
    /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l logfile start
    /usr/local/pgsql/bin/createdb test
    /usr/local/pgsql/bin/psql test

The long version is the rest of this document.

mkdir /apps
mkdir /apps/pgsql
 [root@localhost postgresql-14.2]# ./configure --prefix=/apps/pgsql
不包含文档和其他模块
[root@localhost postgresql-14.2]# make -j 2 world
不包括安装文档
[root@localhost postgresql-14.2]# make install-world
创建用户
useradd -s /bin/bash -m -d /home/postgres postgres
修改密码
echo -e '111111\n111111' |passwd postgres

创建目录
[root@localhost postgresql-14.2]# mkdir -pv /pgsql/data/
修改所有者
[root@localhost postgresql-14.2]# chown -R postgres. /pgsql/data/
[root@localhost postgresql-14.2]# ll -d /pgsql/data/
drwxr-xr-x. 2 postgres postgres 6 Mar  9 12:07 /pgsql/data/

# 配置环境变量
vim /etc/profile.d/pgsql.sh
export PGHOME=/apps/pgsql
export PATH=$PGHOME/bin/:$PATH
export PGDATA=/pgsql/data
export PGUSER=postgres
export MANPATH=/apps/pgsql/share/man:$MANPATH
让他生效:
[root@localhost postgresql-14.2]# . /etc/profile.d/pgsql.sh

切换用户
[root@localhost postgresql-14.2]# su - postgres
直接initdb也可以
[postgres@localhost ~]$ initdb -D /pgsql/data

# 启动
[postgres@localhost ~]$ pg_ctl -l logfile start

# 配置开机自启
[root@localhost ~]# vim /lib/systemd/system/postgresql.service
[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
User=postgres
Group=postgres

ExecStart=/apps/pgsql/bin/postmaster -D /pgsql/data
ExexReload=/bin/kill -HUP

[Install]
WantedBy=multi-user.target

[root@localhost ~]# systemctl daemon-reload
[root@localhost system]# systemctl enable --now  postgresql.service


3. 总结pg服务管理相关命令 pg_ctl 和pgsql命令选项及示例和不同系统的初始化操作

pg_ctl命令管理

  • 初始化PostgreSQL数据库实例
  • 启动、终止和重启PostgreSQL数据库服务
  • 查看PostgreSQL数据库服务的状态
  • 让数据库实例重新读取配置文件,允许给一个指定的PostgreSQL进程发送信号
  • 控制standby服务器为可读写
  • 在window平台下允许为数据库实例注册或取消一个系统服务

psql常用命令选项
\h      查看sql语法
\?      命令行操作的帮助
Tab键可以补全目录
\i sql文件     执行sql文件
\l      列出所有的数据库
\dn     列出所有schema
\db     显示所有表空间(pg中的表空间是一个目录,表放在表空间相当于将表的数据文件放到该目录之下)
\d     查看当前schema 中所有的表、视图、序列
\d+   同上,但是多额外信息,下面几个命令都有带+版,能看到更详细的信息
\d schema.obj   查看对象结构(相当于desc)
\dt     只显示匹配的表
\di     只显示匹配的索引
\ds     只显示序列
\dv     只显示视图
\df      只显示函数
\sf 函数名   查看函数定义
\du 或 \dg   列出数据库中所有角色或用户(pg中是一样的)
\dp 或 \z 表名   显示表的权限分配情况
\x      横纵显示切换 (类似mysql \G)
\dT+   显示扩展类型相关属性及描述
\q      退出pg命令行
\z 或 \dp 表名    显示表的权限分配情况
\timing    显示执行时间
\watch 5    每五秒循环执行sql语句
\c dbname      切换数据库
\conninfo   查看连接信息
\echo 字符串  输出一行信息
\encoding 字符集名      设置客户端字符集
\set [NAME [VALUE]]    设置内部变量,不加参数则列出内部变


4. 总结pg数据库结构组织

实例:一个PostgreSQL对应一个安装的数据目录$PGDATA,即一个instance实例。
数据库:一个PostgreSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他数据库中的内容。
模式:一个数据库可以创建多个不同的名称空间即Schema,用于分隔不同的业务数据。
表和索引:一个数据库可以有多个表和索引。
行和列:每张表中有很多列和行数据。


5.  实现pg远程连接。输入密码和无密码登陆

psql -h 10.0.0.137 -p 5432 +数据库名 -U +用户名

[postgres@localhost ~]$ vim /pgsql/data/postgresql.conf
listen_addresses = '0.0.0.0'
[postgres@localhost ~]$ pg_ctl restart
[postgres@localhost ~]$ vim /pgsql/data/pg_hba.conf
host    all             all             0.0.0.0/0                md5
[postgres@localhost ~]$ pg_ctl restart

[root@localhost ~]# psql -h 10.0.0.137 -p  5432 postgres postgres


vim .pgpass
#hostname:port:database:username:password
10.0.0.137:5432:postgres:postgres:111111
[root@localhost ~]# chmod 600 .pgpass
连接:
[postgres@localhost ~]$ psql -h 10.0.0.137 db1 postgres


6.  总结库,模式,表的添加和删除操作。表数据的CURD。同时总结相关信息查看语句。

创建数据库
create database db1;
删除数据库
drop database db1;
查看oid的编号
postgres=# select oid,datname from pg_database;
  oid  |  datname
-------+-----------
 13025 | postgres
 16384 | db1
     1 | template1
 13024 | template0
(4 rows)
得到oid可以知道数据库所在的文件夹
[root@localhost ~]# ls /pgsql/data/base/
1  13024  13025  16384


7. 总结pg的用户和角色管理。

  • 角色
    PostgreSQL使用角色的概念管理数据库访问权限。 根据角色自身的设置不同,一个角色可以看做是一个数据库用户,或者一组数据库用户。 角色可以拥有数据库对象(比如表)以及可以把这些对象上的权限赋予其它角色, 以控制谁拥有访问哪些对象的权限。
    操作角色的语句:
    create role db_role1; /--创建角色/
    drop role db_role1; /--删除角色/
    select rolename from pg_roles; /--查看所有角色/
    /du --在命令格式下查看所有角色的命令

  • 角色的权限
    一个数据库角色可以有很多权限,这些权限定义了角色和拥有角色的用户可以做的事情。
    create role db_role1 LOGIN; --创建具有登录权限的角色db_role1
    create role db_role2 SUPERUSER; --创建具有超级用户权限的角色
    create role db_role3 CREATEDB; --创建具有创建数据库权限的角色
    create role db_role4 CREATEROLE --创建具有创建角色权限的角色
    alter role db_role1 nologin nocreatedb; --修改角色取消登录和创建数据库权限

  • 用户
    其实用户和角色都是角色,只是用户是具有登录权限的角色。
    create user db_user1 password '123'; --创建用户
    create role db_user1 password '123' LOGIN; --同上一句等价
    drop user db_user1; --删除用户
    alter user db_user1 password '123456'; --修改密码
    alter user db_user1 createdb createrole; --对用户授权

  • 赋予角色控制权限
    我们可以使用GRANT 和REVOKE命令赋予用户角色,来控制权限。
    create user db_user1; --创建用户1
    create user db_user2; --创建用户2
    create role db_role1 createdb createrole; --创建角色1
    grant db_role1 to db_user1,db_user2; --给用户1,2赋予角色1,两个用户就拥有了创建数据库和创建角色的权限
    revoke db_role1 from db_user1; --从用户1移除角色1,用户不在拥有角色1的权限


8. 添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zabbix库有所有权限。

# 创建数据库
create database zabbix;

# 创建模式
create schema magedu;

# 创建用户
create user mage;

alter schema magedu owner to mage;
alter database zabbix owner to mage;


9. 总结pgsql的进程结构,说明进程间如何协同工作的。

Postgresql使用多进程架构实现(Mysql为多线程),PG启动时会拉起守护进程,然后由守护进程fork相关的后台辅助进程。守护进程的另一个作用是监听客户端的连接请求,当client发起连接时,守护进程会fork服务进程来处理client发送过来的命令,每有一个连接,后台就会存在一个服务进程


10. 总结pgsql的数据目录中结构,说明每个文件的作用,并可以配上一些示例说明文件的作用。

pgsql的数据目录结构:
PG_VERSION    pg服务器主版本号文件
base/    数据库目录都在此目录下
global/    数据库集簇范围的表(比如pg_database, 类似mysql的performance_schema)
pg_commit_ts/    事物提交的时间戳数据
pg_dynshmem/    动态共享内存子系统中使用的文件
pg_hba.conf    控制pg客户端认证配置的文件
pg_ident.conf    pg用户映射文件
pg_logical/    逻辑解码的状态数据
pg_multixact/    多事务状态数据
pg_notify/    Listen/Notify状态数据
pg_replslot/    复制槽数据
pg_serial/    已提交的可串行化事务相关信息
pg_snapshots/    快照信息
pg_stat/    统计子系统的永久文件
pg_stat_tmp/    统计子系统的临时文件
pg_subtrans/    子事务状态数据
pg_tblspc/    指向表空间的符号链接
pg_twophase/    两阶段事务的状态文件
pg_wal/    WAL文件
pg_xact/    事务提交状态数据
postgresql.auto.conf    存储使用alter system修改的配置
postgresql.conf    配置文件
postmaster.opts    记录服务器上一次启动的命令行选项
postmaster.pid    服务器pid文件


11.  尝试将pgsql新版本的运行日志存储到数据库。

13版本
[root@ubuntu1804 ~]$vim /pgsql/data/postgresql.conf 
​
log_destination = 'csvlog'                                   
logging_collector = on          # Enable capturing of stderr and csvlog
                           
[root@ubuntu1804 ~]$pg_ctl restart                          
                           
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_transaction_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,
  PRIMARY KEY (session_id, session_line_num)
)
​
copy postgres_log from '/pgsql/data/log/postgresql-2023-03-30_000301.csv' with csv;


12. 图文并茂总结LSN和WAL日志相关概念

LSN:用于记录WAL文件当前的位置,这是WAL日志唯一的、全局的标识。
WAL日志中写入是有顺序的,所以必须得记录WAL日志的写入顺序。而LSN就是负责给每条产生的WAL日志记录唯一的标号


13. 实现WAL日志多种类型的备份,及数据还原。

[root@localhost ~]# mkdir /archive
[root@localhost ~]# chown  postgres. /archive

#1.开启日志归档功能
[root@localhost ~]# vim /pgsql/data/postgresql.conf
archive_mode = on 
archive_command = '[ ! -f archive/%f ] && cp %p /archive/%f'
hellodb=# select pg_switch_wal();
 pg_switch_wal
---------------
 0/30000F0
(1 row)

hellodb=# select pg_walfile_NAME_OFFSET(pg_current_wal_lsn());
    pg_walfile_name_offset
-------------------------------
 (000000010000000000000004,96)
(1 row)
[postgres@localhost ~]$ ll /archive/
total 32768
-rw------- 1 postgres postgres 16777216 Mar 13 15:29 000000010000000000000002
-rw------- 1 postgres postgres 16777216 Mar 13 15:30 000000010000000000000003


# 远程备份
备份机器
[root@localhost ~]# mkdir /archive
[root@localhost ~]# chown  postgres. /archive
原机器
[root@localhost ~]# vim /pgsql/data/postgresql.conf
archive_mode = on 
archive_command = 'scp %p postgres@10.0.0.135:/archive/%f'

基于key验证
[postgres@localhost ~]$ ssh-keygen
[postgres@localhost ~]$ ssh-copy-id postgres@10.0.0.135
重新加载服务
[postgres@localhost ~]$ pg_ctl restart

postgres=# select pg_switch_wal();
 pg_switch_wal
---------------
 0/50000F0
(1 row)

postgres=# select pg_walfile_NAME_OFFSET(pg_current_wal_lsn());
    pg_walfile_name_offset
-------------------------------
 (000000010000000000000006,96)
(1 row)

备份机器
[root@localhost ~]# ll /archive/
total 32768
-rw-------. 1 postgres postgres 16777216 Mar 13 15:43 000000010000000000000004
-rw-------. 1 postgres postgres 16777216 Mar 13 15:44 000000010000000000000005


# 打包备份
[root@localhost ~]# pg_dump -Fc -h 10.0.0.137 -d hellodb -U postgres -f /backup/hellodb.dump
[root@localhost ~]# pg_restore -h 10.0.0.137 -U postgres -d hellodb /backup/hellodb.dump
查看文件内容
[root@localhost ~]# pg_restore -l /backup/hellodb.dump


# 全备份
几个数据库就有几个密码
[root@localhost ~]# pg_dumpall -h 10.0.0.137  -U postgres -f /backup/full_backup.sql
Password:
Password:
Password:
Password:
Password:
数据恢复
[root@localhost ~]# psql -h 10.0.0.137 -U postgres -f /backup/full_backup.sql

# 其他备份
copy students to '/tmp/students.csv' with csv;
倒回去,不能删表
copy students from '/tmp/students.csv' with csv;

# 物理备份
[root@localhost ~]# mkdir /backup
[postgres@localhost ~]$ pg_ctl stop
waiting for server to shut down........ done
server stopped
[postgres@localhost ~]$ ss -ntl
State        Recv-Q       Send-Q             Local Address:Port               Peer Address:Port       Process
LISTEN       0            128                      0.0.0.0:22                      0.0.0.0:*
LISTEN       0            128                         [::]:22                         [::]:*
备份
[root@localhost ~]# cp -a /pgsql/data/ /backup/pgdata-`date +%F`
postgres=# drop database hellodb2
;
DROP DATABASE
[postgres@localhost ~]$ pg_ctl stop
清空原有的数据
[root@localhost ~]# rm -fr /pgsql/data/*
[root@localhost ~]# cp -a /backup/pgdata-2023-03-13/* /pgsql/data/
启动服务
[postgres@localhost ~]$ pg_ctl start
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 db1       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 hellodb2  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)


14. 实现WAL日志完成主从流复制,要求在从节点上进行crontab数据备份,同时手工让主节点宕机,让从节点切换为主节点,并添加新的从节点。

两个节点:

10.0.0.135 Master

10.0.0.137 Standby

# 主机点配置
# 在主节点创建账号
create role repluser with replication login password '111111';

# 修改授权
[postgres@localhost ~]$ vi /pgsql/data/pg_hba.conf
host    all             all             0.0.0.0/0               md5
host    replication     all             0.0.0.0/0               md5

# 开启存档
[postgres@localhost ~]$ vim /pgsql/data/postgresql.conf
archive_mode = on
archive_command = '[ ! -f archive/%f ] && cp %p /archive/%f'
wal_level = replica   #设置wal级别
max_wal_senders = 10  #设置最多有几个复制连接
listen_addresses = '*'
synchronous_standby_names = '*' #开启同步,想要异步的话不需要开启
synchronous_commit = on #开启同步,想要异步的话不需要开启
[postgres@localhost ~]$ pg_ctl restart


# 从节点配置
# 清空数据和归档
[postgres@localhost ~]$ pg_ctl stop
[postgres@localhost ~]$ rm -rf /pgsql/data/*
[root@localhost ~]# mkdir /archive
[root@localhost ~]# chown postgres. /archive
[root@localhost ~]# mkdir /pgsql/backup
[root@localhost ~]# chown postgres. /pgsql/backup

# 备份主数据库
[postgres@localhost ~]$ pg_basebackup -D /pgsql/backup/ -Ft -Pv -Urepluser -h 10.0.0.135 -p 5432 -R
# 还原数据库
[postgres@localhost ~]$ tar xf /pgsql/backup/base.tar  -C /pgsql/data/
[postgres@localhost ~]$ tar xf /pgsql/backup/pg_wal.tar  -C /archive/

# 数据库同步的路径
[root@localhost ~]# vim /pgsql/data/postgresql.conf 
restore_command = 'cp /archive/%f %p'
primary_conninfo = 'host=10.0.0.135 port=5432 user=repluser password=111111'
[postgres@localhost ~]$ pg_ctl start

# 查看是否连接成功:主节点看
[root@localhost ~]# pg_controldata 
pg_control version number:            1300
Catalog version number:               202107181
Database system identifier:           7210212210530311755
Database cluster state:               in production
pg_control last modified:             Tue 14 Mar 2023 10:52:21 AM CST
# 从节点看
[root@localhost ~]# pg_controldata 
pg_control version number:            1300
Catalog version number:               202107181
Database system identifier:           7210212210530311755
Database cluster state:               in archive recovery
pg_control last modified:             Tue 14 Mar 2023 10:55:27 AM CST

[postgres@localhost ~]$ ss -nt
State         Recv-Q         Send-Q                  Local Address:Port                    Peer Address:Port          Process         
ESTAB         0              0                          10.0.0.137:38034                     10.0.0.135:5432                          
ESTAB         0              0                          10.0.0.137:22                          10.0.0.1:56438                         
ESTAB         0              36                         10.0.0.137:22                          10.0.0.1:57898 

# 查看连接的主机:主节点查看
postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
  pid  |   state   | client_addr | sync_priority | sync_state 
-------+-----------+-------------+---------------+------------
 29231 | streaming | 10.0.0.137  |             1 | sync
(1 row)
# 查看同步的信息:主节点查看
postgres=# \x
Expanded display is on.
postgres=# select pg_current_wal_insert_lsn(),* from pg_stat_replication;
-[ RECORD 1 ]-------------+------------------------------
pg_current_wal_insert_lsn | 0/8000B40
pid                       | 29231
usesysid                  | 16422
usename                   | repluser
application_name          | walreceiver
client_addr               | 10.0.0.137
client_hostname           | 
client_port               | 38034
backend_start             | 2023-03-14 10:59:46.097961+08
backend_xmin              | 
state                     | streaming
sent_lsn                  | 0/8000B40
write_lsn                 | 0/8000B40
flush_lsn                 | 0/8000B40
replay_lsn                | 0/8000B40
write_lag                 | 
flush_lag                 | 
replay_lag                | 
sync_priority             | 1
sync_state                | sync
reply_time                | 2023-03-14 11:06:18.064596+08


# 将从库切换为主库
# 从服务器
[postgres@localhost ~]$ pg_ctl promote

[root@localhost ~]# pg_controldata 
pg_control version number:            1300
Catalog version number:               202107181
Database system identifier:           7210212210530311755
Database cluster state:               in production
pg_control last modified:             Tue 14 Mar 2023 11:24:55 AM CST

# 恢复正常状态
select pg_wal_replay_resume();


15. 总结日志记录的内容包含什么

日志记录的内容

  • 历史事件:时间、地点、人物、事件
  • 日志级别:时间的关键程度,loglevel


16. 总结日志分类, 优先级别。图文并茂解释应用如何将日志发到rsyslog,并写到目标。

Off
OFF Level 是最高等级的,用于关闭所有日志记录。

FATAL 致命的错误
FATAL level 指出每个严重的错误事件将会导致应用程序的退出。

ERROR 错误
ERROR level 指出虽然发生错误事件,但仍然不影响系统的继续运行。

WARN 警告
WARN level 表明会出现潜在错误的情形。

INFO 信息
INFO level 表明 消息在粗粒度级别上突出强调应用程序的运行过程。

DEBUG 调试
DEBUG Level 指出细粒度信息事件对调试应用程序是非常有帮助的。

TRACE
与DEBUG 相比更细致化的记录事件消息。

ALL
ALL Level 是最低等级的,用于打开所有日志记录。

从高到地低
OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL

# 假设日志服务器IP为:10.0.0.146,需要发送入职的服务器与这台日志服务器之间,路由可达,并有访问权限,请看下面的实例:

#1.使用管理员权限,修改/etc/rsyslog.conf文件,在最后一行加上"*.* @日志服务器IP","*.*"表示发送Linux上的所有配置
~# echo "*.* @10.0.0.146">>/etc/rsyslog.conf

#2.重启服务

#CentOS7重启服务的方法
~# systemctl restart rsyslog

#CentOS6重启服务的方法
~# service rsyslog restart


17. 总结rsyslog配置文件格式

/etc/rsyslog.conf 配置文件格式:由三部分组成
MODULES:相关模块配置
GLOBAL DIRECTIVES:全局配置
RULES:日志记录相关的规则配置

RULES配置格式:
facility.priority; facility.priority… target

facility格式:
* #所有的facility
facility1,facility2,facility3,... #指定的facility列表

priority格式:
*: 所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息

target格式:
文件路径:通常在/var/log/,文件路径前的-表示异步写入
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
管道: | COMMAND,转发给其它命令处理

通常的日志文件的格式:
日志文件有很多,如: /var/log/messages,cron,secure等,基本格式都是类似的。格式如下
事件产生的日期时间   主机   进程(pid):事件内容


18.完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。

[root@localhost ~]# vim /etc/ssh/ssh_config
# Logging
SyslogFacility LOCAL6
[root@localhost log]# vim /etc/rsyslog.d/ssh.conf
local6.*          /var/log/ssh.log
[root@localhost ~]# systemctl restart sshd rsyslog


18. 完成功能,将3个主机(要求主机名为ip)的ssh日志,通过rsyslog服务将ssh日志写入到集中的主机上的rsyslog服务,写入到/var/log/all-ssh.log文件

# 开启接受服务的网络功能
[root@syslog-server ~]# vim /etc/rsyslog.conf
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
local5.*                                                /var/log/ssh.log
[root@syslog-server ~]# systemctl restart rsyslog
[root@syslog-server ~]# ss -ntlu
Netid        State         Recv-Q        Send-Q               Local Address:Port               Peer Address:Port       Process        
udp          UNCONN        0             0                          0.0.0.0:514                     0.0.0.0:*                         
udp          UNCONN        0             0                             [::]:514                        [::]:*                         
tcp          LISTEN        0             128                        0.0.0.0:22                      0.0.0.0:*                         
tcp          LISTEN        0             128                        0.0.0.0:5432                    0.0.0.0:*                         
tcp          LISTEN        0             128                           [::]:22                         [::]:*                         
tcp          LISTEN        0             128                           [::]:5432                       [::]:*  

[root@rocky1-135 ~]# vim /etc/rsyslog.d/test.conf
local5.*          @10.0.0.137:514
[root@rocky1-135 ~]# systemctl restart rsyslog


19. 总结/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的日志


20. 总结journalctl命令的选项及示例

journalctl命令格式
journalctl [OPTIONS...] [MATCHES...]

--no-full, --full, -l
如果字段内容超长则以省略号(...)截断以适应列宽。
默认显示完整的字段内容(超长的部分换行显示或者被分页工具截断)。
老旧的 -l/--full 选项 仅用于撤销已有的 --no-full 选项,除此之外没有其他用处。
-a, --all
完整显示所有字段内容, 即使其中包含不可打印字符或者字段内容超长。
-f, --follow
只显示最新的日志项,并且不断显示新生成的日志项。 此选项隐含了 -n 选项。
-e, --pager-end
在分页工具内立即跳转到日志的尾部。 此选项隐含了 -n1000
以确保分页工具不必缓存太多的日志行。 不过这个隐含的行数可以被明确设置的 -n
选项覆盖。 注意,此选项仅可用于 less(1) 分页器。
-n, --lines=
限制显示最新的日志行数。 --pager-end 与 --follow 隐含了此选项。
此选项的参数:若为正整数则表示最大行数; 若为 "all" 则表示不限制行数;
若不设参数则表示默认值10行。
--no-tail
显示所有日志行, 也就是用于撤销已有的 --lines= 选项(即使与 -f 连用)。
-r, --reverse
反转日志行的输出顺序, 也就是最先显示最新的日志。
-o, --output=
控制日志的输出格式。 可以使用如下选项:
short
这是默认值, 其输出格式与传统的 syslog[1] 文件的格式相似, 每条日志一行。
short-iso
与 short 类似,只是将时间戳字段以 ISO 8601 格式显示。
short-precise
与 short 类似,只是将时间戳字段的秒数精确到微秒级别。
short-monotonic
与 short 类似,只是将时间戳字段的零值从内核启动时开始计算。
short-unix
与 short 类似,只是将时间戳字段显示为从"UNIX时间原点"(1970-1-1 00:00:00
UTC)以来的秒数。 精确到微秒级别。
verbose
以结构化的格式显示每条日志的所有字段。
export
将日志序列化为二进制字节流(大部分依然是文本) 以适用于备份与网络传输(详见
Journal Export Format[2] 文档)。
json
将日志项按照JSON数据结构格式化, 每条日志一行(详见 Journal JSON Format[3]
文档)。
json-pretty
将日志项按照JSON数据结构格式化, 但是每个字段一行, 以便于人类阅读。
json-sse
将日志项按照JSON数据结构格式化,每条日志一行,但是用大括号包围, 以适应
Server-Sent Events[4] 的要求。
cat
仅显示日志的实际内容, 而不显示与此日志相关的任何元数据(包括时间戳)。
--utc
以世界统一时间(UTC)表示时间
--no-hostname
不显示来源于本机的日志消息的主机名字段。 此选项仅对 short
系列输出格式(见上文)有效。
-x, --catalog
在日志的输出中增加一些解释性的短文本, 以帮助进一步说明日志的含义、
问题的解决方案、支持论坛、 开发文档、以及其他任何内容。
并非所有日志都有这些额外的帮助文本, 详见 Message Catalog Developer
Documentation[5] 文档。
注意,如果要将日志输出用于bug报告, 请不要使用此选项。
-q, --quiet
当以普通用户身份运行时, 不显示任何警告信息与提示信息。 例如:"-- Logs begin at
...", "-- Reboot --"
-m, --merge
混合显示包括远程日志在内的所有可见日志。
-b [ID][±offset], --boot=[ID][±offset]
显示特定于某次启动的日志, 这相当于添加了一个 "_BOOT_ID=" 匹配条件。
如果参数为空(也就是 ID 与 ±offset 都未指定), 则表示仅显示本次启动的日志。
如果省略了 ID , 那么当 ±offset 是正数的时候, 将从日志头开始正向查找,
否则(也就是为负数或零)将从日志尾开始反响查找。 举例来说, "-b
1"表示按时间顺序排列最早的那次启动, "-b 2"则表示在时间上第二早的那次启动; "-b
-0"表示最后一次启动, "-b -1"表示在时间上第二近的那次启动, 以此类推。 如果
±offset 也省略了, 那么相当于"-b -0", 除非本次启动不是最后一次启动(例如用
--directory 指定了另外一台主机上的日志目录)。
如果指定了32字符的 ID , 那么表示以此 ID 所代表的那次启动为基准
计算偏移量(±offset), 计算方法同上。 换句话说, 省略 ID 表示以本次启动为基准
计算偏移量(±offset)。
--list-boots
列出每次启动的 序号(也就是相对于本次启动的偏移量)、32字符的ID、
第一条日志的时间戳、最后一条日志的时间戳。
-k, --dmesg
仅显示内核日志。隐含了 -b 选项以及 "_TRANSPORT=kernel" 匹配项。
-t, --identifier=SYSLOG_IDENTIFIER
仅显示 syslog[1] 识别符为 SYSLOG_IDENTIFIER 的日志项。
可以多次使用该选项以指定多个识别符。
-u, --unit=UNIT|PATTERN
仅显示属于特定单元的日志。 也就是单元名称正好等于 UNIT 或者符合 PATTERN
模式的单元。 这相当于添加了一个 "_SYSTEMD_UNIT=UNIT" 匹配项(对于 UNIT 来说),
或一组匹配项(对于 PATTERN 来说)。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
--user-unit=
仅显示属于特定用户会话单元的日志。 相当于同时添加了 "_SYSTEMD_USER_UNIT=" 与
"_UID=" 两个匹配条件。
可以多次使用此选项以添加多个并列的匹配条件(相当于用"OR"逻辑连接)。
-p, --priority=
根据日志等级(包括等级范围)过滤输出结果。 日志等级数字与其名称之间的对应关系如下
(参见 syslog(3)): "emerg" (0), "alert" (1), "crit" (2), "err" (3),
"warning" (4), "notice" (5), "info" (6), "debug" (7) 。
若设为一个单独的数字或日志等级名称, 则表示仅显示小于或等于此等级的日志
(也就是重要程度等于或高于此等级的日志)。 若使用 FROM..TO.. 设置一个范围,
则表示仅显示指定的等级范围内(含两端)的日志。 此选项相当于添加了 "PRIORITY="
匹配条件。
-c, --cursor=
从指定的游标(cursor)开始显示日志。
[提示]每条日志都有一个"__CURSOR"字段,类似于该条日志的指纹。
--after-cursor=
从指定的游标(cursor)之后开始显示日志。 如果使用了 --show-cursor 选项,
则也会显示游标本身。
--show-cursor
在最后一条日志之后显示游标, 类似下面这样,以"--"开头:
-- cursor: s=0639...
游标的具体格式是私有的(也就是没有公开的规范), 并且会变化。
-S, --since=, -U, --until=
显示晚于指定时间(--since=)的日志、显示早于指定时间(--until=)的日志。
参数的格式类似 "2012-10-30 18:17:16" 这样。 如果省略了"时:分:秒"部分,
则相当于设为 "00:00:00" 。 如果仅省略了"秒"的部分则相当于设为 ":00" 。
如果省略了"年-月-日"部分, 则相当于设为当前日期。 除了"年-月-日 时:分:秒"格式,
参数还可以进行如下设置: (1)设为 "yesterday", "today", "tomorrow"
以表示那一天的零点(00:00:00)。 (2)设为 "now" 以表示当前时间。
(3)可以在"年-月-日 时:分:秒"前加上 "-"(前移) 或 "+"(后移)
前缀以表示相对于当前时间的偏移。 关于时间与日期的详细规范, 参见
systemd.time(7)
-F, --field=
显示所有日志中某个字段的所有可能值。 [译者注]类似于SQL语句:"SELECT DISTINCT
某字段 FROM 全部日志"
-N, --fields
输出所有日志字段的名称
--system, --user
仅显示系统服务与内核的日志(--system)、 仅显示当前用户的日志(--user)。
如果两个选项都未指定,则显示当前用户的所有可见日志。
-M, --machine=
显示来自于正在运行的、特定名称的本地容器的日志。 参数必须是一个本地容器的名称。
-D DIR, --directory=DIR
仅显示来自于特定目录中的日志, 而不是默认的运行时和系统日志目录中的日志。
--file=GLOB
GLOB 是一个可以包含"?"与"*"的文件路径匹配模式。 表示仅显示来自与指定的 GLOB
模式匹配的文件中的日志, 而不是默认的运行时和系统日志目录中的日志。
可以多次使用此选项以指定多个匹配模式(多个模式之间用"OR"逻辑连接)。
--root=ROOT
在对日志进行操作时, 将 ROOT 视为系统的根目录。 例如 --update-catalog 将会创建
ROOT/var/lib/systemd/catalog/database
--new-id128
此选项并不用于显示日志内容, 而是用于重新生成一个标识日志分类的 128-bit ID 。
此选项的目的在于 帮助开发者生成易于辨别的日志消息, 以方便调试。
--header
此选项并不用于显示日志内容, 而是用于显示日志文件内部的头信息(类似于元数据)。
--disk-usage
此选项并不用于显示日志内容,
而是用于显示所有日志文件(归档文件与活动文件)的磁盘占用总量。
--vacuum-size=, --vacuum-time=, --vacuum-files=
这些选项并不用于显示日志内容,
而是用于清理日志归档文件(并不清理活动的日志文件), 以释放磁盘空间。
--vacuum-size= 可用于限制归档文件的最大磁盘使用量 (可以使用 "K", "M", "G", "T"
后缀); --vacuum-time= 可用于清除指定时间之前的归档 (可以使用 "s", "m", "h",
"days", "weeks", "months", "years" 后缀); --vacuum-files=
可用于限制日志归档文件的最大数量。 注意,--vacuum-size= 对 --disk-usage
的输出仅有间接效果, 因为 --disk-usage 输出的是归档日志与活动日志的总量。
同样,--vacuum-files= 也未必一定会减少日志文件的总数,
因为它同样仅作用于归档文件而不会删除活动的日志文件。
此三个选项可以同时使用,以同时从三个维度去限制归档文件。
若将某选项设为零,则表示取消此选项的限制。
--list-catalog [128-bit-ID...]
简要列出日志分类信息, 其中包括对分类信息的简要描述。
如果明确指定了分类ID(128-bit-ID), 那么仅显示指定的分类。
--dump-catalog [128-bit-ID...]
详细列出日志分类信息 (格式与 .catalog 文件相同)。
如果明确指定了分类ID(128-bit-ID), 那么仅显示指定的分类。
--update-catalog
更新日志分类索引二进制文件。
每当安装、删除、更新了分类文件,都需要执行一次此动作。
--setup-keys
此选项并不用于显示日志内容, 而是用于生成一个新的FSS(Forward Secure
Sealing)密钥对。 此密钥对包含一个"sealing key"与一个"verification key"。
"sealing key"保存在本地日志目录中, 而"verification key"则必须保存在其他地方。
详见 journald.conf(5) 中的 Seal= 选项。
--force
与 --setup-keys 连用, 表示即使已经配置了FSS(Forward Secure Sealing)密钥对,
也要强制重新生成。
--interval=
与 --setup-keys 连用,指定"sealing key"的变化间隔。
较短的时间间隔会导致占用更多的CPU资源, 但是能够减少未检测的日志变化时间。
默认值是 15min
--verify
检查日志文件的内在一致性。 如果日志文件在生成时开启了FSS特性, 并且使用
--verify-key= 指定了FSS的"verification key",
那么,同时还将验证日志文件的真实性。
--verify-key=
与 --verify 选项连用, 指定FSS的"verification key"
--sync
要求日志守护进程将所有未写入磁盘的日志数据刷写到磁盘上,
并且一直阻塞到刷写操作实际完成之后才返回。 因此该命令可以保证当它返回的时候,
所有在调用此命令的时间点之前的日志, 已经全部安全的刷写到了磁盘中。
--flush
要求日志守护进程 将 /run/log/journal 中的日志数据 刷写到 /var/log/journal 中
(如果持久存储设备当前可用的话)。 此操作会一直阻塞到操作完成之后才会返回,
因此可以确保在该命令返回时, 数据转移确实已经完成。
注意,此命令仅执行一个单独的、一次性的转移动作, 若没有数据需要转移,
则此命令什么也不做, 并且也会返回一个表示操作已正确完成的返回值。
--rotate
要求日志守护进程滚动日志文件。 此命令会一直阻塞到滚动完成之后才会返回。
-h, --help
显示简短的帮助信息并退出。
--version
显示简短的版本信息并退出。
--no-pager
不将程序的输出内容管道(pipe)给分页程序


21. 完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中


22. 尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M, 保存90天的日志, 旧日志以时间为后缀,要求压缩。


23. 总结DAS, NAS, SAN区别,使用场景

1.直连式存储DAS:一块的方式来使用硬盘存储,本机用,不支持远程

2.存储区域网络SAN:把硬盘放在很远的距离,只负责提供空间,一块的形式存储,会分享一个一个独立的空间给用户存储数据,商业产品

3.网络附加村存储NAS:把文件系统都管理好,数据存储好,直接访问数据,以文件的形式存储


24.  实现nfs共享/data/nfs目录,所有压缩为666用户。并配置其他虚拟机自动挂载。

安装相关软件
[root@rocky1-135 ~]# yum -y  install nfs-utils
启动nfs
[root@rocky1-135 ~]# systemctl enable --now nfs-server
开启共享目录
[root@rocky1-135 ~]# mkdir -p /data/share1
[root@rocky1-135 ~]# mkdir -p /data/share2
[root@rocky1-135 ~]# cat /etc/exports
/data/share1   *
让改的配置文件生效
[root@rocky1-135 ~]# exportfs -r
exportfs: No options for /data/share1 *: suggest *(sync) to avoid warning
查看文件的信息
[root@rocky1-135 ~]# exportfs -v
/data/share1      <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
拷贝文件进去
[root@rocky1-135 ~]# cp /etc/fstab /data/share1/a.txt
[root@rocky1-135 ~]# cp /etc/fstab /data/share1/b.txt

远程挂载
[root@syslog-server ~]# mkdir -p /data/nfs1
安装软件包
[root@syslog-server ~]# yum -y  install nfs-utils
查看对方的共享
[root@syslog-server ~]# showmount -e 10.0.0.135
Export list for 10.0.0.135:
/data/share1 *

挂载
[root@syslog-server ~]# mount 10.0.0.135:/data/share1 /data/nfs1
[root@syslog-server ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
devtmpfs                 877M     0  877M   0% /dev
tmpfs                    896M   28K  896M   1% /dev/shm
tmpfs                    896M  8.8M  887M   1% /run
tmpfs                    896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/rl-root       70G  2.8G   68G   4% /
/dev/mapper/rl-home      127G  939M  126G   1% /home
/dev/nvme0n1p1          1014M  212M  803M  21% /boot
tmpfs                    180M     0  180M   0% /run/user/0
10.0.0.135:/data/share1   70G  2.7G   68G   4% /data/nfs1
可以看到文件系统
[root@syslog-server ~]# df -hT
Filesystem              Type      Size  Used Avail Use% Mounted on
devtmpfs                devtmpfs  877M     0  877M   0% /dev
tmpfs                   tmpfs     896M   28K  896M   1% /dev/shm
tmpfs                   tmpfs     896M  8.8M  887M   1% /run
tmpfs                   tmpfs     896M     0  896M   0% /sys/fs/cgroup
/dev/mapper/rl-root     xfs        70G  2.8G   68G   4% /
/dev/mapper/rl-home     xfs       127G  939M  126G   1% /home
/dev/nvme0n1p1          xfs      1014M  212M  803M  21% /boot
tmpfs                   tmpfs     180M     0  180M   0% /run/user/0
10.0.0.135:/data/share1 nfs4       70G  2.7G   68G   4% /data/nfs1

[root@syslog-server ~]# cat /data/nfs1/a.txt 

#
# /etc/fstab
# Created by anaconda on Mon Mar 13 08:16:14 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rl-root     /                       xfs     defaults        0 0
UUID=51ad6c46-905f-4ca8-8b13-000530e6a5de /boot                   xfs     defaults        0 0
/dev/mapper/rl-home     /home                   xfs     defaults        0 0
/dev/mapper/rl-swap     none                    swap    defaults        0 0
[root@syslog-server ~]# echo hello >> /data/nfs1/a.txt   #只读状态
-bash: /data/nfs1/a.txt: Read-only file system

改成可读可写状态
[root@rocky1-135 ~]# cat /etc/exports
/data/share1   *(rw)
[root@rocky1-135 ~]# exportfs -r
[root@rocky1-135 ~]# exportfs -v
/data/share1      <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

把137上的root映射成135上的普通用户,在135上授权,是的可以修改挂在上的文件内容,135上有默认的普通用户nobody
将挂在文件修改权限
[root@rocky1-135 ~]# chmod 777 /data/share1
[root@syslog-server ~]# echo hello > /data/nfs1/c.txt
[root@syslog-server ~]# ll /data/nfs1
total 12
-rw-r--r-- 1 root   root   655 Mar 14 20:40 a.txt
-rw-r--r-- 1 root   root   655 Mar 14 20:40 b.txt
-rw-r--r-- 1 nobody nobody   6 Mar 14 20:56 c.txt
[root@rocky1-135 ~]# id nobody
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)


25. 总结inotify原理,命令及使用

原理:

        使用 inotify 很简单:创建一个文件描述符,附加一个或多个监视器(一个监视器 是一个路径和一组事件),然后使用 read 方法从描述符获取事件。read 并不会用光整个周期,它在事件发生之前是被阻塞的。

        更好的是,因为inotify 通过传统的文件描述符工作,您可以利用传统的 select 系统调用来被动地监控监视器和许多其他输入源。两种方法 — 阻塞文件描述符和使用 select— 都避免了繁忙轮询。

moved_to  文件或目录被移动到监控的目录中

moved_from  文件或目录从监控中被移动

move  文件或目录不管移到还是移出监控目录都触发事件

access  文件或目录被读取

delete_self  文件或目录被删除,目录本身被删除

unmount  取消挂载

持续后台监控,并记录日志
inotifywait -o /root/inotify.log -drq /data/www --timefmt "%Y-%m-%d %H:%M:%S" --format "%T %w%f event: %e"
持续前台监控特定事件
inotifywait -mrq /data/www --timefmt "%F %H:%M:%S" --format "%T %w%f event: %;e" -e create,delete,moved_to,close_write,attrib


26. 总结rsync原理,命令及ssh命令和rsync协议使用。完成目录文件同步。

1)软件简介
Rsync 是一个远程数据同步工具,可通过 LAN/WAN 快速同步多台主机间的文件。Rsync 本来是用以取代rcp 的一个工具,它当前由 Rsync.samba.org 维护。Rsync 使用所谓的“Rsync 演算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。运行 Rsync server 的机器也叫 backup server,一个 Rsync server 可同时备份多个 client 的数据;也可以多个Rsync server 备份一个 client 的数据。
Rsync 可以搭配 rsh 或 ssh 甚至使用 daemon 模式。Rsync server 会打开一个873的服务通道(port),等待对方 Rsync 连接。连接时,Rsync server 会检查口令是否相符,若通过口令查核,则可以开始进行文件传输。第一次连通完成时,会把整份文件传输一次,下一次就只传送二个文件之间不同的部份。
Rsync 支持大多数的类 Unix 系统,无论是 Linux、Solaris 还是 BSD 上都经过了良好的测试。此外,它在windows 平台下也有相应的版本,比较知名的有 cwRsync 和 Sync2NAS。

Rsync 的基本特点如下:
可以镜像保存整个目录树和文件系统;
可以很容易做到保持原来文件的权限、时间、软硬链接等;
无须特殊权限即可安装;
优化的流程,文件传输效率高;
可以使用 rcp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接;
支持匿名传输。

2)核心算法
假定在名为 α 和 β 的两台计算机之间同步相似的文件 A 与 B,其中 α 对文件A拥有访问权,β 对文件 B 拥有访问权。并且假定主机 α 与 β 之间的网络带宽很小。那么 Rsync 算法将通过下面的五个步骤来完成:
β 将文件 B 分割成一组不重叠的固定大小为 S 字节的数据块。最后一块可能会比 S 小。
β 对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的 MD4 强校验。
β 将这些校验结果发给 α。
α 通过搜索文件 A 的所有大小为 S 的数据块(偏移量可以任选,不一定非要是 S 的倍数),来寻找与文件B 的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。
α 发给 β 一串指令来生成文件 A 在 β 上的备份。这里的每一条指令要么是对文件 B 经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件 B 的任何一个数据块匹配上的。

3) 文件级别的RSync(只传输变化的文件)工作过程:(我的理解)
* 机器A构造FileList,FileList包含了需要与机器B sync的所有文件信息对name->id,(id用来唯一表示文件例如MD5);
* 机器A将FileList发送到机器B;
* 机器B上运行的后台程序处理FileList,构建NewFileList,其中根据MD5的比较来删除机器B上已经存在的文件的信息对,只保留机器B上不存在或变化的文件;
* 机器A得到NewFileList,对NewFileList中的文件从新传输到机器B;

4)进一步的优化存储和传输
文件级别的Rsync + Rsync对单个文件分块比较和传输 : 实现了文件的高效传输。
如果Server上存储有所有文件的MD5码索引的数据库 + hardlink技术 : 实现Server的重复文件删除,单个文件只存储一份的技术。
如果server有单个文件只存储一份的技术,(有所有文件的MD5数据库),则在Rsync传输的过程中只传输Rsync Server没有的文件,如果Rsync Server由此文件直接使用。

5)rsync有六种不同的工作模式
拷贝本地文件;当SRC和DES路径信息都不包含有单个冒号":"分隔符时就启动这种工作模式。
使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号":"分隔符时启动该模式。
使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号":"分隔符时启动该模式。
从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含"::"分隔符时启动该模式。
从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含"::"分隔符时启动该模式。
列远程机的文件列表。这类似于rsync传输,不过只要在命令中省略掉本地机信息即可。

[root@backup www]# ssh-keygen
[root@backup www]# ssh-copy-id 10.0.0.135
[root@backup www]# kill sersync2
[root@data-server ~]# systemctl stop rsyncd.service
[root@backup ~]# cd /opt/GNU-Linux-x86/
[root@backup GNU-Linux-x86]# vim confxml.xml
       <localpath watch="/data/www">
                <remote ip="10.0.0.135" name="/data/backup"/>
                <auth start="false" users="rsync" passwordfile="/etc/rsync.pas"/>
                <ssh start="true"/>

[root@backup GNU-Linux-x86]# ./sersync2 -dro confxml.xml
[root@data-server ~]# watch -n0.5 ls -l /data/backup/


27. 总结sersync的配置,同时基于sersync替换inotify+rsync.


28. 配置LAMP要求 域名使用主从dns, dns解析到2个apache节点,apache和php在同一个节点,同时将wordpress的upload目录基于nfs挂载,同时基于rsync协议将网站同步到备份的nfs服务器, mariadb使用mycat读写分离并且要求后端为MHA集群。 架构规划图及解析一次请求和响应的流程和实践过程。同时将所有主机的apache, php, mariadb日志集中收集。


29.  总结 Redis多种安装方法和内核参数优化


30. 总结  Redis 常见指令和数据类型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值