第七周作业

1. 总结pg和mysql的优劣势。(pgsql 有时间再写整个留着)

  1. 总结pg二进制安装和编译安装。
  2. 总结pg服务管理相关命令 pg_ctl 和pgsql命令选项及示例和不同系统的初始化操作
  3. 总结pg数据库结构组织
  4. 实现pg远程连接。输入密码和无密码登陆
  5. 总结库,模式,表的添加和删除操作。表数据的CURD。同时总结相关信息查看语句。
  6. 总结pg的用户和角色管理。
  7. 添加mage用户,magedu模式,准备zabbix库,配置mage用户的默认模式magedu,要求mage用户给zabbix库有所有权限。
  8. 总结pgsql的进程结构,说明进程间如何协同工作的。
  9. 总结pgsql的数据目录中结构,说明每个文件的作用,并可以配上一些示例说明文件的作用。
  10. 尝试将pgsql新版本的运行日志存储到数据库。
  11. 图文并茂总结LSN和WAL日志相关概念
  12. 实现WAL日志多种类型的备份,及数据还原。
  13. 实现WAL日志完成主从流复制,要求在从节点上进行crontab数据备份,同时手工让主节点宕机,让从节点切换为主节点,并添加新的从节点。

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

日志记录的内容包括:
历史事件:时间,地点,人物,事件
日志级别:事件的关键性程度,Loglevel

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

facility:设施,从功能或程序上对日志进行归类
#内置分类
auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth),
user, uucp, syslog
#自定义的分类:local0-local7


Priority 优先级别,从低到高排序:
debug,info, notice, warn(warning), err(error), crit(critical), alert,
emerg(panic)

notice:注意
crit(critical):临界值
alert:警惕的
emerg(panic):紧急

17. 总结rsyslog配置文件格式

[root@centos7 ~]# vim /etc/rsyslog.conf 
#### GLOBAL DIRECTIVES ####         ##全局指令

# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog     ##全局工作目录

# Use default timestamp format      ##默认时间戳
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf         ##包含/etc/rsyslog.d/下以conf结尾的其他配置文件*.conf 

# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on

# File to store the position in the journal    
$IMJournalStateFile imjournal.state


#### RULES ####                       ##规则模块

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages      ##所有info级别以上的文件保存位置,不包含mail,authpriv,cron

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure    ##   authpriv 所有级别的日志存储位置

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog   ##   mail 所有级别的日志存储位置  -表示异步写入


# Log cron stuff
cron.*                                                  /var/log/cron     ##   cron 所有级别的日志存储位置

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*    

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log   ### local7自定义的日志存储位置


# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)

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

vim/etc/ssh/sshd.conf

#SyslogFacility AUTHPRIV ##默认值,将写入AUTHPRIV模块
SyslogFacility local6     ##修改值,将写入local6模块

vim  /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local6.*                                                /var/log/myssh.log   ## 增加local6的日志类型所有* 到/var/log/myssh.log



systemctl  restart rsyslog sshd

验证:
[root@centos7 ~]# cat /var/log/myssh.log 
Nov 11 11:40:21 centos7 sshd[61603]: Server listening on :: port 22.
Nov 11 11:40:21 centos7 sshd[61603]: Server listening on 0.0.0.0 port 22.
Nov 11 11:41:47 centos7 sshd[61693]: Failed password for root from 192.168.44.48 port 57706 ssh2
Nov 11 11:41:52 centos7 sshd[61693]: Failed password for root from 192.168.44.48 port 57706 ssh2
Nov 11 11:42:10 centos7 sshd[61693]: Accepted password for root from 192.168.44.48 port 57706 ssh2

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

server步骤:

环境:
192.168.44.8 为收集日ssh日志的server
192.168.44.48 为client
192.168.44.58 为client
192.168.44.88 为clinent
--------------------------------------------------------------------
server步骤:
192.168.44.8 
vim  /etc/rsylog.conf
1,修改主机ssh日志路径等级类型:local6.*   /var/log/all-ssh.log
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local6.*                                                /var/log/all-ssh.log
2,取消注释的远程日志的 udp和tcp的端口
.......................
Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

 Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
