当前位置: 首页 > 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)…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

Kafka主题运维全指南:从基础配置到故障处理

#作者&#xff1a;张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1&#xff1a;主题删除失败。常见错误2&#xff1a;__consumer_offsets占用太多的磁盘。 主题日常管理 …...