阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx与Keepalived 实现站点高可用方案

465次阅读
没有评论

共计 9644 个字符,预计需要花费 25 分钟才能阅读完成。

目录

  1. 概述
  2. 规划与准备工作
  3. 安装、部署 Nginx 和 Keepalived
  4. 高可用方案 – 主主配置
  5. 高可用方案 – 主从配置
  6. Keepalived 配置选项说明

1. 概述

1.1 Keepalived 介绍

Keepalived 是一个基于 VRRP 协议来实现的服务高可用方案,可以利用其来避免 IP 单点故障,类似的工具还有 heartbeat、corosync、pacemaker。但是它一般不会单独出现,而是与其它负载均衡技术(如 LVS、HAProxy、Nginx)一起工作来达到集群的高可用。

VRRP(Virtual Router Redundancy Protocol),即虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议,即将多台提供相同功能的路由器组成一个路由器组(Router Group),这个组里面有一个 master 和多个 backup,但在外界看来就像一台一样,构成虚拟路由器,拥有一个虚拟 IP(vip,也就是路由器所在局域网内其他机器的默认路由),占有这个 IP 的 master 实际负责 ARP 相应和转发 IP 数据包,组中的其它路由器作为备份的角色处于待命状态。master 会发组播消息,当 backup 在超时时间内收不到 vrrp 包时就认为 master 宕掉了,这时就需要根据 VRRP 的优先级来选举一个 backup 当 master,保证路由器的高可用。

在 VRRP 协议实现里,虚拟路由器使用 00-00-5E-00-01-XX 作为 虚拟MAC 地址,XX 就是唯一的 VRID(Virtual Router IDentifier),这个地址同一时间只有一个物理路由器占用。在虚拟路由器里面的物理路由器组里面通过多播 IP 地址 224.0.0.18 来定时发送通告消息。每个 Router 都有一个 1-255 之间的优先级别,级别最高的(highest priority)将成为主控(master)路由器。通过降低 master 的优先权可以让处于 backup 状态的路由器抢占(pro-empt)主路由器的状态,两个 backup 优先级相同的 IP 地址较大者为 master,接管虚拟 IP。

Nginx 与 Keepalived 实现站点高可用方案

VRRP 结构图

一般 Keepalived 用于实现前端高可用,常用的前端高可用的组合有,就是我们常见的 LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived。

1.2 Nginx + Keepalived

keepalived 可以认为是 VRRP 协议在 Linux 上的实现,主要有三个模块,分别是 core、check 和 vrrp。core 模块为 keepalived 的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check 负责健康检查,包括常见的各种检查方式。vrrp 模块是来实现 VRRP 协议的。本文基于如下的拓扑图:

Nginx 与 Keepalived 实现站点高可用方案

Nginx + Keepalived 部署结构图

2. 规划与准备工作

  1. 关闭 SELinux

    为了保证 Nginx 和 Keepalived 之间的正常数据通信,需要关闭 Linux 的 SELinux。

      [root@localhost ~]# vi /etc/sysconfig/selinux 
      # This file controls the state of SELinux on the system.
      # SELINUX= can take one of these three values:
      #       enforcing - SELinux security policy is enforced.
      #       permissive - SELinux prints warnings instead of enforcing.
      #       disabled - SELinux is fully disabled.
      SELINUX=disabled
      # SELINUXTYPE= type of policy in use. Possible values are:
      #       targeted - Only targeted network daemons are protected.
      #       strict - Full SELinux protection.
      SELINUXTYPE=targeted
  2. 配置 iptables

    配置 iptables,允许相应的端口通信。

      [root@Docker-OA-98 ~]# vi /etc/sysconfig/iptables
     *filter
     :INPUT ACCEPT [0:0]
     :FORWARD ACCEPT [0:0]
     :OUTPUT ACCEPT [0:0]
     -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
     -A INPUT -p icmp -j ACCEPT
     -A INPUT -i lo -j ACCEPT
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 89 -j ACCEPT
     -A INPUT -p tcp -m state --state NEW -m tcp --dport 9080 -j ACCEPT
     # 允许 VRRP(虚拟路由冗余协议)通信
     -A INPUT -p vrrp -j ACCEPT
     # 允许 Keepalived 虚拟路由组播地址通信
     -A INPUT -d 224.0.0.18 -j ACCEPT
     -A INPUT -j REJECT --reject-with icmp-host-prohibited
     -A FORWARD -j REJECT --reject-with icmp-host-prohibited
     COMMIT
  3. 环境规划