3,修改ssh的日志的级别为自定义的分类日志
vim  /etc/ssh/sshd_conf
#SyslogFacility AUTHPRIV  默认值
SyslogFacility local6 修改值
4,重启服务
systemctl restart sshd rsyslog
5,测试主机单机是否记录ssh的日志和 tcp&udp的端口514是否打开。
[root@centos7 ~]#  tail -f /var/log/all-ssh.log 
Nov 11 18:17:21 centos7 sshd[1971]: Accepted password for root from 192.168.44.48 port 37410 ssh2
Nov 11 18:17:41 centos7 sshd[1971]: Received disconnect from 192.168.44.48 port 37410:11: disconnected by user
Nov 11 18:17:41 centos7 sshd[1971]: Disconnected from 192.168.44.48 port 37410
[root@centos7 ~]# ss -ntlup |grep 514
udp    UNCONN     0      0         *:514                   *:*                   users:(("rsyslogd",pid=1809,fd=3))
udp    UNCONN     0      0      [::]:514                [::]:*                   users:(("rsyslogd",pid=1809,fd=4))
tcp    LISTEN     0      25        *:514                   *:*                   users:(("rsyslogd",pid=1809,fd=5))
tcp    LISTEN     0      25     [::]:514                [::]:*                   users:(("rsyslogd",pid=1809,fd=6))
.......................

client 1步骤:client 2,client 3其他类似略

192.168.44.48 为client
1,修改hostname的名称为ip地址:(为了号区分server端那台设备的日志)
hostnamectl set-hostname 192.168.44.48

2,更改ssh的配置:
vim  /etc/ssh/sshd_conf
#SyslogFacility AUTHPRIV
SyslogFacility local6

2,更改rsyslog的配置:
vim  /etc/rsyslog.conf
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
local6.*                                                -/var/log/boot.log  本地也存放 采用异步存储
local6.*                                                @192.168.44.8:514  ##ucp链接-日志服务器的ip+端口 
#local6.*                                                @@192.168.44.8:514  ##tcp链接-日志服务器的ip+端口 

验证:

server端:
taile   -f  /var/log/all-ssh.log
Nov 11 19:51:32 192 root: hell 192.168.44.48
Nov 11 19:51:46 192 root: hell 192.168.44.48 hello sshd
Nov 11 19:51:46 192 root: hell 192.168.44.48
Nov 11 19:51:55 192 root: hell 192.168.44.58
Nov 11 19:52:07 192 root[1998]: 192.168.44.88

客户端分别发送自己的ip地址等级为info的测试日志:
root@centos7 ~]# logger -p local6.info  hell 192.168.44.48

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命令的选项及示例

CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用
journalctl一个命令,查看所有日志(内核日志和应用日志)。
日志的配置文件:
/etc/systemd/journald.conf
journalctl命令格式
journalctl [OPTIONS…] [MATCHES…]
详见 man journalctl

#查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
#查看内核日志(不显示应用日志)
journalctl -k
#查看系统本次启动的日志
journalctl -b
journalctl -b -0
#查看上一次启动的日志(需更改设置)
journalctl -b -1
#查看指定时间的日志
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"
#显示尾部的最新10行日志
journalctl -n
#显示尾部指定行数的日志
journalctl -n 20
#实时滚动显示最新日志
journalctl -f
#查看指定服务的日志
journalctl /usr/lib/systemd/systemd
#查看指定进程的日志
journalctl _PID=1
#查看某个路径的脚本的日志
journalctl /usr/bin/bash
#查看指定用户的日志
journalctl _UID=33 --since today
#查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service --since today
#实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service -f
#合并显示多个 Unit 的日志
journalctl -u nginx.service -u php-fpm.service --since today
#查看指定优先级(及其以上级别)的日志,共有8级
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -p err -b
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#日志管理journalctl
#以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.service -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years

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

环境:
192.168.44.8 为收集日ssh日志的server
192.168.44.18 为mysql库
192.168.44.58 为client&nginx
192.168.44.88 为clinent&nginx
---------------------------------------
192.168.44.8 为收集日ssh日志的server配置:
1,yum install rsyslog-mysql
2,vim  /etc/rsylog.conf
Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

 Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

