GlusterFS(GFS)分布式文件系统

一、GlusterFS的概述:

GlusterFS 是一个开源的分布式文件系统

只在扩展存储容器,提高性能

并且通过多个互联网络的存储节点的进行几余,以确保数据的可用性和一致性

  • 存储服务器客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。
  • 没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。
  • MFS 传统的分布式文件系统大多通过元服务器来存储元数据,元数据包含存储节点上的目录信息、目录结构等。这样的设计在浏览目录时效率高,但是也存在一些缺陷,例如单点故障。一旦元数据服务器出现故障,即使节点具备再高的冗余性,整个存储系统也将崩溃。而 GlusterFS 分布式文件系统是基于无元服务器的设计,数据横向扩展能力强,具备较高的可靠性及存储效率。
  • GlusterFS同时也是Scale-Out(横向扩展)存储解决方案Gluster的核心,在存储数据方面具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。
  • GlusterFS支持借助TCP/IP或InfiniBandRDMA网络(一种支持多并发链接的技术,具有高带宽、低时延、高扩展性的特点)将物理分散分布的存储资源汇聚在一起,统一提供存储服务,并使用统一全局命名空间来管理数据。
  • GFS由三个组件组成:
    存储服务器(Brick Server)
    客户端(不在本地)(且有客户端,也会有服务端,这点类似于 NFS,但是更为复杂)
    存储网关(NFS/Samaba)(无元数据服务器:就是保存数据的地方 )

二、GlusterFS的特点:

扩展性和高性能:

GlusterFS利用双重特性来提供高容量存储解决方案。
(1)Scale-Out架构允许通过简单地增加存储节点的方式来提高存储容量和性能(磁盘、计算和I/O资源都可以独立增加),支持10GbE和 InfiniBand等高速网络互联。
(2)Gluster弹性哈希(ElasticHash)解决了GlusterFS对元数据服务器的依赖,改善了单点故障和性能瓶颈,真正实现了并行化数据访问。GlusterFS采用弹性哈希算法在存储池中可以智能地定位任意数据分片(将数据分片存储在不同节点上),不需要查看索引或者向元数据服务器查询。

高可用性:

GlusterFS可以对文件进行自动复制,如镜像或多次复制,从而确保数据总是可以访问,甚至是在硬件故障的情况下也能正常访问。
当数据出现不一致时,自我修复功能能够把数据恢复到正确的状态,数据的修复是以增量的方式在后台执行,几乎不会产生性能负载。
GlusterFS可以支持所有的存储,因为它没有设计自己的私有数据文件格式,而是采用操作系统中主流标准的磁盘文件系统(如EXT3、XFS等)来存储文件,因此数据可以使用传统访问磁盘的方式被访问。

全局统一命名空间

分布式存储中,将所有节点的命名空间整合为统一命名空间,将整个系统的所有节点的存储容量组成一个大的虚拟存储池,供前端主机访问这些节点完成数据读写操作。

弹性卷管理:

GlusterFS通过将数据储存在逻辑卷中,逻辑卷从逻辑存储池进行独立逻辑划分而得到。
逻辑存储池可以在线进行增加和移除,不会导致业务中断。逻辑卷可以根据需求在线增长和缩减,并可以在多个节点中实现负载均衡。
文件系统配置也可以实时在线进行更改并应用,从而可以适应工作负载条件变化或在线性能调优。

基于标准协议:

Gluster 存储服务支持 NFS、CIFS、HTTP、FTP、SMB 及 Gluster原生协议,完全与 POSIX 标准(可移植操作系统接口)兼容。
现有应用程序不需要做任何修改就可以对Gluster 中的数据进行访问,也可以使用专用 API 进行访问。

三、GlusterFS 术语:

1.Brick(存储块):

实际存储用户数据的服务器

指可信主机池中由主机提供的用于物理存储的专用分区,是GlusterFS中的基本存储单元,同时也是可信存储池中服务器上对外提存储目录

存储目录的格式由服务器和目录的绝对路径构成,表示方法为SERVER:EXPORT。如:192.168.91.100:/data/mydir/

2.Volume(逻辑卷):

本地文件系统的"分区”

一个逻辑卷是一组Brick的集合。卷是数据存储的逻辑设备,类似于LVM 中的逻辑卷。大部分Gluster管理操作是在卷上进行的

3.3 FUSE:

用户空间的文件系统

是一个内核模块,允许用户创建自己的文件系统,无须修改内核代码

