keepalived服务详解与实验 基于centos8

news2024/11/24 5:02:09

目录

  • keepalived
    • HA简介
      • 常用的高可用软件
      • keepalived简介
    • keepalived常用模块
    • keepalived功能简介
    • keepalived常用文件
    • keepalived配置文件详解
    • keepalived实验1-上手
      • 环境准备
      • 安装服务
      • 主配置文件修改
      • 启动服务
      • 效果查看
    • keepalived脑裂
      • 1. 脑裂现象简介
      • 2. 脑裂的原因
      • 3. 脑裂的预防和解决方案
      • 4. 脑裂的处理流程
    • keepalived实验2-nginx+keepalived联动
      • 编写脚本,检测到nginx down,关闭keepalived服务使主备切换
      • 测试脚本
      • 修改keepalived配置脚本,使其调用
      • 验证
    • keepalived 非抢占&延迟抢占
      • 不抢占
      • 延迟抢占
    • keepalived 双主模式
    • keeplived 通知脚本
      • 语法
      • 脚本
        • 脚本解释
      • 脚本增加x权限并修改keepalived配置文件
      • 测试

keepalived

官网:http://keepalived.org/
官方文档:https://keepalived.org/doc/
官方文档:http://keepalived.org/documentation.html

HA简介

高可用,即HA,是指系统或服务能够在大部分时间内保持可用状态的能力。高可用性的设计目标是确保系统在面对硬件故障、软件错误、网络问题或其他意外情况时,能够持续提供服务而不中断或降低性能。

常用的高可用软件

  • heartbeat
  • keepalived(本文核心)
  • HAproxy

keepalived简介

keepalived是基于vrrp协议改进出的一种用于Linux主机上的高可用软件,用于进行L4的负载均衡(ipvs)。
keepalived的检查原理即vrrp协议是数通的一个常用协议,用于热备路由器,若主路由器宕机,备份路由器自动接管业务,无需修改配置,本文不过多赘述,可期待我后续文章或自行查阅别的文档。
keepalived为vip地址所在的节点生成ipvs规则(在配置文件中预先定义),为ipvs集群的各RS做健康状态检测
keeplived支持基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务

分为主,备一般是2个节点.主备之间通过vrrp协议发送数据包沟通.
主给备定期发送数据包,备收到数据包表示主还活着,备无法收到数据包,表示主挂了,备胎转正了,接管用户请求流量.
vrrp协议使用组播的ip. 224.xx.xx.xx(可修改)

keepalived常用模块

官方文档:https://keepalived.org/doc/software_design.html

  • 核心模块包含:
    • LVS Framework: Uses the getsockopt and setsockopt calls to get and set options on sockets.
    • Netfilter Framework: IPVS code that supports NAT and Masquerading
    • Netlink Interface: Sets and removes VRRP virtual IPs on network interfaces.
    • Multicast: VRRP advertisements are sent to the reserved VRRP MULTICAST group (224.0.0.18).
  • Core:是keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析等 。
  • Check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;
  • Vrrp:VRRPD子进程,VRRPD子进程就是来实现VRRP协议;
  • Libipfwc:iptables(ipchains)库,配置LVS会用到;
  • Libipvs:虚拟服务集群,配置LVS会使用。
    在这里插入图片描述

keepalived功能简介

  1. 提供负载均衡:以vip(虚拟ip)进行工作,提供L4的负载均衡(但实际是主备架构)
  2. 检测服务器状态:定时检查服务器状态,不正常时自动启用备份服务器

keepalived常用文件

  • 主配置文件:/etc/keepalived/keepalived.conf
  • 主程序文件:/etc/sysconfig/keepalived
    /usr/sbin/keepalived
  • 日志文件(keeplived没有自己的日志文件):/var/log/messages

keepalived配置文件详解