$ModLoad ommysql        ###调用mysql模块
*.*                     :ommysql:192.168.44.8,Syslog,rsyslog,magedu
重启服务
---------------------------------------
192.168.44.18 为mysql库配置:
1,yun install mariadb-server
2,拷贝192.168.44.8安装rsyslog-mysql的初始化脚本,
  rsync -a /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql  192.168.18:/data/

3,导入sql脚本
mysql>  \. /data/mysql-createDB.sql
mysql>CREATE USER 'rsyslog'@'192.168.44.%' IDENTIFIED BY 'magedu';
mysql>GRANT ALL ON Syslog.* TO 'rsyslog'@'192.168.44.%' ;
---------------------------------------
192.168.44.58 为client&nginx配置
vim  /etc/rsylog.conf
*.info;mail.none;cron.none                @192.168.44.18:514
重启服务
-----------------------------------
[root@server001 logrotate.d]# logger  ' hell123'


[root@mysql-server] select * from SystemEvents\G;
************************** 57. row ***************************
                ID: 57
        CustomerID: NULL
        ReceivedAt: 2023-11-12 01:14:48
DeviceReportedTime: 2023-11-12 01:14:47
          Facility: 22
          Priority: 6
          FromHost: server001
           Message:  hell123
        NTSeverity: NULL
        Importance: NULL
       EventSource: NULL
         EventUser: NULL
     EventCategory: NULL
           EventID: NULL
   EventBinaryData: NULL
      MaxAvailable: NULL
         CurrUsage: NULL
          MinUsage: NULL
          MaxUsage: NULL
        InfoUnitID: 1
         SysLogTag: sshd[1905]:
      EventLogType: NULL
   GenericFileName: NULL
          SystemID: NULL
57 rows in set (0.00 sec)

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

[root@server001 ~]# ll /var/log/nginx/
total 0
-rw-r--r-- 1 root root 0 Nov 12 00:49 access.log
-rw-r--r-- 1 root root 0 Nov 12 00:49 error.log
[root@server001 logrotate.d]pwd
/etc/logrotate.d
[root@server001 logrotate.d]# touch nginx 
[root@server001 logrotate.d]# ll
total 36
-rw-r--r--  1 root root 242 Nov 12 00:51 nginx

