目录
3.总结PostgreSQL服务管理相关命令,pg_ctl和pgsql命令选项及示例和初始化操作
6.总结库,模式,表的添加和删除操作。表数据的curd。同时总结相关信息查看语句
8.添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zibbix库有所有权限。
9.总结PostgresSQL的进程结构,说明进程间如何协同工作的。
10.总结 PostgreSQL的数据目录结构,说明每个文件的作用,并可以配上一些示例说明文件的作用
11.尝试将PostgreSQL新版本的运行日志存储到数据库
15.实现WAL日志完成主从流复制,要求在从节点上进行crontab数据备份,同时手工让主节点宕机,让从节点切换为主节点,并添加新的从节点。
17.总结日志分类,优先级别,图文并茂解释应用如何将日志发到rsyslog,并写到目标。
19.完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
23.完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中。
24.尝试使用logrotate服务切割nginx日志,每天切割一次,要求大于不超过3M,保存90天的日志,旧日志以时间为后缀,要求压缩。
26.完成文件同步和LAWP架构实现负载均衡实战案例 (脚本实现)
27.总结Redis多种安装方法和内核参数优化 (脚本实现)
1.总结postgresql和mysql的优劣势
(1)PostgreSQL完全免费,而且是BSD协议。而MySQL数据库虽然是开源的,但现在随着SUN被oracle公司收购,但是他它受制于市场环境。
(2)与PostgreSQl配合的开源软件很多,有很多分布式集群软件,如pgpool、pgcluster、slony、plploxy等等,很容易做读写分离、负载均衡、数据水平拆分等方案,而这在MySQL下则比较困难。
(3)PostgreSQL源代码写的很清晰,易读性比MySQL强太多了,怀疑MySQL的源代码被混淆过。所以很多公 司都是基本PostgreSQL做二次开发的。
(4)PostgreSQL在很多方面都比MySQL强,如复杂SQL的执行、存储过程、触发器、索引。同时PostgreSQL是多进程的,而MySQL是线程的,虽然并发不高时,MySQL处理速度快,但当并发高的时候,对于现在多核的 单台机器上,MySQL的总体处理性能不如PostgreSQL,原因是MySQL的线程无法充分利用CPU的能力。
2.总结postgresql二进制安装和编译安装
(1)二进制安装:
(1.1)Rocky二进制安装:
[root@Rocky8 ~]#vim install_postgresql.sh sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disable postgresql sudo dnf install -y postgresql14-server sudo /usr/pgsql-14/bin/postgresql-14-setup initdb sudo systemctl enable postgresql-14 sudo systemctl start postgresql-14 [root@Rocky8 ~]#bash install_postgresql.sh
(1.2)ubuntu二进制安装:
[08:06:49 root@ubuntu2204 ~]#vim install_postgresql.sh sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - sudo apt-get update sudo apt-get -y install postgresql [08:06:49 root@ubuntu2204 ~]#bash install_postgresql.sh
ubuntu直接安装的15版,postgresql不用初始化操作。
(2)源码编译安装
(2.1)系统优化配置
[root@Rocky8 ~]#vim /etc/sysctl.conf kernel.shmmax = 68719476736 kernel.shmall = 4294967296 kernel.shmmni = 4096 kernel.sem = 50100 64128000 50100 1280 fs.file-max = 7672460 net.ipv4.ip_local_port_range = 9000 65000 net.core.rmem_default = 1048576 net.core.rmem_max = 4194304 net.core.wmem_default = 262144 net.core.wmem_max = 1048576 [root@Rocky8 ~]#sysctl -p [root@Rocky8 ~]#vim /etc/security/limits.conf * - nofile 100000 * - nproc 100000 * - memlock 60000
(2.2)安装依赖的包
*************ubuntu安装依赖包******************* [12:53:58 root@ubuntu2204 ~]#apt update [12:53:58 root@ubuntu2204 ~]#apt -y install gcc make libreadline-dev zlib1g-dev **************rocky安装依赖包******************* [root@Rocky8 ~]#yum -y install gcc make readline-devel zlib-devel
(2.3)下载源码压缩包并解压:
[12:53:58 root@ubuntu2204 ~]#wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.gz [13:22:48 root@ubuntu2204 ~]#tar xf postgresql-14.2.tar.gz
(2.4)先查看安装帮助:
[13:33:44 root@ubuntu2204 ~]#cat postgresql-14.2/INSTALL ./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
(2.4)Installation Procedure(安装过程):
[14:20:23 root@ubuntu2204 postgresql-14.2]#./configure --prefix=/apps/pgsql [14:23:11 root@ubuntu2204 postgresql-14.2]#make -j 2 world [14:34:26 root@ubuntu2204 postgresql-14.2]#make install-world ******************************************************************* #创建postgres用户及指定shell类型和创建家目录(默认是不创建家目录的) [14:56:43 root@ubuntu2204 apps]#useradd postgres -s /bin/bash -m -d /home/postgres #给postgres建立密码 [15:04:11 root@ubuntu2204 apps]#echo -e '123456\n123456' | passwd postgres #创建存放数据的目录 [15:26:00 root@ubuntu2204 apps]#mkdir -p /pgsql/data #更改所有者和所属组 [15:27:30 root@ubuntu2204 apps]#chown postgres. /pgsql/data #添加环境变量,为使用PostgresSQL更方便 [16:32:28 root@ubuntu2204 ~]#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 #生效 [16:36:18 root@ubuntu2204 ~]#. /etc/profile.d/pgsql.sh #初始化(初始化以后,/pgsql/data下就有文件了) [16:36:18 root@ubuntu2204 ~]# su - postgres #切换成postgre用户 postgres@ubuntu2204:~$ initdb #启动数据库(-l是指定了启动日志文件) postgres@ubuntu2204:~$ pg_ctl -l logfile start #设置为开机自启动 [17:04:58 root@ubuntu2204 ~]#vim /etc/rc.local #!/bin/bash su - postgres -c "/apps/pgsql/bin/pg_ctl -l logfile start" #加执行权限 [17:06:18 root@ubuntu2204 ~]#chmod +x /etc/rc.local
Configuration:
安装过程的第一步是为你的系统去配置源代码树和选择你想要的选项。通过运行配置脚本完成。
./configure:这个脚本将运行一系列的测试去确定不同系统所依赖变量的数值和检测在你系统上的各种异常。最后它将在构建树上创建几个文件来记录它所发现的内容。
- -prefix=
PREFIX:安装的所有文件在目录PREFIX下,而不是
/usr/local/pgsql。真正的文件将被安装在各个子目录中。任何文件都不能直接被安装在PREFIX目录中。
Build:
开始创建,类型二选一:
make
make all
(记得使用GNUmake)这个创建时间取决于你的硬件
如果你想去构建所有,包括文档(HTML和man 页),还有额外的模块。替换类型为:
make world(建议用这个)
Installing the Files:
安装PostgreSQL,请输入:
make install
它将安装文件到你第一步指定的目录中,确定你有适当的权限去写入到该区域。通常你需要以root身份去做这一步。另外,你也可以先创建目标目录再去赋予适当的权限
如果你构建了所有,替换类型为:
make install-world
Environment Variables:
如果你安装在了 /usr/local/pgsql 或者默认程序没有搜索到的其他位置。你都应该添加/usr/local/pgsql/bin 到你的PATH变量中. 严格的说,这不是必须的。但是它将在使用PostgreSQLS会更方便。
可以这样做,添加以下的内容到你的shell 启动文件中,比如~/.bash_profile(或者 /etc/ profile
如果你想要影响所有用户):
PATH=/usr/local/pgsql/bin:$PATH
export PATH
为了让系统能查找到man文档,你需要添加以下内容到shell启动文件中,除非你安装到了默认搜索的位置。
MANPATH=/usr/local/pgsql/share/man:$MANPATH
export MANPATH
3.总结PostgreSQL服务管理相关命令,pg_ctl和pgsql命令选项及示例和初始化操作
(1)pg_ctl命令:pg_ctl 是一个可以初始化,启动,停止和控制PosgreSQL服务的实用工具。
(2)psql命令:是PosgreSQL的交互式终端,查找帮助:\h (SQL命令帮助);\?(psql命令帮助)
(3)初始化操作:创建多实例、停止服务、开启服务
#把/pgsql目录更改所有者和所属组 [20:49:32 root@ubuntu2204 ~]#chown postgres. /pgsql #创建data2实例 postgres@ubuntu2204:~$ pg_ctl init -D /pgsql/data2 #目前有两个实例 [20:55:19 root@ubuntu2204 ~]#ll /pgsql/ total 16 drwxr-xr-x 4 postgres postgres 4096 Jan 17 20:50 ./ drwxr-xr-x 21 root root 4096 Jan 17 15:27 ../ drwx------ 19 postgres postgres 4096 Jan 17 18:56 data/ drwx------ 19 postgres postgres 4096 Jan 17 20:50 data2/ #不过两个同时启动,会导致端口号冲突。需要更改配置文件,改成5433. [21:02:05 root@ubuntu2204 ~]#vim /pgsql/data2/postgresql.conf port = 5433 # (change requires restart) #再启动data2实例 postgres@ubuntu2204:~$ /apps/pgsql/bin/pg_ctl -D /pgsql/data2 -l logfile start #看一下端口号 LISTEN 0 244 127.0.0.1:5432 0.0.0.0:* LISTEN 0 244 127.0.0.1:5433 0.0.0.0:* #停止data2实例 postgres@ubuntu2204:~$ pg_ctl stop -D /pgsql/data2 #启动data2实例 postgres@ubuntu2204:~$ pg_ctl start -D /pgsql/data2
4.总结PostgreSQL数据库结构组织
在一个PostgreSQL 数据库系统中,数据的组织结构可以分为以下五层:
实例: 一个PostgreSQL对应一个安装的数据目录$PGDATA,即一个instance(实例)
数据库:一个PostgreSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只 能访问这个数据库中的数据,而不能访问其他数据库中的内容 默认情况下初始实例只有三个数据库: postgres、template0、template1
模式: 一个数据库可以创建多个不同的名称空间即Schema,用于分隔不同的业务数据
表和索引:一个数据库可以有多个表和索引。在PostgreSQL中表的术语称为 Relation,而在其他 数据库中通常叫Table
行和列:每张表中有很多列和行数据。在 PostgreSQL 中行的术语一般为“Tuple”,而在其他数据库 中则叫“Row”。
5.实现PostgreSQL远程连接,有密码和无密码登录
#客户端是:10.0.0.10 远程主机是:10.0.0.200 *********************************************** #在远程主机上操作 [14:36:54 root@ubuntu2204 ~]#su - postgres #切换用户身份 postgres@ubuntu2204:~$ vim /pgsql/data/postgresql.conf #修改配置文件 listen_addresses = '*' #打开这一项 postgres@ubuntu2204:~$ vim /pgsql/data/pg_hba.conf #修改身份验证配置文件 # IPv4 local connections: host all all 10.0.0.0/24 md5(有密码) trust(无密码) postgres@ubuntu2204:~$ ALTER USER postgres with password '123456'; #添加密码 ************************************************************** #在客户端登录 [postgres@Rocky8 ~]$ psql -h 10.0.0.131 Password for user postgres: #输入密码
6.总结库,模式,表的添加和删除操作。表数据的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。
7.总结PostgreSQL的用户和角色管理
(1)创建+修改+删除用户:
#创建用户以后可用密码直接登录 postgres=# CREATE USER zhang PASSWORD '123456'; CREATE ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} zhang | | {} **************************************************** #创建角色以后还需要授权登录权限才能登录 postgres=# CREATE ROLE yu PASSWORD '123456'; CREATE ROLE postgres=# \du List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} yu | Cannot login | {} zhang | | {} postgres=# ALTER ROLE yu WITH LOGIN; #让yu角色具有直接登录权限 ****************************************************** #删除用户 postgres=# DROP ROLE yu;
8.添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zibbix库有所有权限。
postgres=# CREATE USER mage PASSWORD '123456'; #创建mage用户 CREATE ROLE postgres=# CREATE DATABASE zabbix OWNER mage; #创建zabbix数据库且属于mage CREATE DATABASE postgres=# CREATE SCHEMA magedu AUTHORIZATION mage; #mage用户的默认模式为magedu CREATE SCHEMA
9.总结PostgresSQL的进程结构,说明进程间如何协同工作的。
Postmaster 主进程:
它是整个数据库实例的主控制进程,负责启动和关闭该数据库实例。
Back Ground Writer 后台写进程:
为了提高插入、删除和更新数据的性能,当往数据库中插入或者更新数据时,并不会马上把数据持久化到数据文件中,而是先写入Buffer中。
该辅助进程可以周期性的把内存中的脏数据刷新到磁盘中。
Write Ahead Writer 预写式日志进程:
预写式日志是在修改数据之前,必须把这些修改操作记录到磁盘中,这样后面更新实际数据 时,就不需要实时的把数据持久化到文件中了。即使机器突然宕机或者数据库异常退出, 导 致一部分内存中的脏数据没有及时的刷新到文件中,在数据库重启后,通过读取WAL日志, 并把最后一部分WAL日志重新执行一遍,就能恢复到宕机时的状态了
Checkpointer 检查点进程:
检查点(Checkpoints)是事务序列中的点,保证在该点之前的所有日志信息都更新到数据文件 中。 在检查点时,所有脏数据页都冲刷到磁盘并且向日志文件中写入一条特殊的检查点记录。在发生崩溃的时候,恢复器就知道应该从日志中的哪个点(称做 redo 记录)开始做 REDO 操作, 因为在该记录前的对数据文件的任何修改都已经在磁盘上了。在完成检查点处理之后,任何在redo记录之前写的日志段都不再需要,因此可以循环使用或者删除。在进行 WAL 归档的时候,这些日志在循环利用或者删除之前应该必须先归档保存。检查点进程 (CKPT) 在特定时间自动执行一个检查点,通过向数据库写入进程 (BgWriter) 传递消 息来启动检查点请求
AutoVacuum 自动清理进程:
执行delete操作时,旧的数据并不会立即被删除,在更新数据时,也不会在旧的数据上做更 新,而是新生成一行数据。旧的数据只是被标识为删除状态,在没有并发的其他事务读到这些 旧数据时,它们才会被清除掉。autovacuum lanucher 负责回收垃圾数据的master进程,如果开启了autovacuum的话,那么postmaster会fork这个进程,autovacuum worker 负责回收垃圾数据的worker进程,是lanucher进程fork出来的
PgStat 统计数据收集进程:
此进程主要做数据的统计收集工作 收集的信息主要用于查询优化时的代价估算。统计的数据包括对一个表或索引进行的插入、删 除、更新操作,磁盘块读写的次数以及行的读次数等。 系统表pg_statistic中存储了PgStat收集的各类统计信息
PgArch 归档进程:
默认没有此进程,开启归档功能后才会启动archiver进程。WAL日志文件会被循环使用,也就是说WAL日志会被覆盖,利用PgArch进程会在覆盖前把WAL日志备份出来,类似于binlog,可用于备份功能。PostgreSQL 从8.X版本开始提供了PITR ( Point-In-Time-Recovery)技术,即就是在对数据厍进行过一次全量备份后,该技术将备份时间点后面的WAL日志通过归档进行备份,将来可以使用数据库的全量备份再加上后面产生的WAL 日志,即可把数据库向前恢复到全量备份后的任意一个时间点的状态
SysLogger 系统日志进程:
默认没有此进程,配置文件 postgresql.conf 设置参数logging_collect设置为“on”时,主进程才 会启动SysLogger辅助进程。它从Postmaster主进程、所有的服务进程以及其他辅助进程收集所有的stderr输出,并将这些输出写入到日志文件中
startup 启动进程:
用于数据库恢复的进程
Session 会话进程:
每一个用户发起连接后,一旦验证成功,postmaster进程就会fork—个新的子进程负责连接此 用户。 通常表现为进程形式: postgres postgres [local] idle
10.总结 PostgreSQL的数据目录结构,说明每个文件的作用,并可以配上一些示例说明文件的作用
初始化完成后,PGDATA数据目录下就会生成三个配置文件:
postgresql.conf #数据库实例的主配置文件,基本上所有的配置参数都在此文件中。
pg_hba.conf #认证配置文件,配置了允许哪些IP的主机访问数据库,认证的方法是 什么等信息。
pg_ident.conf #认证方式ident的用户映射文件。
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
11.尝试将PostgreSQL新版本的运行日志存储到数据库
#修改配置文件 [postgres@Rocky8 ~]$ vim /pgsql/data/postgresql.conf log_destination = 'csvlog' #修改成csvlog格式 logging_collector = on #打开日志收集器功能 #重启服务 [postgres@Rocky8 ~]$ pg_ctl restart #查看csv格式的文件 [postgres@Rocky8 ~]$ ll /pgsql/data/log/ total 8 -rw------- 1 postgres postgres 1270 Jan 26 11:20 postgresql-2023-01-26_112023.csv #创建对应的表结构 hellodb=# 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) ); CREATE TABLE #查看表结构 hellodb=# \d postgres_log Table "public.postgres_log" Column | Type | Collation | Nullable | Default -----------------------+-----------------------------+-----------+----------+--------- log_time | timestamp(3) with time zone | | | user_name | text | | | database_name | text | | | process_id | integer | | | connection_from | text | | | session_id | text | | not null | session_line_num | bigint | | not null | 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 | | | Indexes: "postgres_log_pkey" PRIMARY KEY, btree (session_id, session_line_num) #把csv文件导入postgres.log表中 hellodb=# COPY postgres_log FROM '/pgsql/data/log/postgresql-2023-01-26_112023.csv' WITH csv; COPY 8 #查询postgres_log表数据 hellodb=# SELECT * FROM postgres_log; -[ RECORD 1 ]---------+----------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------ log_time | 2023-01-27 01:20:23.995+08 user_name | database_name | process_id | 2143 connection_from | session_id | 63d1f177.85f session_line_num | 1 command_tag | session_start_time | 2023-01-27 01:20:23+08 virtual_transation_id | transaction_id | 0 error_severity | LOG sql_state_code | 00000 message | ending log output to stderr detail | hint | Future log output will go to log destination "csvlog". internal_query | internal_query_pos | context | query | query_pos | location | application_name | backend_type | postmaster leader_pid | query_id | 0
12.图文并茂总结LSN和WAL日志相关概念
LSN: Log Sequence Number (日志序列号)用于记录WAL文件当前的位置,这是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日志的写入位置 hellodb=# select pg_current_wal_lsn(); pg_current_wal_lsn -------------------- 0/16BC1E8 (1 row) #查看WAL日志文件的名称 hellodb=# select pg_walfile_name(pg_current_wal_lsn()); pg_walfile_name -------------------------- 000000010000000000000001 (1 row) #查看WAL日志的偏移量 hellodb=# select pg_walfile_NAME_OFFSET(pg_current_wal_lsn()); pg_walfile_name_offset ------------------------------------ (000000010000000000000001,7061992) #6BC1E8(16进制)=7061992(10进制) (1 row) #查看WAL目录中的普通文件名称,大小和最后修改时间 hellodb=# select pg_ls_waldir (); pg_ls_waldir -------------------------------------------------------------- (000000010000000000000001,16777216,"2023-01-27 13:36:53+08") (1 row)
13.实现WAL日志归档备份。
注意:因为归档备份的是已经完成的文件,所以正在使用的文件有丢失的风险
**************************本地备份************************** #修改配置文件 [root@Rocky8 ~]#vim /pgsql/data/postgresql.conf archive_mode = on # 启用归档模式 archive_command = 'cp %p /archive/%f' #复制到指定文件夹 #创建archive文件夹和更改所有者和所属组 [root@Rocky8 ~]#mkdir /archive/;chown postgres. /archive/ #重新启动服务 [root@Rocky8 ~]#su - postgres [postgres@Rocky8 ~]$ pg_ctl restart #先看一下目前正在使用的WAL文件 postgres=# select pg_walfile_name(pg_current_wal_lsn()); pg_walfile_name -------------------------- 000000010000000000000002 (1 row) #用pg_switch_wal ()函数直接重新生成WAL日志。 postgres=# select pg_switch_wal (); pg_switch_wal --------------- 0/20001A0 (1 row) #把旧WAL文件进行了备份 [root@Rocky8 ~]#ll /archive/ total 32768 -rw------- 1 postgres postgres 16777216 Jan 27 17:58 000000010000000000000001 -rw------- 1 postgres postgres 16777216 Jan 27 18:03 000000010000000000000002 ***********************远程备份****************************** #本地主机:10.0.0.10 远程主机:10.0.0.131 #在本地主机修改配置文件 [root@Rocky8 ~]#vim /pgsql/data/postgresql.conf archive_mode = on # 启用归档模式 archive_command = 'scp %p postgres@10.0.0.131:/archive/%f' #发送至远程主机指定文件夹 #在本地主机postgres用户下实现基于key登录方式 [postgres@Rocky8 ~]$ ssh-keygen [postgres@Rocky8 ~]$ ssh-copy-id postgres@10.0.0.131 #在远程主机上创建文件夹及修改所属者和所属组 postgres@ubuntu2204:~$ mkdir /archive/;chown postgres. /archive/ #添加postgres用户的密码 [20:53:28 root@ubuntu2204 ~]#echo -e '654321\n654321'|passwd postgres #在本地主机重启服务 [postgres@Rocky8 ~]$ pg_ctl restart
14.PostgreSQL多种类型的备份及数据还原
1.逻辑备份及还原:pg_dump和pg_dumpall工具
(1.1)pg_dump 默认文本格式的备份和还原(远程):指定单个数据库进行备份和还原
#本地主机(rocky):10.0.0.10 远程主机(ubuntu):10.0.0.131 ******************************************************************** #在远程主机上创建/backup文件夹及更改所属者和所属组 [09:44:44 root@ubuntu2204 ~]#mkdir /backup/;chown postgres. /backup/ #在远程主机上备份hellodb数据库,备份格式为默认的文本格式 postgres@ubuntu2204:~$ pg_dump -h 10.0.0.10 -U postgres -C -f /backup/hellodb2 hellodb #模拟删掉本地主机上的hellodb数据库 postgres=# drop database hellodb ; #远程恢复数据库 postgres@ubuntu2204:~$ psql -h 10.0.0.10 -U postgres -f /backup/hellodb2
(1.2)pg_dump为定制格式的备份和还原(远程):指定单个数据库进行备份和还原
#本地主机(rocky):10.0.0.10 远程主机(ubuntu):10.0.0.131 ******************************************************************** #在远程主机上创建/backup文件夹及更改所属者和所属组 [09:44:44 root@ubuntu2204 ~]#mkdir /backup/;chown postgres. /backup/ #在远程主机上进行hellodb数据库的备份,备份文件的格式为定制格式 postgres@ubuntu2204:~$ pg_dump -Fc -h 10.0.0.10 -U postgres -C -f /backup/hellodb3 hellodb #查看一下格式 postgres@ubuntu2204:/backup$ file hellodb3 hellodb3: PostgreSQL custom database dump - v1.14-0 #用psql命令先从远程主机上给本地主机创建一个hellodb3的数据库 postgres@ubuntu2204:~$ psql -h 10.0.0.10 -U postgres -c 'create database hellodb3' CREATE DATABASE #从远程主机上恢复数据 postgres@ubuntu2204:~$ pg_restore -h 10.0.0.10 -U postgres -d hellodb3 /backup/hellodb3
(1.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.131 #更改配置文件,允许所有用户连接 [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 #创建备份文件夹及更改所属者和所属组。注意:文件夹必须为空。 [19:50:00 root@ubuntu2204 ~]#mkdir -p /backup/pgdata/ [19:56:05 root@ubuntu2204 ~]#chown postgres. /backup/pgdata/ #开始备份 postgres@ubuntu2204:~$ pg_basebackup -D /backup/pgdata -Ft -U postgres -h 10.0.0.10 -p 5432 -R Password: #输入密码 #查看备份文件 postgres@ubuntu2204:~$ ll /backup/pgdata/ total 50384 -rw------- 1 postgres postgres 182456 Jan 28 19:56 backup_manifest -rw------- 1 postgres postgres 34616832 Jan 28 19:56 base.tar -rw------- 1 postgres postgres 16778752 Jan 28 19:56 pg_wal.tar **********************还原*********************************** #创建存放归档日志的文件夹及更改所属者和所属组 [20:11:10 root@ubuntu2204 ~]#mkdir /archive ; chown postgres. /archive #模拟删掉原数据库文件 [20:11:27 root@ubuntu2204 ~]#rm -rf /pgsql/data/* #把base.tar文件解压缩到数据库的文件夹下 [20:22:12 root@ubuntu2204 ~]#tar xf /backup/pgdata/base.tar -C /pgsql/data/ #把pg_wal.tar文件解压缩到/archive文件夹下 [20:22:55 root@ubuntu2204 ~]#tar xf /backup/pgdata/pg_wal.tar -C /archive/ #修改postgresql.conf配置文件,修改两行参数。 [21:29:16 root@ubuntu2204 ~]#vim /pgsql/data/postgresql.conf restore_command = 'cp /archive/%f %p' recovery_target = 'immediate' #启动数据库,数据已还原 postgres@ubuntu2204:~$ pg_ctl start
2.物理备份及还原:应用逻辑卷快照(趋于热备份)
#查看硬盘情况 [root@Rocky8 ~]#lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sr0 11:0 1 10.5G 0 rom nvme0n1 259:0 0 200G 0 disk ├─nvme0n1p1 259:1 0 1G 0 part /boot └─nvme0n1p2 259:2 0 199G 0 part ├─rl_rocky8-root 253:0 0 70G 0 lvm / ├─rl_rocky8-swap 253:1 0 2G 0 lvm [SWAP] └─rl_rocky8-home 253:2 0 127G 0 lvm /home nvme0n2 259:3 0 20G 0 disk #把硬盘nvme0n2指定为物理卷 [root@Rocky8 ~]#pvcreate /dev/nvme0n2 Physical volume "/dev/nvme0n2" successfully created. #创建卷组 [root@Rocky8 ~]#vgcreate -s 16M testvg0 /dev/nvme0n2 Volume group "testvg0" successfully created #创建逻辑卷 [root@Rocky8 ~]#lvcreate -L 15G -n lv-pgdata testvg0 #创建文件系统 [root@Rocky8 ~]#mkfs.ext4 /dev/testvg0/lv-pgdata #更改文件系统表 [root@Rocky8 ~]#vim /etc/fstab UUID=3f01a1e8-9bcc-4db6-bca3-420d47ba7f31 /pgsql/data ext4 defaults 0 0 #挂载生效 [root@Rocky8 ~]#mount -a #查看文件系统硬盘空间的使用情况 [root@Rocky8 ~]#df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/testvg0-lv--pgdata 15G 41M 14G 1% /pgsql/data #先停用数据库 [root@Rocky8 ~]#su - postgres #使用LVM快照 [root@Rocky8 ~]#lvcreate -n pgdata_snapshot -s -L 1G /dev/mapper/testvg0-lv--pgdata #在启用数据库 [postgres@Rocky8 ~]$ pg_ctl start #可以把上三个步骤写在一个命令行,能够在不影响生产的情况下进行快照备份。 #把LVM快照做挂载 [root@Rocky8 ~]#mount /dev/mapper/pgdata_snapshot /mnt #查看快照内容 [root@Rocky8 ~]#ls /mnt #备份完数据后再把快照删除
15.实现WAL日志完成主从流复制,要求在从节点上进行crontab数据备份,同时手工让主节点宕机,让从节点切换为主节点,并添加新的从节点。
***************master主节点配置(rocky)************************** #创建复制用的角色并授权 postgres=# CREATE ROLE repluser with replication login password '123456'; #创建wal归档文件夹 [root@Rocky8 ~]#mkdir /archive ; chown postgres. /archive #修改postgresql.conf配置文件 listen_addresses = '*' # what IP address(es) to listen on; archive_mode = on # enables archiving; off, on, or always archive_command = 'cp %p /archive/%f' #修改pg_hba.conf授权配置文件 # IPv4 local connections: host all repluser 0.0.0.0/0 md5 # replication privilege. host replication repluser 0.0.0.0/0 md5 #重启服务 [postgres@Rocky8 ~]$ pg_ctl restart ****************slave从节点配置(ubuntu)************************* #先确保主从的数据从开始时是一致的。 #清空从节点数据 [12:46:46 root@ubuntu2204 ~]#rm -rf /pgsql/data/* #创建存放备份数据的文件夹 [12:47:22 root@ubuntu2204 ~]#mkdir -p /backup/pgdata ; chown postgres. /backup/pgdata #创建存放wal归档的文件夹 [12:57:03 root@ubuntu2204 ~]#mkdir /archive ; chown postgres. /archive #远程备份 [12:48:19 root@ubuntu2204 ~]#pg_basebackup -D /backup/pgdata -Ft -U repluser -h 10.0.0.10 -p 5432 -R #把base.tar解压缩到数据库文件夹 [12:55:44 root@ubuntu2204 ~]#tar xf /backup/pgdata/base.tar -C /pgsql/data/ #把pg_wal.tar解压缩到/archive文件夹下 [12:57:35 root@ubuntu2204 ~]#tar xf /backup/pgdata/pg_wal.tar -C /archive/ #修改配置文件 [12:26:13 root@ubuntu2204 ~]#vim /pgsql/data/postgresql.conf primary_conninfo = 'host=10.0.0.10 port=5432 user=repluser password=123456' #重启服务 postgres@ubuntu2204:~$ pg_ctl restart ********************观察状态******************************* #观察主节点 postgres=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication; pid | state | client_addr | sync_priority | sync_state ------+-----------+-------------+---------------+------------ 2118 | streaming | 10.0.0.131 | 0 | async (1 row) #观察主节点上的进程,walsender进程已开启 [root@Rocky8 ~]#ps auxf|grep 'postgres' postgres 2118 0.0 0.4 173832 8068 ? Ss 13:03 0:00 \_ postgres: walsender repluser 10.0.0.131(13986) streaming 0/303B710 #观察从节点状态 [13:04:13 root@ubuntu2204 ~]#pg_controldata pg_control version number: 1300 Catalog version number: 202107181 Database system identifier: 7189644073010032185 Database cluster state: in archive recovery #观察从节点的进程,walreceiver进程已开启 [13:06:23 root@ubuntu2204 ~]#ps auxf|grep 'postgres' postgres 2838 0.0 0.1 161516 5740 ? Ss 13:03 0:04 \_ postgres: walreceiver streaming 0/303B710 ******************从节点crontab做备份********************** #先修改一下/etc/profile文件 [root@Rocky8 ~]#vim /etc/profile export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL export PATH=/apps/pgsql/bin:$PATH #把命令路径加上 #创建脚本文件 [root@Rocky8 ~]#vim /data/scripts/bckpg.sh #!/bin/bash DIR=/backup/pgdata source /etc/profile pg_basebackup -D $DIR-`date +%F` -Ft -R #保证该文件夹必须为空,才能备份数据 #给脚本文件加执行权限 [root@Rocky8 ~]#chmod +x /data/scripts/bckpg.sh #创建计划任务 [13:06:23 root@ubuntu2204 ~]#crontab -e SHELL=/bin/bash * 2 * * * /data/scripts/bckpg.sh **********************主从切换*************************** #在从节点上执行'提升'命令 postgres@ubuntu2204:~$ pg_ctl promote #添加新的从节点,遵循从节点配置过程就行。
16.总结日志记录的内容包含什么?
历史事件:时间,地点,人物,事件
日志级别:事件的关键性程度,Loglevel
17.总结日志分类,优先级别,图文并茂解释应用如何将日志发到rsyslog,并写到目标。
(1)日志分类:
#内置分类
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, syslog #自定义的分类
local0-local7
(2)优先级别:
debug,info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
18.总结rsyslog配置文件格式
#看一下rocky的日志配置文件 [root@Rocky8 ~]#vim /etc/rsyslog.conf #### MODULES #### #模块 -- #### GLOBAL DIRECTIVES #### #全局指令 -- #### RULES #### #规则 *.info;mail.none;authpriv.none;cron.none /var/log/messages #所有类型,info及以上级别,不包括mail,authpriv,cron 写入/var/log/messages文件中 authpriv.* /var/log/secure #authpriv类型的所有级别写入/var/log/secure中 #看一下ubuntu的日志配置文件 [11:46:13 root@ubuntu2204 ~]#vim /etc/rsyslog.d/50-default.conf auth,authpriv.* /var/log/auth.log #auth和authpriv类型的所有级别写入/var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #所有类型,不包括auth和authpriv的写入/var/log/syslog
19.完成功能,sshd应用将日志写到rsyslog的local6分类,过滤所有级别,写入到/var/log/ssh.log。
#修改ssh的配置文件 [root@Rocky8 ~]#vim /etc/ssh/sshd_config SyslogFacility local6 #新建一个/etc/rsyslog.d/myself.conf的配置文件来专门存放和ssh有关的日志 [root@Rocky8 ~]#vim /etc/rsyslog.d/myself.conf local6.* /var/log/ssh.log #自定义local6类型的所有级别 #重启sshd和rsyslog服务 [root@Rocky8 ~]#systemctl restart sshd rsyslog #查看/var/log/ssh.log日志 [root@Rocky8 ~]#tail -f /var/log/ssh.log Jan 30 13:26:22 Rocky8 sshd[2132]: Server listening on 0.0.0.0 port 22. Jan 30 13:26:22 Rocky8 sshd[2132]: Server listening on :: port 22. Jan 30 13:27:59 Rocky8 sshd[2153]: Accepted password for root from 10.0.0.131 port 32758 ssh2
20.完成功能,将3个主机(要求主机名为IP)的ssh日志,通过rsyslog服务将3个主机的ssh日志,集中写入到的主机名为rsyslog-server服务器中,并写入到/var/log/all-ssh.log文件
#集中日志服务:rsyslog-server #另外3台服务器:10.0.0.20; 10.0.0.30; 10.0.0.131 ********************集中日志服务器rsyslog-server*********************** #修改集中日志服务器的配置,使用模块(也可用tcp)及打开监听端口 [root@rsyslog-server ~]#vim /etc/rsyslog.conf module(load="imudp") #去掉#号 input(type="imudp" port="514") #去掉#号 #新建一个/etc/rsyslog.d/myself.conf的配置文件来专门存放和ssh有关的日志 [root@Rocky8 ~]#vim /etc/rsyslog.d/myself.conf local6.* /var/log/all-ssh.log #自定义local6类型的所有级别 #重启ssh和rsyslog服务 [root@rsyslog-server ~]#systemctl restart sshd rsyslog #查看udp端口 [root@rsyslog-server ~]#ss -nul State Recv-Q Send-Q Local Address:Port Peer UNCONN 0 0 0.0.0.0:514 0.0.0.0:* UNCONN 0 0 [::]:514 [::]:* ***********************另外3台服务器************************* #修改ssh配置文件 [root@20 ~]#vim /etc/ssh/sshd_config SyslogFacility local6 #定义类型为local6 #修改rsyslog配置文件 [root@20 ~]#vim /etc/rsyslog.conf local6.* @10.0.0.10:514 #local6类型的所有级别发往集中服务器 #两个@@符号代表tcp #重启ssh和rsyslog服务 [root@20 ~]#systemctl restart sshd rsyslog #3台服务器配置流程一致 **********************在集中日志服务器端查看******************* [root@rsyslog-server ~]#cat /var/log/all-ssh.log Jan 30 15:30:58 20 sshd[1548]: Accepted password for root from 10.0.0.1 port 53632 ssh2 Jan 30 15:48:53 30 sshd[1318]: Accepted password for root from 10.0.0.1 port 53767 ssh2 Jan 30 15:46:03 131 sshd[1844]: Server listening on 0.0.0.0 port 22.
21.总结/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的日志
22.总结journal命令的选项及示例
#查看内核日志(不显示应用日志)
journalctl -k
#查看指定时间的日志
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
#实时滚动显示最新日志
journalctl -f
#查看某个 Unit 的日志
journalctl -u nginx.service
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件保存多久
journalctl --vacuum-time=1years
23.完成将多个主机(要求主机名为ip)的nginx日志集中写入到mysql表中。
************************************************************ #提供mysql服务的主机:10.0.0.30 #日志集中管理的主机:10.0.0.10 #远程主机:10.0.0.20 #远程主机:10.0.0.131 ************************************************************* *********************在10.0.0.30上操作************************ #安装mysql-server [root@mysql ~]#yum -y install mysql-server #启动mysqld [root@mysql ~]#systemctl enable --now mysqld #创建用户及授权 mysql> create user rsyslog@'10.0.0.%' identified by '123456'; mysql> grant all on Syslog.* to rsyslog@'10.0.0.%'; #执行从10.0.0.10发送过来的mysql-createDB.sql脚本 mysql> source mysql-createDB.sql #测试 mysql> select * from SystemEvents where Message like '%am%'\G; *************************** 1. row *************************** ID: 17 CustomerID: NULL ReceivedAt: 2023-01-30 21:50:18 DeviceReportedTime: 2023-01-30 21:50:18 Facility: 1 Priority: 5 FromHost: 20 Message: i am rocky **********************在10.0.0.10上操作********************** #在10.0.0.10上安装rsyslog-mysql [root@rsyslog-server ~]#yum -y install rsyslog-mysql #看一下软件包包含的文件 [root@rsyslog-server ~]#rpm -ql rsyslog-mysql /usr/share/doc/rsyslog/mysql-createDB.sql #自动生成数据库的脚本 #把脚本发到10.0.0.30上 [root@rsyslog-server ~]#scp /usr/share/doc/rsyslog/mysql-createDB.sql 10.0.0.30: #修改配置文件,加载模块,调用模块 [root@mysql ~]#vim /etc/rsyslog.conf module(load="ommysql" *.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.30,Syslog,rsyslog,123456 #重启服务 [root@mysql ~]#systemctl restart rsyslog **********************在10.0.0.20上操作**************** [root@20 ~]#logger 'i am rocky'
24.尝试使用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-20230131 -rw-r--r-- 1 root root 4194304 Jan 31 11:09 /var/log/nginx.log-20230131
25.总结NAS,NAS,SAN区别,使用场景
DAS:是指存储设备直接连接到服务器总线上,存储设备只与一台独立的主机连 接,其他主机不能使用这个存储设备。
NAS:是存储设备通过标准的网络拓扑结构(比如以太网)添加到一群计算机上。与DAS以及SAN不 同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。
SAN:是通过光纤通道或以太网交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。
DAS虽然比较古老了,但是还是很适用于那些数据量不大,对磁盘访问速度要求较高的中小企业
NAS多适用于文件服务器,用来存储非结构化数据,虽然受限于以太网的速度,但是部署灵活,成 本低
SAN则适用于大型应用或数据库系统,缺点是成本高、较为复杂
26.完成文件同步和LAWP架构实现负载均衡实战案例
10.0.0.10为DNS服务器;;10.0.0.20为LAP1服务器;;10.0.0.30为LAP2服务器;;10.0.0.40为NFS服务器;;10.0.0.110为NFS备用服务器;;10.0.0.120为mysql服务器
(1)在10.0.0.10上执行DNS脚本
#!/bin/bash DOMAIN=zyb.com HOST=www HOST_IP1=10.0.0.20 HOST_IP2=10.0.0.30 #配置颜色提示 set_color () { RES_COL=60 MOVE_TO_COLOR="echo -en \e[${RES_COL}G" SETCOLOR_SUCCESS="echo -en \e[1;32m [ok]\n" SETCOLOR_FAILURE="echo -en \e[1;31m [failure]\n" SETCOLOR_WARNING="echo -en \e[1;33m [worning]\n" SETCOLOR_NORMAL="echo -en \e[0m" echo -n "$1" && ${MOVE_TO_COLOR} if [ $2 = "success" -o $2 = "0" ];then ${SETCOLOR_SUCCESS} elif [ $2 = "failure" -o $2 = "1" ];then ${SETCOLOR_FAILURE} else ${SETCOLOR_WARNING} fi ${SETCOLOR_NORMAL} } #配置DNS dns_config () { rpm -ql bind bind-utils &> /dev/null || yum -y install bind bind-utils sed -i -e /listen-on/s/127.0.0.1/any/g -e /allow-query/s/localhost/any/g /etc/named.conf cat > /var/named/$DOMAIN.zone <<EOF \$TTL 1D @ IN SOA secdomain hostname ( 1 3H 10M 1D 3H ) IN NS master master A `hostname -I` $HOST A $HOST_IP1 $HOST A $HOST_IP2 EOF named-checkzone $DOMAIN /var/named/$DOMAIN.zone &> /dev/null && set_color 专区文件正确 0;sleep 1 || exit; chmod 640 /var/named/$DOMAIN.zone chgrp named /var/named/$DOMAIN.zone cat>>/etc/named.rfc1912.zones<<EOF zone "$DOMAIN" IN { type master; file "$DOMAIN.zone"; }; EOF named-checkconf /etc/named.rfc1912.zones &> /dev/null && set_color 专区配置文件正确 0; sleep 1 || exit; set_color 已完成 0 sleep 1 systemctl enable --now named } dns_config
(2)在10.0.0.20和10.0.0.30上执行LAP脚本+NFS客户端脚本
**********************LAP脚本************************* #!/bin/bash LAP_config () { yum -y install httpd php php-mysqlnd php-json wget https://cn.wordpress.org/latest-zh_CN.tar.gz -P /opt tar xf /opt/latest-zh_CN.tar.gz -C /opt mv /opt/wordpress/* /var/www/html/ chown -R apache. /var/www/html/ systemctl enable --now httpd } LAP_config **********************NFS客户端脚本********************** #!/bin/bash NFS_SERVER_IP=10.0.0.40 SHARE_FILE=/data/www MOUNT_POINT=/var/www/html/wp-content/uploads/* #注意需提前有该文件,否则不能挂载。 NFS_config () { yum -y install nfs-utils mount $NFS_SERVER_IP:$SHARE_FILE $MOUNT_POINT cat >> /etc/fstab<<EOF $NFS_SERVER_IP:$SHARE_FILE $MOUNT_POINT nfs _netdev 0 0 EOF mount -a } NFS_config
(3)在10.0.0.40上执行NFS服务器端脚本+serync数据同步脚本
****************NFS服务器端脚本********************** #!/bin/bash NFS_config () { yum -y install nfs-utils systemctl enable --now nfs-server mkdir -p /data/www chmod 757 /data/www cat >/etc/exports <<EOF /data/www *(rw,all_squash,anonuid=666,anongid=666) EOF useradd -u 666 web exportfs -r } NFS_config *******************sesync数据同步脚本************** #!/bin/bash #SYN_DIR=/data/www SYN_USER=rsyncuser BACKUP_IP=10.0.0.110 BACKUP_DIR=backup sersync_config () { wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/sersync/sersync2.5.4_64bit_binary_stable_final.tar.gz tar xf sersync2.5.4_64bit_binary_stable_final.tar.gz -C /opt sed -i -e /\<attrib/s/false/true/g -e /\<localpath/s/opt/data/g -e /\<localpath/s/tongbu/www/g -e /\<remote/s/127.0.0.1/$BACKUP_IP/g -e /\<remote/s/tongbu1/$BACKUP_DIR/g -e /\<auth/s/false/true/g -e /\<auth/s/root/$SYN_USER/g /opt/GNU-Linux-x86/confxml.xml # mkdir -p $SYN_DIR echo "zyb12345">/etc/rsync.pas chmod 600 /etc/rsync.pas /opt/GNU-Linux-x86/sersync2 -dro /opt/GNU-Linux-x86/confxml.xml } sersync_config
(4)在10.0.0.110上执行serync备份服务器脚本
#!/bin/bash sync_config () { rpm -ql rsync-daemon || yum -y install rsync-daemon cat >> /etc/rsyncd.conf << EOF uid = root gid = root max connection = 0 ignore errors exclude = lost+found/ log file = /var/log/rsync.log pid file = /var/run/rsync.pid lock file = /var/run/rsyncd.lock reverse lookup = no [backup] path = /data/backup/ comment = backup dir read only = no auth users = rsyncuser secrets file = /etc/rsync.pas EOF echo "rsyncuser:zyb12345">/etc/rsync.pas chmod 600 /etc/rsync.pas [ -d /data ] && rm -rf /data mkdir -p /data/backup/ chmod 757 /data/backup/ systemctl enable --now rsyncd } sync_config
(5)在10.0.0.120上执行mysql服务器脚本
#!/bin/bash MQL_config () { yum -y install mysql-server systemctl enable --now mysqld touch mysql_data cat>mysql_data<<EOF create user wordpress@'10.0.0.%' identified by '123456'; create database wordpress; grant all on wordpress.* to wordpress@'10.0.0.%'; EOF mysql<mysql_data } MQL_config
27.总结Redis多种安装方法和内核参数优化
(1)Rocky的yum安装
[root@Rocky8 ~]#yum -y install redis [root@Rocky8 ~]#systemctl enable --now redis [root@Rocky8 ~]#redis-cli 127.0.0.1:6379> ping #健康性检查 PONG 127.0.0.1:6379> info #查看详细信息 #也可以直接[root@Rocky8 ~]#redis-cli ping [root@Rocky8 ~]#redis-cli info
(2)源码编译(用脚本实现)+多实例
#!/bin/bash Cpu_core=`awk /processor/ /proc/cpuinfo|wc -l` Install_dir=/apps/redis Redis_config () { [ -f redis-stable.tar.gz ]||wget https://download.redis.io/redis-stable.tar.gz tar -xf redis-stable.tar.gz -C /usr/local/src/ yum -y install gcc jemalloc-devel systemd-devel cd /usr/local/src/redis-stable make -j $Cpu_core USE_SYSTEMD=yes PREFIX=$Install_dir install ln -s $Install_dir/bin/redis-* /usr/bin/ mkdir -p /apps/redis/{etc,log,data,run} cp /usr/local/src/redis-stable/redis.conf /apps/redis/etc/ sed -i -e "s/bind 127.0.0.1/bind 0.0.0.0/" -e "/^dir .*/c dir $Install_dir/data/" -e "/logfile .*/c logfile $Install_dir/log/redis-6379.log" -e "/^pidfile .*/c pidfile $Install_dir/run/redis_6379.pid" $Install_dir/etc/redis.conf cat>>/etc/sysctl.conf<<EOF net.core.somaxconn = 511 vm.overcommit_memory = 1 EOF sysctl -p useradd -r -s /sbin/nologin redis chown -R redis. /apps/redis/ cat>>/lib/systemd/system/redis.service<<EOF [Unit] Description=Redis persistent key-value database After=network.target [Service] ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd ExecStop=/bin/kill -s QUIT \$MAINPID ExecReload=/bin/kill -s HUP \$MAINPID Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 LimitNOFILE=1000000 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable --now redis } Redis_config #查看目录结构 [root@Rocky8 ~]#tree /apps/redis/ /apps/redis/ ├── bin │ ├── redis-benchmark │ ├── redis-check-aof -> redis-server │ ├── redis-check-rdb -> redis-server │ ├── redis-cli │ ├── redis-sentinel -> redis-server │ └── redis-server ├── data ├── etc │ └── redis.conf ├── log │ └── redis-6379.log └── run └── redis_6379.pid 5 directories, 9 files **************************多实例脚本************************* #!/bin/bash Configfile_path=/apps/redis/etc Servicefile_path=/lib/systemd/system multi_instance () { systemctl stop redis.service mv $Configfile_path/redis.conf $Configfile_path/redis6379.conf sed "s/6379/6380/" $Configfile_path/redis6379.conf > $Configfile_path/redis6380.conf sed "s/6379/6381/" $Configfile_path/redis6379.conf > $Configfile_path/redis6381.conf chown -R redis. $Configfile_path/* mv $Servicefile_path/redis.service $Servicefile_path/redis6379.service sed -i "s/redis.conf/redis6379.conf/" $Servicefile_path/redis6379.service cp $Servicefile_path/redis6379.service $Servicefile_path/redis6380.service sed -i "s/6379/6380/" $Servicefile_path/redis6380.service cp $Servicefile_path/redis6379.service $Servicefile_path/redis6381.service sed -i "s/6379/6381/" $Servicefile_path/redis6381.service systemctl daemon-reload systemctl start redis6379.service systemctl start redis6380.service systemctl start redis6381.service } multi_instance
28.总结redis常见指令和数据类型
(1)指令:
INFO:显示当前节点redis运行状态信息
SELECT:切换数据库,相当于myql的use指令
KEYS:查看当前库下的所有key。此命令慎用,容易造成数据库宕机
BGSAVE:手动在后台执行RDB持久化操作
DBSIZE:返回当前库下的所有key数量
FLUSHDB:强制清空当前库中的所有key
FLUSHALL:强制清空当前的redis服务器所有key。即删除所有数据,此命令慎用
SHUTDOWN:关闭redis服务
(2)数据类型:
字符串
列表
集合
有序集合
哈希