当前位置: 首页 > news >正文

keepalived服务详解与实验 基于centos8

目录

  • 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                     			                # 实例名1VI_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|BACKUPnopreempt                       			    # 设置为不抢占
interface ens33                   			        # 对外提供服务的网络接口
lvs_sync_daemon_inteface ens33                       # 负载均衡器之间监控接口; track_interface {               	 			# 设置额外的监控,网卡出现问题都会切换;ens33	ens37	}	mcast_src_ip                    			    # 发送组播包的地址,如果不设置默认使用绑定网卡的primary ipgarp_master_delay              				    # 在切换到master状态后,延迟进行gratuitous ARP请求virtual_router_id 50            			    # VRID标记 ,路由ID,可通过#tcpdump vrrp查看priority 90                    				    # 优先级,优先级高者竞选为masteradvert_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|dhlb_kind DR                     				   # 负载均衡转发规则NAT|DR|TUNpersistence_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 keepalivedglobal_defs {router_id lb01  # 所有keepalived集群中router_id唯一
}vrrp_instance VRRP_55 { # 实例名相同的在一个vrrp实例组中state MASTER # 只有一个master,可以有多个BACKUPinterface ens33 # 使用的网口virtual_router_id 55 # vrrp idpriority 100 # 优先级,越高越优先advert_int 1 # vrrp通告报文间隔1sauthentication { # 认证模块auth_type PASS # 是否认证auth_pass 5555 # 认证密码}virtual_ipaddress { # 该vrrp实例的vip192.168.100.55 dev ens33 label ens33:0}
}

keepalived实验1-上手

环境准备

lb01  nginx+keeplived
lb02  (克隆lb01)

安装服务

rpm -qa | grep keepalivedyum 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 ]; thensystemctl stop keepalived
fi

测试脚本

  • nginx存在