配置文件keepalived.conf可以包含三个文本块:全局定义块VRRP实例定义块虚拟服务器定义块全局定义块虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须VRRP实例定义块

  • Global definitions(全局配置):定义邮件配置,route_id,vrrp配置,组播地址 等
  • VRRP instance(s):定义vrrp协议中的每个vrrp虚拟路由器的规则,基本信息,vrrp协议配置,vip,主备,网卡…经常改动部分.
  • Virtual server(s):LVS集群的VS和RS
[全局定义块]
global_defs {
      notification_email {           			    # 指定keepalived在发生切换时需要发送email到的对象,一行一个;
         xxx@yyy.com	                      
      }	
     notification_email_from  root@localhost	    # 指定发件人
     smtp_server  127.0.0.1           			    # 指定smtp服务器地址
     smtp_connect_timeout 3          	            # 指定smtp连接超时时间
     router_id LVS_DEVEL             			    # 运行keepalived机器的标识
}	
[监控Nginx进程]			
vrrp_script	chk_nginx  {	
    script "/server/script/nginx.sh"      		    # 监控服务脚本,脚本需要有x执行权限;
    interval 2                    				    # 检测时间间隔(执行脚本间隔)
    weight 1	                                    # 权重
    user root                                       # 执行脚本的用户
}				
[VRRP实例定义块]				
vrrp_sync_group VG_1{                			    # 监控多个网段的实例
        group {			 	
  VI_1                     			                # 实例名1
  VI_2	
 }	
 notify_master /data/sh/nginx.sh          		    # 指定当切换到master时,执行的脚本
 notify_backup /data/sh/nginx.sh          		    # 指定当切换到backup时,执行的脚本
 notify   /data/sh/nginx.sh						    # 发生任何切换,均执行的脚本
 smtp_alert                         			    # 使用global_defs中提供的邮件地址和smtp服务器发送邮件通知;
}		
vrrp_instance VI_1 {		
    state BACKUP                    			    # 设置主机状态,MASTER|BACKUP
	nopreempt                       			    # 设置为不抢占
interface ens33                   			        # 对外提供服务的网络接口
lvs_sync_daemon_inteface ens33                       # 负载均衡器之间监控接口; 
    track_interface {               	 			# 设置额外的监控,网卡出现问题都会切换;
     ens33	
     ens37	
    }	
    mcast_src_ip                    			    # 发送组播包的地址,如果不设置默认使用绑定网卡的primary ip
    garp_master_delay              				    # 在切换到master状态后,延迟进行gratuitous ARP请求
    virtual_router_id 50            			    # VRID标记 ,路由ID,可通过#tcpdump vrrp查看
    priority 90                    				    # 优先级,优先级高者竞选为master
    advert_int 5                    			    # 检查间隔,默认5秒
    preempt_delay                   			    # 抢占延时,默认5分钟
    debug                           			    # debug日志级别
    authentication {                			    # 设置认证
        auth_type PASS              			    # 认证方式
        auth_pass 1111          				    # 认证密码
    }
	track_script {                      		    # 以脚本为监控chk_nginx;
        chk_nginx		
    }		
    virtual_ipaddress {             			    # 设置vip地址
        192.168.111.188
    }
}
注意:使用了脚本监控Nginx或者MYSQL,不需要下面虚拟服务器设置块。
[虚拟服务器定义块]
virtual_server 192.168.111.188 3306 {
    delay_loop 6                   	               # 健康检查时间间隔
    lb_algo rr                     	               # 调度算法rr|wrr|lc|wlc|lblc|sh|dh
    lb_kind DR                     				   # 负载均衡转发规则NAT|DR|TUN
    persistence_timeout  5        	     		   # 会话保持时间
    protocol TCP                   				   # 使用的协议
    real_server 192.168.1.12 3306 {	
               weight 1            				   # 默认为1,0为失效
               notify_up   <string> | <quoted-string> # 在检测到server up后执行脚本;
               notify_down <string> | <quoted-string> # 在检测到server down后执行脚本;
               TCP_CHECK {
               connect_timeout 3    		       # 连接超时时间;
               nb_get_retry  1     				   # 重连次数;
               delay_before_retry 1  			   # 重连间隔时间;
               connect_port 3306  				   # 健康检查的端口;
               }
       HTTP_GET {    
       url  {
          path /index.html          		       # 检测url,可写多个
          digest  24326582a86bee478bac72d5af25089e # 检测效验码
          # digest效验码获取方法:genhash -s IP -p 80 -u http://IP/index.html 
          status_code 200                          # 检测返回http状态码
      }
}
}

不过上述完整脚本非常复杂,实际上简单实用仅需以下内容即可:

[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb01  # 所有keepalived集群中router_id唯一
}

vrrp_instance VRRP_55 { # 实例名相同的在一个vrrp实例组中
    state MASTER # 只有一个master,可以有多个BACKUP
    interface ens33 # 使用的网口
    virtual_router_id 55 # vrrp id
    priority 100 # 优先级,越高越优先
    advert_int 1 # vrrp通告报文间隔1s
    authentication { # 认证模块
        auth_type PASS # 是否认证
        auth_pass 5555 # 认证密码
    }
    virtual_ipaddress { # 该vrrp实例的vip
        192.168.100.55 dev ens33 label ens33:0
    }
}

keepalived实验1-上手

环境准备

lb01  nginx+keeplived
lb02  (克隆lb01)

安装服务

rpm -qa | grep keepalived

yum install -y keepalived

主配置文件修改

具体的主配置文件参数,见上文配置详解

在这里插入图片描述

启动服务

# 关闭防火墙和selinux,不然会导致脑裂
systemctl stop firewalld
setenforce 0
systemctl start keeplived

效果查看

  • vip
    在这里插入图片描述

  • 抓包
    在这里插入图片描述

keepalived脑裂

1. 脑裂现象简介

脑裂是指在多节点系统中,由于网络问题、节点故障或其他原因导致系统中的多个节点同时认为自己是活动的,从而产生数据不一致或服务中断的现象。在分布式系统中,脑裂是一个严重的问题,可能导致数据丢失或损坏,服务不可用,甚至系统崩溃。
在keeplived中,即主备均有vip

2. 脑裂的原因

脑裂通常由以下原因引起:

  • 时钟同步问题:节点间的时间不一致可能导致节点对系统状态的理解产生分歧。
  • 配置错误:不当的配置可能导致节点无法正确判断其他节点的状态。
  • 节点故障:节点的硬件故障或软件异常可能导致节点行为异常。
  • 防火墙:selinux和防火墙默认不放行vrrp流量,需要进行放行流量或关闭。

3. 脑裂的预防和解决方案

为了预防和解决脑裂问题,可以采取以下措施:

  • 心跳检测:节点之间通过定期发送心跳消息来监控彼此的状态,一旦发现某个节点失联,可以及时采取措施。
  • 时钟同步:使用NTP(网络时间协议)或其他同步机制来确保节点间的时间一致性。
  • 监控和报警:实时监控系统的状态,一旦发现异常立即报警并采取措施。可以考虑只要BACKUP上出现vip,就让MASTER下线(非常粗暴的解决方式)

4. 脑裂的处理流程

当系统发生脑裂时,可以按照以下步骤进行处理:

  1. 检测脑裂:通过监控系统或日志分析,发现节点间通信异常。
  2. 隔离问题节点:将问题节点从服务中隔离,避免其继续影响系统状态。
  3. 故障排查:分析脑裂的原因,修复网络或配置问题。

keepalived实验2-nginx+keepalived联动

需求:在nginx服务down时,自动触发keepalived主备切换
keepalived是主机down才会切换,默认不会监控某个服务
可以修改主配置文件,增加脚本监控

编写脚本,检测到nginx down,关闭keepalived服务使主备切换

[root@lb01 scripts]# cat check_ngx.sh
#!/bin/bash
# 脚本用于检测nginx的进程是否等于0,nginx没有进程时就关闭keepalived服务
# 注意: 脚本名.sh不要写全服务名,不然在过滤进程时会将脚本过滤出来,导致出现错误
count=`ss -tunlp  | grep nginx | wc -l`
echo "ngx 端口数量 $count"

# -eq用于数值的比较,==用于字符串的比较;-ne不等于
if [ ${count} -eq 0 ]; then
        systemctl stop keepalived
fi

测试脚本

  • nginx存在
[root@lb01 scripts]# sh check_ngx.sh
ngx 端口数量 1
[root@lb01 scripts]# systemctl status keepalived.service
   Active: active (running) since Tue 2024-06-18 11:18:08 CST; 17min ago

  • nginx不存在
[root@lb01 scripts]# pkill nginx
[root@lb01 scripts]# sh check_ngx.sh
ngx 端口数量 0

[root@lb01 scripts]# systemctl status keepalived.service
   Active: inactive (dead) 

# 查看日志
[root@lb01 scripts]# tail -10 /var/log/messages
Jun 18 11:35:41 lb01 systemd[1]: nginx.service: Failed with result 'exit-code'.
Jun 18 11:35:44 lb01 systemd[1]: Stopping LVS and VRRP High Availability Monitor...
Jun 18 11:35:44 lb01 Keepalived[19322]: Stopping
Jun 18 11:35:45 lb01 Keepalived_vrrp[19323]: (VRRP_55) sent 0 priority
Jun 18 11:35:45 lb01 Keepalived_vrrp[19323]: (VRRP_55) removing VIPs.
Jun 18 11:35:46 lb01 Keepalived_vrrp[19323]: Stopped - used 0.001242 user time, 0.161294 system time
Jun 18 11:35:46 lb01 Keepalived[19322]: CPU usage (self/children) user: 0.001348/0.001242 system: 0.000000/0.162545
Jun 18 11:35:46 lb01 Keepalived[19322]: Stopped Keepalived v2.1.5 (07/13,2020)
Jun 18 11:35:46 lb01 systemd[1]: keepalived.service: Succeeded.
Jun 18 11:35:46 lb01 systemd[1]: Stopped LVS and VRRP High Availability Monitor.

修改keepalived配置脚本,使其调用

# 脚本增加x权限
[root@lb01 scripts]# chmod +x check_ngx.sh
[root@lb01 scripts]# ll
total 4
-rwxr-xr-x 1 root root 144 Jun 16 09:52 check_ngx.sh

# 修改keepalived配置文件
[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb01
}
# 添加以下内容,定义vrrp脚本
vrrp_script check_ngx { # 脚本名,用于在vrrp_instance中调用
    script /server/scripts/check_ngx.sh # 指定的运行脚本,需要x权限
    interval 2 # 检测间隔2s
    weight 1 # 权重1
    user root # 执行脚本的用户为root
}

vrrp_instance VRRP_55 {
    state MASTER
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5555
    }
    virtual_ipaddress {
        192.168.100.55 dev ens33 label ens33:0
    }
    track_script { # 调用上述vrrp脚本
        check_ngx # 即上面定义的名字
    }
}