用户 空间的文件系统(类比EXT4),“这是一个伪文件系统”;以本地文件系统为例,用户想要读写一个文件,会借助于EXT4文件系统,然后把数据写在磁盘上;而如果是远端的GFS,客户端的请求则应该交给FUSE(为文件系统),就可以实现跨界点存储在GFS上

3.4 VFS(虚拟端口):

内核态的虚拟文件系统

内核空间对用户空间提供的访问磁盘的接口,用户是先提交请求交给VFS然后VFS交给FUSE,再交给GFS客户端,最后由客户端交给远端的存储

3.5 Glusterd(后台管理进程):

运行在存储节点的进程

在存储群集中的每个节点上都要运行,允许在存储节点的进程

四、GlusterFS 的工作流程:

  1. 客户端通过 GlusterFS 的挂载点访问数据。
  2. linux系统内核通过 VFS API 收到请求并处理。
  3. VFS 将数据递交给 FUSE 内核文件系统,并向系统注册一个实际的文件系统 FUSE,而 FUSE 文件系统则是将数据通过 /dev/fuse 设备文件递交给了 GlusterFS client (客户)端。可以将 FUSE 文件系统理解为一个代理。
  4. GlusterFS client 收到数据后,client 根据配置文件的配置对数据进行处理
  5. 经过 GlusterFS client 处理后,通过网络将数据传递至远端的 GlusterFS Server(服务器),并且将数据写入到服务器存储设备上。

数据流向:

①mysql服务器——>存储数据到挂载目录中/data

②mysql数据会优先交给内核的文件系统处理——>GFS客户端处理(本地)

③GFS客户端会和GFS服务端进行交互,GFS服务端接收到数据,然后再通过挂载的卷的类型,对应保存在后端block块节点服务器上

  • 分布式条带复制卷(Distribute Stripe Replicavolume)三种基本卷的复合卷,通常用于类 Map Reduce 应用器——>存储数据到挂载目录中/data

五、弹性HASH算法:

弹性HASH算法是Davies-Meyer 算法的具体实现,通过HASH 算法可以得到一个32位的整数范围的hash 值,假设逻辑卷中有N个存储单位Brick, 则32位的整数范围将被划分为N个连续的子空间,每个空间对应一个Brick。当用户或应用程序访问某一个命名空间时,通过对该命名空间计算HASH值,根据该HASH 值所对应的32位整数空间定位数据所在的Brick。

优点:

  1. 保证数据平均分布在每一个Brick 中。
  2. 解决了对元数据服务器的依赖,进而解决了单点故障以及访问瓶颈。

六、GlusterFS的卷类型:

GlusterFS支持7种卷(前5种使用的多)

  • 分布式卷:提高存储容量和扩展性,但不提供冗余保护
  • 条带卷:提高读写性能,但不提供冗余保护
  • 复制卷:提供冗余保护,但会降低存储容量和扩展性
  • 分布式条带卷:提供读写性能和扩展性
  • 分布式复制卷:提供冗余保护和扩展性
  • 条带复制卷
  • 分布式条带复制卷

1.分布式卷(Distribute volume):

文件通过HAS日算法分布到所有Brick Server上,这种卷是GlusterFS的默认卷;以文件为单位根据HASH算法散列到不同的Brick,其实只是扩大了磁盘空间,如果有一块磁盘损坏,数据也将丢失,属于文件级的RAIDO,不具有容错能力。
在该模式下,并没有对文件进行分块处理,文件直接存储在某个Server 节点上。
由于直接使用本地文件系统进行文件存储,所以存取效率并没有提高,反而会因为网络通信的原因而有所降低。

示例原理:

File1和File2存放在Server1,而File3存放在server2,文件都是随机存储,一个文件(如File1)要么在server1上,要么在Server2上,不能分块同时存放在Server1和Server2上。

分布式卷的特点:

  • 文件分布在不同的服务器,不具备冗余性。
  • 更容易和廉价地扩展卷的大小。
  • 单点故障会造成数据丢失。
  • 依赖底层的数据保护。

创建分布式卷:

创建一个名为dis-volume的分布式卷,文件将根据HASH分布在server1:/dir1、server2:/dir2和server3:/dir3中

gluster volume create dis-volume server1:/dirl server2:/dir2 server3:/dir3

2、条带卷(Stripe volume):

  • 根据偏移量将文件分成N块(N个条带节点),轮询的存储在每个Brick Server节点
  • 存储大文件时,性能尤为突出
  • 不具备冗余性,类似Raid0

