KEEPALIVED高可用集群最详解
目录
一、高可用集群
1.1 集群的类型
1.2 实现高可用
1.3 VRRP:Virtual Router Redundancy Protocol
1.3.1 VRRP相关术语
1.5.2 VRRP 相关技术
二、部署KEEPALIVED
2.1 keepalived 简介
2.2 Keepalived 架构
2.3 Keepalived 环境准备
2.3.1 实验环境
2.4 Keepalived 相关文件
2.5 安装软件
2.6 KeepAlived 配置说明
2.6.1 配置虚拟路由
2.6.2 示例: keepalived配置文件中配置虚拟路由
2.6.2.1 抓包命令查看组播信息:
2.6.3 实现独立子配置文件
三.Keepalived 应用示例
3.1 实现master/slave的 Keepalived 单主架构
3.1.1 配置MASTER
3.1.2 配置BACKUP
3.1.3 抓包查看
3.2 抢占模式和非抢占模式
3.2.1 非抢占模式
3.2.2 抢占延迟模式
3.3vip单播模式
3.3.1 抓包命令查看: ka2上看不到,因为没有vip
3.4 keepalived实现邮件通知
3.5 实现keepalived的双主架构 master/master
3.6 实现IPVS的高可用性(DR模式)
3.6.1 应用层监测
3.6.2 TCP监测
3.6.3 实现单主的 LVS-DR 模式
3.7 vrrp Script 配置 脚本控制vip
3.7.1 利用脚本实现主从角色切换
3.8 keepalived-haproxy实现高可用
3.8.1 还原状态
3.8.2 实现haproxy高可用
3.8.3 测试
一、高可用集群
1.1 集群的类型
- LB:Load Balance 负载均衡
- LVS/HAProxy/nginx(http/upstream, stream/upstream)
- HA:High Availability 高可用集群 数据库、Redis
- SPoF: Single Point of Failure,解决单点故障
- HPC:High Performance Computing 高性能集群
1.2 实现高可用
- active/passive 主/备
- active/active 双主
- active --> HEARTBEAT --> passive
- active <--> HEARTBEAT <--> active
1.3 VRRP:Virtual Router Redundancy Protocol
- 物理层:路由器、三层交换机
- 软件层:keepalived
1.3.1 VRRP相关术语
- 虚拟路由器:Virtual Router
- 虚拟路由器标识:VRID(0-255),唯一标识虚拟路由器
- VIP:Virtual IP
- VMAC:Virutal MAC (00-00-5e-00-01-VRID)
- 物理路由器:
- master:主设备
- backup:备用设备
- priority:优先级
1.5.2 VRRP 相关技术
- 无认证
- 简单字符认证:预共享密钥
- MD5
- 主/备:单虚拟路由器
- 主/主:主/备(虚拟路由器1),备/主(虚拟路由器2)
二、部署KEEPALIVED
2.1 keepalived 简介
- 基于vrrp协议完成地址流动
- 为vip地址所在的节点生成ipvs规则(在配置文件中预先定义)
- 为ipvs集群的各RS做健康状态检测
- 基于脚本调用接口完成脚本中定义的功能,进而影响集群事务,以此支持nginx、haproxy等服务
2.2 Keepalived 架构
- 用户空间核心组件:
- 控制组件:提供keepalived.conf 的解析器,完成Keepalived配置
- IO复用器:针对网络目的而优化的自己的线程抽象
- 内存管理组件:为某些通用的内存管理功能(例如分配,重新分配,发布等)提供访问权限
2.3 Keepalived 环境准备
2.3.1 实验环境
主机名 | IP |
ka1 | 172.25.254.10/24 |
ka2 | 172.25.254.20/24 |
realserver1 | 172.25.254.110/24 |
realserver2 | 172.25.254.120/24 |
- 各节点时间必须同步:ntp, chrony
- 关闭防火墙及SELinux
- 各节点之间可通过主机名互相通信:非必须
- 建议使用/etc/hosts文件实现:非必须
- 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信:非必须
2.4 Keepalived 相关文件
- 软件包名:keepalived
- 主程序文件:/usr/sbin/keepalived
- 主配置文件:/etc/keepalived/keepalived.conf
- 配置文件示例:/usr/share/doc/keepalived/
- Unit File:/lib/systemd/system/keepalived.service
- Unit File的环境配置文件:/etc/sysconfig/keepalived
2.5 安装软件
[root@ka1 ~]# dnf install keepalived -y[root@ka1 ~]# systemctl start keepalived
2.6 KeepAlived 配置说明
配置文件:/etc/keepalived/keepalived.conf
- GLOBAL CONFIGURATION
- VRRP CONFIGURATION
- LVS CONFIGURATION
2.6.1 配置虚拟路由
配置master:
vim /etc/keepalived/keepalived.confglobal_defs {notification_email {2961953033@qq.com #keepalived 发生故障切换时邮件发送的目标邮箱,可以按行区分写多个}notification_email_from keepalived@ka1.exam.org #发邮件的地址smtp_server 127.0.0.1 #邮件服务器地址smtp_connect_timeout 30 #邮件服务器连接timeoutrouter_id ka1.exam.org #每个keepalived主机唯一标识,多节点 重名不影响vrrp_skip_check_adv_addr #对所有通告报文都检查,会比较消耗性能 启用此配置后,如果收到的通告报文和上 一个报文是同一个路由器,则跳过检查, 默认值为全检查#vrrp_strict #严格遵循vrrp协议#启用此项后以下状况将无法启动服务:1.无VIP地址2.配置了单播邻居3.在VRRP版本2中有IPv6地址#建议不加此项配置vrrp_garp_interval 0 #报文发送延迟,0表示不延迟vrrp_gna_interval 0 #消息发送延迟vrrp_mcast_group4 224.0.0.18 #指定组播IP地址范围:
}
配置slave:
vrrp_instance VI_1 {state MASTERinterface eth0 #绑定为当前虚拟路由器使用的物理接口,如:eth0,可以和 VIP不在一个网卡virtual_router_id 100 #每个虚拟路由器惟一标识,范围:0-255,每个虚拟路由器此 值必须唯一,否则服务无法启动同属一个虚拟路由器的多个keepalived节点必须相同务必要确认在同一网络中此值必须唯一priority 100 #当前物理节点在此虚拟路由器的优先级,范围:1-254值越大优先级越高,每个keepalived主机节点此值不同advert_int 1 #vrrp通告的时间间隔,默认1sauthentication { #认证机制auth_type PASS #PASS为简单密码(建议使用)auth_pass 1111 #预共享密钥,仅前8位有效同一个虚拟路由器的多个keepalived节点必须一样}virtual_ipaddress { #虚拟IP,生产环境可能指定上百个IP地址172.25.250.100/24 dev eth0 label eth0:1 #<IPADDR> dev <STRING> scope <SCOPE> label <LABEL>#指定VIP,不指定网卡,默认为eth0,注意:不指 定/prefix,默认32}
}
2.6.2 示例: keepalived配置文件中配置虚拟路由
ka1和ka2中安装软件包:yum install keepalived -y主配置文件:/etc/keepalived/keepalived.conf默认为抢占模式:
vim /etc/keepalived/keepalived.conf
配置全局参数:
global_defs {notification_email {2961953033@qq.com18883572121@163.com}notification_email_from keepalived@timingding.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka1.timingding.orgvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18
}配置vip:
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}systemctl start keepalived.service
查看:
这里简便快捷一下:使用scp命令直接传到另一台ka上面
直接传到ka2上面:
scp /etc/keepalived/keepalived.conf root@172.25.254.20:/etc/keepalived/keepalived.conf
ka2上面的优先级设置的低一些:
ka2配置vip的地方要改优先级:vrrp_instance VI_1 {state BACKUP ------ 改为BACKUPinterface eth0virtual_router_id 100priority 80 ------ 改的比ka1低一些advert_int 1authentication {auth_type PASSauth_pass 1111}
2.6.2.1 抓包命令查看组播信息:
tcpdump -i eth0 -nn host 224.0.0.18
此时ping 172.25.254.100 不通。
命令查看:
iptables -nL
想ping通,得在全局配置里面加参数 vrrp_iptables,不想加就可以把vrrp_strict注释掉,要么都开,要么就注释掉
ka1和ka2都要加
global_defs {notification_email {2961953033@qq.com18883572121@163.com}notification_email_from keepalived@timingding.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka1.timingding.orgvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group4 224.0.0.18vrrp_iptables ------ 加这个参数
}此时就可以ping通172.25.254.100了。
2.6.3 实现独立子配置文件
vim /etc/keepalived/keepalived.conf
把虚拟路由注释掉:
#vrrp_instance VI_1 {
# state MASTER
# interface eth0
# virtual_router_id 100
# priority 100
# advert_int 1
# authentication {
# auth_type PASS
# auth_pass 1111
# }
# virtual_ipaddress {
# 172.25.254.100/24 dev eth0 label eth0:1
# }
#}
加上
include "/etc/keepalived/conf.d/*.conf"vim /etc/keepalived/conf.d/172.25.254.100.confvrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}systemctl restart keepalived.service
三.Keepalived 应用示例
3.1 实现master/slave的 Keepalived 单主架构
3.1.1 配置MASTER
[root@ka1 ~]# vim /etc/keepalived/keepalived.confglobal_defs {notification_email {2961953033@qq.com18883572121@163.com}notification_email_from keepalived@timingding.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka1.timingding.orgvrrp_skip_check_adv_addr#vrrp_strict vrrp_garp_interval 0vrrp_gna_interval 0#vrrp_mcast_group4 224.0.0.18#vrrp_iptables
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
3.1.2 配置BACKUP
[root@ka2 ~]# vim /etc/keepalived/keepalived.conf global_defs {notification_email {2961953033@qq.com18883572121@163.com}notification_email_from keepalived@ka2.timingding.orgsmtp_server 127.0.0.1smtp_connect_timeout 30router_id ka2.timingding.orgvrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0vrrp_mcast_group 224.0.0.18#vrrp_iptables
}vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
3.1.3 抓包查看
tcpdump -i eth0 -nn host 224.0.0.18
3.2 抢占模式和非抢占模式
默认为抢占模式preempt,即当高优先级的主机恢复在线后,会抢占低先级的主机的 master 角色, 这样会使vip 在 KA 主机中来回漂移,造成网络抖动,建议设置为非抢占模式 nopreempt ,即高优先级主机恢复后,并不会抢占低优先级主机的 master 角色非抢占模块下,如果原主机 down 机 , VIP 迁移至的新主机 , 后续也发生 down 时 , 仍会将 VIP 迁移回原主机
master角色下线后,会转移到另一台主机后,master角色重新恢复之后,不会因为优先级抢占vip
3.2.1 非抢占模式
使用参数:nopreempt
ka1和ka2一样:
vim /etc/keepalived/keepalived.confvrrp_instance VI_1 {state BACKUP ---- 也得设置为BACKUP,两台都为备机interface eth0virtual_router_id 100 priority 100advert_int 1nopreempt ------- 加上这个参数authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
}
3.2.2 抢占延迟模式
使用参数:preempt_delay
ka1主机上:ka2也一样
vim /etc/keepalived/keepalived.confvrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 100advert_int 1preempt_delay 5s ---- 抢占延时为5s,一般设定一分钟,五分钟,这里演示。authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}
3.3vip单播模式
ka1主机上:ka2也一样
vim /etc/keepalived/keepalived.confvrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.10 ---- 指定谁到谁 ka2上相反unicast_peer {172.25.254.20}
3.3.1 抓包命令查看: ka2上看不到,因为没有vip
[root@ka1 ~]# tcpdump -i eth0 -nn src host 172.25.254.10 and dst 172.25.254.20
3.4 keepalived实现邮件通知
安装邮件发送工具:
dnf install mailx -yQQ邮箱配置:
vim /etc/mail.rcset from=2961953033@qq.com
set smtp=smtp.qq.com
set smtp-auth-user=2961953033@qq.com
set smtp-auth-password=gyzvbkvimprddecb ---- 去QQ邮箱上面登录弄授权码
set smtp-auth=login
set ssl-verify=ignore测试发送邮件:
echo test message |mail -s test 2961953033@qq.com写个脚本:
vim /etc/keepalived/mail.sh#!/bin/bash
mail_dst="2961953033@qq.com"
send_message()
{mail_sub="HOSTNAME to be $1 vip mopve"mail_msg="`date +%F\ %T`: vrrp move $HOSTNAME chage $1"echo $mail_msg | mail -s "$mail_sub" $mail_dst
}case $1 inmaster)send_message master;;backup)send_message backup;;fault)send_message fault;;*);;
esacchmod +x /etc/keepalived/mail.sh在ka1和ka2虚拟路由上面添加节点:
vim /etc/keepalived/keepalived.confvrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 100priority 80advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.20unicast_peer {172.25.254.10}notify_master "/etc/keepalived/notify.sh master" ----- 添加这三行notify_backup "/etc/keepalived/notify.sh backup"notify_fault "/etc/keepalived/notify.sh fault"
}
3.5 实现keepalived的双主架构 master/master
master/slave的单主架构,同一时间只有一个Keepalived 对外提供服务,此主机繁忙,而另一台主机却 很空闲,利用率低下,可以使用master/master 的双主架构,解决此问题。master/master 的双主架构:即将两个或以上VIP分别运行在不同的 keepalived 服务器,以实现服务器并行提供 web 访问的目的,提高 服务器资源利用率
ka1和ka2上都加上,都有一个主备
vim /etc/keepalived/keepalived.confvrrp_instance VI_2 {state MASTWEinterface eth0virtual_router_id 200priority 80 ----- 优先级不能一样advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.200/24 dev eth0 label eth0:2}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}
}
3.6 实现IPVS的高可用性(DR模式)
3.6.1 应用层监测
HTTP_GET|SSL_GET {url {path <URL_PATH> #-----------定义要监控的URLstatus_code <INT> #---------判断上述检测机制为健康状态的响应码,一般为 200}connect_timeout <INTEGER> #---------客户端请求的超时时长, 相当于haproxy的timeout servernb_get_retry <INT> #---------重试次数delay_before_retry <INT> #---------重试之前的延迟时长connect_ip <IP ADDRESS> #---------向当前RS哪个IP地址发起健康状态检测请求connect_port <PORT> #--------向当前RS的哪个PORT发起健康状态检测请求bindto <IP ADDRESS> #---------向当前RS发出健康状态检测请求时使用的源地址bind_port <PORT> #----------向当前RS发出健康状态检测请求时使用的源端口
}
3.6.2 TCP监测
TCP_CHECK {connect_ip <IP ADDRESS> #----------向当前RS的哪个IP地址发起健康状态检测请求connect_port <PORT> #---------向当前RS的哪个PORT发起健康状态检测请求bindto <IP ADDRESS> #--------发出健康状态检测请求时使用的源地址bind_port <PORT> #---------发出健康状态检测请求时使用的源端口connect_timeout <INTEGER> #------客户端请求的超时时长#-------等于haproxy的timeout server
}
3.6.3 实现单主的 LVS-DR 模式
永久设定vip:
vim /etc/sysconfig/network-scripts/ifcfg-lo 加上:
IPADDR1=172.25.254.100
NETMASK1=255.255.255.255
NETWORK=127.0.0.0这里我们给上临时的就行:
reslserver1和2上面给上vip(临时)
ip a a 172.25.254.100 dev lo解决响应问题:
查看arp:
sysctl -a | grep arpka1上面
vim /etc/sysctl.d/arp.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1用scp命令写到ka2上面:
scp /etc/sysctl.d/arp.conf root@172.25.254.110:/etc/sysctl.d/arp.confka1和ka2上面安装ipvsadm 用来查看策略:
yum install ipvsadm -yka1和ka2一样:
vim /etc/keepalived/keepalived.confvirtual_server 172.25.254.100 80 {delay_loop 6lb_algo wrrlb_kind DR#persistence_timeout 50protocol TCPreal_server 172.25.254.110 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}real_server 172.25.254.120 80 {weight 1HTTP_GET {url {path /status_code 200}connect_timeout 3nb_get_retry 2delay_before_retry 2}}
}ssytemctl restart keepalived.service使用ipvsadm -Ln 查看策略是否写进去
3.7 vrrp Script 配置 脚本控制vip
3.7.1 利用脚本实现主从角色切换
示例:先用例子测试一下:
检测文件是否存在,存在为真(1),ka1就降低优先级,vip飘到ka2上面,不存在为假(0),vip就按兵不动
[root@ka1 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
[ ! -f /mnt/ding ] ---- 取反chmod +x /etc/keepalived/test.sh ---- 给上可执行权限[root@ka1 ~]# vim /etc/keepalived/keepalived.confvrrp_script check_file {script "/etc/keepalived/test.sh" ------shell命令或脚本的路径interval 1 ------ 检测的间隔时间,默认为1sweight -30 ------ 默认为零,这里测试设置-30,当运行脚本检测到之后,为非0,就会与VIP的优先级相加,优先 降低,实现VIP飘移,为0时就VIP就按兵不动。fall 2 ------ 脚本连续几次都执行失败,则转换为失败,建议设置为2以上rise 2 ------ 执行脚本连续几次都成功,把服务器标记为成功timeout 2 ------ 设置的超时时间。
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}track_script { ------ 调用这个script配置参数check_file}
}[root@ka1 ~]# systemctl restart keepalived.service sh /etc/keepalived/test.sh
echo $?0
此时/mnt底下没有ding这个文件,运行脚本输出0,VIP就按兵不动
此时在/mnt底下创建ding这个文件,输出为非0,执行脚本,此时vip飘到ka2上面
touch /mnt/ding
sh /etc/keepalived/test.sh
echo $?1
ka1上面:
ka2上面:
删除这个文件之后,VIP就自动飘回来了
rm -rf /mnt/ding
systemctl restart keepalived.serviceifconfig
3.8 keepalived-haproxy实现高可用
3.8.1 还原状态
两台ka1和ka2上安装haproxy
yum install haproxy -y把两台server机上面的VIP和arp响应给去掉:
[root@realserver1 ~]# ip a d 172.25.254.100/32 dev lo
[root@realserver2 ~]# ip a d 172.25.254.100/32 dev loarp响应:
[root@realserver1 ~]# vim /etc/sysctl.d/arp.conf
[root@realserver2 ~]# vim /etc/sysctl.d/arp.confnet.ipv4.conf.all.arp_ignore=0
net.ipv4.conf.all.arp_announce=0
net.ipv4.conf.lo.arp_announce=0
net.ipv4.conf.lo.arp_ignore=0sysctl --system ---- 查看ka1和ka2上都开启内核路由:
[root@ka1 ~]# vim /etc/sysctl.conf
[root@ka2 ~]# vim /etc/sysctl.conf et.ipv4.ip_nonlocal_bind=1 ---- 两台都开启内核路由sysctl -p ----- 刷新一下记住要把之前做的LVS给注释掉,lvs和haproxy不能同时使用!!!!
[root@ka1 ~]# vim /etc/haproxy/haproxy.cfg
[root@ka2 ~]# vim /etc/haproxy/haproxy.cfglisten webclusterbind 172.25.254.100:80mode httpbalance roundrobinserver web1 172.25.254.110:80 check inter 3 fall 2 rise 5server web1 172.25.254.120:80 check inter 3 fall 2 rise 5查看端口是否开启:
[root@ka1 ~]# netstat -antlupe | grep haproxy
tcp 0 0 172.25.254.100:80 0.0.0.0:* LISTEN 0 2636800 5709/haproxy
tcp 0 0 0.0.0.0:5000 0.0.0.0:* LISTEN 0 2636798 5709/haproxy
udp 0 0 0.0.0.0:35424 0.0.0.0:* 0 2636799 5708/haproxy
[root@ka1 ~]#
3.8.2 实现haproxy高可用
如何检测haproxy的存活状态:
killall -0 haproxy写入之前示例的那个脚本:
[root@ks2 ~]# vim /etc/keepalived/test.sh
#!/bin/bash
killall -0 haproxy[root@ka1 ~]# vim /etc/keepalived/keepalived.conf
[root@ka2~]# vim /etc/keepalived/keepalived.conf vrrp_script check_haproxy {script "/etc/keepalived/test.sh" interval 1 weight -30 fall 2 rise 2 timeout 2
}vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 100priority 100advert_int 1#preempt_delay 5sauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {172.25.254.100/24 dev eth0 label eth0:1}unicast_src_ip 172.25.254.10unicast_peer {172.25.254.20}track_script { check_haproxy}
}systemctl restart keepalived.service
3.8.3 测试
复制一个ka1出来,写个死循环:
while true
>do
>curl 172.25.254.100;sleep 0.5
>done把ka1上的haproxy挂掉,这边不会受影响,一直循环,VIP会飘到ka2上面
把ka1上面的haproxy给挂掉:
[root@ka1 ~]# systemctl stop haproxy.service
此时ka1上面没有VIP了
查看ka2上面:
把ka1上面的haproxy重新启动,VIP又回来了
systemctl start haproxy.service死循环也不会受影响,因为ka1上面haproxy挂掉了,ka1上的VIP优先级降低,飘到ka2上面去了,ka2上面的haproxy还存活,也有VIP,所以死循环会一直能访问。最终不会影响架构的最终访问。
至此,keepalived-haproxy就实现了高可用
相关文章:
KEEPALIVED高可用集群最详解
目录 一、高可用集群 1.1 集群的类型 1.2 实现高可用 1.3 VRRP:Virtual Router Redundancy Protocol 1.3.1 VRRP相关术语 1.5.2 VRRP 相关技术 二、部署KEEPALIVED 2.1 keepalived 简介 2.2 Keepalived 架构 2.3 Keepalived 环境准备 2.3.1 实验环境 2…...
【大模型】llama-factory基础学习
前言:LLaMA-Factory项目的目标是整合主流的各种高效训练微调技术,适配市场主流开源模型,形成一个功能丰富,适配性好的训练框架。 目录 1. 前期准备2. 原始模型直接推理3. 自定义数据集4. 模型训练5. 模型合并并导出 1. 前期准备 …...
【Java】如何使用jdbc连接并操作MySQL,一文读懂不迷路,小白也能轻松学会
JDBC的原理 JDBC(Java Database Connectivity)是Java提供的用于连接和操作数据库的API。它允许Java应用程序与各种数据库进行交互,以下是JDBC的基本原理: 驱动程序管理:JDBC使用不同的数据库驱动程序来连接不同类型的…...
新手学习VR全景需要知道的几个问题
1.什么是720云 720云是一家专注于VR全景内容制作与展示的技术平台,提供从拍摄、编辑到发布的一站式解决方案。它的核心功能包括全景图像的制作和编辑工具,以及VR全景内容的在线展示和分享服务。720云的技术广泛应用于房地产、旅游、教育、文化展示等多个…...
上海知名泌尿外科专家常态化坐诊黄山新晨医院,让前列腺癌看得更早、更准!
继7月28日上海第四人民医院泌尿外科专家在黄山新晨医院开展义诊之后,8月9日和10日,该团队领头人周铁教授又完成了合作以来的首次坐诊,标志着双方合作从此进入常态化阶段。 周铁主任在查看患者的检查报告 周铁主任曾任中华医学会泌尿外科分会…...
Elasticsearch: 非结构化的数据搜索
r很多大数据组件在快速原型时期都是Java实现,后来因为GC不可控、内存或者向量化等等各种各样的问题换到了C,比如zookeeper->nuraft(https://www.yuque.com/treblez/qksu6c/hu1fuu71hgwanq8o?singleDoc# 《olap/clickhouse keeper 一致性协调服务》)&…...
44 个 React 前端面试问题
1.你知道哪些React hooks? useState:用于管理功能组件中的状态。useEffect:用于在功能组件中执行副作用,例如获取数据或订阅事件。useContext:用于访问功能组件内的 React 上下文的值。useRef:用于创建对跨…...
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析
LLMs之Framework:Hugging Face Accelerate后端框架之FSDP和DeepSpeed的对比与分析 导读:该文章阐述了FSDP和DeepSpeed在实现上的差异,Accelerate如何统一它们的行为,并提供指导帮助用户在两种后端之间切换。同时也讨论了低精度优化…...
HarmonyOS应用开发学习-ArkTs声明式UI描述
ArkTs声明式UI描述 1 创建组件 声明式UI描述 ArKTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑 创建组件 根据组件构造方法的不同,创建组件包含有参数和无参…...
Redis20-通信协议
目录 RESP协议 概述 数据类型 模拟Redis客户端 RESP协议 概述 Redis是一个CS架构的软件,通信一般分两步(不包括pipeline和PubSub): 客户端(client)向服务端(server)发送一条命…...
Unity Shader变体优化与故障排除技巧
在 Unity 中编写着色器时,我们可以方便地在一个源文件中包含多个特性、通道和分支逻辑。在构建时,着色器源文件会被编译成着色器程序,这些程序包含一个或多个变体。变体是该着色器在满足一组条件后生成的版本,这通常会导致线性执行…...
数据结构——时间复杂度和空间复杂度
目录 时间复杂度 什么是时间复杂度 常见时间复杂度类型 如何计算时间复杂度 空间复杂度 什么是空间复杂度 常见的空间复杂度类型 如何计算空间复杂度 时间复杂度和空间复杂度是评估算法性能的两个重要指标。 时间复杂度 什么是时间复杂度 时间复杂度描述了算法执行所需…...
(echarts) 饼图设置滚动图例
(echarts) 饼图设置滚动图例 效果: 代码: // 图例 legend: {type: scroll,orient: vertical,right: 10,top: 20,bottom: 20,data: data.legendData},参考:官网-可滚动的图例 https://echarts.apache.org/examples/zh/editor.html?cpie-leg…...
Java spring SSM框架--mybatis
一、介绍 Spring 框架是一个资源整合的框架,可以整合一切可以整合的资源(Spring 自身和第三方),是一个庞大的生态,包含很多子框架:Spring Framework、Spring Boot、Spring Data、Spring Cloud…… 其中Spr…...
Python知识点:如何使用Arduino与Python进行物联网项目
Arduino和Python是物联网(IoT)项目中常用的两种技术。Arduino是一个开源的硬件平台,而Python是一种高级编程语言,它们可以结合使用来创建各种智能设备和系统。以下是使用Arduino和Python进行物联网项目的一般步骤: 确定项目需求: …...
论文复现_从 CONAN 中收集 TPL 数据集
1. 概述 CONAN:Conan是一个用于C项目的开源包管理工具。 它的主要目标是简化C项目的依赖关系管理过程,使开发人员能够更轻松地集成、构建和分享C库。 其中有一些比较独特的功能,例如:版本管理、第三方库管理等。 TPL 数据集&…...
使用Docker将Java项目打包并部署到CentOS服务器的详细教程。
当然,让我们将上述步骤进一步细化,以便更好地理解整个过程。 前提条件 一个Java项目CentOS服务器,并且已安装DockerJava项目可以正常在本地运行具有服务器访问权限 ———————————————————————————————————…...
嘉立创eda布线宽度
https://prodocs.lceda.cn/cn/pcb/route-routing-width/#%E5%B8%83%E7%BA%BF%E5%AE%BD%E5%BA%A6...
硬件面试经典 100 题(31~50 题)
31、多级放大电路的级间耦合方式有哪几种?哪种耦合方式的电路零点偏移最严重?哪种耦合方式可以实现阻抗变换? 有三种耦合方式:直接耦合、阻容耦合、变压器耦合。直接耦合的电路零点漂移最严重,变压器耦合的电路可以实现…...
5G:下一代无线通信技术的全面解析
随着科技的不断进步,移动通信技术也在飞速发展。从2G到4G,我们见证了无线网络的巨大变革,而现在,5G已经悄然来临。作为下一代无线通信技术,5G不仅将带来更快的速度和更低的延迟,还将开启全新的应用场景和商…...
关于refresh_token
前文介绍过jwt的一般使用场景,用户登录成功后获得jwt,其中包含用户相关信息,主要是在前端要用到的属性(比如姓名、应用角色[这个前端后都用得着]等)、在后端要用到的属性(比如登录IP、终端唯一标识…...
Linux网络:基于OS的网络架构
Linux网络:OS视角下的网络架构 网络分层模型OSI 七层模型TCP/IP 五层模型 协议操作系统与网络网络相关命令ifconfigpingnetstat 本博客将基于操作系统,讲解计算机网络的设计理念,帮助大家理解操作系统与网络之间的关系。 网络分层模型 网络…...
UEC++学习(十六)变量添加中文注释、ui设置中文文本
(一)变量添加中文注释 在C 项目中创建变量,并在蓝图中显示变量的英文名同时附带中文注释,可以使用UPROPERTY 的 ToolTip 元数据属性来实现 UPROPERTY(EditAnywhere, meta (ToolTip "弹夹最大容量"))int32 MagCapacit…...
Redis延迟双删
1、何为延时双删 Redis延迟双删是一种在数据更新操作中确保缓存与数据库数据一致性的策略,通过两次缓存删除操作间隔一段延时来减少数据不一致的问题。 在并发环境下,多个请求同时对同一数据进行读写时,如果没有妥善处理,很容易…...
WO Mic 手机变身免费麦克风
目录 一、主要特点 1.支持多种连接方式 2.应用广泛 3.低延迟 4.简易配置 5.自动连接 6.音频格式 二、软件下载 三、软件安装 四、系统连接 五、测试 直播的时候,上课的时候,会议的时候……突然发现没有麦克风或者电脑麦克风有故障,这可怎么办呢?今天给大家介绍一…...
MQ死信对列
面试题:你们是如何保证消息不丢失的? 1、什么是死信 死信就是消息在特定场景下的一种表现形式,这些场景包括: 1. 消息被拒绝访问,即消费者返回 basicNack 的信号时 或者拒绝basicReject 2. 消费者发生异常࿰…...
springboot乡镇小区管理系统-计算机毕业设计源码73685
摘 要 过去使用手工的管理方式对乡镇小区进行管理,造成了管理繁琐、难以维护等问题,如今使用计算机对停车场停车的各项基本信息进行管理,比起手工管理来说既方便又简单,而且具有易于管理、搜索速度快、存储量大等多个优点。将其使…...
基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
系统程序文件列表 项目功能:客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展,4S店作…...
小米开放式耳机值得买吗?南卡、小米、漫步者一周横评
大家好,最近对开放式耳机比较感兴趣,作为一名数码博主以及多年的耳机发烧友,今天想给大家测评一下开放式耳机,这类耳机目前在数码圈非常火热!很多喜欢运动的小伙伴都选择了这款耳机,搭配运动场景听歌&…...
解决oracel锁表问题;SQL 错误 [54] [61000]: ORA-00054: 资源正忙
问题描述; SQL 错误 [54] [61000]: ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 select session_id from v$locked_object;查看这些 session_id 对应的会话的详细信息,包括用户名、机器名、程序等,9596等是select se…...
政府网站建设管理经验汇报材料/成都网络营销推广
dagger2 和 RxJava butterknife 以及 Retrofit使用起来非常酸爽 代码非常干净清晰 动手尝试 配置编译 DaggerAppComponent的时候 出现问题 配置dagger2 在 Application中能够顺利编译,但是添加完 butterknife之后 Application中的 DaggerAppComponent编译失败。原来是dagger2和…...
普陀做网站价格/广州做seo整站优化公司
原子变量构建高效的非阻塞算法 非阻塞算法被广泛用于在操作系统和JVM中实现线程/进度调度机制、垃圾回收机制以及锁和其他并发数据结构。 非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次协调,并且极大地减少调度开销…...
怎样做软件网站建设/精准营销推广
自从经朋友介绍PerfDog这款移动端测试神器后就一直在使用它测试大型游戏的流程度,前两天使用腾讯视频追剧分享到微信时发现发现的链接直接进入腾讯视频的小程序中,试了多个视频软件皆是如此,于是想要试试用PerfDog测试一下各家视频小程序实际…...
长沙网站建设哪家靠谱/郑州见效果付费优化公司
String.prototype.charAt()str.charAt(index)返回字符串中指定位置的字符。字符串中的字符从左向右索引,第一个字符的索引值为 0,最后一个字符(假设该字符位于字符串 stringName 中)的索引值为 stringName.length - 1。如果指定的 index 值超出了该范围&…...
微信网站建设报价/seo静态页源码
设 计 总 说 明 现在社会随着计算机技术迅速发展与技术的逐渐成熟,信息技术已经使人们的生活发生深刻的变化。生活中的各种服务系统也使人们在生活中的联系日常销售活动方式发生了很大的变化,让效率较低的手工操作成为过去,而换成信息化自动化…...
网站建设难做吗/百度推广的渠道有哪些
一.概念 列表视图;用来显示多个可滑动项列表的ViewGroup;需要适配器Adapter 将集合中数据和每一个Item所对应的布局动态适配到ListView中进行显示。 1 <?xml version"1.0" encoding"utf-8"?>2 <LinearLayout xmlns:andro…...