一、GlusterFS概述

分布式文件系统由来

  在介绍之前我们先来看下文件系统及典型的NFS文件系统。

  计算机通过文件系统管理,存储数据的。而现在数据信息时代中人们可获取数据成指数倍的增长,单纯通过增加硬盘个数来拓展计算机系统的存储的方式,已经明显不能满足目前的需求。
  分布式文件系统可以有效解决数据的存储和管理难题,将固定于某个地点的某个文件系统,拓展到多个地点、多个文件系统。众多的节点组成一个文件系统网络,每个节点可以分布在不同的区域的地点,通过网络进行节点间的通信和数据传输。人们无需关系数据存储哪个节点上或从哪个节点获取的,只需要像使用本地文件一样管理和存储文件系统中的数据。

典型代表NFS

  NFS即网络文件系统,它允许网络计算机之间通过TCP/IP网络共享资源,在NFS应用中,本地的NFS客户端应用可以透明的读取远端NFS服务器上的文件。

优点如下:

  1.节约使用的磁盘空间

  客户端经常使用的数据可以集中放在一台机器上,并使用NFS发布,那么网络内部所有计算机可以通过网络访问,不必单独共享。

  2.节约硬件资源

  NFS还可以共享软驱,CDROM和ZIP等存储设备,减少整个网络上的可移动设备的数量。

  3.用户主目录设定

  对于特殊用户,如管理员等,为了管理的需要,可能会经常登录到网络中所有的计算机,若每个客户端,均保存这个用户的主目录很繁琐,而且不能保证数据的一致性,实际上,经过NFS服务的设定,然后在客户端指定这个用户主目录位置,并自动挂载,就可以在任何计算机上使用用户主目录的文件。

GlusterFS概述

  GlusterFS是Scale-Out存储解决方案Gluster的核心,它是一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS借助TCP/IP或GlusterFS基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。
  GlusterFS支持运行在任何标准的IP网络上标准应用程序客户端,用户可以在全局统一的命名空间使用NFS、CIFS等标准协议来访问应用数据。GlusterFS使用的用户可摆脱原有的独立,高成本的封闭存储系统,能够利用普通廉价的存储设备来部署可集中管理、横向拓展、虚拟化的存储池,存储容量可拓展至TP/PB级.

前glusterfs已rehat收购,官方网站是:https://www.gluster.org/

GlusterFS安装部署

1.安装glusterfs依赖的包

yum install -y centos-release-gluster37.noarch
yum --enablerepo=centos-gulster*-test install gluster-server gluster-cli gluster-geo-replication

二、GlusterFS安装部署实践

2.1GlusterFS安装环境准备

#准备好4台Centos6-x86_64虚拟机 内存1G 数据盘10G 网络选择nat;

每台机器,关闭 selinux iptables并做每台好主机名解析:

  192.168.10.101 mystorage1
  192.168.10.102 mystorage2
  192.168.10.103 mystorage3
  192.168.10.104 mystorage4

补充说明:

#修改主机名2个位置

1. 修改 /etc/sysconfig/network 另外一个是  /etc/hosts
vi /etc/sysconfig/network
里面有一行 HOSTNAME=localhost.localmain修改成localhost.localdomain作为主机名
/etc/hosts里面有一行 127.0.0.1 localhost.localdomain(主机名hostname)

2.2关闭selinux及iptables

#关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux或
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
#关闭iptables
/etc/init.d/iptables stop
#永久关闭
chkconfig iptables off

2.3安装epel源(4台主机分别执行)

GlusterFS yum 源有部分包依赖epel源
yum -y install epel-release

2.4安装glusterfs源(4台主机分别执行)

wget -P /etc/yum.repos.d/
https://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/RHEL/glusterfs-epel.repo

或者gluster的相关包下载到本地目录

主要包括

glusterfs-3.7.4-2.e16.x86_64.rpm
glusterfs-cli-3.7.4-2.e16.x86_64.rpm
glusterfs-debuginfo-3.7.4-2.e16.x86_64.rpm
glusterfs-geo-replication-3.7.4-2.e16.x86_64.rpm
glusterfs-rdma-3.7.4-2.e16.x86_64.rpm
glusterfs-api-3.7.4-2.e16.x86_64.rpm
glusterfs-client-xlators-3.7.4-2.e16.x86_64.rpm
glusterfs-fuse-3.7.4-2.e16.x86_64.rpm
glusterfs-libs-3.7.4-2.e16.x86_64.rpm
glusterfs-server-3.7.4-2.e16.x86_64.rpm

