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

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

案例分析

案例概述

  • 使用 KVM 及 GlusterFS 技术,结合起来实现 KVM 高可用
  • 利用 GlusterFS 分布式复制卷对 KVM 虚拟机文件进行分布存储和冗余

分布式复制卷

  • 主要用于需要冗余的情况下把一个文件存放在两个或两个以上的节点,当其中一个节点数据丢失或损坏后,KVM 仍然能够通过卷组找到另一个节点上存储的虚拟机文件,保证虚拟机正常运行
  • 节点修复后,GlusterFS 会自动同步同一组卷组里有数据的节点数据

案例前置知识点

GlusterFS 分布式文件系统简介

  • 由 Gluster 公司创始人兼首席执行官 Anand BabuPeriasamy 编写
  • 于 2011 年 10 月 7 日被 Red Hat 收购

特性

  • 可扩展的分布式文件系统
  • 可运行与廉价的普通硬件上
  • 提供容错功能
  • 也可以给大量用户提供总体性能较高的服务
  • 可以根据存储需求快速调配存储,内含丰富的自动故障转移功能
  • 且摒弃集中元数据服务器的思想
  • 适用于数据密集型任务的可扩展网络文件系统
  • 免费开源

优势

  • 可用于大型的、分布式的、对大量数据进行访问的应用

特点

  • GlusterFS 体系结构,将计算、存储和 |0 资源聚合到全局名称空间中,每台服务器都被视为节点,通过添加附加节点或向每个节点添加额外存储来扩展容量。通过在更多节点之间部署存储来提高性能。
  • GlusterFS 支持基于文件的镜像和复制、分条、负载平衡、故障转移、调度、磁盘缓存、存储配额、卷快照等功能。
  • GlusterFS 各客户端之间无连接,本身依赖于弹性哈希算法,而不是使用集中式或分布式元数据模型。
  • GlusterFS 通过各种复制选项提供数据可靠性和可用性,例如复制卷、分布卷。

案例环境

主机

操作系统

主机名/IP地址

主要软件及版本

服务器

CentOS7.9

node1/192.168.10.101

GlusterFS 3.10.2

服务器

CentOS7.9

node2/192.168.10.102

GlusterFS 3.10.2

服务器

CentoS7.9

node3/192.168.10.103

GlusterFS 3.10.2

服务器

CentoS7.9

node4/192.168.10.104

GlusterFS 3.10.2

服务器

CentoS7.9

kvm/192.168.10.201

KVMGluster-client

服务器

CentoS7.9

kvm/192.168.10.202

KVMGluster-client

案例需求
  • 部署 GlusterFS 文件系统
  • 实现 KVM 虚拟主机不会因宿主机宕机而宕机
案例实现思路
  • 安装 KVM
  • 所有节点部署 GlusterFS
  • 客户端挂载 GlusterFS
  • KVM 使用挂载的 GlusterFS 目录创建虚拟机
案例实施
部署 GFS 高可用分布式存储环境

安装部署 KVM 虚拟化平台

部署 GlusterFS

先开启四台机器,并会话同步

  • 192.168.10.101
  • 192.168.10.102
  • 192.168.10.103
  • 192.168.10.104

关闭防火墙、内核机制

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0

修改 hosts 文件

[root@localhost ~]# vim /etc/hosts
//添加节点
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4
192.168.10.201 kvm01
192.168.10.202 kvm02

设置好阿里巴巴仓库

[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@localhost ~]# yum clean all

安装 GlusterFS 包

[root@localhost ~]# yum -y install centos-release-gluster 

进入目录查看文件