序号 服务器名称 主机名 IP 地址 操作系统 备注
1 VIP1(Keepalived) 192.168.1.100 虚拟节点
2 VIP2(Keepalived) 192.168.1.101 主主模式
3 Nginx 01 Nginx-A-98 192.168.1.98 CentOS LInux 7.3  
4 Nginx 02 Nginx-B-99 192.168.1.99 CentOS LInux 7.3  
5 Tomcat 01 Tomcat-Web-91 192.168.202.91 CentOS LInux 7.3  
6 Tomcat 02 Tomcat-Web-92 192.168.202.92 CentOS LInux 7.3  
7 Tomcat 03 Tomcat-Web-93 192.168.202.93 CentOS LInux 7.3  

3. 安装、部署 Nginx 与 Keepalived

3.1 安装 Nginx 与 Keepalived

分别在服务器 Nginx 01 和 Nginx 02 安装 Nginx 和 Keepalived。

# 安装 Nginx
[root@Docker-OA-98 ~]# yum -y install nginx

# 安装 Keepalived
[root@Docker-OA-98 ~]# yum -y install keepalived

3.2 配置 Nginx 负载均衡

分别在服务器 Nginx 01 和 Nginx02 上配置 Nginx 的应用负载均衡。

[root@Docker-OA-98 ~]# vi /etc/nginx/nginx.conf
upstream application01 {
  ip_hash;
  server 192.168.202.91:8080;
  server 192.168.202.92:8080;
  server 192.168.202.93:8080;
}

server {
    listen   80;
    listen   [::]:80;
    server_name  service.test01.com;
    #root         /usr/share/nginx/html;

    location / {
        proxy_pass  http://application01/;
        proxy_set_header  Host  $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header  X-Real-IP     $remote_addr;

        access_log  /var/log/nginx/access.ecology.log  main;

        client_max_body_size 100m;
        client_body_buffer_size 1024k;

        proxy_connect_timeout 5000;
        proxy_read_timeout 5000;
        proxy_send_timeout 6000;
        proxy_buffer_size 1024k;
        proxy_buffers 4 512k;
        proxy_busy_buffers_size 1024k;
        proxy_temp_file_write_size 1024k;
    }

}

4. 高可用方案 — 主主模式

Nginx 与 Keepalived 实现站点高可用方案

主主模式
  • Nginx 01 服务器 Keepalived 脚本配置
 [root@Nginx-A-98 src]# vim /etc/keepalived/keepalived.conf
  vrrp_script chk_nginx {
     script "/etc/keepalived/nginx_check.sh"    # 检测 nginx 状态的脚本路径
     interval 2                    # 检测时间间隔 2s
     weight -20                    # 如果脚本的条件成立,权重 -20
  }

  vrrp_instance VI_1 {            # VRRP 实例名;多实例的情况下,名称必须不一致
      state MASTER                # 服务状态;MASTER(工作状态)BACKUP(备用状态)interface eth0              # VIP 绑定网卡
      virtual_router_id 51        # 虚拟路由 ID,主、备节点必须一致;多实例的情况下,ID 必须不一致
      mcast_src_ip 192.168.1.98  # 本机 IP
      nopreempt                   # 优先级高的设置,解决异常回复后再次抢占的问题
      priority 100                # 优先级;取值范围:0~254;MASTER > BACKUP
      advert_int 1                # 组播信息发送间隔,主、备节点必须一致,默认 1s
      authentication {            # 验证信息;主、备节点必须一致
          auth_type PASS          # VRRP 验证类型,PASS、AH 两种
          auth_pass 1111          # VRRP 验证密码,在同一个 vrrp_instance 下,主、从必须使用相同的密码才能正常通信
      }
       track_script {             # 将 track_script 块加入 instance 配置块
          chk_nginx               # 执行 Nginx 监控的服务
      }
      virtual_ipaddress {         # 虚拟 IP 池,主、备节点必须一致,可以定义多个 VIP
          192.168.1.100            # 虚拟 IP
      }
  }

 vrrp_instance VI_2 {
      state BACKUP
      interface eth0
      virtual_router_id 52
      mcast_src_ip 192.168.1.98
      priority 90
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      track_script {chk_nginx}
      virtual_ipaddress {192.168.1.101}
}
  • Nginx 02 服务器 Keepalived 配置
[root@Nginx-B-99 src]# vim /etc/keepalived/keepalived.conf
  vrrp_script chk_nginx {
     script "/etc/keepalived/nginx_check.sh"
     interval 2
     weight -20
  }

  vrrp_instance VI_1 {
      state BACKUP
      interface eth0
      virtual_router_id 51
      mcast_src_ip 192.168.1.99
      priority 90
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      track_script {chk_nginx}
      virtual_ipaddress {192.168.1.100}   
  }   

  vrrp_instance VI_2 {
      state MASTER
      interface eth0
      virtual_router_id 52
      mcast_src_ip 192.168.1.99
      nopreempt
      priority 100
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      track_script {chk_nginx}
      virtual_ipaddress {192.168.1.101}
  }
  • Nginx 状态监测脚本