下载地址:

https://download.gluster.org/pub/gluster/glusterfs/3.7/LATEST/CentOS/epel-6.8/x86_64/

例如:(4台主机分别执行)

mkdir -p /opt/glusterfs
执行yum -y install glusterfs-*

一直执行完毕,没有报错的话,glusterfs安装完毕;

2.5或者yum安装(4台主机分别执行)

yum install -y centos-release-gluster37.noarch
yum --enablerepo=centos-gluster*-test install glusterfs-server glusterfs-cli glusterfs-geo-replication

2.6配置Glusterfs

#查看gluster版本信息

glusterfs -V

#启动停止服务(4台主机分别执行)

/etc/init.d/glusterd start
/etc/init.d/glusterd stop

#添加开机启动(4台主机分别执行)

chkconfig glusterd on

#查看glusterfs的运行状态(4台主机分别执行)

/etc/init.d/glusterd status

2.7存储主机加入信任存储池配置(4台主机分别执行)

说明:每台主机上加入除本机以外对应的其他3台主机的存储池配置

gluster peer probe mystorage2
gluster peer probe mystorage3
gluster peer probe mystorage4

#查看配置连接存储池的状态(4台主机分别执行)

gluster peer status

三、GlusterFS配置实践

3.1 配置之前的准备工作

安装xfs支持包(4台主机分别执行)

yum -y install xfsprogs

fdisk -l #查看磁盘块设备,查看类似的信息

#磁盘分区(这步可以不做)

fdisk /dev/vdb
n
p
1(数字)
回车
w

再次执行fdisk -l查看

说明:如果格式话分区的磁盘大于4T使用 parted命令

生产环境中:磁盘的分区的分区暂时不做。直接对应格式化即可。

#分区格式化,每台机器上执行

mkfs.xfs -f /dev/sdb

#分别在4台机器上 执行

mkdir -p /storage/brick1  #建立挂在块设备的目录
mount /dev/sdb /storage/brick1

执行df -h查看

#开机自动挂载(4台机器中每台执行)

编辑/etc/fstab添加如下

/dev/sdb /storage/brick1 xfs defaults 0 0

或者执行命令:(4台机器中每台执行)

echo "/dev/sdb /storage/brick1 xfs defaults 0 0" >> /etc/fstab

#4台机器中机器分别执行挂载命令

mount -a

#每台机器执行查看挂载情况命令;(4台机器也都自动挂载了)

df -h

3.2创建volume及其操作

  Distributed,分布卷,算法随机分布到bricks组的卷上。
  Replicated 复制试卷,类似raid1 replica数必须等于volume中brick所包含存储服务器数,可用性高。
  Striped,带条带的卷,类似raid0 stripe数必须等于volume中brick所包含的存储服务器数,文件被分割数据模块,以RoundRobin的方式存储在bricks,并发颗粒度是数据块,大文件性能好.
  Distributed Striped分布式的条带卷,volume中的brick所包含的存储服务器数必须是stripe的倍数(>=2倍)兼顾分布式和条带的功能、(生产环境一般不使用,官方也不推荐)
  Distributed Relicated分布式的复制卷,volume中brick1所包含的存储服务器数必须是replica的倍数(>=2倍)兼顾分布式和复制的功能。(生产环境使用较多)

情景1:

3.3创建分布卷(任意一台主机执行即可)[意义是跨主机整合磁盘]

gluster volume create gv1 mystorage1:/storage/brick1 mystorage2:/storage/brick1 force

3.4创建启动卷(任意一台主机执行即可)

[root@ mystorage1brick1]# gluster volume start gv1

#查看配置卷的信息

[root@ mystorage1brick1]# gluster volume info

3.5挂载到目录(任意一台主机执行即可)

mount -t glusterfs 127.0.0.1:/gv1 /mnt

3.6#查看挂载后的磁盘(任意一台主机执行即可)

df -h

3.7创建文件查看测试结果

#mystorage1s上创建文件

[root@mystorage1 mnt]# touch a b c dd ddf

#mystorage3查看创建文件

