《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)
作者:冰河
星球:http://m6z.cn/6aeFbs
博客:https://binghe.gitcode.host
文章汇总:https://binghe.gitcode.host/md/all/all.html
星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html
沉淀,成长,突破,帮助他人,成就自我。
- 本章难度:★★☆☆☆
- 本章重点:以图文的形式介绍基于HAProxy和Keepalived部署Mycat集群案例,掌握Mycat在实际案例场景中的应用,能够结合自身实际项目将Mycat灵活应用到自身实际项目中。
大家好,我是冰河~~
今天给大家介绍《Mycat核心技术》的第20章:以图文的形式给大家介绍下基于HAProxy和Keepalived部署Mycat集群案例,好了,开始今天的内容。
本文是在博文《第20章:Mycat集群部署(基于HAProxy + Mycat)》的基础上,实现高可用负载均衡,若还没有阅读博文《第20章:Mycat集群部署(基于HAProxy + Mycat)》,请先阅读博文《第20章:Mycat集群部署(基于HAProxy + Mycat)》。
一、本文要解决的问题
在博文《第20章:Mycat集群部署(基于HAProxy + Mycat)》中,我们的架构图如下:
由上图可以看出,HAProxy存在单点隐患,一旦这个HAProxy服务宕机,那么整个服务架构将不可用。那么,如何解决HAProxy存在的单点隐患问题呢?这就是这篇博文要解决的问题。
二、软件版本
- 操作系统:CentOS-6.5-x86_64
- JDK版本:jdk1.7.0_80
- HAProxy版本:haproxy-1.5.19.tar.gz
- Mycat版本:Mycat-server-1.5.1-RELEASE-20170717215510-Linux.tar.gz (自行下载源码编译)
- keepalived版本:keepalived-1.2.18.tar.gz
- MySQL版本:mysql-5.6.32.tar.gz
三、部署规划
四、 Mycat 高可用负载均衡集群部署架构图
图解说明:
(1) HAProxy 实现了 Mycat 多节点的集群高可用和负载均衡, 而 HAProxy 自身的高可用则可以通过Keepalived 来实现。 因此, HAProxy 主机上要同时安装 HAProxy 和 Keepalived, Keepalived 负责为该服务器抢占 vip(虚拟 ip,图中的 192.168.209.130),抢占到 vip 后,对该主机的访问可以通过原来的 ip(192.168.209.135)访问,也可以直接通过 vip(192.168.209.130)访问。
(2) Keepalived 抢占 vip 有优先级, 在 keepalived.conf 配置中的 priority 属性决定。但是一般哪台主机上的 Keepalived服务先启动就会抢占到 vip,即使是 slave,只要先启动也能抢到(要注意避免 Keepalived的资源抢占问题)。
(3) HAProxy 负责将对 vip 的请求分发到 Mycat 集群节点上, 起到负载均衡的作用。 同时 HAProxy 也能检测到 Mycat 是否存活, HAProxy 只会将请求转发到存活的 Mycat 上。
(4) 如果 Keepalived+HAProxy 高可用集群中的一台服务器宕机, 集群中另外一台服务器上的 Keepalived会立刻抢占 vip 并接管服务, 此时抢占了 vip 的 HAProxy 节点可以继续提供服务。
(5) 如果一台 Mycat 服务器宕机, HAPorxy 转发请求时不会转发到宕机的 Mycat 上,所以 Mycat 依然可用。
综上: Mycat 的高可用及负载均衡由 HAProxy 来实现,而 HAProxy 的高可用,由 Keepalived 来实现。
五、 HAProxy 节点 2 的部署
HAProxy 主机 2(liuyazhuang136, 192.168.209.136)的安装部署请参考博文《第20章:Mycat集群部署(基于HAProxy + Mycat)》,注意配置文件的调整:
多节点部署时 haproxy.cfg 配置文件中的 node 、 description 配置的值要做相应调整。
HAProxy 主机 2(liuyazhuang136, 192.168.209.136)上的HAProxy配置如下:
## global配置中的参数为进程级别的参数,通常与其运行的操作系统有关globallog 127.0.0.1 local0 info ## 定义全局的syslog服务器,最多可以定义2个### local0是日志设备,对应于/etc/rsyslog.conf中的配置,默认回收info的日志级别#log 127.0.0.1 local1 infochroot /usr/share/haproxy ## 修改HAProxy的工作目录至指定的目录并在放弃权限之前执行### chroot() 操作,可以提升 haproxy 的安全级别group haproxy ## 同gid,不过这里为指定的用户组名user haproxy ## 同uid,但这里使用的为用户名daemon ## 设置haproxy后台守护进程形式运行nbproc 1 ## 指定启动的haproxy进程个数,### 只能用于守护进程模式的haproxy;默认为止启动1个进程,### 一般只在单进程仅能打开少数文件描述符的场中中才使用多进程模式maxconn 4096 ## 设定每个haproxy进程所接受的最大并发连接数,### 其等同于命令行选项"-n","ulimit-n"自动计算的结果正式参照从参数设定的# pidfile /var/run/haproxy.pid ## 进程文件(默认路径 /var/run/haproxy.pid)node liuyazhuang136 ## 定义当前节点的名称,用于HA场景中多haproxy进程共享同一个IP地址时description liuyazhuang136 ## 当前实例的描述信息## defaults:用于为所有其他配置段提供默认参数,这默认配置参数可由下一个"defaults"所重新设定defaultslog global ## 继承global中log的定义mode http ## mode:所处理的模式 (tcp:四层 , http:七层 , health:状态检查,只会返回OK)### tcp: 实例运行于纯tcp模式,在客户端和服务器端之间将建立一个全双工的连接,#### 且不会对7层报文做任何类型的检查,此为默认模式### http:实例运行于http模式,客户端请求在转发至后端服务器之前将被深度分析,#### 所有不与RFC模式兼容的请求都会被拒绝### health:实例运行于health模式,其对入站请求仅响应“OK”信息并关闭连接,#### 且不会记录任何日志信息 ,此模式将用于相应外部组件的监控状态检测请求option httplogretries 3option redispatch ## serverId对应的服务器挂掉后,强制定向到其他健康的服务器maxconn 2000 ## 前端的最大并发连接数(默认为2000)### 其不能用于backend区段,对于大型站点来说,可以尽可能提高此值以便让haproxy管理连接队列,### 从而避免无法应答用户请求。当然,此最大值不能超过“global”段中的定义。### 此外,需要留心的是,haproxy会为每个连接维持两个缓冲,每个缓存的大小为8KB,### 再加上其他的数据,每个连接将大约占用17KB的RAM空间,这意味着经过适当优化后 ,### 有着1GB的可用RAM空间时将维护40000-50000并发连接。### 如果指定了一个过大值,极端场景中,其最终所占据的空间可能会超过当前主机的可用内存,### 这可能会带来意想不到的结果,因此,将其设定一个可接受值放为明智绝对,其默认为2000timeout connect 5000ms ## 连接超时(默认是毫秒,单位可以设置us,ms,s,m,h,d)timeout client 50000ms ## 客户端超时timeout server 50000ms ## 服务器超时## HAProxy的状态信息统计页面listen admin_statsbind :48800 ## 绑定端口stats uri /admin-status ##统计页面stats auth admin:admin ## 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可mode httpoption httplog ## 启用日志记录HTTP请求## listen: 用于定义通过关联“前端”和“后端”一个完整的代理,通常只对TCP流量有用listen mycat_serversbind :3307 ## 绑定端口mode tcpoption tcplog ## 记录TCP请求日志option tcpka ## 是否允许向server和client发送keepaliveoption httpchk OPTIONS * HTTP/1.1\r\nHost:\ www ## 后端服务状态检测### 向后端服务器的48700端口(端口值在后端服务器上通过xinetd配置)发送 OPTIONS 请求### (原理请参考HTTP协议) ,HAProxy会根据返回内容来判断后端服务是否可用.### 2xx 和 3xx 的响应码表示健康状态,其他响应码或无响应表示服务器故障。balance roundrobin ## 定义负载均衡算法,可用于"defaults"、"listen"和"backend"中,默认为轮询方式server mycat_01 192.168.209.133:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10server mycat_02 192.168.209.134:8066 check port 48700 inter 2000ms rise 2 fall 3 weight 10## 格式:server <name> <address>[:[port]] [param*]### serser 在后端声明一个server,只能用于listen和backend区段。### <name>为此服务器指定的内部名称,其将会出现在日志及警告信息中### <address>此服务器的IPv4地址,也支持使用可解析的主机名,但要在启动时需要解析主机名至响应的IPV4地址### [:[port]]指定将客户端连接请求发往此服务器时的目标端口,此为可选项### [param*]为此server设定的一系列参数,均为可选项,参数比较多,下面仅说明几个常用的参数:#### weight:权重,默认为1,最大值为256,0表示不参与负载均衡#### backup:设定为备用服务器,仅在负载均衡场景中的其他server均不可以启用此server#### check:启动对此server执行监控状态检查,其可以借助于额外的其他参数完成更精细的设定#### inter:设定监控状态检查的时间间隔,单位为毫秒,默认为2000,##### 也可以使用fastinter和downinter来根据服务器端专题优化此事件延迟#### rise:设置server从离线状态转换至正常状态需要检查的次数(不设置的情况下,默认值为2)#### fall:设置server从正常状态转换至离线状态需要检查的次数(不设置的情况下,默认值为3)#### cookie:为指定server设定cookie值,此处指定的值将会在请求入站时被检查,##### 第一次为此值挑选的server将会被后续的请求所选中,其目的在于实现持久连接的功能#### maxconn:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数目高于此处指定的值,#####其将被放置于请求队列,以等待其他连接被释放
HAProxy 节点 1 的状态信息页:http://192.168.209.135:48800/admin-status
HAProxy 节点 2 的状态信息页:http://192.168.209.136:48800/admin-status
六、 Keepalived 介绍
官网: Keepalived for Linux
Keepalived 是一种高性能的服务器高可用或热备解决方案, Keepalived 可以用来防止服务器单点故障的发生,通过配合 Haproxy 可以实现 web 前端服务的高可用。
Keepalived 以 VRRP 协议为实现基础,用 VRRP 协议来实现高可用性(HA)。 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议, VRRP 协议将两台或多台路由器设备虚拟成一个设备,对外提供虚拟路由器 IP(一个或多个),而在路由器组内部,如果实际拥有这个对外 IP 的路由器如果工作正常的话就是 MASTER,或者是通过算法选举产生。
MASTER 实现针对虚拟路由器 IP 的各种网络功能,如 ARP 请求, ICMP,以及数据的转发等;其他设备不拥有该虚拟 IP,状态是 BACKUP,除了接收 MASTER 的VRRP 状态通告信息外,不执行对外的网络功能。当主机失效时, BACKUP 将接管原先 MASTER 的网络功能。
VRRP 协议使用多播数据来传输 VRRP 数据, VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC 地址, VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息,表示 MASTER 工作正常以及虚拟路由器 IP(组), BACKUP 只接收 VRRP 数据,不发送数据,如果一定时间内没有接收到 MASTER 的通告信息,各 BACKUP 将宣告自己成为 MASTER,发送通告信息,重新进行 MASTER 选举状态。
七、 Keepalived 的安装(192.168.209.135、 192.168.209.136)
Keepalived (Keepalived for Linux )
1、 上传或下载 keepalived
上传或下载 keepalived(keepalived-1.2.18.tar.gz) 到 /usr/local/src 目录
2、解压安装
安装 keepalived 需要用到 openssl
# yum install gcc gcc-c++ openssl openssl-devel
# cd /usr/local/src
# tar -zxvf keepalived-1.2.18.tar.gz
# cd keepalived-1.2.18
# ./configure --prefix=/usr/local/keepalived
# make && make install
3、 将 keepalived 安装成 Linux 系统服务
因为没有使用 keepalived 的默认路径安装(默认是/usr/local) ,安装完成之后,需要做一些工作
复制默认配置文件到默认路径
# mkdir /etc/keepalived
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
复制 keepalived 服务脚本到默认的地址
# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/
# ln -s /usr/local/keepalived/sbin/keepalived /sbin/
设置 keepalived 服务开机启动
# chkconfig keepalived on
4、 修改 Keepalived 配置文件
(1) MASTER 节点配置文件(192.168.209.135)
! Configuration File for keepalived
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTProuter_id liuyazhuang135 ## 标识本节点的字条串,通常为 hostname
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析,动态调整 vrrp_instance 的优先级。
## 如果脚本执行结果为 0,并且 weight 配置的值大于 0,则优先级相应的增加。
## 如果脚本执行结果非 0,并且 weight 配置的值小于 0,则优先级相应的减少。
## 其他情况,维持原本配置的优先级,即配置文件中 priority 对应的值。
vrrp_script chk_haproxy {script "/etc/keepalived/haproxy_check.sh" ## 检测 haproxy 状态的脚本路径interval 2 ## 检测时间间隔weight 2 ## 如果条件成立,权重+2
}
## 定义虚拟路由, VI_1 为虚拟路由的标示符,自己定义名称
vrrp_instance VI_1 {state BACKUP ## 默认主设备(priority 值大的)和备用设备(priority 值小的)都设置为 BACKUP,## 由 priority 来控制同时启动情况下的默认主备,否则先启动的为主设备interface eth3 ## 绑定虚拟 IP 的网络接口,与本机 IP 地址所在的网络接口相同,我的是 eth3virtual_router_id 35 ## 虚拟路由的 ID 号,两个节点设置必须一样,可选 IP 最后一段使用,## 相同的 VRID 为一个组,他将决定多播的 MAC 地址priority 120 ## 节点优先级,值范围 0-254, MASTER 要比 BACKUP 高nopreempt ## 主设备(priority 值大的)配置一定要加上 nopreempt,否则非抢占也不起作用advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样,默认 1s## 设置验证信息,两个节点必须一致authentication {auth_type PASSauth_pass 1111 ## 真实生产,按需求对应该过来}## 将 track_script 块加入 instance 配置块track_script {chk_haproxy ## 检查 HAProxy 服务是否存活}## 虚拟 IP 池, 两个节点设置必须一样virtual_ipaddress {192.168.209.130 ## 虚拟 ip,可以定义多个,每行一个}
}
(2)BACKUP 节点配置文件(192.168.209.136)
! Configuration File for keepalived
global_defs {router_id liuyazhuang136
}
vrrp_script chk_haproxy {script "/etc/keepalived/haproxy_check.sh"interval 2weight 2
}
vrrp_instance VI_1 {state BACKUPinterface eth3virtual_router_id 35priority 110advert_int 1authentication {auth_type PASSauth_pass 1111}track_script {chk_haproxy}virtual_ipaddress {192.168.209.130}
}
特别注意: 如果非抢占模式不生效, 在 Keepalived 的故障节点恢复后会再次导抢占 vip,从而因 vip 切换而闪断带来的风险(视频解说)。 按以上配置,配置了 Keepalived 非抢占模式, 配置及注意点如下:
(1) 主设备、 从设备中的 state 都设置为 BACKUP
(2) 主设备、从设备中都不要配置 mcast_src_ip (本机 IP 地址)
(3) 默认主设备(priority 值大的 Keepalived 节点) 配置一定要加上 nopreempt,否则非抢占不起作用
(4) 防火墙配置允许组播(主、备两台设备上都需要配置, keepalived 使用 224.0.0.18 作为 Master 和Backup 健康检查的通信 IP)
# iptables -I INPUT -i eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
# iptables -I OUTPUT -o eth3 -d 224.0.0.0/8 -p vrrp -j ACCEPT
(eth3 为主机的网卡设备名称,生产环境服务器可以用独立网卡来处理组播和心跳检测等)
# service iptables save
重启防火墙:
# service iptables restart
5、 编写 Haproxy 状态检测脚本
我们编写的脚本为/etc/keepalived/haproxy_check.sh (已在 keepalived.conf 中配置)
脚本要求:如果 haproxy 停止运行,尝试启动,如果无法启动则杀死本机的 keepalived 进程,keepalied将虚拟 ip 绑定到 BACKUP 机器上。
内容如下:
# mkdir -p /usr/local/keepalived/log
# vi /etc/keepalived/haproxy_check.sh
haproxy_check.sh脚本内容如下:
#!/bin/bash
START_HAPROXY="/etc/rc.d/init.d/haproxy start"
STOP_HAPROXY="/etc/rc.d/init.d/haproxy stop"
LOG_FILE="/usr/local/keepalived/log/haproxy-check.log"
HAPS=`ps -C haproxy --no-header |wc -l`
date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE
echo "check haproxy status" >> $LOG_FILE
if [ $HAPS -eq 0 ];thenecho $START_HAPROXY >> $LOG_FILE$START_HAPROXY >> $LOG_FILE 2>&1sleep 3if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];thenecho "start haproxy failed, killall keepalived" >> $LOG_FILEkillall keepalivedfi
fi
保存后,给脚本赋执行权限:
# chmod +x /etc/keepalived/haproxy_check.sh
6、 启动 Keepalived
# service keepalived start
Starting keepalived: [ OK ]
Keepalived 服务管理命令:
停止: service keepalived stop
启动: service keepalived start
重启: service keepalived restart
查看状态: service keepalived status
八、 Keepalived + Haproxy 的高可用测试
1、 关闭 192.168.209.135 中的 Haproxy, Keepalived 会将它重新启动
# service haproxy stop
2、 关闭 192.168.209.135 中的 Keepalived, VIP(192.168.209.130) 会被 192.168.209.136 抢占
# service keepalived stop
由上图可知:Keepalived 停止后, 192.168.209.135 节点的网络接口中的 VIP(192.168.209.130) 将消失
此时,由上图可知:在192.168.209.136节点的网络接口中会出现 VIP(192.168.209.130)。
查看此时 VIP 对应的 MAC, Windows 下使用 CMD 命令查看:
说明此时 VIP 已经漂移到物理主机 192.168.209.136上了
再通过 VIP(192.168.209.130) 来访问 Haproxy 集群, 访问到的也是 192.168.209.136
3、 重新启动 192.168.209.135 中的 Keepalived
重新启动 192.168.209.135 中的 Keepalived, vip(192.168.209.130)保留在 192.168.209.136 主机上, 不会出现 135 启动抢占 vip 的情况。
# service keepalived start
4、 模拟抢占了 vip 的节点(192.168.209.136) 中的 HAProxy 故障或启动失败
方式:把 192 节点中的 haproxy.cfg 文件重命名为 haproxy.cfg_bak, 并把 haproxy 服务进行 kill 掉,此时 keepalived 会尝试去启动 haproxy,会由于找不到配置文件而启动失败,此时就会进行 haproxy_check.sh脚本中的 killall keepalived 命令,结束 keepalived 进行。随后就是 192.168.209.135 节点重新抢占 vip
说明此时 VIP 已经漂移到物理主机 192.168.209.135上了
再通过 VIP(192.168.209.130) 来访问 Haproxy 集群, 访问到的也是 192.168.209.135
九、 通过 vip 访问数据库、验证 vip 切换后的数据库访问
1、命令行访问数据库
2、Navicat访问数据库
至此,Mycat高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)搭建完毕
十、温馨提示
大家可以到链接http://download.csdn.net/detail/l1028386804/9915621下载搭建Mycat高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)使用的Keepalived
好了,今天就到这儿吧,我是冰河,我们下期见~~
相关文章:
《Mycat核心技术》第21章:高可用负载均衡集群的实现(HAProxy + Keepalived + Mycat)
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀,…...
Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清
Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清 文章目录 Dynamic WallPaper-壁纸动态-Mac电脑-4K超高清一、介绍二、效果三、下载 一、介绍 Dynamic Wallpaper for mac版,是一款4K超高清动态壁纸软件,告别单调的静态壁纸,拥抱活泼的动态壁纸…...
MySQL8.4 NDB Cluster 集群配置安装
文章目录 前置条件安装步骤环境准备下载 安装 RPM 包安装 NDB 组件与常见错误配置节点启用节点配置启动 MySQL 集群验证集群状态 关于 ndb_mgm集群管理备份与恢复集群配置管理日志相关 MySQL NDB Cluster 是一个分布式数据库解决方案,提供高可用性、数据分片和自动故…...
多线程开发中List的使用
由于ArrayList在多线程高并发情况下是不安全的,因此要慎用,那么此时如果涉及到集合操作,应该怎么选: 方案一:Vector: 特点:通过给所有方法都用 synchronized 修饰从而保证线程安全, 缺点&…...
Html 页面图标的展示列表
Html 页面中经常需要使用网页图标,这些图标的样式和名称都不容易记住。常用的网页图标展示页面链接记录如下: Material Design Icons 图标库 - FontAwesome 字体图标中文Icon...
Vue实现动态路由的后端控制
在传统开发后台管理系统时,都会涉及权限控制这一功能需求 即:根据不同登录的角色账号来使用该账号拥有的功能,也就是说系统左边的菜单栏不是固定不变的。 首先是基础路由配置带有component的。 const allRoutes [// 基础路由{path: /,name…...
AI训练中的专有名词大白话版
AI训练中的专有名词大白话版 1. 数据集(Dataset) 👉 人话:AI的“练习题题库”,包含一堆带答案的题目(比如猫狗照片标签)。 🔹 例子: 训练集(练习…...
kafka 与 RocketMQ对比
问题 1: 为什么使用消息队列?服务搭建KafkaRocketMQ编写 docker-compose.yml运行docker compose修改配置文件(解决网络问题)创建一个 topic运行skd尝试发送与接收功能 压力测试:Kafkabatch-size(批量大小)分区数:发送数据(MB/s)消费-线程数(15 分区) RocketMQ生产生产者数量批…...
instnatid模型加载器放在哪里
一般根据节点名称来放,如果没有就新建 ComfyUI\models\instantid...
Spring Boot自动配置原理解析
文章目录 前言一、SpringBootConfiguration二、EnableAutoConfiguration2.1、AutoConfigurationPackage2.2、Import(AutoConfigurationImportSelector.class) 三、ComponentScan四、自动配置源码4.1、获取所有候选的自动配置类4.2、过滤不满足条件的自动配置 总结 前言 在常规的…...
LlamaIndex实现(基于PDF|CSV文件)RAG检索增强生成:NaiveRAG
什么是 RAG? RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合 信息检索(Retrieval) 和 文本生成(Generation) 的AI技术,用于提升大语言模型(L…...
分布式系统面试总结:3、分布式锁(和本地锁的区别、特点、常见实现方案)
仅供自学回顾使用,请支持javaGuide原版书籍。 本篇文章涉及到的分布式锁,在本人其他文章中也有涉及。 《JUC:三、两阶段终止模式、死锁的jconsole检测、乐观锁(版本号机制CAS实现)悲观锁》:https://blog.…...
vue3搭建实战项目笔记三
vue3搭建实战项目笔记三 3.1.行高偏移问题3.2.谷歌浏览器上不能定位3.2.2 移动端css隐藏滚动条 3.3.获取列表的数据3.3.1 服务器返回十万条数据3.3.2 分页展示数据3.3.2 防止展示数据为空报错 3.4.上拉加载数据3.4.1 加载更多数据3.4.2 监听页面滚动到底部3.4.3 监听滚动的时机…...
【商城实战(101)】电商未来已来:新技术引领商城发展新航向
【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…...
深入解析最大公约数(GCD)与最小公倍数(LCM)的C++实现
深入解析最大公约数(GCD)与最小公倍数(LCM)的C实现 一、GCD与LCM的数学定义 1. 最大公约数(GCD) 两个或多个整数共有约数中最大的一个。 例如: GCD(12, 18) 6GCD(21, 14) 7 2. 最小公倍数…...
低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战
在远程资产追踪、野外环境监测等场景中,稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 原生双UART接口 USB OTG扩展能力 ,可无缝集成主流LPWAN模组(LoRa/NB-IoT),实现“数据采集-边…...
【质量管理】纠正、纠正措施和预防的区别与解决问题的四重境界
“质量的定义就是符合要求”,我们在文章【质量管理】人们对于质量的五个错误观念-CSDN博客中提到过,这也是质量大师克劳士比所说的。“质量的系统就是预防”,防止出现产品不良而造成的质量损失。 质量问题的解决可以从微观和宏观两个方面来考…...
STM32F103_LL库+寄存器学习笔记12 - 提高串口通讯程序的健壮性:异常监控 + 超时保护机制
导言 首先,进行USART和DMA状态监测、记录异常状态并主动处理,是高健壮性嵌入式系统开发的核心思想之一。 这种机制看似复杂,实则能有效保障系统长期、稳定地运行: 提升通讯可靠性。降低维护成本。增强系统自恢复能力。 因此&…...
搜索-BFS
马上蓝桥杯了,最近刷了广搜,感觉挺有意思的,广搜题类型都差不多,模板也一样,大家写的时候可以直接套模板 这里给大家讲一个比较经典的广搜题-迷宫 题目问问能否走到 (n,m) 位置,假设最后一个点是我们的&…...
Keil调试(RTT Debug 断点)
调试 打印操作 方式接口优缺点串口打印TXRX简单,但是占用串口,速度慢,重定向fputc简单RTT打印SWDIOSWCLK速度快,不占额外接口,直接移植RTT库断点打印SWDIOSWCLKDebug的时候断点操作SWOSWDIOSWCLKSWO需要连接SWO引脚,重定向fputc简单 这里我只介绍RTT打印和断点打印; 一. RT…...
【jQuery】插件
目录 一、 jQuery插件 1. 瀑布流插件: jQuery 之家 http://www.htmleaf.com/ 2. 图片懒加载: jQuery 插件库 http://www.jq22.com/ 3. 全屏滚动 总结不易~ 本章节对我有很大收获,希望对你也是~~~ 一、 jQuery插件 jQuery 功能…...
leetcode 28 Find the Index of the First Occurrence in a String
直接用kmp算法 class Solution { public:int strStr(string haystack, string needle) {return kmp(haystack,needle);}int kmp(std::string &text,std::string &pattern){int n text.size();int m pattern.size();if(m 0)return 0;std::vector<int> next;ne…...
nginx 动静分离
一.动静分离 1.动静分离的好处 Apache Tocmat 严格来说是一款java EE服务器,主要是用来处理 servlet请求。处理css、js、图片这些静态文件的IO性能不够好,因此,将静态文件交给nginx处理,可以提高系统的访问速度,减少…...
1.2 斐波那契数列模型:LeetCode 面试题 08.01. 三步问题
动态规划解三步问题:LeetCode 面试题 08.01. 三步问题 1. 题目链接 LeetCode 面试题 08.01. 三步问题 题目要求:小孩上楼梯,每次可以走1、2或3步,计算到达第 n 阶台阶的不同方式数,结果需对 1e9 7 取模。 2. 题目描述…...
关于AutoMapper
AutoMapper 概述 AutoMapper 是一个基于约定的对象 - 对象映射库,主要用于在不同对象类型之间自动映射属性值。它能根据配置的映射规则,将源对象的属性值填充到目标对象中,避免了手动编写大量繁琐的对象映射代码。 作用 提升开发效率&…...
是否每一层之间都要线性变换和激活函数?
1. 神经网络层的基本组成 一个典型的神经网络层通常包含两个步骤: 线性变换(加权求和): z Wx} b 其中W 是权重矩阵,b是偏置向量,是输入,z 是线性输出。激活函数: 其中,…...
golang 的reflect包的常用方法
目录 reflect 包方法总结 类型 (Type) 方法 值 (Value) 方法 代码示例: reflect 包方法总结 p : Person{Name: "小明", Age: 22}t : reflect.TypeOf(&p)v : reflect.ValueOf(p) 类型 (Type) 方法 方法名描述示例 Na…...
CentOS 7 安装 EMQX (MQTT)
CentOS 7 安装 EMQX 通过 Yum 源安装 EMQX 支持通过 Yum 源安装,您可通过以下 Yum 命令从中自动下载和安装 EMQX。 通过以下命令配置 EMQX Yum 源: curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash安装以下依赖项ÿ…...
Flask项目部署:Flask + uWSGI + Nginx
目录 1,网络架构 2,环境安装 2.1,安装yum:Shell软件包管理器 2.2 安装python 2.3 安装uWSGI 2.4 安装Flask 3,上传工程包到服务器,打包Flask项目 4,创建和配置 uwsgi 配置文件 uwsgi.ini 4.1配置文件 4.2配置文件注释详解 5,启动服务 6,安装nginx 7,nginx配置 8,…...
软件工程面试题(十五)
1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…...
当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系
《当Kafka化身抽水马桶:论组件并发提升与系统可用性的量子纠缠关系》 引言:一场OOM引发的血案 某个月黑风高的夜晚,监控系统突然发出刺耳的警报——我们的数据发现流水线集体扑街。事后复盘发现:Kafka集群、Gateway、Discovery服…...
python和Java的区别
Python和Java是两种流行的编程语言,它们之间有一些重要的区别: 语法:Python是一种动态类型的脚本语言,语法简洁明了,通常使用缩进来表示代码块。Java是一种静态类型的编程语言,语法更为严格,需要…...
QFlightInstruments飞行仪表控件库
QFlightInstruments 是一个开源的飞行仪表控件库,专为基于 Qt 的应用程序设计。它提供了一系列仿真实飞机仪表的组件,适用于飞行模拟软件、航空电子系统或任何需要高仿真飞行仪表显示的项目。 主要功能 高仿真飞行仪表:包括空速表、高度表、…...
可发1区的超级创新思路(python\matlab实现):MPTS+Lconv+注意力集成机制的Transformer时间序列模型
首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴! 应用场景 该模型主要用于时间序列数据预测问题,包含功率预测、电池寿命预测、电机故障检测等等。 一、模型整体架构(本文以光伏功率预测为例) 本模型由多尺度特征提取模块(MPTS)…...
Nginx — Nginx版本升级
例如:将10.224.11.220、10.224.11.221、10.208.11.220 三台服务器上的Nginx从1.21.1版本升级到1.23.3版本。 一、Nginx升级步骤 步骤一:备份老版本的Nginx(10.224.11.220、10.224.11.221、10.208.11.220) #关闭Nginx cd /usr/l…...
CSS学习笔记6——网页布局
目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…...
C语言【指针二】
引言 介绍:const修饰指针,野指针 应用:指针的使用(strlen的模拟实现),传值调用和传指调用 一、const修饰指针 1.const修饰变量 简单回顾一下前面学过的const修饰变量:在变量前面加上const&…...
第十六届蓝桥杯模拟二(串口通信)
由硬件框图可以知道我们要配置LED 和按键 一.LED 先配置LED的八个引脚为GPIO_OutPut,锁存器PD2也是,然后都设置为起始高电平,生成代码时还要去解决引脚冲突问题 二.按键 按键配置,由原理图按键所对引脚要GPIO_Input 生成代码,在文件夹中添加code文件夹,code中添加fun.…...
Java List 集合取交集、并集、差集、补集
在Java中,集合操作是编程中非常常见的需求,尤其是在处理数据集合时,如List、Set等。本文将详细介绍如何在Java中实现List集合的交集、并集、差集和补集操作,并提供代码示例和实现方法。 1. 交集操作 交集是指两个集合中都存在的元…...
SkyWalking+Springboot实战
1、下载SkyWalking APM 1.手动下载 Downloads | Apache SkyWalkinghttps://skywalking.apache.org/downloads/ 2.链接下载 https://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-apm-10.2.0.tar.gzhttps://dlcdn.apache.org/skywalking/10.2.0/apache-skywalking-…...
【小兔鲜】day01 项目、Vue3介绍、组合式API、小案例
【小兔鲜】day01 项目、Vue3介绍、组合式API、小案例 0. 市场上Vue前端工程师用到的技术1. Vue3小兔鲜先导课1.1 技术栈1.2 项目规模1.3 项目亮点1.4 课程安排 2. 认识Vue32.1 Vue3组合式API体验 3. create-vue创建Vue3项目3.1 新建项目结构3.2 小节3.3 补充说明npm init vuela…...
【Pandas DataFrame】
以下是 Pandas DataFrame 的核心知识点总结,用结构化分类帮你高效记忆关键操作和概念: 1. 基础操作 创建DataFrame 方法代码示例说明从字典创建df pd.DataFrame({A: [1,2], B: [3,4]})字典键为列名,值为数据从列表创建df pd.DataFrame([[…...
华为OD机试2025A卷 - 生成回文素数(Java Python JS C++ C )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 求出大于或等于 N 的最小回文素数。 如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数。 例如,2,3,5,7,11 以及 13 是素数。 如果一个数从左往右读与从右往左读是一…...
Jenkins教程(自动化部署)
Jenkins教程(自动化部署) 1. Jenkins是什么? Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行&…...
C#里使用libxl的对齐/边框/颜色
一份好的EXCEL文件,通道会有不同的颜色和边框来表示。 以便表示一些重要的信息,这样才能让人们一眼就看到需要关注的信息。 如下面所示: 要显示上面的内容,需要使用下面的例子: private void button12_Click(object sender, EventArgs e){var book = new ExcelBook();if…...
虚拟pinctrl驱动
之前呢,我们讲解了在内核中pinctrl子系统是怎么实现的,今天我们来尝试一下自己去写一个pinctrl子系统: 首先呢,我们来看看一个pinctrl子系统需要做的事情: 上面的话,我们看了一个pinctrl子系统需要的三大功能以及在驱…...
pycharm虚拟环境项目转移后配置解释器
添加解析器提示:无效的 Python SDK 解决方法 在到电脑安装python解析器,复制:python.exe和pythonw.exe 项目虚拟环境venv/Scripts Python解释器添加 项目现有虚拟环境,就可以正常使用...
蓝桥杯嵌入式学习笔记
用博客来记录一下参加蓝桥杯嵌入式第十六届省赛的学习经历 工具环境准备cubemx配置外部高速时钟使能设置串口时钟配置项目配置 keil配置烧录方式注意代码规范头文件配置 模块ledcubemx配置keil代码实现点亮一只灯实现具体操作的灯,以及点亮还是熄灭 按键cubemx配置k…...
0201-jsx语法基础-jsx-仿低代码平台项目
文章目录 1.jsx标签2.jsx属性3.jsx 事件3.1 声明事件3.2 使用事件(对象) 4. typescript类型基础4.1 类型声明4.2 事件函数传递自定义参数 5.插入js变量6. 条件判断7. 循环结语 1.jsx标签 jsx标签与html标签区别: 首字母大小写 大写是自定义组…...
在MCU工程中优化CPU工作效率的几种方法
在嵌入式系统开发中,优化 CPU 工作效率对于提升系统性能、降低功耗、提高实时性至关重要。Keil 作为主流的嵌入式开发工具,提供了多种优化策略,包括 关键字使用、内存管理、字节对齐、算法优化 等。本文将从多个方面介绍如何在 Keil 工程中优…...