分布式文件系统FastDFS实战
1. 分布式文件系统应用场景
- 互联网海量非结构化数据的存储需求:
- 电商网站:海量商品图片
- 视频网站:海量视频文件
- 网盘:海量文件
- 社交网站:海量图片
2.FastDFS介绍
https://github.com/happyfish100/fastdfs
2.1简介
- FastDFS 是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB< file_size< 500MB)为载体的在线服务
- FastDFS设计是用来存储小文件的,过大的文件处理方案是拆分为小文件,可跟踪小文件的上传情况。如果应用场景都是外理大文件,可以选择其他分布式文件系统方案会更合适。
2.2 特性
- FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
- 优点:
1. 文件不分块存储,文件和系统中的文件一一对应。
2. 对文件内容做hash处理,避免出现重复文件,节约磁盘空间。
3. 下载文件支持HTTP协议,可基于内置Web Server或外部Web Server。
4. 支持在线扩容,动态添加卷。
5. 支持文件冗余备份和负载均衡。
6. 存储服务器上可以保存文件属性 (meta-data)。
7. V2.0 网络通信采用libevent,支持高并发访问,整体性能更好。 - 缺点:
1. 直接按文件存储,可直接查看文件内容,缺乏文件安全性。
2. 数据同步无校验,存在静默IO问题,降低系统可用性。
3. 单线程数据同步,仅适合存储小文件 (4KB到500MB之间)。
4. 备份数根据存储分卷(分组)决定,缺乏文件备份数设置灵活性。
5. 单个挂载点异常会导致整个存储节点下线。
6. 缺乏多机房容灾机制。
7. 静态的负载均衡机制。 - 优点与缺点并存,但针对中小型系统已经完全足够使用了。
2.3. 角色
Tracker Server
: 跟踪服务器,主要做调度工作,起到均衡的作用。负责管理所有的storage server
和group
,每个storage
在启动后会连接Tracker
,告知自己所属group
等信息,并保持周期性心跳。Storage Server
: 存储服务器,主要提供容量和备份服务;以group
为单位,每个group
内可以有多台storage server
,数据互为备份。client
: 客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
- Tracker相当于一个调度中心,上传和下载都通过它来进行分配指定。
- Storage cluster部分,由Volume1、Volume2…VolumeK组成,它们称为卷(或者叫做组),卷与卷之间是平行的关系,可以根据资源的使用情况随时增加,卷内服务器文件相互同步备份,以达到容灾的目的。
2.4. 存储策略:
- 为了支持大容量,存储节点 (服务器) 采用了分卷 (或分组) 的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
- 在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
2.5. 上传过程:
- 当服务启动之后,
Storage Server
会定期的向Tracker Server
发送存储信息如果Tracker Server
是集群形式,则每个Tracker
之间的关系是对等的,客户端上传时选择任意一个Tracker
即可。 - 整体流程:当客户端请求
Tracker
进行上传操作时,会获取存储服务器相关信息,主要包括IP和端口。根据返回信息上传文件,通过存储服务器写入磁盘,并返回给客户端file_id、路径信息、文件名等信息。 - 对应流程图如下:
- 其中,当
Tracker
收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group
,当选定了group后就要决定给客户端分配group
中的哪一个storage server
。 - 当分配好
storage server
后,客户端向storage
发送写文件请求,storage
将会为文件分配一个数据存储目录。然后为文件分配一个fileid
最后根据以上的信息生成文件名存储文件。 - 生成的文件名基本格式如下:
- 组名:文件上传后所在的 storage 组名称,在文件上传成功后有
storage
服务器返回,需要客户端自行保存。 - 虚拟磁盘路径:
storage
配置的虚拟路径,与磁盘选项store_path*
对应。如果配置了store_path0
则是 M00,如果配置了store_path1
则是M01,以此类推。 - 数据两级目录:
storage
服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。 - 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含源存储 服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
2.6文件同步
- 写文件时,客户端将文件写至
group
内一个storage server
即认为写文件成功,storage server
写完文件后,会由后台线程将文件同步至同group
内其他的storage server
。 - 每个
storage
写文件后,同时会写一份binlog
,binlog
里不包含文件数据,只包含文件名等元信息,这份binlog
用于后台同步,storage
会记录向group
内其他storage
同步的进度,以便重启后能接上次的进度继续同步,进度以时间戳的方式进行记录,所以最好能保证集群内所有server
的时钟保持同步。 storage
的同步进度会作为元数据的一部分汇报到traker
上,tracke
在选择读storage
的时候会以同步进度作为参考。
2.7下载过程
- 跟上传一样,在下载时客户端可以选择任意
Tracker server
。 - 客户端带文件名信息请求
Tracker
,Tracker
从文名中解析出文件的group
、大小、创建时间等信息,然后选择一个storage
用来服务处理请求,返回对应文件。 - 对应流程图如下:
- 如果是基于Web的http请求,此处的Client可以是Nginx代理服务。下面这张图更加形象的描述了相关的流程。
3.FastDFS环境搭建
3.1环境准备
3.1.1. 使用的系统软件
名称 | 说明 |
---|---|
centos | 7.X |
libfastcommon | FastDFS分离出的一些公用函数包 |
FastDFS | FastDFS本体 |
fastdfs-nginx-module | FastDFS和nginx的关联模块 |
nginx | nginx-1.16.1 |
3.1.2. 编译环境:
yum -y install git gcc gcc-c++ make automake autoconf 1ibtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim
3.1.3. 磁盘目录
说明 | 位置 |
---|---|
所有安装包 | /usr/local/soft/ |
数据存储位置 | /data/fastdfs/ |
3.1.4. 安装libfastcommon
mkdir /usr/local/soft/
cd /usr/local/soft
#下载libfastcommon源码包
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
tar -xf libfastcommon-1.0.7.tar.gz
cd libfastcommon-1.0.7
#编译安装:
./make.sh && ./make.sh insta11
3.1.5. 安装FastDFS
cd /usr/local/soft
#下载fastdfs源码包
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
cd fastdfs-5.05/
#编译安装
./make.sh && ./make.sh insta11#供nginx访问使用
cp -r /usr/local/soft/fastdfs-5.05/conf/http.conf /etc/fdfs/
cp -r /usr/local/soft/fastdfs-5.05/conf/mime.types /etc/fdfs/
3.1.6. 安装fastdfs-nginx-module
fastdfs-nginx-module下载
#下载nginx模块:
tar -xf fastdfs-nginx-module_v1.16.tar.gzcp -r /usr/local/soft/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
3.1.7. 安装nginx
#下载nginx源码
wget https://nginx.org/download/nginx-1.16.1.tar.gz
tar -xf nginx-1.16.1.tar.gz
cd nginx-1.16.1/
#预编译添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/
#编译安装
make && make install
- 编译时报错如下:
In file included from /usr/local/soft/fastdfs-nginx-module/src//common.c:26:0,from /usr/local/soft/fastdfs-nginx-module/src//ngx_http_fastdfs_module.c:6:
/usr/include/fastdfs/fdfs_define.h:15:27: fatal error: common_define.h: No such file or directory#include "common_define.h"^
compilation terminated.
- 解决方法如下:
将fastdfs-nginx-module/src/config
中CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
去掉local
修改如下:
vim /usr/local/soft/fastdfs-nginx-module/src/config
...CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
...
- 继续安装nginx
cd /usr/local/soft/nginx-1.16.1
#预编译添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/soft/fastdfs-nginx-module/src/
#编译安装
make && make install
3.2. 单机部署
- 服务器IP地址:192.168.2.10
#添加域名方便管理
vim /etc/hosts
192.168.2.10 fastdfs.com
3.2.1. tracker配置:
mkdir -p /data/fastdfs/
cp -r /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vim /etc/fdfd/tracker.conf
修改如下:
base_path=/data/fastdfs/
- tracker.conf配置文件详解:
disabled=false #标识是否禁用,这里设置为 false 表示启用bind_addr= #绑定地址,留空表示绑定所有可用地址 port=22122 #监听端口号connect_timeout=30 #连接超时时间,单位为秒network_timeout=60 #网络超时时间,单位为秒base_path=/data/fastdfs/ #存储文件的基本路径max_connections=256 #最大连接数accept_threads=1 #接受连接的线程数work_threads=4 #工作线程数store_lookup=2 #存储查找方式store_group=group2 #存储组名store_server=0 #存储服务器编号store_path=0 #存储路径编号 download_server=0 #下载服务器编号reserved_storage_space = 10% #保留存储空间的百分比log_level=info #日志级别,这里设置为 inforun_by_group= #运行用户组run_by_user= #运行用户名allow_hosts=* #允许连接的主机,这里设置为全部允许sync_log_buff_interval = 10 #同步日志缓冲间隔,单位为秒check_active_interval = 120 #检查活跃状态的间隔时间,单位为秒thread_stack_size = 64KB #线程栈大小 storage_ip_changed_auto_adjust = true #存储 IP 变化自动调整的开关,这里设置为 truestorage_sync_file_max_delay = 86400 #存储同步文件最大延迟时间,单位为秒storage_sync_file_max_time = 300 #存储同步文件最大时间,单位为秒use_trunk_file = false #是否使用扩展文件slot_min_size = 256 #槽位最小尺寸slot_max_size = 16MB #槽位最大尺寸trunk_file_size = 64MB #扩展文件大小trunk_create_file_advance = false #是否提前创建扩展文件trunk_create_file_time_base = 02:00 #扩展文件创建时间的基准,这里设置为凌晨 2 点trunk_create_file_interval = 86400 #扩展文件创建间隔,单位为秒trunk_create_file_space_threshold = 20G #扩展文件空间阈值trunk_init_check_occupying = false #初始化检查扩展文件占用情况的开关trunk_init_reload_from_binlog = false #是否从 binlog 重载初始化数据trunk_compress_binlog_min_interval = 0 #扩展文件压缩的最小时间间隔,单位为秒use_storage_id = false #是否使用存储 IDstorage_ids_filename = storage_ids.conf #存储 ID 配置文件名id_type_in_filename = ip #文件名中的 ID 类型,这里设置为 IPstore_slave_file_use_link = false #从节点是否使用链接方式rotate_error_log = false #是否轮转错误日志error_log_rotate_time=00:00 #错误日志轮转时间rotate_error_log_size = 0 #错误日志轮转大小log_file_keep_days = 0 #保留日志文件的天数use_connection_pool = false #是否使用连接池connection_pool_max_idle_time = 3600 #连接池最大空闲时间,单位为秒http.server_port=8080 #HTTP 服务器监听端口号http.check_alive_interval=30 #检查存活状态的间隔时间,单位为秒http.check_alive_type=tcp #检查存活状态的类型,这里设置为 TCPhttp.check_alive_uri=/status.html #检查存活状态的 URI
3.2.2. storage配置
cp -r /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vim /etc/fdfs/storage.conf
...
port=23000 #storage服务端口,默认23000一般不修改
base_path=/data/fastdfs/ #数据和日志文件存放根目录
store_path0=/data/fastdfs/ #第一存储目录
tracker_server=fastdfs.com:22122 #tracker服务IP和端口号
http.server_port=8888 #http访问文件的端口(默认8888,和nginx保持一致)
- 配置文件详解:
disabled=false #标识是否禁用,这里设置为 false 表示启用group_name=group1 #FastDFS 的分组名称bind_addr= #绑定地址,留空表示绑定所有可用地址client_bind=true #客户端是否绑定地址的开关,这里设置为 trueport=23000 #监听端口号connect_timeout=30 #连接超时时间,单位为秒network_timeout=60 #网络超时时间,单位为秒heart_beat_interval=30 #心跳间隔时间,单位为秒stat_report_interval=60 #状态报告间隔时间,单位为秒base_path=/data/fastdfs/ #存储文件的基本路径max_connections=256 #最大连接数buff_size = 256KB #缓冲区大小accept_threads=1 #接受连接的线程数work_threads=4 #工作线程数disk_rw_separated = true #磁盘读写是否分离的开关,这里设置为 truedisk_reader_threads = 1 #磁盘读取线程数disk_writer_threads = 1 #磁盘写入线程数sync_wait_msec=50 #同步等待时间,单位为毫秒sync_interval=0 #同步间隔时间,单位为秒sync_start_time=00:00 #同步开始时间sync_end_time=23:59 #同步结束时间
write_mark_file_freq=500 #写入标记文件的频率store_path_count=1 #存储路径个数store_path0=/data/fastdfs/ #存储路径subdir_count_per_path=256 #每个存储路径的子目录个数tracker_server=fastdfs.com:22122 #Tracker 服务器地址log_level=info #日志级别,这里设置为 inforun_by_group= #运行用户组run_by_user= #运行用户名allow_hosts=* #允许连接的主机,这里设置为全部允许file_distribute_path_mode=0 #文件分布路径模式file_distribute_rotate_count=100 #文件分布轮转计数fsync_after_written_bytes=0 #写入多少字节后执行 fsyncsync_log_buff_interval=10 #同步日志缓冲间隔,单位为秒sync_binlog_buff_interval=10 #同步二进制日志缓冲间隔,单位为秒sync_stat_file_interval=300 #同步统计文件间隔,单位为秒thread_stack_size=512KB #线程栈大小upload_priority=10 #上传优先级if_alias_prefix= #接口别名前缀check_file_duplicate=0 #检查文件重复性的开关file_signature_method=hash #文件签名方法key_namespace=FastDFS #键命名空间keep_alive=0 #保持连接的时间,单位为秒use_access_log = false #是否使用访问日志rotate_access_log = false #是否轮转访问日志access_log_rotate_time=00:00 #访问日志轮转时间rotate_error_log = false #是否轮转错误日志error_log_rotate_time=00:00 #错误日志轮转时间rotate_access_log_size = 0 #访问日志轮转大小rotate_error_log_size = 0 #错误日志轮转大小log_file_keep_days = 0 #保留日志文件的天数file_sync_skip_invalid_record=false #是否跳过无效记录进行文件同步的开关use_connection_pool = false #是否使用连接池connection_pool_max_idle_time = 3600 #连接池最大空闲时间,单位为秒http.domain_name= #HTTP 服务器的域名http.server_port=8888 #HTTP 服务器监听端口号
3.2.3. 启动服务
#启动tracker服务:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
#启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
# 重启storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
3.2.4. client测试:
cp -r /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
vim /etc/fdfs/client.conf
...
base_path=/data/fastdfs #存储文件路径
tracker_server=fastdfs.com:22122 #指定tracker服务IP地址和端口号
...
#测试上传图片,下载一张图片上传至/root/下
ls
anaconda-ks.cfg pcindex_small.png
#上传图片:
fdfs_upload_file /etc/fdfs/client.conf /root/pcindex_small.png
group1/M00/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png --这是存放图片的路径
#查看一下图片:
ls /data/fastdfs/data/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png
/data/fastdfs/data/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png#删除图片:
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgCCmUQWBeAOIRdAAAYqekVITI126.png#查看图片是否存在:
ls /data/fastdfs/data/00/00/
3.2.5. 配置nginx访问
#修改mod_fastdfs.conf
vim /etc/fdfs/mod_fastdfs.conftracker_server=fastdfs.com:22122 #Tracker 服务器的地址和端口号
url_have_group_name = true #URL 是否包含分组名称的开关,设置为 true 表示 URL 包含分组名称
store_path0=/data/fastdfs #存储路径的配置。FastDFS 是一个分布式文件系统,数据会保存在多个存储路径中。store_path0 表示第一个存储路径,/data/fastdfs 是具体的路径。可以根据实际情况配置多个存储路径,每个存储路径使用不同的 store_pathX 配置项,例如 store_path1=/path/to/another/store#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
...
server {listen 8888; #该端口为storage.conf中的http.server_port相同server_name localhost;location ~/group[0-9]/ {ngx_fastdfs_module;}
#启动nginx
/usr/local/nginx/sbin/nginx
#重启nginx
/usr/local/nginx/sbin/nginx -s reload
#停止nginx
/usr/local/nginx/sbin/nginx -s stop
3.2.6. 测试:
#上传一张图片
fdfs_upload_file /etc/fdfs/client.conf /root/pcindex_small.png
group1/M00/00/00/wKgCCmUQYGmAC88HAAAYqekVITI560.png
- 打开浏览器访问:http://192.168.2.10:8888/group1/M00/00/00/wKgCCmUQYGmAC88HAAAYqekVITI560.png
3.3. 集群部署:
- 集群IP地址:192.168.2.10,192.168.2.20,192.168.2.30
3.3.1. 修改hosts内容和主机名
- 注意每台服务器都需要修改如下:
vim /etc/hosts192.168.2.10 fastdfs.com
192.168.2.20 fastdfs2.com
192.168.2.30 fastdfs3.com#在每台服务器执行如下命令修改主机名,注意不同服务器的网卡不同需要根据现场情况修改:
hostname `cat /etc/hosts|grep $(ifconfig ens33|grep broadcast|awk '{print $2}')|awk '{print $2}'`;su
- 每台部署Fastdfs,这里就不重新写了,具体怎么部署可以看上面的内容
3.3.2. tracker配置
- 每台都需要配置
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122 # tracker服务器端口(默认22122,一般不修改)
base_path=/data/fastdfs # 存储日志和数据的根目录
3.3.3. storage配置
- 每台都需要配置
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000 # storage服务端口(默认23000,一般不修改)
base_path=/data/fastdfs # 数据和日志文件存储根目录
store_path0=/data/fastdfs # 第一个存储目录
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
3.3.4. 启动服务
#启动tracker服务:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
#启动storage服务:
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
3.3.4. client 测试:
- 在任意一台都可以测试:
vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/data/fastdfs
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3# 下载一张图片上传至/root/下
[root@fastdfs ~]# ls
28e70ebf91667f0c9b04be96bc730c49.jpeg anaconda-ks.cfg pcindex_small.png#上传图片
fdfs_upload_file /etc/fdfs/client.conf /root/28e70ebf91667f0c9b04be96bc730c49.jpeg
group1/M00/00/00/wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg#任意一台验证:
ls /data/fastdfs/data/00/00/
wKgCCmUQYGmAC88HAAAYqekVITI560.png wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg
3.3.5. 配置nginx访问
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=fastdfs.com:22122 # 服务器1
tracker_server=fastdfs2.com:22122 # 服务器2
tracker_server=fastdfs3.com:22122 # 服务器3
url_have_group_name=true
store_path0=/data/fastdfs#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {listen 8888; ## 该端口为storage.conf中的http.server_port相同server_name localhost;location ~/group[0-9]/ {ngx_fastdfs_module;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}
}#启动nginx
/usr/local/nginx/sbin/nginx -s reload
ngx_http_fastdfs_set pid=25197
3.3.6. 测试刚才上传的图片
- 打开浏览器访问:http://192.168.2.10:8888/group1/M00/00/00/wKgCCmUWboKAJ2IPAAEnsjF1S3g58.jpeg
3.3. 7. 检测集群:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# 会显示会有几台服务器 有3台就会 显示 Storage 1-Storage 3的详细信息
相关文章:
分布式文件系统FastDFS实战
1. 分布式文件系统应用场景 互联网海量非结构化数据的存储需求: 电商网站:海量商品图片视频网站:海量视频文件网盘:海量文件社交网站:海量图片 2.FastDFS介绍 https://github.com/happyfish100/fastdfs 2.1简介 …...
手机自动直播系统源码交付与代理加盟注意事项解析!
随着直播行业的不断发展,手机自动直播已经成为了人们生活中不可或缺的一部分。手机无人直播软件成了香饽饽,各类手机实景直播APP大批量涌现。因为创业和技术门槛低,市场需求高,所以成了最火热创业赛道。那么如果是不懂技术的人群&…...
NodeJS 如何连接 MongoDB
初始化: yarn init使用命令: yarn add mongodb新建 index.js 文件: const MongoClient require(mongodb).MongoClient; const db_name "fly_articleDb"; const url mongodb://127.0.0.1:27017;(async function () {const cli…...
基于Java的老年人体检管理系统设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
燃气安全如何保障?万宾燃气管网监测系统时刻感知管网运行态势
近年来随着我国城镇化建设的加快,燃气已经成为每个家庭的必需品。然而,每年夏季频繁发生的燃气爆炸事故,已经严重危害人民生命财产安全危害社会公共安全和公共利益。为了保障燃气安全运行,近日,许多城市都在大力推进燃…...
2. selenium学习
Selenium 学习 简介 Selenium 是一个用于自动化浏览器的工具,它提供了多种编程语言的支持,包括 Python、Java、C# 等。它可以模拟用户在浏览器中的操作,比如点击按钮、填写表单、提交数据等。Selenium 具有强大的功能和灵活的定制性&#x…...
数学建模Matlab之评价类方法
大部分方法来自于http://t.csdnimg.cn/P5zOD 层次分析法 层次分析法(Analytic Hierarchy Process, AHP)是一种结构决策的定量方法,主要用于处理复杂问题的决策分析。它将问题分解为目标、准则和方案等不同层次,通过成对比较和计算…...
json能够存储图片吗?
JSON 本身并不适合存储图片,因为它是一种轻量级的数据交换格式,易于阅读和编写,同时也易于机器解析和生成。JSON 数据格式简单,只包含键值对,因此它主要用于存储和传输文本数据。 然而,你可以将图片转换为 …...
C语言中自定义类型讲解
前言:C语言中拥有三种自定义类型,这三种自定义类型是怎么运用呢?在内存中又是怎么存储的呢?通过这篇文章我们来逐个讲解讲解。 三种类型分别是: 1.结构体 – 通俗的来讲就是可以把不同类型的变量放在一个集合中 2.枚举…...
Win10系统中GPU深度学习环境配置记录
运行环境 系统:Win10 处理器 Intel(R) Core(TM) i7-9700K CPU 3.60GHz 3.60 GHz 机带 RAM 16.0 GB 设备 ID A18D4ED3-8CA1-4DC6-A6EF-04A33043A5EF 产品 ID 00342-35285-64508-AAOEM 系统类型 64 位操作系统, 基于 x64 的处理器 显卡:NVIDIA GeF…...
pycharm一直没显示运行步骤,只是出现waiting for process detach
pycharm一直没显示运行步骤,只是出现waiting for process detach;各类音乐免费软件;最棒的下载torch-geometric-CSDN博客(不太推荐)我强烈推荐这个:_waiting for process detachhttps://blog.csdn.net/weix…...
管道读写特点以及设置成非阻塞
管道的读写特点: 使用管道时,需要注意以下几种特殊的情况(假设都是阻塞I/O操作) 1.所有的指向管道写端的文件描述符都关闭了(管道写端引用计数为0),有进程从管道的读端 读数据,那么管…...
(c++)类和对象 下篇
目录 1.再次了解构造函数 2. Static成员 3. 友元 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 1.再次了解构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { pub…...
Tomcat报404问题的原因分析
1.未配置环境变量 按照需求重新配置即可。 2.IIs访问权限问题 注意:这个问题有的博主也写了,但是这个问题可有可无,意思是正常情况下,有没有都是可以访问滴放心 3.端口占用问题 端口占用可能会出现这个问题,因为tomcat的默认端口号是8080,如果在是运行tomcat时计算机的…...
《发现的乐趣》作者费曼(读书笔记)
目录 一、书简介 二、作者理查德•费曼 费曼式思维 教育与传承 三、个人思考 四、笔记 科学家眼中的花之美 关于偏科 父亲教育我的方式 知道一个概念和真正懂得这个概念有很大区别 我没有义务去成全别人对我的期望 诺贝尔奖——够格吗? 探究世界的游戏规…...
第5章-宏观业务分析方法-5.3-主成分分析法
目录 5.3.1 主成分分析简介 协方差矩阵 方差 协方差 协方差矩阵...
IDEA 使用
目录 Git.gitignore 不上传取消idea自动 add file to git撤销commit的内容本地已经有一个开发完成的项目,这个时候想要上传到仓库中 Git .gitignore 不上传 在项目根目录下创建 .gitignore 文件夹,并添加内容: .gitignore取消idea自动 add…...
如何使用 ChatGPT 创建强大的讲故事广告
shadow: 使用AI技术来辅助创作故事越来越流行,从事营销相关工作的人员需要不断适应和学习新的技术和工具,以应对行业的变化和挑战。 如何使用ChatGPT创建讲故事的广告: A. 确定品牌故事和信息传递B. 确定目标受众C. 开发概念D. 使…...
【C语言深入理解指针(4)】
1.回调函数是什么? 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅…...
qt中弱属性机制
目录 简介: 详解: 实例: 易错地方: 简介: 使用弱属性机制,可以存储临时的值用于传递判断。可以通过widget->dynamicPropertyNames()列出所有弱属性名称,然后通过widget->proper…...
软断言你也学不会
断言是测试用例的一部分,也是测试工程师开发测试用例的核心。断言通常集成在单元测试和集成测试中,断言分为硬断言和软断言。 硬断言是我们狭义上听到的普通断言:当用例运行后得到的[实际]结果与预期结果不匹配时,测试框架将停止测试执行并抛…...
【推荐系统】多任务学习模型
介绍一些多任务学习模型了解是如何处理多任务分支的。 ESSM, Entire Space Multi-Task Model 阿里提出的ESSM全称Entire Space Multi-Task Model,全样本空间的多任务模型,有效地解决了CVR建模(转化率预估)中存在的两个非常重要…...
基于SpringBoot的商品物品产品众筹平台设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…...
《安富莱嵌入式周报》第323期:NASA开源二代星球探索小车, Matlab2023b,蓝牙照明标准NLC, Xilinx发布电机套件,Clang V17发布
周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版: https://www.bilibili.com/video/BV1vp4y1F7qD 《安富莱嵌入式周报》第323期:NASA开源…...
Redis的事务管理
redis也支持事务,但与MySQL等关系型数据库相比,redis的事务比较简单。 一、redis事务的特点 1、redis的事务是一组命令集合 可以把redis的事务看成一个命令的缓存,把一组要执行的命令添加到集合中,然后按顺序一起执行。 2、redi…...
openwrt (一):特殊的WiFi驱动移植方法
openwrt的去驱动移植灵活多样,总体来说只要掌握了官方提供的操作方法即可可简单上手,但是也有一些稍微比较特殊的操作。比如说backport模块。 由于需要兼容很多不同版本的Linux驱动,很多时候需要用到backport。因此,如果已有的项目…...
PCL 计算点云中值
目录 一、算法原理2、主要函数二、代码实现三、结果展示四、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 计算点云坐标的中值点,首先对点云坐标进行排序,然后计算中值。如果点云点的个数为奇数…...
【工作记录】前后端分离场景下CAS单点登录的集成思路与实践@20230926
背景及目的 之前做一个公司项目的时候甲方要求集成他们指定的CAS服务端实现登录,要求不影响原有业务。 CAS服务端提供的文档都是基于前后端不分离的应用,对前后端分离应用没有任何说明,找官方人问也是爱答不理的,近期正好有时间就…...
阿里云数据库RDS有哪些?细数关系型数据库大全
阿里云RDS关系型数据库大全,关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB,阿里云百科分享阿里云RDS关系型数据库大全: 目录 阿里云RDS关系型数据库大全 …...
【计算机网络】因特网中的电子邮件
文章目录 简单邮件传送协议SMTP邮件访问协议POP3IMAPHTTP 参考资料 电子邮件为异步通信媒介 因特网电子邮件系统 电子邮件系统的三个构件:用户代理、邮件服务器、邮件发送和读取协议 用户代理 User Agent 即UA 电子邮件客户端软件,用户与电子邮件系统的接…...
网站幕布拍照什么样子的/视频推广
最近有一段时间,由于项目需要实现SQL Server数据库的异地备份。刚开始想到的是使用数据库的同步,在两台服务器上,安装SQL Server,然后建立数据库同步,再分别为每个服务器建立数据库维护计划,发现这样处理比…...
备案网站名怎么填写/windows7优化大师下载
HTML参考系列(2)-图形元素标签时间:2006.4.29 作者:Anytao ©2006 Anytao.com 转贴请注明出处,留此信息。图形元素是网页设计中最重要的元素,因此在设计过程中对图片的把握是非常重要的,在此Anytao总…...
php做的网站好么/河南网站优化
题意:给你 n个点 m条边 每条边有些公司支持 问 a点到b点的路径有哪些公司可以支持 这里是一条路径中要每段路上都要有该公司支持 才算合格的一个公司 分析:map[i][j] 等于 i直接到 j 的 公司数,加上i经过中间节点到 j 的 公司数 因为每两个站点间的…...
网站的优化分析/想做百度推广找谁
南财大学计算机基础试题A含参PAGE大学计算机基础试卷 A卷 第 PAGE 15 页 共 NUMPAGES 15 页大学计算机基础 课程试卷(A卷)一、单项选择题(共50小题,每题1分,共计50分)二、填空题(共36空,每空1分,共计36分)三、简答题(共3小题&…...
找人做网站需要准备什么材料/济南今日头条新闻
删除软件要删除软件非常简单,只要执行下面的命令就行:# rpm –e xanim这时,用户要注意使用的是软件的名称xanim,而不是软件包的名称xanim-27.64-3.i386.rpm。如果要删除的软件是其它软件所需要的,用户会得到类似下面…...
wordpress 如何修改主题宽度/阐述网络营销策略的内容
解析:〈#ffffffff〉 #ffffffff由#加八位数字或字母组成,前两个ff为透明度(十六进制),后面六位ffffff为颜色代码,采用RGB配色(十六进制) 需要修改的机油一般都要查找相关资料…...