[root@mystorage3 mnt]# ls
a b c dd ddf

情景2:

3.8测试NFS方式挂载及查看数据

[root@mystorage4 /]# umount /mnt/
[root@mystorage4 /]# mount -o mountproto=tcp -t nfs 192.168.56.11:/gv1 /mnt/
[root@mystorage4 /]# df -h
[root@mystorage4 /]# umount /mnt/

#测试挂载另外一台机器

[root@mystorage4 /]# mount -o mountproto=tcp -t nfs 192.168.56.12:/gv1 /mnt/
[root@mystorage4 /]# df -h
[root@mystorage4 /]# umount /mnt/

情景3:

3.9创建分布式复制卷(storage3和storage4)[生产场景推荐使用此种方式]

[root@mystorage1 mnt]# gluster volume create gv2 replica 2 mystorage3:/storage/brick1 mystorage4:/storage/brick1 force
[root@mystorage2 ~]# gluster volume start gv2
[root@mystorage1 mnt]# df -h
[root@mystorage1 mnt]# mount -t glusterfs 127.0.0.1:/gv2 /opt
[root@mystorage1 mnt]# df -h
[root@mystorage1 mnt]# cd /opt/
[root@mystorage1 opt]# touch sdfsd sdf

3.10测试查看分布式复制的数据(storage3和storage4)

[root@mystorage3 mnt]# cd /storage/brick1
[root@mystorage3 brick1]# ls
sdfsd sdf
[root@mystorage4 mnt]# cd /storage/brick1
[root@mystorage4 brick1]# ls
sdfsd sdf

说明:以上两种情况,一是创建分布卷,另外创建分布式复制卷,生产场景中一般使用1个卷(整合多个磁盘到一个卷)使用分布式复制卷场景(情景3)居多。

情景4:

3.11创建分布式条带卷

#创建卷目录(4台主机分别执行)

mkdir -p /storage/brick2

#添加开机启动自动挂载(4台主机分别执行)

echo "/dev/sdc /storage/brick2 xfs defaults 0 0" >>/etc/fstab

#执行挂载(4台主机分别执行)

mount -a

#查看挂载情况(4台主机分别执行)

df -h

#创建分布式条带卷(storage1上执行)

gluster volume create gv3 stripe 2 mystorage3:/storage/brick2 mystorage4:/storage/brick2 force

#启动卷(storage1上执行)

gluster volume start gv3

#查看配置卷信息

gluster volume info

#创建要挂载的目录(分别在4台机器的根上新建gv1 gv2 gv3)

mkdir /gv1 /gv2 /gv3

#执行挂载命令(storage4上执行)(4台机器也可都执行)

mount -t glusterfs 127.0.0.1:gv1 /gv1
mount -t glusterfs 127.0.0.1:gv2 /gv2
mount -t glusterfs 127.0.0.1:gv3 /gv3
df -h

#我们创建一个10M的目录测试(storage4上)

[root@mystorage4 gv3]# ls -a
. .. .trashcan
[root@mystorage4 gv3]# dd if=/dev/zero bs=1024 count=10000 of=/gv3/10M.file
[root@mystorage4 gv3]# dd if=/dev/zero bs=2048 count=10000 of=/gv3/20M.file
[root@mystorage4 gv3]# cd /storage/brick2
[root@mystorage4 brick2]# ls -lh

#进入到storage3上看下

[root@mystorage3 gv3]# cd /storage/brick2
[root@mystorage3 brick2]# ls -lh

对比两边的文件你会发现两个文件被打散分别存储在storage3和storage4上了、

[root@mystorage3 gv3]# ls -lh  #也会看到刚我们创建的两个文件。

#我们在storage3上 gv2目录测试

[root@mystorage3 gv2]# dd if=/dev/zero bs=1024 count=10000 of=/gv2/10M.file
[root@mystorage3 gv2]# dd if=/dev/zero bs=2048 count=10000 of=/gv2/20M.file

#进入到storage3 brick1和storage4 brick1对比查看

[root@mystorage3 brick1]# ls -lh
[root@mystorage4 brick1]# ls -lh

3.12 添加磁盘操作

#停止gv2 数据服务

gluster volume stop gv2

#添加新加的磁盘的到存储池

gluster volume add-brick gv2 replica 2 mystorage1:/storage/brick2 mystorage2:/storage/brick2 force