# 重启服务
[root@lb01 scripts]# systemctl restart keepalived.service

验证

# 直接kill nginx,不用执行脚本,keepalived自动检测,并关闭自身
[root@lb01 scripts]# pkill nginx
[root@lb01 scripts]# tail -5 /var/log/messages
Jun 18 11:50:21 lb01 Keepalived_vrrp[21044]: Stopped - used 0.000000 user time, 0.026432 system time
Jun 18 11:50:21 lb01 Keepalived[21043]: CPU usage (self/children) user: 0.001334/0.090439 system: 0.000000/0.265936
Jun 18 11:50:21 lb01 Keepalived[21043]: Stopped Keepalived v2.1.5 (07/13,2020)
Jun 18 11:50:21 lb01 systemd[1]: keepalived.service: Succeeded.
Jun 18 11:50:21 lb01 systemd[1]: Stopped LVS and VRRP High Availability Monitor.


[root@lb01 scripts]# systemctl status keepalived.service
   Active: inactive (dead) 

# 现在vip出现在lb02即BACKUP上
[root@lb02 ~]# ip a | grep 100.55
    inet 192.168.100.55/32 scope global ens33:0
# 即使手动拉起lb01的keepalived,若没有在lb01上启动nginx,keepalived仍然会自动关闭

keepalived 非抢占&延迟抢占