[root@lb01 scripts]# sh check_ngx.sh
ngx 端口数量 1
[root@lb01 scripts]# systemctl status keepalived.serviceActive: 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.serviceActive: 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 keepalivedglobal_defs {router_id lb01
}
# 添加以下内容,定义vrrp脚本
vrrp_script check_ngx { # 脚本名,用于在vrrp_instance中调用script /server/scripts/check_ngx.sh # 指定的运行脚本,需要x权限interval 2 # 检测间隔2sweight 1 # 权重1user root # 执行脚本的用户为root
}vrrp_instance VRRP_55 {state MASTERinterface ens33virtual_router_id 55priority 100advert_int 1authentication {auth_type PASSauth_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.serviceActive: inactive (dead) # 现在vip出现在lb02即BACKUP上
[root@lb02 ~]# ip a | grep 100.55inet 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 keepalivedglobal_defs {router_id lb01
}
vrrp_script check_ngx {script /server/scripts/check_ngx.shinterval 2weight 1user root
}vrrp_instance VRRP_55 {state MASTERinterface ens33virtual_router_id 55priority 100advert_int 1authentication {auth_type PASSauth_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服务变化时,自动发送邮件
在这里插入图片描述

相关文章:

keepalived服务详解与实验 基于centos8

目录 keepalivedHA简介常用的高可用软件keepalived简介 keepalived常用模块keepalived功能简介keepalived常用文件keepalived配置文件详解keepalived实验1-上手环境准备安装服务主配置文件修改启动服务效果查看 keepalived脑裂1. 脑裂现象简介2. 脑裂的原因3. 脑裂的预防和解决…...

vue技巧(十)全局配置使用(打包后可修改配置文件)

1、背景 vue打包目前主流用的有webpack和vite两种&#xff0c;默认用的webpack。&#xff08;二者的区别大家可以各自上网查&#xff0c;我没用过vite&#xff0c;所以不过多介绍&#xff09;vue通过webpack打包后&#xff0c;源码会被压缩&#xff0c;但一些关键配置可…...

计算机网络 —— 运输层(运输层概述)

计算机网络 —— 运输层&#xff08;运输层概述&#xff09; 运输层运输层端口号复用分用复用&#xff08;Multiplexing&#xff09;分用&#xff08;Demultiplexing&#xff09; 常用端口号页面响应流程 我们今天进入到运输层的学习&#xff1a; 运输层 我们之前学习的物理层…...

BKP备份寄存器RTC实时时钟

BKP备份寄存器&RTC实时时钟 VDDA和VSSA是内部模拟部分的电路 VDD和VSS_1、2、3是内部数字电路的供电。系统以VDD开头的电源都是主电源。在正常使用STM32时&#xff0c;全部需要接到3.3v电源上。 VBAT备用电池供电引脚&#xff0c;如使用STM32内部的BKP和RTC&#xff0c;引…...

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…...

IEEE754、linear11、linear16浮点数应用原理

IEEE754、linear11、linear16浮点数应用原理 1 浮点数应用1.1 IEEE754 浮点数标准1.2 PMBUS浮点数格式 2 浮点数原理2.1 IEEE754 浮点数解析2.2 PMBUS浮点数解析 3 浮点数代码应用3.1 IEEE754 浮点数应用3.1.1 将浮点变量赋值&#xff0c;直接打印整型&#xff08;32位&#xf…...

6、 垃圾回收 浏览器事件循环

垃圾回收 & 浏览器事件循环 垃圾回收引用计数算法标记清除&#xff08;mark-sweep&#xff09;算法标记整理&#xff08;Mark-Compact&#xff09;算法 内存管理浏览器事件循环宏任务微任务整体流程 垃圾回收 垃圾回收&#xff0c;又称为&#xff1a;GC&#xff08;garbag…...

Java多线程面试重点-2

16.Synchronized关键字加在静态方法和实例方法的区别? 修饰静态方法&#xff0c;是对类进行加锁&#xff08;Class对象&#xff09;&#xff0c;如果该类中有methodA和methodB都是被Synch修饰的静态方法&#xff0c;此时有两个线程T1、T2分别调用methodA()和methodB()&#x…...

LLaMA Factory多卡微调的实战教程(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

IOUtils的妙用

查看IOUtils的api文档&#xff0c;它的方法大部分都是重载的&#xff0c;方法的用法总结如下&#xff1a; 方法名使用说明buffer将传入的流进行包装&#xff0c;变成缓冲流。并可以通过参数指定缓冲大小closeQueitly关闭流contentEquals比较两个流中的内容的是否一致copy将输入…...

目标检测——室内服务机器人LifelongSLAM数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …...

Mysql学习笔记-进阶篇

一、存储引擎 1、MYSQL体系结构 连接层、服务层、引擎层、存储层&#xff1b; 2、存储引擎简介 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是库的&#xff0c;所以存储引擎也可被称为表类型。 1&#xff09;在创…...

AI写真:ControlNet 之 InstantID

但是 IPAdapter-FaceId 目前只在 SD 1.5 模型上表现较好&#xff0c;SDXL 模型上的表现较差&#xff0c;不能用于实际生产。可是很多同学已经在使用SDXL了&#xff0c;而且SDXL确实整体上出图效果更好&#xff0c;怎么办&#xff1f; 这篇文章就来给大家介绍一个在SDXL中创作A…...

单元测试的思考与实践

1. 什么是单元测试 通常来说单元测试&#xff0c;是一种自动化测试&#xff0c;同时包含一下特性&#xff1a; 验证很小的一段代码&#xff08;业务意义 或者 代码逻辑 上不可再分割的单元&#xff09;&#xff0c;能够更准确的定位到问题代码的位置 能够快速运行&#xff08;…...

C# Socket通讯简单Demo

C# Socket通讯简单Demo Client端Listener端 Client端 static void Main(string[] args) {XSocketService XSocketService new XSocketService();XSocketService.Init();while (true){Console.Write("请输入消息&#xff1a;");var msg Console.ReadLine();XSocket…...

视频融合共享平台LntonCVS视频监控管理平台技术方案详细介绍

LntonCVS国标视频综合管理平台是一款以视频为核心的智慧物联应用平台。它基于分布式、负载均衡等流媒体技术进行开发&#xff0c;提供广泛兼容、安全可靠、开放共享的视频综合服务。该平台具备多种功能&#xff0c;包括视频直播、录像、回放、检索、云存储、告警上报、语音对讲…...

C#ListView的单元格支持添加基本及自定义任意控件

功能说明 使用ListView时&#xff0c;希望可以在单元格显示图片或其他控件&#xff0c;发现原生的ListView不支持&#xff0c;于是通过拓展&#xff0c;实现ListView可以显示任意控件的功能&#xff0c;效果如下&#xff1a; 实现方法 本来想着在单元格里面实现控件的自绘的…...

数据库选型实践:如何避开分库分表痛点 | OceanBase用户实践

随着企业业务的不断发展&#xff0c;数据量往往呈现出快速的增长趋势。使用MySQL的用户面对这种增长&#xff0c;普遍选择采用分库分表技术作为应对方案。然而&#xff0c;这一方案常在后期会遇到很多痛点。 分库分表的痛点 痛点 1&#xff1a;难以保证数据一致性。由于分库分…...

3个火火火的AI项目,开源了!

友友们&#xff0c;今天我要给你们安利三个超酷的开源项目&#xff0c;它们都和AI有关&#xff0c;而且每一个都能让你的日常生活变得更加有趣和便捷&#xff01;(最近AI绘图又又超神了&#xff0c;分享以下美图养眼) 01 字节出品&#xff0c;文字转语音Seed-TTS 字节推出了一…...

算法 | 子集数排列树满m叉树二分搜索归并排序快速排序

子集树&#xff1a;O(2^n) 一个序列的所有子集为2^n&#xff0c;即可看成具有2^n个叶节点的满二叉树 int backtrack(int k) //k表示扩展结点在解空间树中所处的层次 {if(k>n) //n标识问题的规模output(x); //x是存放当前解的一维数组if(constraint(k)…...

SpringBoot配置第三方专业缓存技术jetcache方法缓存方案

jetcache方法缓存 我们可以给每个方法配置缓存方案 JetCache 是一个基于 Java 的缓存库&#xff0c;支持多种缓存方案和缓存策略&#xff0c;主要用于提升应用程序的性能和响应速度。它提供了多种缓存模式和特性&#xff0c;可以根据需求选择合适的缓存方案。 JetCache 的主…...

游戏开发丨基于PyGame的消消乐小游戏

文章目录 写在前面PyGame消消乐注意事项系列文章写在后面 写在前面 本期内容&#xff1a;基于pygame实现喜羊羊与灰太狼版消消乐小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700193 实验环境 python3.11及以上pycharmpygame 安装pygame…...

软件项目管理概述

1.什么是项目&#xff1f; 2.项目管理的定义 3.项目管理的本质 4.项目成功的标志 5.项目管理的基本方法 6.项目的生命周期&#xff08;启动 计划 执行 控制 结束&#xff09; 7.结合生活中的某件事&#xff0c;谈谈项目管理的作用 项目管理在日常生活中扮演着重要的角色&…...

FastAdmin后台开发框架 lang 任意文件读取漏洞复现

0x01 产品简介 FastAdmin是一款基于PHPBootstrap的开源后台框架&#xff0c;专为开发者精心打造。它基于ThinkPHP和Bootstrap两大主流技术构建&#xff0c;拥有完善的权限管理系统和一键生成CRUD等强大功能。FastAdmin致力于提高开发效率&#xff0c;降低开发成本&#xff0c;…...

数字时代PLM系统的重要性

什么是 PLM&#xff08;产品生命周期管理&#xff09;&#xff1f; 从最基本的层面上讲&#xff0c;产品生命周期管理 (PLM)是管理产品从最初构思、开发、服务和处置的整个过程的战略流程。换句话说&#xff0c;PLM 意味着管理产品从诞生到消亡所涉及的一切。 什么是 PLM 软件…...

安卓实现圆形按钮轮廓以及解决无法更改按钮颜色的问题

1.实现按钮轮廓 在drawable文件新建xml文件 <shape xmlns:android"http://schemas.android.com/apk/res/android"<!--实现圆形-->android:shape"oval"><!--指定内部的填充色--><solid android:color"#FFFFFF"/><!-…...

常用原语介绍

1.在Xilinx的example&#xff08;wavegen example&#xff09;中看到他们的顶层模块的输入输出管脚都手动例化原语IBUF以及OBUF——工具也会自动给我们加上不必要自己加 2.非mrcc个srcc的管脚输入的时钟信号&#xff0c;无法进入mmcm和bufg————试验过会报错 3.实际上&…...

29. 透镜阵列

导论&#xff1a; 物理传播光学&#xff08;POP&#xff09;不仅可以用于简单系统&#xff0c;也可以设计优化复杂的光学系统&#xff0c;比如透镜阵列。 设计流程&#xff1a; 透镜阵列建模 在孔径类型中选择“入瞳直径”&#xff0c;并输入2 在视场设定中。设置一个视场&…...

深入理解并打败C语言难关之一————指针(3)

前言&#xff1a; 昨天把指针最为基础的内容讲完了&#xff0c;并且详细说明了传值调用和传址调用的区别&#xff08;这次我也是做到了每日一更&#xff0c;感觉有好多想写的但是没有写完&#xff09;&#xff0c;下面不多废话&#xff0c;下面进入本文想要说的内容 目录&#…...

Ubuntu-24.04-live-server-amd64启用ssh

系列文章目录 Ubuntu-24.04-live-server-amd64安装界面中文版 Ubuntu安装qemu-guest-agent Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、输入安装命令二、使用私钥登录&#xff08;可选&#xff09;1.创建私钥2.生成三个文件说明3.将公钥复制到服务器 三…...