#启动启动卷

gluster volume start gv2

#取消挂载gv2,重新挂载

umount /gv2
mount -t glusterfs 127.0.0.1:/gv2 /gv2

#查看挂载结果(gv2已经变成20G了)

df -h

#查看gv2卷信息

gluster volume info gv2

注意说明:

当你给分布式复制卷和分布式条带卷中增加bricks时,你增加的bricks的数目必须是复制卷和条带卷数目的倍数。例如:

你给一个分布式复制卷的replica为2 你在增加bricks的时候数量必须为2.4.6.8等。

3.13磁盘存储的平衡:

  注意;平衡布局是很有必要的,因为布局结构是静态的,当新的bricks加入现有卷,新建的文件会分布在旧的brick中,所以需要平衡布局结构,使新加入的bricks生效,布局只是使新布局生效。并不会在新的布局上移动老的数据,如果想在新布局生效后,重新平衡卷中的数据,还需要对卷中的数据进行平衡。

执行命令:(可在storage1上执行)

gluster volume rebalance gv2 start

#查看执行平衡后同步的状态

gluster volume rebalance gv2 status

3.14移除brick

  注意:你可能想在线缩小卷的大小。例如:当硬件损坏或者网络故障的时候,你可能想在卷中移除相关的bricks注意,当你移除bricks的时候,你在gluster的挂载点不能继续访问数据,只有配置文件中的信息移除后你才能继续访问bricks的数据。当移除分布式复制卷或者分布式条带卷的时候,移除的bricks数目必须是replica或者stripe的倍数。例如:一个分布式条带卷的stripe是2 当你移除bricks的时候必须是2、4、6、8等。

执行操作:

gluster volume stop gv2

#移除操作

gluster volume remove-brick gv2 replica 2 mystorage3:/storage/brick1 mystorage4:/storage/brick1 force

3.15删除卷

#storege4上看下挂载情况

df -h

#卸载gv1

umount /gv1

#停止卷

gluster volume stop gv1

#删除卷

gluster volume

#查看卷信息

gluster volume info gv1

GlusterFS在企业中应用场景

  理论和实践分析,GlusterFS目前主要使用大文件存储场景,对于小文件尤其是海量小文件,存储效率和访问性能都表现不佳,海量小文件LOSF问题是工业界和学术界的人工难题,GlusterFS作为通用的分布式文件系统,并没有对小文件额外的优化措施,性能不好也是可以理解的。

Media
  -文档、图片、音频、视频
 *Shared storage  
  -云存储、虚拟化存储、HPC(高性能计算)
 *Big data
  -日志文件、RFID(射频识别)数据
 

###########################################################################################

一、构建高性能分布式存储基本条件和要求

1.1硬件要求:

  一般选择2U的机型,磁盘STAT盘4T,如果I/O要求比较高,可以采购SSD固态硬盘。为了充分保证系统的稳定性和性能,要求所有的Glusterfs服务器硬件配置尽量一致,尤其是硬盘数量和大小。机器的RAID卡需要带电池,缓存越大,性能越好,一般情况下建议做RAID10,如果出于空间要求的考虑,需要做RAID5,建议最好能有1-2块硬盘的热备盘。

1.2系统要求和分区划分

 系统要求:
   建议使用Centos6.x安装完成后升级到最新版本。
 分区划分:
   安装的时候,不要选择LV,建议/boot分区200M分区100G,swap分区和内存一样的大小,剩余空间给gluster使用,划分单独的硬盘空间,系统安装软件没有特殊要求,建议出了开发工具和基本的管理软件,其他软件一律安装。

1.3网络环境

  网络要求全部千兆环境,gluster服务器至少有2块网卡,1块网卡绑定供gluster使用,另外1块管理网络ip用于系统管理。如果有条件购买万兆交换机,服务器可配置万兆网卡,存储性能会更好,网络方面如果安全性要求较高,可以多网卡绑定。

1.4服务器摆放分布

  服务器主备要求放在不同的机柜,连接不同的交换机,即使一个机柜出现问题,还有一份数据能够正常访问。



1.5构建高性能高可用存储

  一般在企业中,采用的是分布式复制卷,因为有数据备份,数据相对安全,分布式条带卷目前对gulsterfs来说没有完全成熟,存储一定的数据安全风险。