特点:

  • 数据被分割成更小块分布到块服务器群中的不同条带区
  • 分布减少了负载且更小的文件加速了存取的速度
  • 没有数据冗余

创建条带卷:

创建了一个名为Stripe-volume的条带卷,文件将被分块轮询的存储在Server1:/dir1和Server2:/dir2两个Brick中

gluster volume create stripe-volume stripe 2 transport tcp server1:/dirl server2:/dir2

3、复制卷(Replica volume):

  • 将文件同步到多个Brick上,使其具备多个文件副本,属于文件级RAID1,具有容错能力。因为数据分散在多个Brick中,所以读性能得到很大提升,,但写性能下降。
  • 复制卷具备冗余性,即使一个节点损坏,也不影响数据的正常使用。但因为要保存副本,所以磁盘利用率较低。

示例原理:

File1 同时存在Server1和Server2,File2也是如此,相当于server2中的文件是Server1中文件的副本。

复制卷特点:

  • 卷中所有的服务器均保存一个完整的副本。
  • 卷的副本数量可由客户创建的时候决定,但复制数必须等于卷中Brick所包含的存储服务器数。
  • 至少由两个块服务器或更多服务器。
  • 具备冗余性。

创建复制卷:

创建名为rep-volume的复制卷,文件将同时存储两个副本,分别在server1:/dirl和Server2:/dir2两个Brick中

gluster volume create rep-volume replica 2 transport tcp serverl:/dirl server2:/dir2

4、分布式条带卷(Distribute Stripe volume):

  • 兼顾分布式卷和条带卷的功能
  • 主要用于大文件访问处理
  • 至少最少需要4台服务器

创建分布式条带卷:

创建了名为dis-stripe的分布式条带卷,配置分布式的条带卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)

gluster volume create dis-stripe stripe 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

5、分布式复制卷(Distribute Replica volume):

  • 兼顾分布式卷和复制卷的功能
  • 用于需要冗余的情况

创建分布式复制卷:

创建名为dis-rep的分布式条带卷,配置分布式复制卷时,卷中Brick所包含的存储服务器数必须是条带数的倍数(>=2倍)

gluster volume create dis-rep replica 2 transport tcp server1:/dir1 server2:/dir2 server3:/dir3 server4:/dir4

6、条带复制卷(Stripe Replica volume):

类似 RAID 10,同时具有条带卷和复制卷的特点。

7、分布式条带复制卷(Distribute Stripe Replicavolume):

三种基本卷的复合卷,通常用于类 Map Reduce 应用。

五、部署GlusterFS集群:

1.环境准备:

服务器类型系统和IP地址需要安装的组件
node1服务器CentOS7.4(64 位) 192.168.91.3添加4块20G硬盘
node2服务器CentOS7.4(64 位) 192.168.91.4添加4块20G硬盘
node3服务器CentOS7.4(64 位) 192.168.91.5添加4块20G硬盘
node4服务器CentOS7.4(64 位) 192.168.91.7添加4块20G硬盘

2.关闭所有节点服务器的防火墙和SElinux:

systemctl stop firewalld
setenforce 0

3.编写脚本:

由于节点服务器的操作都一样,这里我仅展示node1的操作步骤

[root@node1 ~] # vim /opt/fdisk.sh#!/bin/bash
NEWDEV=`ls /dev/sd* | grep -o 'sd[b-z]' | uniq`
for VAR in $NEWDEV
doecho -e "n\np\n\n\n\nw\n" | fdisk /dev/$VAR &> /dev/nullmkfs.xfs /dev/${VAR}"1" &> /dev/nullmkdir -p /data/${VAR}"1" &> /dev/nullecho "/dev/${VAR}"1" /data/${VAR}"1" xfs defaults 0 0" >> /etc/fstab
done
mount -a &> /dev/null

4.执行脚本并查看磁盘挂载情况:

chmod +x /opt/fdisk.sh 
cd /opt/
./fdisk.sh 
mount -a
df -h
--------------------------------------------------------------------------
文件系统        容量  已用  可用 已用% 挂载点
...				 ...   ...   ...    ...
/dev/sdb1        20G   33M   20G    1% /data/sdb1
/dev/sdc1        20G   33M   20G    1% /data/sdc1
/dev/sdd1        20G   33M   20G    1% /data/sdd1
/dev/sde1        20G   33M   20G    1% /data/sde1

5.添加临时DNS域名解析:

echo "192.168.91.3 node1" >> /etc/hosts
echo "192.168.91.4 node2" >> /etc/hosts
echo "192.168.91.5 node3" >> /etc/hosts
echo "192.168.91.7 node4" >> /etc/hosts
cat /etc/hosts

6.放入gfsrepo.zip安装包解压,然后创建glfs.repo配置文件:

cd /opt
rz -E
tar zxf gfsrepo.zip.tar 
cd /etc/yum.repos.d/
mkdir repos.bak      #如果有,则无需创建
mv * repos.bak/
ls
##应该剩下repos.bak#创建glfs.repo配置文件内容如下
vim glfs.repo			
[glfs]
name=glfs
baseurl=file:///opt/gfsrepo
gpgcheck=0
enabled=1yum clean all && yum makecache

7.安装gfs相关程序,然后开启服务:

yum -y install glusterfs glusterfs-server glusterfs-fuse glusterfs-rdma
systemctl start glusterd.service 
systemctl enable glusterd.service
systemctl status glusterd.service

 8.添加节点到存储信任池中:

#只要在一台Node节点上添加其它节点即可
gluster peer probe node1
gluster peer probe node2
gluster peer probe node3
gluster peer probe node4#在每个Node节点上查看群集状态
gluster peer status

六、创建卷:

1、操作均在node1,要求规划如下:

卷名称卷类型Brick
dis-volume分布式卷node1(/data/sdb1)、node2(/data/sdb1)
stripe-volume条带卷node1(/data/sdc1)、node2(/data/sdc1)
rep-volume复制卷node3(/data/sdb1)、node4(/data/sdb1)
dis-stripe分布式条带卷node1(/data/sdd1)、node2(/data/sdd1)、node3(/data/sdd1)、node4(/data/sdd1)
dis-rep分布式复制卷node1(/data/sde1)、node2(/data/sde1)、node3(/data/sde1)、node4(/data/sde1)

2.创建分布式卷:

#创建分布式卷,没有指定类型,默认创建的是分布式卷
gluster volume create dis-volume node1:/data/sdb1 node2:/data/sdb1 force	#查看卷列表
gluster volume list#启动新建分布式卷
gluster volume start dis-volume#查看创建分布式卷信息
gluster volume info dis-volume

3.创建条带卷:

#指定类型为 stripe,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是条带卷
gluster volume create stripe-volume stripe 2 node1:/data/sdc1 node2:/data/sdc1 force#启动新建条带卷
gluster volume start stripe-volume       #查看创建条带卷信息
gluster volume info stripe-volume        

4.创建复制卷:

#指定类型为 replica,数值为 2,且后面跟了 2 个 Brick Server,所以创建的是复制卷
gluster volume create rep-volume replica 2 node3:/data/sdb1 node4:/data/sdb1 force#启动复制卷
gluster volume start rep-volume  #查看复制卷信息     
gluster volume info rep-volume       

5.创建分布式条带卷:

#指定类型为 stripe,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式条带卷
gluster volume create dis-stripe stripe 2 node1:/data/sdd1 node2:/data/sdd1 node3:/data/sdd1 node4:/data/sdd1 forcegluster volume start dis-stripegluster volume info dis-stripe

6.创建分布式复制卷:

#指定类型为 replica,数值为 2,而且后面跟了 4 个 Brick Server,是 2 的两倍,所以创建的是分布式复制卷
gluster volume create dis-rep replica 2 node1:/data/sde1 node2:/data/sde1 node3:/data/sde1 node4:/data/sde1 forcegluster volume start dis-repgluster volume info dis-rep	

7.查看当前所有卷的列表 

[root@node1 ~]#gluster volume list

七、部署客户端并创建测试文件:

1、关闭防火墙和SElinux:

systemctl stop firewalld
setenforce 0

八、查看卷对应磁盘中的测试文件:

1.查看分布式文件分布:

#查看分布式文件分布					
[root@node1 opt]# ls -lh /data/sdb1    #数据没有被分片[root@node2 ~]# ls -lh /data/sdb1

2.查看条带卷文件分布:

[root@node1 ~]# ls -lh /data/sdc1					#数据被分片50% 没副本 没冗余[root@node2 ~]# ls -lh /data/sdc1					#数据被分片50% 没副本 没冗余

3.查看复制卷文件分布:

[root@node3 ~]# ll -h /data/sdb1					#数据没有被分片 有副本 有冗余     [root@node4 ~]# ll -h /data/sdb1					#数据没有被分片 有副本 有冗余

4.查看分布式条带卷分布:

[root@node1 ~]# ll -h /data/sdd1					#数据被分片50% 没副本 没冗余[root@node2 ~]# ll -h /data/sdd1[root@node3 ~]# ll -h /data/sdd1[root@node4 ~]# ll -h /data/sdd1

 

5.查看分布式复制卷分布:

[root@node1 ~]# ll -h /data/sde1          #数据没有被分片 有副本 有冗余[root@node2 ~]# ll -h /data/sde1[root@node3 ~]# ll -h /data/sde1[root@node4 ~]# ll -h /data/sde1

九、破坏性测试:

1.挂起 node2节点或者关闭glusterd服务来模拟故障:

[root@node2 ~]# init 0[root@zabbix test]#ll /test/dis
总用量 163840
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo1.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo2.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo3.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo4.log

2.条带卷,无法访问,不具备冗余:

[root@zabbix test]#ll /test/stripe/
总用量 0
[root@promote test]#

3、复制卷,在node3和node4上的,关闭node4:

[root@node4 ~]#init 0客户端,仍然存在
[root@zabbix test]#ll /test/rep/
总用量 204800
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo1.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo2.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo3.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo4.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo5.log
[root@promote test]#

4.分布式条带卷,不具备冗余:

[root@zabbix test]#ll /test/dis_stripe/
总用量 0

5、分布式复制卷,具有冗余:

[root@zabbix test]#ll /test/dis_rep/
总用量 204800
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo1.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo2.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo3.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo4.log
-rw-r--r--. 1 root root 41943040 3月   2 23:36 demo5.log

十、其他维护命令:

1.查看GlusterFS卷
gluster volume list 2.查看所有卷的信息
gluster volume info3.查看所有卷的状态
gluster volume status4.停止一个卷
gluster volume stop dis-stripe5.删除一个卷,注意:删除卷时,需要先停止卷,且信任池中不能有主机处于宕机状态,否则删除不成功
gluster volume delete dis-stripe6.设置卷的访问控制
#仅拒绝
gluster volume set dis-rep auth.allow 192.168.184.100#仅允许
gluster volume set dis-rep auth.allow 192.168.184.*	  #设置192.168.184.0网段的所有IP地址都能访问dis-rep卷(分布式复制卷)

总结:

①mysql服务器——>存储数据到挂载目录中/data

②mysql数据会优先交给内核的文件系统处理——>GFS客户端处理(本地)

③GFS客户端会和GFS服务端进行交互,GFS服务端接收到数据,然后再通过挂载的卷的类型,对应保存在后端block块节点服务器上

分布式条带复制卷(Distribute Stripe Replicavolume)三种基本卷的复合卷,通常用于类 Map Reduce 应用器——>存储数据到挂载目录中/data

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/807988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#关于 InputSimulator的用法

InputSimulator 是一个 C# 库,它提供了模拟键盘和鼠标输入的功能,可以方便地在代码中模拟用户的键盘按键和鼠标操作。这在自动化测试、模拟用户操作等场景下非常有用。 使用 InputSimulator 非常简单,只需要几行代码就可以实现模拟输入的功能…

小娱xiaoyu xy-c5 路由器 刷机openwrt

1、刷固件openwrt 顾虑到可能要安装cups(打印服务器)只支持19版本以下的,所以只能安装19的版本,官网没有找到,都是21以上的,所以我只能到外面找玩家自己编译的了。 我这次刷的包是来源于这里:h…

Intrigue Core:一款功能强大的攻击面枚举引擎

关于Intrigue Core Intrigue Core是一款功能强大的开源攻击面枚举引擎,该工具可以帮助广大研究人员更好地管理应用程序的攻击面。 Intrigue Core集成了各种各样的安全数据源,可以将这些数据提取到标准化的对象模型中,并通过图形数据库跟踪关…

工作流引擎常见API(以camunda为例)

在Camunda中,API的继承关系主要体现在各个服务接口之间。以下是Camunda中一些常见服务接口的继承关系: ProcessEngineServices 接口: RepositoryService: 负责管理流程定义和部署。RuntimeService: 负责管理流程实例的…

001-NodeJs全局对象

概念 node是一个运行js的平台,在node中,用global对象取代了Window这个对象。 node中的repl环境可以执行js,通过命令node进入到repl环境。repl环境类似于Chrome的开发人员工具。 全局对象global 可以参考一下它的文档global全局对象 node版本介绍&am…

GPT-4对多模态大模型在多模态预训练、 理解生成上的启发