keepalived默认是抢占模式,即MASTER活了之后会抢夺vip的控制权
如果在动荡网络中,一直抢占与被抢占,会导致业务不稳定
所以可以考虑修改为不抢占延迟抢占

不抢占

  • 修改流程:
  1. 两个节点均为BACKUP
  2. 两个节点都增加一行nopreempt
    在这里插入图片描述

延迟抢占

  • 修改流程:
  1. 两个节点均为BACKUP
  2. 仅其中一台增加一行preempt_delay 30
    在这里插入图片描述

keepalived 双主模式

即两个vrrp实例,类似于数通中mstp+vrrp实验。

在这里插入图片描述

keeplived 通知脚本

具体的配置邮件分发,请参考我之前的博客如何使用openEuler 22.03 配置mail.rc给邮箱发送邮件

语法

事件脚本参数
当前节点成为主节点时触发的脚本`notify_master
当前节点转为备节点时触发的脚本`notify_backup
当前节点转为“失败”状态时触发的脚本`notify_fault
通用格式的通知触发机制`notify
当停止VRRP时触发的脚本`notify_stop

脚本

#!/bin/bash
#
contact='xxx@qq.com'
notify() {
 mailsubject="$(hostname) to be $1, vip floating"
 mailbody="$(date +'%F %T'): vrrp transition, $(hostname) changed to be $1"
 echo "$mailbody" | mail -s "$mailsubject" $contact
}
case $1 in
master)
 notify master
 ;;
backup)
 notify backup
 ;;
fault)
 notify fault
 ;;
*)
 echo "Usage: $(basename $0) {master|backup|fault}"
 exit 1
 ;;
esac
脚本解释
  • 联系邮箱:contact=‘xxx@qq.com’,这行代码设置了接收通知的电子邮件地址。在实际使用中,应该替换为真实的邮箱地址。
  • notify 函数:这个函数用于发送电子邮件。它接受一个参数,表示Keepalived的新状态(master、backup 或 fault)。函数内部,它构建了邮件的主题和正-文,并使用 mail 命令将通知发送到指定的邮箱。
  • mailsubject:邮件主题,包含了主机名和新状态的信息。
  • mailbody:邮件正文,包含了变化发生的时间和主机名以及状态变化的信息。
  • case 语句:这是一个选择语句,根据脚本接收的第一个参数($1)来执行不同的操作。
  • master:如果参数是 master,则调用 notify 函数并传入 master 参数,表示主机成为主节点。
  • backup:如果参数是 backup,则调用 notify 函数并传入 backup 参数,表示主机成为备节点。
  • fault:如果参数是 fault,则调用 notify 函数并传入 fault 参数,表示主机状态变为故障。
  • *:如果参数不是以上任何一个,脚本会输出一条使用帮助信息,并退出脚本,返回码为1。

脚本增加x权限并修改keepalived配置文件

chmod +x malikl.sh

# vrrp_instance中添加
[root@lb01 scripts]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id lb01
}
vrrp_script check_ngx {
    script /server/scripts/check_ngx.sh
    interval 2
    weight 1
    user root
}

vrrp_instance VRRP_55 {
    state MASTER
    interface ens33
    virtual_router_id 55
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 5555
    }
    virtual_ipaddress {
        192.168.100.55 dev ens33 label ens33:0
    }
    # 添加以下3行
    notify_master "/server/scripts/mailkl.sh master"
    notify_backup "/server/scripts/malikl.sh backup"
    notify_fault "/server/scripts/malikl.sh fault"
    track_script {
        check_ngx
    }
}

测试

[root@lb01 scripts]# systemctl restart keepalived.service

检测到keepalived服务变化时,自动发送邮件
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1834557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【需求管理】软件需求开发和管理文档(原件Word)

1. 目的 2. 适用范围 3. 参考文件 4. 术语和缩写 5. 需求获取的方式 5.1. 与用户交谈向用户提问题 5.1.1. 访谈重点注意事项 5.1.2. 访谈指南 5.2. 参观用户的工作流程 5.3. 向用户群体发调查问卷 5.4. 已有软件系统调研 5.5. 资料收集 5.6. 原型系统调研 5.6.1. …

【数据结构】第十七弹---C语言实现选择排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、选择排序 1.1、基本思想 1.2、代码实现 1.3、代码测试 1.4、时空复杂度分析 总结 1、选择排序 1.1、基本思想 选择排序是一种简单直观的比…

safari浏览器无法连接到服务器

问题&#xff1a;MacBook pro&#xff0c;网络连接正常&#xff0c;可以使用各种软件上网&#xff0c;唯独safari浏览器打不开网页&#xff0c;报错说Safari无法连接到服务器&#xff1b; 原因&#xff1a;使用了VPN&#xff0c;VPN自动更改了网络设置&#xff0c;导致Safari浏…

PythonPoc基础编写(3)---批量刷cnvd

文章目录 前言一、发现过程二、使用步骤1.引入库2.读入数据结果 总结 前言 想刷cnvd&#xff1f;最重要的是登录进行测试功能点 一、发现过程 找到一个网站 发现登录失败返回200 登录成功则是重定向 302 那就写一个脚本吧 二、使用步骤 1.引入库 import requests 2.读入…

【前端项目笔记】2 主页布局

主页布局 element-ui提供的组件名称就是它的类名 ☆☆ CSS选择器&#xff1a; &#xff08;1&#xff09;基本选择器 类型选择器 p/span/div…… 类选择器 (.classname) ID选择器 (#idname) 通配选择器 ( * ) &#xff08;2&#xff09;属性选择器 选择具有特定属性或属性值的…

掌控Linux-Conda环境安装终极指南

Linux-Conda环境安装教程 一、引言1.1. conda的作用与优势优势&#xff1a; 1.2. 简述conda在Linux系统中的重要性重要性&#xff1a; 二、准备工作2.1. 系统要求与兼容性Linux发行版支持情况硬件资源需求 2.2. 安装前的必要工具wget或curl的安装必要的开发库 三、下载与安装Mi…

计算机相关专业是否仍是“万金油”的选择?

亲爱的朋友们&#xff1a; 2024 年高考已然落幕&#xff0c;数百万高三学子站在了人生的重要十字路口&#xff0c;面临着选择大学专业这一关键抉择。在这个节点上&#xff0c;计算机相关专业是否还能被称为“万金油”的选择呢&#xff1f; 相信大家都知道&#xff0c;在最近这几…

Apache Doris 之 Docker 部署篇

前言 在现代数据驱动的商业环境中&#xff0c;实时数据分析和高并发查询能力是企业成功的关键因素之一。传统的数据仓库和分析工具在面对大规模数据处理和实时分析需求时&#xff0c;往往力不从心。Apache Doris 作为一个现代的 MPP 数据库管理系统&#xff0c;凭借其强大的查…

预埋螺栓抗滑移系数检测 内六角螺栓扭矩系数检测

螺栓检测范围&#xff1a;螺栓&#xff0c;高强螺栓&#xff0c;地脚螺栓&#xff0c;不锈钢螺栓&#xff0c;六角头螺栓&#xff0c;管片螺栓&#xff0c;膨胀螺栓&#xff0c;化学螺栓&#xff0c;镀锌螺栓&#xff0c;植筋螺栓&#xff0c;普通螺栓&#xff0c;钢结构螺栓&a…

【机器学习】CART决策树算法的核心思想及其大数据时代银行贷款参考案例——机器认知外界的重要算法

目录 引言 概述 CART决策树的特点 核心思想 减少不确定性的指标 基尼系数&#xff08;Gini Index&#xff09; 分类错误率 熵 银行实例 背景 数据准备 模型构建 模型评估与优化 应用与结果 代码示例 ✈✈✈✈引言✈✈✈✈ CART算法既可以用于分类问题&#xff0…

C# + easyui 写的一个web项目

用C# easyui 来开发&#xff0c;其实就是为了开发速度&#xff0c;用easyui可以一天写很多页面&#xff0c;比一些低代码平台还快。 登陆页面 主界面 记录数统计 家庭信息采集表 新建家庭 家庭成员 低保、五保人员帮扶情况登记表 低保、五保人员帮扶情况登记表的新增和编辑 治…

STM32学习笔记(五)--TIM输出比较PWM详解

&#xff08;1&#xff09;配置步骤1.配置RCC外设时钟 开启GPIO以及TIM外设2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等4.配置GPIO口 初始化为复用式推挽输出的配置5.运行控制 启动计数器 输出PWM…

Java基础-案例练习-全是干货

目录 案例&#xff1a;卖飞机票 案例&#xff1a;找质数&#xff1a; 案例&#xff1a;开发验证码 案例&#xff1a;评委打分 案例&#xff1a;卖飞机票 package anlixunlian;import java.util.Scanner;/*机票价格按照淡季旺季、头等舱和经济舱收费、 输入机票原价、月份和…

Python进阶二: NumPy基础:数组和矢量计算

二、NumPy基础&#xff1a;数组和矢量计算 本文源自微博客(www.microblog.store),且以获得授权 NumPy&#xff08;Numerical Python的简称&#xff09;是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。 NumPy的部分功能如下&#xf…

SuiNS更新命名标准,增强用户体验

SuiNS将其面向用户的命名标准从 xxx.sui 更新为 xxx&#xff0c;让用户能够以一种适用于Web2和Web3世界的方式来代表自己。通过此更新&#xff0c;用户可以在其选择的名称前使用 &#xff0c;而不是在名称后添加 .sui。 Sui命名服务于去年推出&#xff0c;旨在使Sui上的地址更…

docker-compose harbor 2.11

harbor 前言 “Harbor” 是一个用于管理容器镜像的开源仓库项目。由 VMware 开发和维护,Harbor 提供一个企业级的 Docker 镜像仓库,具有丰富的功能,包括: 镜像管理:提供存储和分发 Docker 镜像的能力。安全性:支持镜像签名和漏洞扫描,确保镜像的安全性。身份认证:集成…

python-开学?

[题目描述] 小执&#xff1a;终于可以开学啦&#xff01;好开心啊&#xff01; 小理&#xff1a;你没看新闻吗&#xff0c;开学日期又延后了。 小执&#xff1a;&#x1d441;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&am…

一文梳理ChatTTS的进阶用法,手把手带你实现个性化配音,音色、语速、停顿,口语,全搞定

前几天和大家分享了如何从0到1搭建一套语音交互系统。 其中&#xff0c;语音合成&#xff08;TTS&#xff09;是提升用户体验的关键所在。于是&#xff0c;上一篇接着和大家聊了聊&#xff1a;全网爆火的AI语音合成工具-ChatTTS&#xff0c;有人已经拿它赚到了第一桶金&#x…

代理配置SQUID

目录 SQUID代理服务器配置 监听浏览器访问记录 拒绝访问配置 SQUID代理服务器配置 实验系统 windows 10 xxxxx Roucky_linux9.4 192.168.226.22 监听浏览器访问记录 1. 安装squid yum install squid -y 2. 编辑squid配置文件 vim /etc/squid…