补充说明:

  开启防火墙端口

  一般在企业中linux的防火墙是打开的,部署gluster服务服务器需要开通如下端口:

命令如下:

iptables -I INPUT -p tcp --dport 24007:24011 -j ACCEPT
iptables -I INPUT -p tcp --dport 38465:38485 -j ACCEPT

部署安装GlusterFS见前面文章https://www.liuliya.com/archive/733.html

二、构建高性能分布式存储实践优化

2.1GlusterFS文件系统优化

Auth_allow  #IP访问授权;缺省值(*.allow all);合法值:Ip地址
Cluster.min-free-disk  #剩余磁盘空间阀值;缺省值(10%);合法值:百分比
Cluster.stripe-block-size  #条带大小;缺省值(128KB);合法值:字节
Network.frame-timeout  #请求等待时间;缺省值(1800s);合法值:1-1800
Network.ping-timeout  #客户端等待时间;缺省值(42s);合法值:0-42
Nfs.disabled  #关闭NFS服务;缺省值(Off);合法值:Off|on
Performance.io-thread-count  #IO线程数;缺省值(16);合法值:0-65
Performance.cache-refresh-timeout  #缓存校验时间;缺省值(1s);合法值:0-61
Performance.cache-size  #读缓存大小;缺省值(32MB);合法值:字节
Performance.quick-read: #优化读取小文件的性能
Performance.read-ahead: #用预读的方式提高读取的性能,有利于应用频繁持续性的访问文件,当应用完成当前数据块读取的时候,下一个数据块就已经准备好了。
Performance.write-behind:先写入缓存内,在写入硬盘,以提高写入的性能。
Performance.io-cache:缓存已经被读过的、

2.2优化参数调整方式

命令格式:
gluster.volume set <卷><参数>

例如:

#打开预读方式访问存储

[root@mystorage gv2]# gluster volume set gv2 performance.read-ahead on

#调整读取缓存的大小

[root@mystorage gv2]# gluster volume set gv2 performance.cache-size 256M

2.3监控及日常维护

  使用zabbix自带的模板即可,CPU、内存、磁盘空间、主机运行时间、系统load。日常情况要查看服务器监控值,遇到报警要及时处理。

#看下节点有没有在线

gluster volume status nfsp

#启动完全修复

gluster volume heal gv2 full

#查看需要修复的文件

gluster volume heal gv2 info

#查看修复成功的文件

gluster volume heal gv2 info healed

#查看修复失败的文件

gluster volume heal gv2 heal-failed

#查看主机的状态

gluster peer status

#查看脑裂的文件

gluster volume heal gv2 info split-brain

#激活quota功能

gluster volume quota gv2 enable

#关闭quota功能

gulster volume quota gv2 disable

#目录限制(卷中文件夹的大小)

gluster volume quota limit-usage /data/30MB --/gv2/data

#quota信息列表

gluster volume quota gv2 list

#限制目录的quota信息

gluster volume quota gv2 list /data

#设置信息的超时时间

gluster volume set gv2 features.quota-timeout 5

#删除某个目录的quota设置

gluster volume quota gv2 remove /data

备注:

  quota功能,主要是对挂载点下的某个目录进行空间限额。如:/mnt/gulster/data目录,而不是对组成卷组的空间进行限制。

三、Gluster日常维护及故障处理

3.1硬盘故障

  因为底层做了raid配置,有硬件故障,直接更换硬盘,会自动同步数据。

如果没有做raid处理方法:

  1)正常node 执行gluster volume status 记录故障节点uuid
  2)执行getfattr -d -m '.*' /brick
  3)记录trusted.glusterfs.volume-id 及trusted.gfid

例如:

[root@mystorage1 gv2]# getfattr -d -m '.*' /storage/brick2

在机器上更换新磁盘,挂载目录

执行如下命令:

setfattr -n trusted.glusterfs.volume-id -v 记录值 brickpath
setfattr -n trusted.gfid -v 记录值 brickpath
/etc/init.d/glusterd restart

3.2主机故障

一台节点故障的情况包括以下情况:

  a)物理故障;
  b)同时有多快硬盘故障,造成数据丢失;
  c)系统损坏不可修复