传统人工智能 模型往往依赖大量有标签数据的监督训练,而且一个模型一般只能解决一个任务,仅适用于单一场景, 这使得人工智能的研发和应用成本高,场景适应能力弱,难以规模化应用。 常见的多模态任务大致可以分为两类: 多模态理解任务,如视频 分类、视觉问答、跨模态检索、指代…

ARM Cordio WSF(三)——WSF在nRF52840平台移植

前文介绍了WSF架构及其WSF API,本文将介绍如何在一个硬件平台上使用WSF,这里基于stack项目下的nRF52840平台进行介绍。 3、PAL实现 对于要在一个处理器上运行WSF(逻辑情况),需要处理系统的调度、系统SysTick、中断上下…

征程 5 芯片架构

文章目录 简介图像处理升级丰富异构计算自动驾驶 I/O 接口功能安全和信息安全保障征程 5 架构性能指标简介 征程5 是地平线第三代车规级产品,也是国内首颗遵循 ISO 26262 功能安全认证流程开发,并通过ASIL-B 认证的车载智能计算方案;⁣基于最新的地平线BPU 贝叶斯架构设计,…

Excel 防止数字变为E+的技巧

方式一:开始选项卡 ⇒ 分数 方式二:设置单元格格式 ⇒ 自定义 ⇒ 0 方式三 设置单元格格式为纯文本后,在粘贴数据当数字过长的时候(例如身份证号),超过15位之后的数字都会变成0。 此时可以在数字前添加一个符号,例如 …

润色问题解惑

上博士为了毕业写学术论文头都大了,但更难受的是英语不咋地,投稿后经常会因为语言问题而惨遭拒稿,每每想起就令人心情郁郁,天台可期。有些审稿人也会直接告知需要专业的修改,那咋整呢,让润色呗,…

LeetCode 142.环形链表II(数学公式推导)

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整…

Navicat的详细下载步骤

第一步,打开百度,找到Navicat官网 第二步,点击产品然后进去 第三步,点击直接下载然后跟着步骤来就OK啦

Centos7配置秘钥实现集群免密登录

设备:MacBook Pro、多台Centos7.4服务器(已开启sshd服务) 大体流程:本机生成秘钥,将秘钥上传至服务器即可实现免密登录 1、本地电脑生成秘钥: ssh-keygen -t rsa -C "邮箱地址 例:*****.163.com"一路回车…

跟TED演讲学英文:The inside story of ChatGPT‘s astonishing potential by Greg Brockman

The inside story of ChatGPT’s astonishing potential Link: https://www.ted.com/talks/greg_brockman_the_inside_story_of_chatgpt_s_astonishing_potential Speaker: Greg Brockman Date:April 2023 文章目录 The inside story of ChatGPTs astonishing potentialIntro…

功能强大的开源数据中台系统 DataCap 2024.03.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台,建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-commun…

基于springboot+vue实现的高校宿舍管理系统(界面优美,十分推荐)

一、项目简介 本项目是一套基于springbootvue实现的高校宿舍管理系统设计与实现 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观…

探索 Java 网络爬虫:Jsoup、HtmlUnit 与 WebMagic 的比较分析

1、引言 在当今信息爆炸的时代,网络数据的获取和处理变得至关重要。对于 Java 开发者而言,掌握高效的网页抓取技术是提升数据处理能力的关键。本文将深入探讨三款广受欢迎的 Java 网页抓取工具:Jsoup、HtmlUnit 和 WebMagic,分析…

如何应用电桥电路的原理?

电桥电路是一种常用的测量技术,它利用了四个电阻的网络来检测电路的平衡状态。在平衡状态下,电桥的输出电压为零,这种特性使得电桥电路非常适合于精确测量电阻、电感、电容等电气参数,以及用于传感器和测量设备中。以下是电桥电路…

浏览器输入URL并回车都发生了什么?

浏览器输入URL并回车都发生了什么 **URL 解析****DNS 查询****TCP 连接建立与断开****应用层:发送 HTTP 请求****传输层:TCP 传输报文****网络层:IP 协议查询 MAC 地址****链路层:以太网协议****Mac 地址****三次握手****四次挥手…

C++初阶 | [十二] 模板进阶

摘要&#xff1a;非类型模板参数&#xff0c;类模板的特化&#xff0c;模板的分离编译&#xff0c;模板总结 前言&#xff1a;C初阶终篇 1. 非类型模板参数 类型模板参数&#xff1a;如下代码&#xff0c;T 为模板的类型参数。 #define N 10 template<class T> class …