分别在服务器 Nginx 01 和 Nginx 02 上添加 Nginx 状态监测脚本。

  [root@Nginx-A-98 keepalived]# vim /etc/keepalived/nginx_check.sh
  #!/bin/bash
  A=`ps -C nginx –no-header |wc -l`
  if [$A -eq 0];then
          /usr/local/nginx/sbin/nginx
          sleep 2
          if [`ps -C nginx --no-header |wc -l` -eq 0];then
                  killall keepalived
          fi
  fi

我们也可以根据自己的业务需求,总结出在什么情形下关闭 keepalived,如 curl 主页连续 2 个 5s 没有响应则切换:

#!/bin/bash

count = 0
for ((k=0; k<2; k++)) 
do 
    check_code=$(curl --connect-timeout 3 -sL -w "%{http_code}\\n" http://localhost/login.html -o /dev/null )
    if ["$check_code" != "200"]; then
        count = count +1
        continue
    else
        count = 0
        break
    fi
done
if ["$count" != "0"]; then
#   /etc/init.d/keepalived stop
    exit 1
else
    exit 0
fi

5. 高可用方案 — 主从模式

Nginx 与 Keepalived 实现站点高可用方案

主从模式
  • Nginx 01 服务器 Keepalived 脚本配置
 [root@Nginx-A-98 src]# vim /etc/keepalived/keepalived.conf
  vrrp_script chk_nginx {
     script "/etc/keepalived/nginx_check.sh"    # 检测 nginx 状态的脚本路径
     interval 2                    # 检测时间间隔 2s
     weight -20                    # 如果脚本的条件成立,权重 -20
  }

  vrrp_instance VI_1 {            # VRRP 实例名;多实例的情况下,名称必须不一致
      state MASTER                # 服务状态;MASTER(工作状态)BACKUP(备用状态)interface eth0              # VIP 绑定网卡
      virtual_router_id 51        # 虚拟路由 ID,主、备节点必须一致;多实例的情况下,ID 必须不一致
      mcast_src_ip 192.168.1.98  # 本机 IP
      nopreempt                   # 优先级高的设置,解决异常回复后再次抢占的问题
      priority 100                # 优先级;取值范围:0~254;MASTER > BACKUP
      advert_int 1                # 组播信息发送间隔,主、备节点必须一致,默认 1s
      authentication {            # 验证信息;主、备节点必须一致
          auth_type PASS          # VRRP 验证类型,PASS、AH 两种
          auth_pass 1111          # VRRP 验证密码,在同一个 vrrp_instance 下,主、从必须使用相同的密码才能正常通信
      }
       track_script {             # 将 track_script 块加入 instance 配置块
          chk_nginx               # 执行 Nginx 监控的服务
      }
      virtual_ipaddress {         # 虚拟 IP 池,主、备节点必须一致,可以定义多个 VIP
          192.168.1.100            # 虚拟 IP
      }
  }
  • Nginx 02 服务器 Keepalived 配置
[root@Nginx-B-99 src]# vim /etc/keepalived/keepalived.conf
  vrrp_script chk_nginx {
     script "/etc/keepalived/nginx_check.sh"
     interval 2
     weight -20
  }

  vrrp_instance VI_1 {
      state BACKUP
      interface eth0
      virtual_router_id 51
      mcast_src_ip 192.168.1.99
      priority 90
      advert_int 1
      authentication {
          auth_type PASS
          auth_pass 1111
      }
      track_script {chk_nginx}
      virtual_ipaddress {192.168.1.100}   
  }
  • Nginx 状态监测脚本

分别在服务器 Nginx 01 和 Nginx 02 上添加 Nginx 状态监测脚本。

  [root@Nginx-A-98 keepalived]# vim /etc/keepalived/nginx_check.sh
  #!/bin/bash
  A=`ps -C nginx –no-header |wc -l`
  if [$A -eq 0];then
          /usr/local/nginx/sbin/nginx
          sleep 2
          if [`ps -C nginx --no-header |wc -l` -eq 0];then
                  killall keepalived
          fi
  fi

6. Keepalived 配置选项说明

6.1 global_defs

  • notification_email:keepalived 在发生诸如切换操作时需要发送 email 通知地址,后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警,毕竟邮件不是实时通知的。
  • router_id:机器标识,通常可设为 hostname。故障发生时,邮件通知会用到

6.2 vrrp_instance

  • state:指定 instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为 MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,那么他会就回抢占为 MASTER
  • interface:实例绑定的网卡,因为在配置虚拟 IP 的时候必须是在已有的网卡上添加的
  • mcast_src_ip:发送多播数据包时的源 IP 地址,这里注意了,这里实际上就是在那个地址上发送 VRRP 通告,这个非常重要,一定要选择稳定的网卡端口来发送,这里相当于 heartbeat 的心跳端口,如果没有设置那么就用默认的绑定的网卡的 IP,也就是 interface 指定的 IP 地址
  • virtual_router_id:这里设置 VRID,这里非常重要,相同的 VRID 为一个组,他将决定多播的 MAC 地址
  • priority:设置本节点的优先级,优先级高的为 master
  • advert_int:检查间隔,默认为 1 秒。这就是 VRRP 的定时器,MASTER 每隔这样一个时间间隔,就会发送一个 advertisement 报文以通知组内其他路由器自己工作正常
  • authentication:定义认证方式和密码,主从必须一样
  • virtual_ipaddress:这里设置的就是 VIP,也就是虚拟 IP 地址,他随着 state 的变化而增加删除,当 state 为 master 的时候就添加,当 state 为 backup 的时候删除,这里主要是有优先级来决定的,和 state 设置的值没有多大关系,这里可以设置多个 IP 地址
  • track_script:引用 VRRP 脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。

6.3 vrrp_script

告诉 keepalived 在什么情况下切换,所以尤为重要。可以存在多个 vrrp_script。

  • script:自己写的检测脚本。也可以是一行命令如 killall -0 nginx
  • interval 2:每 2s 检测一次
  • weight -5:检测失败(脚本返回非 0)则优先级 -5
  • fall 2:检测连续 2 次失败才算确定是真失败。会用 weight 减少优先级(1-255 之间)
  • rise 1:检测 1 次成功就算成功。但不修改优先级

这里要提示一下 script 一般有 2 种写法:

  • 通过脚本执行的返回结果,改变优先级,keepalived 继续发送通告消息,backup 比较优先级再决定
  • 脚本里面检测到异常,直接关闭 keepalived 进程,backup 机器接收不到 advertisement 会抢占 IP

上文 vrrp_script 配置部分,killall -0 nginx属于第 1 种情况,/etc/keepalived/check_nginx.sh属于第 2 种情况(脚本中关闭 keepalived)。个人更倾向于通过 shell 脚本判断,但有异常时 exit 1,正常退出 exit 0,然后 keepalived 根据动态调整的 vrrp_instance 优先级选举决定是否抢占 VIP:

  • 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加
  • 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少

其他情况,原本配置的优先级不变,即配置文件中 priority 对应的值。

提示:

  1. 优先级不会不断的提高或者降低
  2. 可以编写多个检测脚本并为每个检测脚本设置不同的 weight(在配置中列出就行)
  3. 不管提高优先级还是降低优先级,最终优先级的范围是在[1,254],不会出现优先级小于等于 0 或者优先级大于等于 255 的情况
  4. 在 MASTER 节点的 vrrp_instance 中 配置 nopreempt,当它异常恢复后,即使它 prio 更高也不会抢占,这样可以避免正常情况下做无谓的切换

以上可以做到利用脚本检测业务进程的状态,并动态调整优先级从而实现主备切换。

一些关于 Keepalived 相关教程集合

CentOS 7 下 Keepalived + HAProxy 搭建配置详解  http://www.linuxidc.com/Linux/2017-03/141593.htm

Keepalived 高可用集群应用场景与配置 http://www.linuxidc.com/Linux/2017-03/141866.htm

Nginx+Keepalived 实现站点高可用  http://www.linuxidc.com/Linux/2016-12/137883.htm

Nginx+Keepalived 实现站点高可用(负载均衡)  http://www.linuxidc.com/Linux/2016-12/138221.htm

构建高可用集群 Keepalived+Haproxy 负载均衡 http://www.linuxidc.com/Linux/2016-12/138917.htm

Nginx+Keepalived 双机热备(主主模式)http://www.linuxidc.com/Linux/2017-10/148061.htm

CentOS6.5 下 Keepalived 高可用服务单实例配置 http://www.linuxidc.com/Linux/2016-12/138110.htm

Keepalived 安装与配置 http://www.linuxidc.com/Linux/2017-02/140421.htm

Nginx 之 Keepalived 高可用  http://www.linuxidc.com/Linux/2017-05/143708.htm

Linux 下 Keepalived 服务安装文档  http://www.linuxidc.com/Linux/2017-03/141441.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148405.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计9644字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7980499
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...
星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛NAS-5:飞牛NAS中的Docker功能介绍

星哥带你玩飞牛 NAS-5:飞牛 NAS 中的 Docker 功能介绍 大家好,我是星哥,今天给大家带来如何在...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号AI知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率

国产开源公众号 AI 知识库 Agent:突破未认证号限制,一键搞定自动回复,重构运营效率 大家好,我是星哥,...
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

告别Notion焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁”

  告别 Notion 焦虑!这款全平台开源加密笔记神器,让你的隐私真正“上锁” 引言 在数字笔记工...