解决方法:

  1)找一台完全一样的机器,至少要保证数量和大小一致,安装系统,配置和故障机器同样的ip安装gluster软件,保证配置都一样,在其他健康的节点上执行命令gluster peer status,查看故障服务器的uuid。
  2)修改新加机器的/var/lib/glusterd/glusterd.info和故障机器的一样。

cat /var/lib/glusterd/glusterd.info
UUID=2e3B51aa-45b2-4cc0-bc44-457d42210ff1

在新机器挂在目录上执行磁盘故障的操作,在任意节点上执行
[root@mystorage1 gv2]# gluster volume heal gv1 full
就会自动开始同步,但是同步的时候会影响整个系统的性能。
  3)查看状态
[root@drbd01~]# gluster volume heal gv2 info

  工作Glusterfs还有很多优化的位置点。具体细节官方文档最详细哈。

http://gluster.readthedocs.io/en/latest/Contributors-Guide/Guidelines-For-Maintainers/

 
 

学习GlusterFS(六)的更多相关文章

  1. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  2. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. Bootstrap3.0学习第六轮(表单)

    Bootstrap3.0学习第六轮(表单) 前言 阅读之前您也可以到Bootstrap3.0入门学习系列导航中进行查看http://www.cnblogs.com/aehyok/p/3404867.h ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Maven学习(六)-- Maven与Eclipse整合

    由于我使用的是IDEA所以就不摘录了,感兴趣的移步 Maven学习总结(六)--Maven与Eclipse整合 Maven学习总结(七)--eclipse中使用Maven创建Web项目  

  7. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  8. Python学习第六课

    Python学习第六课 课前回顾 列表 创建 通过 [] :写在[]里,元素之间用逗号隔开 对应操作: 查 增 append insert 改(重新赋值) 删除(remove del pop(删除后会 ...

  9. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  10. 【转载】 强化学习(六)时序差分在线控制算法SARSA

    原文地址: https://www.cnblogs.com/pinard/p/9614290.html ------------------------------------------------ ...

随机推荐

  1. 【windows 访问控制】七、window 访问控制编辑器(Access Control Editor)

    window 访问控制编辑器(Access Control Editor) 右键(文件.目录.程序)>选择属性>安全>高级   进入访问控制编辑器

  2. .NET 6 在小并发下如何生成唯一单据号

    一.场景介绍 小并发下要解决生成单据号的问题,会碰到哪些问题呢?,接下来让我们一探究竟[这是小并发的解决方案,大家有更好的做好可以一起讨论分享]. 之所以叫小并发:是因为确实是小并发场景的应用模式,一 ...

  3. Java:输入输出、格式化输出

    1.输出 都在System.out模块下,常用方法有: print:输出: println:输出并换行: printf:格式化输出: 2.格式化输出 格式化输出的方法是System.out.print ...

  4. selenium+python自动化-元素定位

    自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告. 本篇主要讲几种基本的元素定位方法元素定位在这四个环节中是至关重要的,如果说按学习精力 ...

  5. 基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目

    基于ESP8266+BY8301语音模块的与山地车捉迷藏的小项目 写在前面: 不知道大家有没有经历过,在茫茫车海中找不到自己山地车情况,针对这个痛点(开玩笑的),我做了个小玩意,纯属娱乐,拿出来,在疫 ...

  6. const 对象的属性能否修改

    const保证的并不是变量的值不能改动,而是变量指向的那个内存地址不能改动. 对于基本类型的数据(数值.字符串.布尔值),其值就保存在变量指向的那个内存地址,因此等同于常量. 对于引用类型的数据(主要 ...

  7. 『现学现忘』Docker常用命令 — 21、容器常用命令(三)

    目录 13.进入正在运行的容器并以命令行交互 (1)方式一 (2)方式二 (3)attach和exec的区别 14.从容器内拷贝文件到主机上 15.Docker常用命令小结 (1)容器生命周期管理 ( ...

  8. 为什么 TCP 链接需要三次握手,两次不可以么,为什么?

    两次握手  三次握手

  9. Linux性能优化实战内存篇(五)

    一.Linux内存工作原理 1,内存映射 Linux内核给每个进程都提供了一个独立的虚拟空间,并且这个地址空间是连续的.这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存. 虚拟地址空间的内部 ...

  10. VuePress 博客之 SEO 优化(二)重定向

    前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇讲讲 ...