[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# ls
Cent0s-Base.repo ent0S-Gluster-9.mepo Cent0S-Storage-common.repo epel.repo

查看当前查看状态

[root@localhost ~]# yum repolist

这一步的状态都是0,下面解决方法

修改 GlusterFS 文件

[root@localhost yum.repos.d]# vim CentOS-Gluster-9.repo
//修改前
mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=$releasever&repostorage-qluster-9
#baseurl=http://mirror.centos,org/$contentdir/$releasever/storage/$basearch/gluste~-9/
//修改后
#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=$releasever&repostorage-qluster-9
baseurl=http://mirrors.aliyun.com/$contentdir/$releasever/storage/$basearch/gluste~-9/

再次查看

[root@localhost ~]# yum repolist
源标识                      源名称                                            状态
base/7/x86 64              Cent0S-7- Base - mirrors.aliyun.com               10,072
centos-gluster9/7/x86_64   Cent0s-7 - Gluster 9                              181
epel/x86_64                Extra Packages for Enterprise Linux 7 - x86 64    13,791
extras/7/x86_64            Cent0S-7- Updates - mirrors.aliyun.com            526
updates/7/x86 64           Cent0S-7-Extras - mirrors.aliyun.com              6,173
repolist: 30,743

安装软件包

[root@localhost ~]# yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma

启动服务并设置开机自启

[root@localhost ~]# systemctl start glusterd
[root@localhost ~]# systemctl enable glusterd

这里取消会话同步

在101上加入其它节点

[root@localhost ~]# gluster peer probe node2
peer probe: success
[root@localhost ~]# gluster peer probe node3
peer probe: success
[root@localhost ~]# gluster peer probe node4
peer probe: success

查看状态

[root@localhost ~]# gluster peer status
Hostname: node2
Uuid:b5f43fc7-2f68-4bf9-8721-eb6d1bbdd98b
State: Peer in Cluster (connected)Hostname: node3
Uuid:bblcdlad-f396-403e-bf68-c96147466043
State: Peer in Cluster (Connected)Hostname: node4
Uuid: ea66c509-4fcf-4b17-9bf-1d7b00608a7e
State: Peer in Cluster (Connected)

开启会话同步

创建目录

[root@localhost ~]# mkdir /data

取消会话同步

在101上创建分布式复制卷

[root@localhost ~]# gluster volume create models replica 2 node1:/data node2:/data node3:/data node4:/data force
volume create: models: success: please start the volume to access data

启动

[root@localhost ~]# gluster volume start models

查看信息

[root@localhost ~]# gluster volume info models

201和202恢复kvm01快照,XShell 连接客户端

  • 192.168.10.201
  • 192.168.10.202

开启会话同步

打开 hosts 文件添加节点

[root@localhost ~]# vim /etc/hosts
//添加节点
192.168.10.101 node1
192.168.10.102 node2
192.168.10.103 node3
192.168.10.104 node4

安装 glusterfs 客户端软件

[root@kvm01 ~]# yum -y install glusterfs glusterfs-fuse

创建挂载目录

[root@kvm01 ~]# mkdir /kvmdata

挂载 models 卷

[root@kvm01 ~]# mount -t glusterfs node1:models /kvmdata/

修改 fstab 文件

[root@localhost ~]# vi /etc/fstab
//添加配置
node1:models        /kvmdata     glusterfs  defaults,_netdev  0 0

查看挂载卷

[root@kvm01 ~]# df

取消会话同步

进入目录
[root@kvm01 ~]# cd /opt
在201上打开 Xftp把用到的系统镜像上传到/opt目录中。这里直接使用CentOS官方提供的qcow2格式的系统镜像(CentOS-7-x86_64-GenericCloud-2009.qcow2),这个镜像可以直接部署到kvm或openstack的平台中

 拷贝镜像到新目录下
[root@kvm01 opt]# cp CentOS-7-x86_64-GenericCloud-2009.qcow2 /kvmdata/test01.qcow2

为系统镜像设置密码

[root@kvm01 ~]# virt-customize -a /kvmdata/test01.qcow2 --root-password password:123
[  0.0] Examining the guest ...
[ 17.3] Setting a random seed
[ 17.4] Setting passwords
[ 19.3] Finishing off
用新的镜像文件生成虚拟机
[root@kvm01 opt]# virt-install --name=test01 -r 1024 --vcpus=1 --disk device=disk,bus=virtio,path='/kvmdata/test01.qcow2',size=10 -w bridge:br0 --virt-type=kvm --boot hd
登录测试
[root@kvm01 opt]# virt-manager
测试实时迁移环境

配置kvm01的无密码登录环境(生成密钥对)

[root@kvm01 ~]# ssh-keygen -t rsa

把公钥拷贝给kvm02

[root@kvm01 ~]# ssh-copy-id kvm02

kvm01留一份

[root@kvm01 ~]# ssh-copy-id kvm01

配置kvm02的无密码登录环境(生成密钥对)

[root@kvm02 ~]# ssh-keygen -t rsa

拷贝给kvm01

[root@kvm02 ~]# ssh-copy-id kvm01

再拷贝给自己

[root@kvm02 ~]# ssh-copy-id kvm02

将 kvm01 迁移到 kvm02 上

[root@kvm01 opt]# virsh migrate --persistent --undefinesource test01 qemu+ssh://kvm02/system

查看状态

[root@kvm01 opt]# virsh list --all
Id            名称        状态
--------------------------------

查看 kvm02 上的状态

[root@kvm01 opt]# virsh list --allId    名称                         状态
----------------------------------------------------1     test01                         running

把 kvm02 迁回到 kvm01上

[root@kvm01 opt]# virsh migrate --persistent --undefinesource test01 qemu+ssh://kvm01/system

202上查看状态

[root@kvm02 ~]# virsh list --all
Id        名称        状态
---------------------------------

201再查看状态

[root@kvm01 opt]# virsh list --all
Id        名称        状态
---------------------------------
3         test01      running
创建虚拟机资源

退出 /opt 目录,为配置文件创建共享目录

[root@kvm01 ~]# mkdir /kvmdata/config

将 test01 的配置文件拷贝到共享目录

[root@kvm01 ~]# cp /etc/libvirt/qemu/test01.xml /kvmdata/config/

关闭 test01

[root@kvm01 ~]# virsh shutdown test01
域    test01 被关闭

取消定义 test01 虚拟机

[root@kvm01 ~]# virsh undefine test01
域    test01 已经被取消定义

查看状态

[root@kvm01 ~]# virsh list --all
Id        名称        状态
--------------------------------

重新定义 test01 虚拟机

[root@kvm02 ~]# virsh define /kvmdata/config/test01.xml
定义域    test01 (从 /kvmdata/config/test01.xml)

查看状态

[root@kvm01 ~]# virsh list --all
Id        名称        状态
---------------------------------
-         test01      关闭

启动 test01

[root@kvm01 ~]# virsh start test01
域 test01 已开始

再查看状态

[root@kvm01 ~]# virsh list --allId    名称                         状态
----------------------------------------------------6     test01                         running

202 进入目录并查看状态

[root@kvm02 ~]# cd /kvmdata/
[root@kvm02 kvmdata]# ls
test01.qcow2
[root@kvm02 kvmdata]# virsh list --all
Id                名称            状态
--------------------------------------
部署群集

这里201和202会话同步

设置好阿里巴巴仓库

[root@kvm01 ~]# rm -rf /etc/yum.repos.d/*
[root@kvm01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@kvm01 ~]# curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@kvm01 ~]# yum clean all

安装群集组件(201和202都要安装)

[root@kvm01 ~]# yum -y install pcs pacemaker fence-agents-all
[root@kvm02 ~]# yum -y install pcs pacemaker fence-agents-all
  • Pacemaker 是一个集群管理器。它利用OpenAIS 或 heartbeat提供的消息和成员能力,由辅助节点和系统进行故障检测和回收,实现性群集服务(亦称资源)的高可用性。
  • Fence agent是集群管理中的一个概念,用于在发生电源故障或其他故障时确保集群的稳定性。
  • pcs 是集群管理的一个守护进程,利用pcs提供的工具可以对集群环境进行状态的管理

查看 passwd 检查 hacluster 账号

[root@kvm01 ~]# cat /etc/passwd
hacluster:x:189:189:cluster user:/home/hacluster:/sbin/nologin

设置密码

[root@kvm01 ~]# passwd hacluster

  • 两台 kvm 机器密码要一致

启动服务并设置开机自启

[root@kvm01 ~]# systemctl start pcsd
[root@kvm01 ~]# systemctl enable pcsd
Created symlink from /etc/systemd/system/multi-user.target.wants/pcsd.service to
/usr/lib/systemd/system/pcsd.service.

取消会话同步

认证组成群集的节点(只在kvm01上操作)

[root@kvm01 ~]# pcs cluster auth kvm01 kvm02 -u hacluster -p aptech
kvm01: Authorized
kvm02: Authorized

自动生成配置文件(只在kvm01上操作)

[root@kvm01 ~]# pcs cluster setup --name cluster-kvm kvm01 kvm02

启动群集(只在kvm01上操作)

[root@kvm01 ~]# pcs cluster start --all
kvm01: Starting Cluster (corosync)...
kvm02: Starting Cluster (corosync)...
kvm0l: Starting Cluster (pacemaker)...
kvm@2: Starting Cluster (pacemaker)...

设置开机自启

[root@kvm01 ~]# pcs cluster enable --all
kvm01: Cluster Enabled
kvm02: Cluster Enabled
  • enable:将群集设置为开机自启

201和202查看pcs群集状态

[root@kvm01 ~]# pcs status2 nodes configured
0 resource instances configuredOnline: [ kvm01 kvm02 ]No resource
[root@kvm02 ~]# pcs status2 nodes configured
0 resource instances configuredOnline: [ kvm01 kvm02 ]No resource

关闭其中一个节点

[root@kvm01 ~]# pcs cluster stop kvm01
kvm01: Stopping Cluster (pacemaker)...
kvm01: Stopping Cluster (corosync)...

在另一个节点查看状态

[root@kvm02 ~]# pcs statusOnline: [ kvm02 ]
OFFLINE: [ kvm01 ]

启动服务

[root@kvm01 ~]# pcs cluster start kvm01
kvm01: Starting Cluster (pacemaker)...
kvm01: Starting Cluster (corosync)...

查看状态

[root@kvm02 ~]# pcs status2 nodes configured
0 resource instances configuredOnline: [ kvm01 kvm02 ]No resource

开启会话同步

关闭隔离设备的功能(每个设备都执行)

[root@kvm01 ~]# pcs property set stonith-enabled=false

取消会话同步

向群集中添加资源

[root@kvm01 ~]# pcs resource create test01 VirtualDomain hypervisor="qemu:///system" config="/kvmdata/config/test01.xml" migration_transport=ssh meta allow-migrate="true"Assumed agent name 'ocf:heartbeat:VirtualDomain'(deduced from 'VirtualDomain')
  • meta allow-migrate="true"  :允许迁移模式

查看群集状态

[root@kvm01 ~]# pcs status
Cluster name: cluster-kvmWARNINGS:
No stonith devices and stonith-enabled is not falseStack: corosync
Current DC: kvm02 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 19:55:48 2022
Last change: Wed Aug 31 19:55:43 2022 by root via cibadmin on kvm012 nodes configured
1 resource instance configuredOnline: [ kvm01 kvm02 ]Full list of resources:test01	(ocf::heartbeat:VirtualDomain):	Started kvm01Daemon Status:corosync: active/enabledpacemaker: active/enabledpcsd: active/enabled
KVM 群集验证

kvm01 的状态

[root@kvm01 ~]# virsh list --allId    名称                         状态
----------------------------------------------------6     test01                         running

查看资源限制

[root@kvm01 ~]# pcs constraint
//查询限制情况,如下显示结果为无限制
Location Constraints:
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

清除某个 pcs 资源只能在某个主机上运行的限制

[root@kvm01 ~]# pcs resource clear test01

手动迁移

[root@kvm01 ~]# pcs resource move test01
Warning: Creating location constraint cli-ban-test01-on-kvm@l with a score of -INFINITY for resource test@l on node kvm01.
This will prevent test0l from running on kvm0l until the constraint is removed.his will be the case even if kvm0l is the last node in the cluster.
  • 会自动选择其他节点进行迁移

201上查看状态

[root@kvm01 ~]# pcs status
Cluster name: cluster-kvm
Stack: corosync
Current DC: kvm01 (version 1.1.23-1.el7_9.1-9acf116022) - partition with quorum
Last updated: Wed Aug 31 21:54:15 2022
Last change: Wed Aug 31 21:52:31 2022 by root via crm_resource on kvm012 nodes configured
1 resource instance configuredOnline: [ kvm01 kvm02 ]Full list of resources:test01	(ocf::heartbeat:VirtualDomain):	Started kvm02Daemon Status:corosync: active/enabledpacemaker: active/enabledpcsd: active/enabled
[root@kvm01 ~]# virsh list --allId    名称                         状态
-----------------------------------------------------     test01                         关闭

202上查看状态

[root@kvm02 ~]# virsh list --allId    名称                         状态
----------------------------------------------------2     test01                         running
  • 迁移后,test01运行在kvm02上

查看是否有限制

[root@kvm02 ~]# pcs constraint
Location Constraints:Resource: test0lDisabled on: kvm01(score:-INFINITY)(role: Started)
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:
  • Resource: test01:被限制了 

202上清除 test01 限制

[root@kvm02 ~]# pcs resource clear test01

202查看限制情况

[root@kvm02 ~]# pcs constraint
//查询限制情况,如下显示结果为无限制
Location Constraints:
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

201查看限制情况

[root@kvm01 ~]# pcs constraint
//查询限制情况,如下显示结果为无限制
Location Constraints:
Ordering Constraints:
Colocation Constraints:
Ticket Constraints:

202虚拟机挂起模拟故障

201上查看状态

[root@kvm01 ~]# pcs status2 nodes configured
1 resource instance configuredOnline: [ kvm@l ]
OFFLINE: [ kvm02 ]Full list of resources:test01 (ocf::heartbeat:VirtualDomain): Started kvm01

查看状态

[root@kvm01 ~]# virsh list --all
Id            名称            状态
--------------------------------------
5             test01          running

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

相关文章:

小阿轩yx-KVM+GFS 分布式存储系统构建 KVM 高可用

小阿轩yx-KVMGFS 分布式存储系统构建 KVM 高可用 案例分析 案例概述 使用 KVM 及 GlusterFS 技术,结合起来实现 KVM 高可用利用 GlusterFS 分布式复制卷对 KVM 虚拟机文件进行分布存储和冗余 分布式复制卷 主要用于需要冗余的情况下把一个文件存放在两个或两个…...

centos安装mysql 5.7版本

因为要继续第二阶段的学习,windows里面的mysql版本,很多设置没有。因此弄了一个虚拟机,安装了centos,在里面安装mysql。 看了《centos安装mysql 5.7版本》里面有设置my.cnf文件,这个在虚拟机里面编辑,手动敲…...

SQL——查询sql执行顺序

在SQL查询中,虽然我们在编写查询时遵循一定的逻辑顺序(SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY),但实际上,数据库在执行这些查询时遵循的是不同的物理执行顺序。这个物理执行顺序是数据库管理系统&#xff0…...

钉耙编程(3)

1001深度自同构 Problem Description 对于无向图中的点,定义一个点的度为与其相连的边的条数。 对于一棵有根树,定义一个点的深度为该点到根的距离。 对于由若干有根树构成的森林,定义该森林是深度自同构的,当且仅当森林中任意…...

python 线程池处理文件

使用多线程来加速文件复制的过程,可以使用Python的concurrent.futures模块中的ThreadPoolExecutor。代码如下: import glob import os import shutil from concurrent.futures import ThreadPoolExecutordef copy_image(image):imagepath image.replace…...

AI技术和大模型对人才市场的影响

012024 AI技术和大模型 2024年AI技术和大模型呈现出多元化和深入融合的趋势,以下是一些关键的技术方向和特点: 1. 生成式AI 生成式AI(Generative AI)在2024年继续快速发展,它能够创造全新的内容,而不仅仅…...

解释“location”和“position”

Explanation of “Location” and “Position” Location and position are terms often used interchangeably in everyday language, but they can have distinct meanings depending on the context. Below, we explore their definitions, differences, and examples of u…...

Netty 必知必会(三)—— ByteBuf

Netty ByteBuf工作原理,和NIO里ByteBuffer区别? Java NIO 提供了ByteBuffer 作为它 的字节容器,但是这个类使⽤起来过于复杂,⽽且也有些繁琐。 ByteBuf是Netty框架中的一个关键类,专门设计来处理字节数据,…...

芋道以开源之名行下作之事 恬不知耻 标榜自己开源 公开源码+sql 不用再加入知识星球

资源 链接: https://pan.baidu.com/s/1TeuxbAUfLQ5_BqMBF1kniQ?pwdcqud 提 取码: cqud 依次为后端、补充版的sql、前端 此文档内安装部署等一应俱全...

wordpress中,wp_posts 文章的状态 有哪些,分别对应什么数值

在WordPress中,wp_posts 表存储了网站上的所有内容,包括文章(posts)、页面(pages)、自定义文章类型(custom post types)等。这个表有一个名为 post_status 的字段,用于标…...

输入成绩问题(c语言)

1.问题:期中考试开始了,大家想要取得好成绩,争夺前五名,从键盘输入n个学生成绩(不超过40个),输出每组的前五名的成绩 两行,第一行输入一个整数,表示n个学生(…...

基于域名+基于ip+基于端口的虚拟主机+上线商务系统

一、回顾 1.jdk环境 tomcat服务器需要jdk环境 版本对应 ​ tomcat9>jdk1.8 配置系统变量JAVA_HOME sed -i $aexport JAVA_HOME/usr/local/jdk22/ /etc/profile sed -i $aexport PATH$JAVA_HOME/bin:$PATH /etc/profile ​ source /etc/profile ​ java -version java…...

vue每次路由跳转前将页面滚动到顶部

在Vue.js应用中,特别是使用Vue Router进行页面路由管理时,router.beforeEach是一个非常有用的导航守卫(Navigation Guard)。它允许你在路由跳转之前执行一些逻辑,比如权限验证、页面跳转前的数据加载、滚动位置重置等。…...

【Qt】QDateTimeEdit

在Qt中,QDateEdit是用于选择日期的微调框,QTimeEdit是用于选择小时和分钟的微调框 QDateTimeEdit则是基于QDateEdit和QTimeEdit的组合控件,能够同时显示日期和时间,并允许用户以交互方式编辑日期 常用属性 属性说明dateTime时间…...

Redis和Mysql如何保持数据一致性

一般情况下,Redis是用来实现应用和数据库之间读操作得缓存层,主要目的是减少数据库IO,还可以提升数据的IO性能。 当应用程序需要去读取某个数据时,会首先尝试去Redis里面加载,如果命中就直接返回,如果没有…...

Java中Optional相关

Java中Optional相关 orElse 提供默认值以确保不会返回 null。 适用于默认情况下的备选值或简单计算结果。 // 如果 optionalName 为空&#xff0c;返回 "Unknown" Optional<String> optionalName Optional.empty(); String result optionalName.orElse(&q…...

AI在HR候选人关系管理中的革新应用

一、引言 随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;其在人力资源管理&#xff08;HR&#xff09;领域的应用也日益广泛。特别是在候选人关系管理方面&#xff0c;AI技术不仅提高了管理效率&#xff0c;还使得候选人体验得到了极大的改善。本文将深入分…...

HTML+CSS+JavaScript制作七夕表白网页(含音乐+自定义文字+烟花特效)

利用HTMLCSSJavaScript制作了一个简单的七夕表白网页&#xff1a; 这是一个简单的表白功能&#xff0c;可以用于小哥哥小姐姐在情人节向心爱的人表白使用点击信封中间的爱心&#xff0c;会出现一封信由信封向外展开&#xff0c;与此同时会有烟花绽放&#xff0c;并且自动播放背…...

【Python机器学习系列】一文教你实现决策树模型可视化(案例+源码)

这是我的第335篇原创文章。 一、引言 决策树是一个有监督分类模型&#xff0c;本质是选择一个最大信息增益的特征值进行输的分割&#xff0c;直到达到结束条件或叶子节点纯度达到阈值。根据分割指标和分割方法&#xff0c;可分为&#xff1a;ID3、C4.5、CART算法。每一种颜色代…...

如何在Python中使用网页抓取API获得Google搜索结果

SERP是搜索引擎结果页的缩写&#xff0c;它是你在百度、谷歌、Bing等搜索引擎中提交查询后所得到的页面。搜索引擎需要给所有页面做排序&#xff0c;把最能解决我们需求的页面展示给我们&#xff0c;企业会非常关注结果页的排序&#xff0c;也就是本企业内容的自然排名情况。手…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...