Tag: linux

  • rsync同步错误failed: Read-only file system (30)

    rsync同步错误failed: Read-only file system (30)

    你可能会碰到如下错误,检查文件和目录权限没有问题,rsync的ip授权也没有问题 提示目标文件系统只读,这是因为被systemd的配置限制了服务对系统文件的访问权限 更改文件/lib/systemd/system/rsync.service配置,默认是full,改为none 参数解释: ProtectSystem=none:没有特别的保护,服务可以自由地访问系统文件。ProtectSystem=full:会使/usr、/boot和/etc目录对服务来说是只读的,从而提供一定程度的保护。ProtectSystem=strict:除了full提供的保护外,这个设置还会将整个文件系统(包括/home、/root和运行时目录)都设置为只读。 然后重新载入配置即可systemctl daemon-reloadsystemctl restart rsync 还有一个选择,那就是用ReadWritePaths参数开放指定某个目录的权限,这样更符合安全守则 [Service]ProtectSystem保持默认配置 ProtectSystem=fullReadWritePaths=/data3/web

  • Linux下的翻译转码命令工具

    Linux下的翻译转码命令工具

    ascii2uni转码echo ‘\u73af\u5883\uff0c\u800c’ | ascii2uni -a U -q cconv 繁体简体:b.txt 是繁体 输出a.txt 为简体cconv -f UTF8-HK -t UTF8-CN b.txt -o a.txt Translate Shellhttps://linux.cn/article-9107-1.htmlhttps://www.clloz.com/programming/assorted/2019/11/19/translate-shell-usage/ nodejs解决方案,牛逼!https://www.zhihu.com/question/47239748https://github.com/John-Theo/google-translate-serverhttps://www.npmjs.com/package/google-translate-cn-api

  • Linux的文件描述符

    Linux的文件描述符

    1、文件描述符Linux系统预留可三个文件描述符:0、1和2,他们的意义如下所示:0——标准输入(stdin)1——标准输出(stdout)2——标准错误(stderr)标准输出——stdout假设:在当前目录下,有且只有一个文件名称为123.txt的文件,这时我们运行这个命令【ls 123.txt】,就会获得一个标准输出stdout的输出结果:123.txt错误输出——stderr按照上面的假设,我们运行另一条命令【ls abc.txt】,这样我们就会获得一个标准错误stderr的输出结果“ls:无法访问abc.txt:没有那个文件或目录”。 2、重定向重定向的符号有两个:>或>>,两者的区别是:前者会先清空文件,然后再写入内容,后者会将重定向的内容追加到现有文件的尾部。举个例子:(a)重定向标准输出stdout如上图所示,对比没有添加重定向的操作,这条命令在使用之后并没有将123.txt打印到屏幕。在紧接的cat操作后,可以发现本来应该被输出的内容被记录到stdout.txt中。(b)重定向标准输出(c)可以将stderr单独定向到一个文件,stdout重定向到另一个文件cmd 2> stderr.txt 1>stdout.txt(d)也可以将stderr和stdout重定向到同一个文件cmd > output.txt 2>&1或采用下面的方法,可以少写几个字,能达到同样的效果cmd &> output.txtcmd >& output.txt     #两个表达式效果一样的 3、Linux特殊文件/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit bucket)或黑洞。所以,2>/dev/null的意思就是将标准错误stderr删掉。

  • linux路由命令ip rule和ip route(替代ifconfig和route命令)
  • Transit Over GRE的vps服务器

    Transit Over GRE的vps服务器

    在你的服务器和商家给的临时vps间建立一个GRE隧道,然后让目的地址为大陆的数据包全部经过隧道传输,实现去程走服务器自己的线路,而回程修改成联通的as10099~as9929以达到优化回程线路的效果

  • linux下用split命令切割大文件技巧

    linux下用split命令切割大文件技巧

    比如切割大的sitemap文件

  • grep出现报错binary file matches
  • Linux中替换回车换行的工具sed、tr、awk

    Linux中替换回车换行的工具sed、tr、awk

    linux下对文本文件进行回车替换

  • 常见编码Unicode、UTF ISO 8859-1 GBK UTF概念解释及乱码问题分析

    常见编码Unicode、UTF ISO 8859-1 GBK UTF概念解释及乱码问题分析

    最早的编码就是ISO 8859-1,属于单字节编码,应用于英文系列。最多能表示的字符范围是0-255(编码范围是0x00-0xFF),其中0x00-0x7F之间完全和ASCII一致,因此向下兼容ASCII。除ASCII收录的字符外,ISO-8859-1收录的字符还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。欧元符号等出现的比较晚,没有被收录在ISO 8859-1当中。

  • 目录/var/spool/postfix/maildrop有很多大量散碎文件处理方法
  • Linux下常用的TCP/IP协议命令
  • rsync --delete --delete-before --delete-during 多个选项有啥区别?

    rsync –delete –delete-before –delete-during 多个选项有啥区别?

    先看原文解释: –del/–delete_during:复制时从目标目录中删除文件(与–delete-before相比,节省了内存:–delete-before进行了单独扫描以查找可删除的内容)–delete:如果目标目录中没有文件,则删除它们在源目录中存在。–delete-before:从源目录复制具有相同名称的文件之前,先删除目标目录中的文件–delete-during:在复制具有相同名称的文件时删除目标目录中的文件源目录中的名称–delete-delay:标记在传输过程中删除,但要等到传输完成后–delete-after:接收器在传输之后而不是之前删除…如果rsync的其他部分将多余的文件移到了其他地方,想要它而不是–delete-delay,因为–delete-delay决定了在传输过程中要删除的内容,而–delete-after则检查了目录以查找应在完成所有操作后删除的文件。–delete-excluded:从目标位置删除文件从源目录的传输中明确排除的目录。 具体讨论来看: 默认情况下,rsync不会在目标端删除任何文件。要使rsync完全删除文件,您需要至少使用一个删除选项。如果您不在乎何时删除文件,只需使用–delete并将选择保留为rsync即可。您可以将–delete与其他删除选项结合使用(这不会冲突),但是您不必这样做,因为所有其他删除选项都已经暗示了–delete。–delete-before的工作方式如下:rsync看起来源于哪些文件,并且目的地中存在哪些文件,删除在目的地但在源中找不到的所有文件,然后开始实际同步。如果目标的存储空间很小,则此顺序很有用,因为在开始传输任何新文件之前,它将首先释放目标上的更多磁盘空间。缺点是rsync将需要更多的内存来执行该操作,并且整个操作是一个两步过程,因此速度较慢。–delete-during的工作方式如下:rsync立即开始同步文件,并且当它遇到一个存在的文件时仅在目的地,它被删除。这样就不会造成速度损失,也不需要额外的内存。不利的一面是,可能会在删除删除的文件之前先将许多新文件复制到目标位置,因此目标位置在操作过程中可能需要比最终在整个操作完成后需要更多的磁盘存储空间。完成。–delete-after的工作方式如下:首先同步所有文件,然后执行–delete-before在同步阶段之前执行的相同操作。在大多数情况下,这是最糟糕的选择,因为它需要最多的内存,目标位置上的大多数磁盘空间,并且速度较慢,因为它需要两个步骤。基本上,它结合了其他两种方法的所有缺点。此选项主要用于您正在使用“合并文件”的情况(什么是合并文件以及它们如何工作超出了此答案的范围)。由于这些文件可能包含删除期间要排除的文件的规则,因此,如果在删除阶段要考虑其内容,则必须在删除阶段之前复制新的合并文件。除非有此要求,否则–delete-after没有任何优势。–delete-delay是一个相当新的选项(在rsync 2.6.9中不可用,例如在macOS 10.15中仍是默认设置)。它像–delete-during一样工作,除了它不会立即删除文件,而是在同步完成后删除文件,因此它是–delete-during和–delete-after的混合体。优点是它比–delete-after更快,并且仍正确支持合并文件,缺点是在同步过程中需要更多的内存。–delete-excluded告诉rsync不仅删除源上丢失的文件,还要删除目的地中被排除在同步之外的文件(–exclude或–exclude-from),无论这些文件是否实际存在于源文件中。

  • Linux将十六进制转换为ASCII字符的几种方法
  • linux端口转发7种方法

    linux端口转发7种方法

    本文讨论linux下端口转发的7个方法。

  • 如何利用nvtop命令监控GPU(AMD & Intel)
  • Puppeteer+Nodejs截图乱码中文变方块,在Ubuntu 22.04上安装中文字体
  • shell的数字循环、字母循环、指定顺序循环

    shell的数字循环、字母循环、指定顺序循环

    花括号for i in {1..3};doecho “$i What to do”done 循环字母: for i in {a..z};doecho “Letters is $i”done seq产生for i in seq 1 3;doecho “num is $i”done 条件循环小括号for((i=1;i<=3;i++));doecho “Cycle number is $i”done While循环i=1while(($i<=3));doecho “while run num is $i”i=$(($i+1))done

  • rsync 示例:使用exclude-from排除多个文件和目录
  • Linux用户对文件所属权限解读

    Linux用户对文件所属权限解读

    还是需要记一下:Linux 系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。在 Linux 中我们通常使用以下两个命令来修改文件或目录的所属用户与权限:chown (change owner) : 修改所属用户与组。chmod (change mode) : 修改用户的权限。下图中通过 chown 来授权用户,通过 chmod 为用户设置可以开门的权限。 在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如: [root@www /]# ls -ltotal 64dr-xr-xr-x 2 root root 4096 Dec 14 2023 bindr-xr-xr-x 4 root root 4096 Apr 19 2023 boot 实例中,bin 文件的第一个属性用 d 表示。d 在 Linux 中代表该文件是一个目录文件。在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。当为…

  • 检测监控域名过期天数的shell脚本代码

    检测监控域名过期天数的shell脚本代码

    可以用于检测域名过期天数

  • Linux history命令显示时间

    Linux history命令显示时间

    Linux history命令显示时间

  • Linux 系统 /var/log/journal/ 是什么?垃圾日志需要清理么?
  • 清理操作系统产生的日志 /var/log/journal

    清理操作系统产生的日志 /var/log/journal

    来源:https://blog.mimvp.com/article/30995.html 问题来源:发现/var/log/journal/0ea734564f9a4e2881b677b82d679dfc目录下有若干系统日志垃圾文件,如何清理? CentOS系统中有两个日志服务,分别是传统的 rsyslog 和 systemd-journalls -l /etc/logrotate.d/ -rw-r–r– 1 root root 91 Apr 11 2018 bootlog-rw-r–r– 1 root root 160 Sep 15 2017 chrony-rw-r–r– 1 root root 138 Oct 30 2018 iptraf-ng-rw-r–r– 1 root root 187 Dec 27 2017 monit-rw-r–r– 1 root root 173 Mar 15 2013 monitorix-rw-r–r– 1 root root 868 Jul 28…

  • Linux下如何使用 timedatectl 命令设置时间、时区和同步系统时钟

    Linux下如何使用 timedatectl 命令设置时间、时区和同步系统时钟

    1.要显示系统上的当前时间和日期,请从命令行使用timedatectl 命令,如下所示:# timedatectl status 检查时间和日期 在上面的截屏视频中,RTC时间是硬件时钟时间。 2.你的Linux系统上的时间总是通过系统上设置的时区来管理的,要查看你当前的时区,按如下操作: #timedatectl 或者 #timedatectl | grep time 检查 Linux 时区 3.要查看所有可用时区,请运行以下命令: # timedatectl list-timezones 列出 Linux 中的所有时区 4.要根据您的位置查找本地时区,请运行以下命令: 在 Linux 中查找本地时区 5.要在 Linux 中设置本地时区,我们将使用set-timezone开关,如下所示。 # timedatectl set-timezone “Asia/Kolkata” 始终建议使用和设置协调世界时UTC。# timedatectl 设置时区 UTC 在 Linux 中设置 UTC 时间 您需要输入正确的时区名称,否则在更改时区时可能会出错,在以下示例中,时区“亚洲/加尔各答”不正确,因此会导致错误。 在 Linux 中设置正确的时区 如何在 Linux 中设置时间和日期 6.您可以使用 timedatectl 命令设置系统的日期和时间,如下所示: 要仅设置时间,我们可以使用设置时间开关以及HH:MM:SS(小时、分钟和秒)的时间格式。 timedatectl…

  • linux服务器常用服务端口

    linux服务器常用服务端口

    HTTP服务器,默认的端口号为80/tcp(木马Executor开放此端口);HTTPS(securely transferring web pages)服务器,默认的端口号为443/tcp 443/udp;Telnet(不安全的文本传送),默认端口号为23/tcp(木马Tiny Telnet Server所开放的端口);FTP,默认的端口号为21/tcp(木马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口);TFTP(Trivial File Transfer Protocol ),默认的端口号为69/udp;SSH(安全登录)、SCP(文件传输)、端口重定向,默认的端口号为22/tcp;SMTP Simple Mail Transfer Protocol (E-mail),默认的端口号为25/tcp(木马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端口);POP3 Post Office Protocol (E-mail) ,默认的端口号为110/tcp;WebLogic,默认的端口号为7001;WebSphere应用程序,默认的端口号为9080;WebSphere管理工具,默认的端口号为9090;JBOSS,默认的端口号为8080;TOMCAT,默认的端口号为8080;WIN2003远程登陆,默认的端口号为3389;Symantec AV/Filter for MSE ,默认端口号为 8081;Oracle 数据库,默认的端口号为1521;ORACLE EMCTL,默认的端口号为1158;Oracle XDB( XML 数据库),默认的端口号为8080;Oracle XDB FTP服务,默认的端口号为2100;MS SQLSERVER数据库server,默认的端口号为1433/tcp 1433/udp; MS SQLSERVER数据库monitor,默认的端口号为1434/tcp 1434/udp;QQ,默认的端口号为1080/udp

  • 磁盘文件删除后磁盘空间并没有减少

    磁盘文件删除后磁盘空间并没有减少

    将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容。出现删除文件后,空间还没有释放的原因,是因为某个进程还在一直向这个文件写入内容,导致删除了文件后,进程锁定,文件对应的指针部分并未从meta-data中清除,由于指针并未删除,系统内核就默认文件并未被删除,因此查询文件系统使用率时,显示空间并未释放。

  • Linux polkit权限提升漏洞修复方法(CVE-2021-4034)

    Linux polkit权限提升漏洞修复方法(CVE-2021-4034)

    Polkit(PolicyKit)是类Unix系统中一个应用程序级别的工具集,通过定义和审核权限规则,实现不同优先级进程间的通讯。pkexec是Polkit开源应用框架的一部分,可以使授权非特权用户根据定义的策略以特权用户的身份执行命令。

  • 小内存vps内mysql的优化

    小内存vps内mysql的优化

    只有1G内存的vps的情况下,还要启动mysql,默认的参数会占用大量的内存,需要优化缩减:

  • CentOS7 安装Clamav 用于linux的病毒扫描

    CentOS7 安装Clamav 用于linux的病毒扫描

    I, CentOS7 安装Clamav 安装依赖 yum -y install gcc-c++ pcre-devel zlib-devel openssl-devel llvm-devel libxml2 libxml2-devel libcurl-devel 解压编译安装 tar zxf clamav-0.102.1.tar.gz cd clamav-0.102.1 ./configure –prefix=/opt/clamav 或者有libcurl-devel报错情况下: ./configure –prefix=/opt/clamav –disable-clamonacc make && make install II, 修改配置文件 groupadd clamav useradd clamav -s /sbin/nologin mkdir /opt/clamav/logs mkdir /opt/clamav/share/update touch /opt/clamav/logs/{freshclam.log,clamd.log} chown -R clamav:clamav /opt/clamav/logs chown clamav.clamav /opt/clamav/share/update cp /opt/clamav/etc/clamd.conf.sample /opt/clamav/etc/clamd.conf…

  • linux下删除带横岗的文件

    linux下删除带横岗的文件

    Linux下处理特殊字符的文件

  • 修改mysql 5.7.27日志时区从UTC到SYSTEM(数据库时间 和 日志记录时间不一样解决办法)

    修改mysql 5.7.27日志时区从UTC到SYSTEM(数据库时间 和 日志记录时间不一样解决办法)

    问题:mysql的日志显示时间少8个小时,明显是时区问题。 先查看数据库时间是对的: mysql> select now(); +———————+ | now() | +———————+ | 2021-07-03 11:03:15 | +———————+ 1 row in set (0.01 sec) 再次查看默认的系统时区system_time_zone是CST,time_zone是跟随SYSTEM,所以也是CST,mysql数据库采用的时区没有问题,都是中国时区的时间。 mysql> show variables like “%time_zone%”; +——————+——–+ | Variable_name | Value | +——————+——–+ | system_time_zone | CST | | time_zone | SYSTEM | +——————+——–+ 2 rows in set (0.01 sec) 但是mysql的日志时间是不对的,比正常时间晚了8个小时,查看日志采用的时区log_timestamps,发现是UTC mysql> SHOW global…

  • Discuz清除广告手段(广播/收听/最近访客)
  • 清理Discuz空间的最近访客、广播、通知等垃圾信息的方法
  • 在Linux Centos7下,如何定时对日志文件进行切割?

    在Linux Centos7下,如何定时对日志文件进行切割?

    使用logrotate通用方法来切割日志:(1).logrotate的配置文件logrotate配置文件主要在两个地方:/etc/logrotate.conf以及/etc/logrotate.d/下的明细配置文件。其中/etc/logrotate.conf文件是主配置文件,/etc/logrotate.d/下的明细配置文件都会被读入/etc/logrotate.conf进行执行,所以请注意这里还涉及到了公有变量和私有变量。 logrotate的执行是由crond服务来调用的,其脚本是/etc/cron.daily/logrotate,每天自动执行。我们可以看一下脚本具体内容: [root@moneyslow.com ~]# cat /etc/cron.daily/logrotate#!/bin/sh/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.confEXITVALUE=$?if [ $EXITVALUE != 0 ]; then/usr/bin/logger -t logrotate “ALERT exited abnormally with [$EXITVALUE]”fiexit 0简单的说明:/usr/sbin/logrotate工具调用了/var/lib/logrotate/logrotate.status和/etc/logrotate.conf两个文件。然后将执行的结果(就是那个$?,成功为0,不成功为非0)进行判断,非0时执行/usr/bin/logger命令。最后退出。看完定时计划任务,我们再来看主配置文件/etc/logrotate.conf(也就是公有变量)。具体内容如下:[root@moneyslow.com ~]# grep -vE “^$|^#” /etc/logrotate.conf weekly  //每周一次rotate(翻译是旋转,其实就是切割)rotate 4  //保留4份切割文件,多余删除,不计算新建日志文件create  //结束后创建一个新的空白日志文件dateext  //用日期作为切切割文件的后缀include /etc/logrotate.d  //将/etc/logrotate.d目录下的文件都加载进来(全都执行)/var/log/wtmp {  //仅针对/var/log/wtmp文件monthly  //每月执行一次create 0664 root utmp  //结束后创建新的空白日志,权限0664,所有者root,所属组utmpminsize 1M  //切割文件最少需要1M,否则不执行rotate 1  //保留1份,多余删除,不计算新建日志文件}/var/log/btmp {  //仅针对/var/log/btmpmissingok  //丢失不报错monthly  //每月执行一次create 0600 root utmp  //结束后创建新的空白日志,权限0600,所有者root,所属组utmprotate 1  //保留1份,多余删除,不计算新建日志文件}配置文件参数说明:missingok  日志切割期间产生错误将被忽略(如果日志丢失,不报错继续切割)daily、weekly、monthly、yearly  每天、每周、每月、每年执行create MODE OWNER GROUP  切割后指定创建新的空白文件的属性nocreate  不建立新的日志文件rotate N  保留N份,多余删除,不计算新建日志文件dateext  用当前日期作为后缀命名格式(默认年月日)dateformat .%s  配合dateext使用,紧跟在下一行出现,定义切割后的文件名,只支持%Y,%m,%d,%ssize/minsize  达到指定大小才会切割,默认单位bytes,还可以是KB和MBcompress  切割结束后,归档并使用gzip格式压缩nocompress  解除compress参数delaycompress  总是与compress参数一起使用,指示logrotate不要将最近的归档压缩,压缩将在下一次切割进行。nodelaycompress  解除delaycompress参数ifempty  即使日志为空,也执行切割notifempty  如果日志为空,切割不执行prerotate/endscript  在所有其他指令之前执行prerotate和endscript之间的命令。postrotate/endscript  在所有其他指令完成后,postrotate和endscript之间的命令将被执行。sharescripts  所有日志切割后统一执行一次脚本,如果没有配置该参数,则每个日志切割后都会执行一次脚本。errors ADDRESS  切割时的错误信息发送到指定的Emial地址mail ADDRESS  切割日志发送到指定的Email地址nomail  切割日志不发送邮件olddir DIRECTORY  切割后的日志文件放入指定目录,必须与当前日志处在同一文件系统noolddir  切割后的日志文件与当前文件放在同一目录下copytruncate  用于还在打开中的日志文件,把当前日志备份并截断;先拷贝后清空,可能丢失部分日志nocopytruncate  备份日志文件,但不截断。(2).查看上次切割日志时间/var/lib/logrotate/logrotate.status中默认记录logrotate上次切割日志文件的时间 [root@moneyslow.com logrotate]# cat /var/lib/logrotate/logrotate.statuslogrotate state…

  • Mac下利用brew工具把git版本从2.23升级到2.30

    查看目前git版本为2.23: fox@MacBook-Air ~ % git –version git version 2.23.0 进行升级: fox@MacBook-Air ~ % brew upgrade git Updating Homebrew… ==> Downloading https://homebrew.bintray.com/bottles-portable-ruby/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz -=O=- # # # # curl: (6) Could not resolve host: d29vzk4ow07wi7.cloudfront.net ==> Downloading https://github.com/Homebrew/homebrew-portable-ruby/releases/download/2.6.3_2/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz #################################################################################################################### 100.0%#################################################################################################################### 100.0% ==> Pouring portable-ruby-2.6.3_2.yosemite.bottle.tar.gz ==> Auto-updated Homebrew! Updated 3 taps (laggardkernel/tap, homebrew/core and homebrew/cask). ==> New Formulae…

  • mysql数据类型timestamp存储的时间戳上限到2038年的解决方案

    mysql数据类型timestamp存储的时间戳上限到2038年的解决方案

    方案1: 直接将字段数据类型(timestamp)修改成数据类型(datetime) alter table moneyslow modify intime datetime #海阔中文网# 方案2: 新建一个数据类型(datetime)的字段,修改程序代码,讨论自身业务定时启用新字段。  

  • Centos7.6下docker安装sonarqube7.6加postgres:9.6实现代码安全扫描检测

    Centos7.6下docker安装sonarqube7.6加postgres:9.6实现代码安全扫描检测

    代码安全检查的流程: 环境需求: https://docs.sonarqube.org/7.6/requirements/requirements/ Linux If you’re running on Linux, you must ensure that: vm.max_map_count is greater or equals to 262144 fs.file-max is greater or equals to 65536 the user running SonarQube can open at least 65536 file descriptors the user running SonarQube can open at least 2048 threads You can see the values with the…

  • Redis讲故事学习教程

    Redis讲故事学习教程

    你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也随之暴涨,而每一个用户请求都变成了对它的一个又一个读写操作,MySQL是苦不堪言。尤其是到“双11”、“618“这种全民购物狂欢的日子,都是MySQL受苦受难的日子。据后来MySQL告诉我说,其实有一大半的用户请求都是读操作,而且经常都是重复查询一个东西,浪费它很多时间去进行磁盘I/O。后来有人就琢磨,是不是可以学学CPU,给数据库也加一个缓存呢?于是我就诞生了! 出生不久,我就和MySQL成为了好朋友,我们俩常常携手出现在后端服务器中。应用程序们从MySQL查询到的数据,在我这里登记一下,后面再需要用到的时候,就先找我要,我这里没有再找MySQL要。 为了方便使用,我支持好几种数据结构的存储: String Hash List Set SortedSet Bitmap ······ 因为我把登记的数据都记录在内存中,不用去执行慢如蜗牛的I/O操作,所以找我要比找MySQL要省去了不少的时间呢。可别小瞧这简单的一个改变,我可为MySQL减轻了不小的负担!随着程序的运行,我缓存的数据越来越多,有相当部分时间我都给它挡住了用户请求,这一下它可乐得清闲自在了!有了我的加入,网络服务的性能提升了不少,这都归功于我为数据库挨了不少枪子儿。 缓存过期 && 缓存淘汰 不过很快我发现事情不妙了,我缓存的数据都是在内存中,可是就算是在服务器上,内存的空间资源还是很有限的,不能无节制的这么存下去,我得想个办法,不然吃枣药丸。不久,我想到了一个办法:给缓存内容设置一个超时时间,具体设置多长交给应用程序们去设置,我要做的就是把过期了的内容从我里面删除掉,及时腾出空间就行了。 超时时间有了,我该在什么时候去干这个清理的活呢?最简单的就是定期删除,我决定100ms就做一次,一秒钟就是10次!我清理的时候也不能一口气把所有过期的都给删除掉,我这里面存了大量的数据,要全面扫一遍的话那不知道要花多久时间,会严重影响我接待新的客户请求的! 时间紧任务重,我只好随机选择一部分来清理,能缓解内存压力就行了。   就这样过了一段日子,我发现有些个键值运气比较好,每次都没有被我的随机算法选中,每次都能幸免于难,这可不行,这些长时间过期的数据一直霸占着不少的内存空间!气抖冷!我眼里可揉不得沙子!于是在原来定期删除的基础上,又加了一招: 那些原来逃脱我随机选择算法的键值,一旦遇到查询请求,被我发现已经超期了,那我就绝不客气,立即删除。这种方式因为是被动式触发的,不查询就不会发生,所以也叫惰性删除! 可是,还是有部分键值,既逃脱了我的随机选择算法,又一直没有被查询,导致它们一直逍遥法外!而于此同时,可以使用的内存空间却越来越少。 而且就算退一步讲,我能够把过期的数据都删除掉,那万一过期时间设置的很长,还没等到我去清理,内存就吃满了,一样要吃枣药丸,所以我还得想个办法。 我苦思良久,终于憋出了个大招:内存淘汰策略,这一次我要彻底解决问题! 我提供了8种策略供应用程序选择,用于我遇到内存不足时该如何决策: noeviction:返回错误,不会删除任何键值 allkeys-lru:使用LRU算法删除最近最少使用的键值 volatile-lru:使用LRU算法从设置了过期时间的键集合中删除最近最少使用的键值 allkeys-random:从所有key随机删除 volatile-random:从设置了过期时间的键的集合中随机删除 volatile-ttl:从设置了过期时间的键中删除剩余时间最短的键 volatile-lfu:从配置了过期时间的键中删除使用频率最少的键 allkeys-lfu:从所有键中删除使用频率最少的键 有了上面几套组合拳,我再也不用担心过期数据多了把空间撑满的问题了~ 缓存穿透 && 布隆过滤器 我的日子过的还挺舒坦,不过MySQL大哥就没我这么舒坦了,有时候遇到些烦人的请求,查询的数据不存在,MySQL就要白忙活一场!不仅如此,因为不存在,我也没法缓存啊,导致同样的请求来了每次都要去让MySQL白忙活一场。我作为缓存的价值就没得到体现啦!这就是人们常说的缓存穿透。   这一来二去,MySQL大哥忍不住了:“唉,兄弟,能不能帮忙想个办法,把那些明知道不会有结果的查询请求给我挡一下” 这时我想到了我的另外一个好朋友:布隆过滤器 我这位朋友别的本事没有,就擅长从超大的数据集中快速告诉你查找的数据存不存在(悄悄告诉你,我的这位朋友有一点不靠谱,它告诉你存在的话不能全信,其实有可能是不存在的,不过它他要是告诉你不存在的话,那就一定不存在)。     我把这位朋友介绍给了应用程序,不存在的数据就不必去叨扰MySQL了,轻松帮忙解决了缓存穿透的问题。 缓存击穿 && 缓存雪崩 这之后过了一段时间太平日子,直到那一天··· 有一次,MySQL那家伙正优哉游哉的摸鱼,突然一大堆请求给他怼了过去,给他打了一个措手不及。 一阵忙活之后,MySQL怒气冲冲的找到了我,“兄弟,咋回事啊,怎么一下子来的这么猛” 我查看了日志,赶紧解释到:“大哥,实在不好意思,刚刚有一个热点数据到了过期时间,被我删掉了,不巧的是随后就有对这个数据的大量查询请求来了,我这里已经删了,所以请求都发到你那里来了” “你这干的叫啥事,下次注意点啊”,MySQL大哥一脸不高兴的离开了。 这一件小事我也没怎么放在心上,随后就抛之脑后了,却没曾想几天之后竟捅了更大的篓子。…

  • ansible 的lineinfile模块使用-在某行前面添加一行、在某行后面添加一行、删除某一行、末尾加入一行、替换或添加某一行
  • CentOS 7 +安装 Nginx 1.8.0 + PHP 5.6 + MariaDB 10.0 (LEMP) + SSL

    CentOS 7 +安装 Nginx 1.8.0 + PHP 5.6 + MariaDB 10.0 (LEMP) + SSL

    1. change ulimits vim /etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 2. Install MariaDB vim /etc/yum.repos.d/MariaDB.repo [mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.0/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 yum install MariaDB-server MariaDB-client chkconfig mysql on mysql_secure_installation setting firewalld for mysql 3. Install Nginx rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm yum install nginx systemctl start nginx systemctl enable nginx setting…