[root@server001 logrotate.d]# cat nginx 
/var/log/nginx/*log {
    create 0664 nginx root
    daily
    rotate 90
    size 3M
    missingok
    notifempty
    compress
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}
[root@server001 logrotate.d]dd if=/dev/zero of=/var/log/nginx/access.log bs=4M count=1
[root@server001 logrotate.d]# bash /etc/cron.daily/logrotate
[root@server001 logrotate.d]# ll /var/log/nginx/
total 8
-rw-rw-r-- 1 nginx root    0 Nov 12 01:39 access.log
-rw-r--r-- 1 root  root 4098 Nov 12 01:31 access.log-20231112.gz
-rw-r--r-- 1 nginx root    0 Nov 12 00:49 error.log


[root@server001 logrotate.d]# 

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

DAS:是指存储设备直接连接到服务器总线上,存储设备只与一台独立的主机连 接,其他主机不能使用这个存储设备。

NAS:是存储设备通过标准的网络拓扑结构(比如以太网)添加到一群计算机上。与DAS以及SAN不 同,NAS是文件级的存储方法。采用NAS较多的功能是用来进行文件共享。

SAN:是通过光纤通道或以太网交换机连接存储阵列和服务器主机,最后成为一个专用的存储网络。

在这里插入图片描述

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

nfs共享服务器端:
1,yum -y install nfs-utils
   systemctl enable --now nfs-server
2,mkdir -pv /data/nfs
3[root@192 ~]# cat /etc/exports
    /data/nfs  *(rw,all_squash,anonuid=666,anongid=666)
4,useradd -d /data/nfs -u 666 nfs -g 666   ##创建被压制的账号,防止压榨成nobody导致权限不足
5[root@192 ~]# chown nfs.nfs /data/nfs
   [root@192 ~]# ll -d /data/nfs
    drwxr-xr-x 2 nfs nfs 6 Nov 12 16:23 /data/nfs
  [root@192 ~]# id 666
  uid=666(nfs) gid=666(nfs) groups=666(nfs)
6#生效配置
[root@192 ~]# exportfs -r
[root@192 ~]# exportfs -v
/data/nfs     	<world>(sync,wdelay,hide,no_subtree_check,anonuid=666,anongid=666,sec=sys,rw,root_squash,all_squash)
[root@192 ~]# 
7,局域网其他设备查看:
yum -y install nfs-utils
   systemctl enable --now nfs-server
   
[root@www ~]# showmount -e 192.168.44.8
Export list for 192.168.44.8:
/data/nfs *
8,其他设备挂载:
临时挂载:
[root@www ~]# mount 192.168.44.8:/data/nfs /data/nfs
[root@www ~]# df
Filesystem             1K-blocks    Used Available Use% Mounted on
d
192.168.44.8:/data/nfs     99072    5376     93696   6% /data/nfs
永久挂载:
vim /etc/fstab
192.168.44.8:/data/nfs   /data/nfs  nfs  defaults,_netdev 0 0

[root@centos7 ~]#mount -a
9:验证:
[root@www ~]# cd /data/nfs
[root@www nfs]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 12 16:44 123.222
[root@www nfs]# touch 192.168.44.18.txt
服务器验证是否压榨为666用户nfs:
[root@192 nfs]# ll
total 0
-rw-r--r-- 1 root root 0 Nov 12 16:44 123.222
-rw-r--r-- 1 nfs  nfs  0 Nov 12 16:45 192.168.44.18.txt
[root@192 nfs]# uname -n
192.168.44.8
[root@192 nfs]# 

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

i

notify:
异步的文件系统事件监控机制,利用事件驱动机制,而无须通过诸如cron等的轮询机制来获取事件,
linux内核从2.6.13起支持 inotify,通过inotify可以监控文件系统中添加、删除,修改、移动等各种事件
查看当前系统是否开启inotify:
[root@192 nfs]# grep -i inotify /boot/config-3.10.0-1160.el7.x86_64 
CONFIG_INOTIFY_USER=y

内核是否支持inotify
Linux支持inotify的内核最小版本为 2.6.13,参看man 7 inotify
#列出下面的文件,说明服务器内核支持inotify
[root@192 nfs]# ls -l /proc/sys/fs/inotify
total 0
-rw-r--r-- 1 root root 0 Nov 12 16:52 max_queued_events
-rw-r--r-- 1 root root 0 Nov 12 16:52 max_user_instances
-rw-r--r-- 1 root root 0 Nov 12 16:52 max_user_watches

[root@192 nfs]#cat /proc/sys/fs/inotify/max_queued_events
16384
[root@192 nfs]#cat /proc/sys/fs/inotify/max_user_instances
128
[root@192 nfs]#cat /proc/sys/fs/inotify/max_user_watches
8192
inotify 内核参数说明:
max_queued_events:inotify 事件队列最大长度,如值太小会出现 Event Queue Overflow 错
误,默认值:16384, 生产环境建议调大,比如:327679
max_user_instances:每个用户创建inotify实例最大值,默认值:128
max_user_watches:可以监视的文件的总数量(inotifywait 单进程),默认值:8192,建议调大
修改范例:
[root@192 nfs]#vim /etc/sysctl.conf
fs.inotify.max_queued_events=66666
fs.inotify.max_user_watches=100000
[root@centos8 ~]#sysctl -p
fs.inotify.max_queued_events = 66666
fs.inotify.max_user_watches = 100000
[root@centos8 ~]#cat /proc/sys/fs/inotify/*
66666
128
100000

使用:
实现inotify软件:
inotify-tools
sersync
lrsyncd
inotify+rsync使用方式
inotify 对同步数据目录信息的监控
rsync 完成对数据的同步
利用脚本进行结合

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

rsync 常用于做为 linux系统下的数据镜像备份工具,实现远程同步,支持本地复制,或者与其他SSH、
rsync主机同步数据,支持增量备份,配合任务计划,rsync能实现定时或间隔同步,配合inotify或
sersync,可以实现触发式的实时数据同步
软件包:rsync,rsync-daemon(CentOS 8)
服务文件:/usr/lib/systemd/system/rsyncd.service
配置文件:/etc/rsyncd.conf
端口:873/tcp
格式:
#Local:
rsync [OPTION...] SRC... [DEST]
#Access via remote shell:
Pull:
rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST:DEST
#Access via rsync daemon:
Pull:
rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push:
rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect
to an rsync daemon, and require SRC or DEST to start with a module name

rsync有三种工作方式:

  1. 本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。
  2. 本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格
    式。
  3. 本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via
    rsync daemon"段的格式。
    前两者的本质是通过本地或远程shell,而第3种方式则是让远程主机上运行rsyncd服务,使其监听在一
    个端口上,等待客户端的连接。
常见选项:
v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显
示进度信息的)-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导
致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)-g --group:保持group属性(属组)-p --perms:保持perms属性(权限,不包括特殊权限)-D :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象
-z :传输时进行压缩提高效率
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,
包括它们的属性。用法见下文示例。
--size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会
影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1
目录,使用该选项将拷贝dir1但不拷贝file1。
--max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--
max-size=1.5m")
--min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
--exclude :指定排除规则来排除不需要传输的文件。
--delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行
的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
--backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
--port :连接daemon时使用的端口号,默认为873端口。
--password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell
认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增
量传输更高效。
--existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如
果上层目录不存在也不会传输。
--ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示
例。
--remove-source-files:要求删除源端已经成功传输的文件
#主机backup-server下载rsync-tools工具
[root@backup-server ~]# yum -y install rsync-daemon  

#修改配置文件
[root@backup-server ~]# vim /etc/rsyncd.conf 

uid = root
gid = root
max connections = 0 
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.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


#服务器端准备目录
[root@backup-server ~]# mkdir -pv /data/backup
#服务器端生成验证文件
[root@backup-server ~]# echo "rsyncuser:123456" > /etc/rsync.pas
[root@backup-server ~]# chmod 600 /etc/rsync.pas
#服务器端启动rsync服务
[root@backup-server ~]# rsync --daemon #可加入/etc/rc.d/rc.local实现开
机启动
[root@backup-server ~]# systemctl restart rsyncd #CentOS 7 以上版本

#客户端配置密码文件
#也可将密码赋值给环境变量RSYNC_PASSWORD变量,但不安全
#export RSYNC_PASSWORD=123456
[root@backup-server ~]# echo "123456" > /etc/rsync.pas
[root@backup-server ~]# chmod 600 /etc/rsync.pas #此为必要项,权限必须修改
#查看远程rsync服务器的模块信息
[root@data-server ~]#rsync rsync://192.168.188.88
[root@data-server ~]#rsync rsync://192.168.188.88
backup         	backup dir


#交互式验证查看具体模块内的文件
[root@data-server ~]#rsync rsync://rsyncuser@192.168.188.88/backup
Password:
#非交互式查看共享目录
[root@data-server ~]#rsync --password-file=/etc/rsync.pas
rsync://rsyncuser@192.168.188.88/backup

#客户端测试同步数据
[root@data-server ~]#rsync -avz --delete --password-file=/etc/rsync.pas /data/www/ rsyncuser@192.168.188.88::backup
[root@data-server ~]#rsync -avz --delete --password-file=/etc/rsync.pas
rsyncuser@192.168.188.88::backup /data/www/

 编写inotify+rsync+shell 脚本实现实时数据同步
[root@data-server ~]#vim inotify_rsync.sh 
#!/bin/bash
#
#********************************************************************
#Author:            dingbaohang
#QQ:                904748581
#Date:              2023-08-24
#FileName:         inotify_rsync.sh
#URL:               www.dingbh.top
#Description:      The test script
#Copyright (C):     2023 All rights reserved
#********************************************************************
#!/bin/bash
SRC='/data/www/'
DEST='rsyncuser@192.168.188.88::backup'
rpm -q inotify-tools &> /dev/null ||yum -y install inotify-tools
rpm -q rsync &> /dev/null || yum -y install rsync
inotifywait -mrq --exclude=".*\.swp" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w %f' -e create,delete,moved_to,close_write,attrib ${SRC} |while read DATE TIME DIR FILE;do
    FILEPATH=${DIR}${FILE}
    rsync -az --delete --password-file=/etc/rsync.pas $SRC $DEST && echo "At ${TIME} on ${DATE}, file $FILEPATH was backuped up via rsync" >> /var/log/changelist.log
done
~       
	
[root@data-server ~]#nohup bash inotify_rsync.sh 
nohup: ignoring input and appending output to 'nohup.out'
#查看文件传输日志
[root@data-server ~]#tail -f /var/log/changelist.log
At 17:25:52 on 2023-08-26, file /data/www/a.txt was backuped up via rsync
At 17:25:52 on 2023-08-26, file /data/www/a.txt was backuped up via rsync
At 17:26:06 on 2023-08-26, file /data/www/d.txt was backuped up via rsync
At 17:26:06 on 2023-08-26, file /data/www/d.txt was backuped up via rsync
At 17:26:06 on 2023-08-26, file /data/www/d.txt was backuped up via rsync
At 18:30:38 on 2023-08-26, file /data/www/b.txt was backuped up via rsync
At 18:33:42 on 2023-08-26, file /data/www/c.txt was backuped up via rsync
At 18:34:08 on 2023-08-26, file /data/www/c.txt was backuped up via rsync
At 18:34:08 on 2023-08-26, file /data/www/c.txt was backuped up via rsync
At 18:34:08 on 2023-08-26, file /data/www/c.txt was backuped up via rsync


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多种安装方法和内核参数优化

Redis的yum安装
yum install redis -y

Redis的二进制安装

1,yum -y install gcc jemalloc-devel systemd-devel python3
2, wget http://download.redis.io/releases/redis-7.0.0.tar.gz
3, tar -xvf redis-7.0.0.tar.gz
3, cd /redis-7.0.0
4,make  USE_SYSTEMD=yes PREFIX=/apps/redis install
5,echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
6,. /etc/profile.d/redis.sh
7,echo $PATH
[root@centos7 redis-7.0.0]# echo $PATH
/apps/redis/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
8,mkdir /apps/redis/{etc,log,data,run} ##创建redis的工作和配置目录
9,cp redis.conf /apps/redis/etc/##拷贝redis的配置文件至配置目录
  9.1 创建redis账号:
    useradd redis -r -s /sibn/onlogin 
10.[root@centos7 system]# cat /lib/systemd/system/redis.service  ##编写systemctl启动文件
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

10.[root@centos7 system]# systemctl daemon-reload
   [root@centos7 system]#systemctl start redis.service 
 [root@centos7 system]# systemctl status redis.service 
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2023-11-13 20:40:46 CST; 8s ago
 Main PID: 8809 (redis-server)
   Status: "Ready to accept connections"
   CGroup: /system.slice/redis.service
           └─8809 /apps/redis/bin/redis-server 127.0.0.1:6379



内核优化消除3个报警:

消除启动时的三个Warning提示信息(可选)
前面直接启动Redis时有三个Waring信息,可以用下面方法消除告警,但非强制消除
1.2.2.3.1 Tcp backlog
Tcp backlog 是指TCP的第三次握手服务器端收到客户端 ack确认号之后到服务器用Accept函数处理请求
前的队列长度,即全连接队列
1.2.2.3.2 overcommit_memory
内核参数说明:
范例: 
1.2.2.3.3 transparent hugepage
注意:ubuntu20.04, Rocky8/CentOS8 默认为 never,所以此值无需优化
WARNING: The TCP backlog setting of 511 cannot be enforced because 
/proc/sys/net/core/somaxconn is set to the lower value of 128.
#vim /etc/sysctl.conf
net.core.somaxconn = 1024
#sysctl -p 
WARNING overcommit_memory is set to 0! Background save may fail under low memory 
condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf 
and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to 
take effect.
内核参数overcommit_memory 实现内存分配策略,可选值有三个:0、1、2
0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则内存
申请失败,并把错误返回给应用进程
1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何
2 表示内核允许分配超过所有物理内存和交换空间总和的内存
#vim /etc/sysctl.conf
vm.overcommit_memory = 1
#sysctl -p 
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. 
This will create latency and memory usage issues with Redis. To fix this issue 
run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as 
root, and add it to your /etc/rc.local in order to retain the setting after a 
reboot. Redis must be restarted after THP is disabled.
警告:您在内核中启用了透明大页面(THP,不同于一般4k内存页,而为2M)支持。 这将在Redis中造成延迟
和内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never> 
/sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在
重启后保留设置。禁用THP后,必须重新启动Redis。
[root@centos8 ~]#echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' 
>> /etc/rc.d/rc.local 
[root@centos8 ~]#cat /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@centos8 ~]#chmod +x /etc/rc.d/rc.local
#ubuntu开机配置
[root@ubuntu2004 ~]#cat /etc/rc.local 
#!/bin/bash
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@ubuntu2004 ~]#chmod +x /etc/rc.local

优化后前后查看:

[root@centos7 system]# vim /etc/sysctl.conf
[root@centos7 system]# cat /proc/sys/net/core/somaxconn
128
[root@centos7 system]# sysctl -p 
net.core.somaxconn = 1024
vm.overcommit_memory = 1
[root@centos7 system]# cat /proc/sys/net/core/somaxconn
1024
[root@centos7 system]# cat /proc/sys/vm/overcommit_memory
1
[root@centos7 system]# 

[root@centos7 system]# redis-server
8661:C 13 Nov 2023 20:39:59.404 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
8661:C 13 Nov 2023 20:39:59.404 # Redis version=7.0.0, bits=64, commit=00000000, modified=0, pid=8661, just started
8661:C 13 Nov 2023 20:39:59.404 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
8661:M 13 Nov 2023 20:39:59.405 * Increased maximum number of open files to 10032 (it was originally set to 1024).
8661:M 13 Nov 2023 20:39:59.405 * monotonic clock: POSIX clock_gettime
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 7.0.0 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 8661
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               


8661:M 13 Nov 2023 20:39:59.406 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
8661:M 13 Nov 2023 20:39:59.406 # Server initialized
8661:M 13 Nov 2023 20:39:59.406 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
8661:M 13 Nov 2023 20:39:59.406 * The AOF directory appendonlydir doesn't exist
8661:M 13 Nov 2023 20:39:59.407 * Ready to accept connections

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

Redis 常见指令:

redis-cli
info
ping

config get

config set

get key *

dbsize
。。。。。

数据类型:

一、Redis键(key)

● keys *:查看当前库的所有key(匹配:keys *1)

● exists key:判断某个key是否存在

● type key:查看你的key是什么类型

● del key:删除指定的key数据

● unlink key:根据value选择非阻塞删除(仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作)

● expire key time:给指定的key设置过期时间

● ttl key:查看还有多少秒过期,-1表示永不过期,-2表说已过期

● select index: 命令切换数据库

● dbsize:查看当前数据库的key数量

● flushdb:清空当前库

● flushall:通杀全部库

二、String类型

1.简介

● String是Redis最基本的类型,一个key对应一个value。

● String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg或者序列化的对象

●String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M

2.常用命令

● set <key> <value>:添加键值对

● get <key>:查询对应键值

● append <key> <value>:将给定的value追加到原值的末尾

● strlen <key>:获得值的长度

● setnx <key> <value>:只有在key不存在时,设置key的值

● incr <key>:将key中储存的数字值增1。只能对数字值操作,如果为空,新增值为1

● decr <key>:将key中储存数字值减1。只能对数字值操作,如果为空,新增值为-1

● incrby/decrby <key> <步长>:将key中储存的数字值增减,自定义步长

● mset <key1> <value1><key2> <value2>......:同时设置一个或多个key-value对

● mget <key1> <key2> <key3>......:同时获取一个或多个value

● msetnx <key1> <value1><key2> <value2>......:同时设置一个或多个key-value对,当且仅当所有给定key都不存在。原子性,有一个失败则都失败

● getrange <key> <起始位置> <结束位置>:获得值的范围,前包后包

● setrange <key> <起始位置> <value>:用value覆盖key所储存的字符串值,从<起始位置>开始

● setex <key> <过期时间> <value>:设置键值的同事,设置过期时间,单位秒

● getset <key> <value>:以新换旧,设置了新值的同时获得旧值

3.数据结构

String数据结构为简单动态字符串(SDS),是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配

三、List列表

1.简介

单键多值,Redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部( 左边)或者尾部(右边)。

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

2.常用命令

● lpush/rpush <key1> <value1> <value2> <value3>...:从左边/右边插入一个或多个值

● lpop/rpop <key> 从左边/右边吐出一个值。值在键在,值光键亡

● rpoplpush <key1> <key2>:从key1列表右边吐出一个值,插到key2列表左边

● lrange <key> <start> <stop>:按照索引下标获得元素(从左到右),0 -1(表示获取所有)

● lindex <key> <index>:按照索引下标获得元素(从左到右)

● llen <key>:获得列表长度

● linsert <key> before <value> <newvalue>:在value的后面插入newvalue

● lrem <key> <n> <value>:从左边删除n个value(从左到右)

● lset <key> <index> <value>:将列表key下标为index的值替换成value

3.数据结构

List的数据结构为快速链表quickList。首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表,它将所有的元素紧挨着一起存储,分配的一块连续的内存。

当数据量比较多的时候才会改成quickList

Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入性能,又不会出现太大的空间冗余。

四、Set集合

1.简介

Set对外提供的功能与lisst类似是一个列表的功能,set可以自动排重,需要用列表数据,又不希望出现重复数据时,set是一个很好的选择。set提供了判断某个元素是否在set集合内的重要接口。

Redis的set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加、删除、查找的复杂度都是O(1)。一个算法,随着数据的增加,执行时间长短,如果是O(1),数据增加,查找数据的时间不变。

2.常用命令

● sadd <key1> <value1> <value2>...:将一个或多个member元素加入到集合key中,已经存在的member元素将被忽略

● smembers <key> 取出该集合的所有值

● smember <key> <value> 判断集合key是否为含有该value值,有则返回1,没有0

● scard <key> 返回该集合的元素个数

● srem <key> <value1> <value2>...:删除集合中的某个元素

● spop <key>:随机从该集合中吐出一个值

● srandmember <key> <n>:随机从该集合中取出n个值。不会从集合中删除

● smove <source> <destination> <value>:把集合中的一个值从一个集合移动到另一个集合

● sinter <key1> <key2>:返回两个集合的交集元素

● sunion <key1> <key2>:返回两个集合中的并集元素

● sdiff <key1> <key2>:返回两个集合中的差集元素(key1中的,不包含key2)

3.数据结构

set数据是dict字典,字典是用哈希表实现的。

Java中的HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的Set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值

五、Hash哈希

1.简介

● Redis hash是一个键值对集合。

● Redis hash是一个string类型的field和value的映射表,hash特别适用用于存储对象,类似Java里面的Map<Strinf,Object>2.常用命令

● hset <key> <field> <value>:给key集合中的field键赋值value

● hget <key> <field>:从key集合的field键取出value

● hmset <key1> <field1> <value1> <key2> <field2> <value2>...:批量设置hash的值

● hexists <key> <field>:查看哈希表key中,给定域field是否存在

● hkeys <key>:列出该hash集合的所有field

● hvals <key>:列出该hash集合的所有value

● hincrby <key> <field> <n>:为哈希表key中的域field的值加上增量n

● hsetnx <key> <field> <value>:将哈希表key中的域field的值设置为value,当且仅当域field不存在

3.数据结构

Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表),当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

六、Zset有序集合

1.简介

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。有序集合zset的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式

排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的。因为元素是有序的所以你也可以很快的根据评分(score),或者次序(position)来获取一个范围的元素。访问有序集合的中间

元素也是非常快的。

2.常用命令

● zadd <key> <score1> <value1> <score2> <value2>...:将一个或多个score值加入到有序集合key当中

● zrange <key> <start> <stop> [WITHSCORES]:返回有序集合key中,下标在<start><stop>之间的元素,带WITHSCORES,可以让分数一起和值返回到结果集

● zrangebyscore key minmax [withscores] [limit offset count]:返回有序集合key中,所以score值介于min和max之间(包括等于min或max)的成员,有序集合成员按score值递增次序排序

● zrangebyscore key minmax [withscores] [limit offset count]:同上,改为从大到小排列

● zincrby <key> <increment> <value>:为元素的score加上增量

● zrem <key> <value>:删除该集合下,指定值的元素

● zcount <key> <min> <max>:统计该集合,分数区间内的元素个数

● zrank <key> <value>:返回该值在集合中的排名,从0开始

3.数据结构

Zset是Redis提供的一个特别的数据结构,一方面它等价于java的数据结构Map<String,Double>,可以给每一个元素赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重

score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。

zset底层使用了两个数据结构。

(1)hash,hash的作业就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。

(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表
————————————————
版权声明:本文为CSDN博主「一枚务实的码农」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42003636/article/details/128750927
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值