搭建iscsi存储系统(一)

(1).配置ISCSI多路径实现磁盘挂载高可用

  如果存储服务器到交换机只有一条线路的时候,那么一条线路出现故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障。

 1)实验环境

youxi1  192.168.5.101,1.1.5.129  服务端

youxi2  192.168.5.102,1.1.5.130  客户端

 2)搭建target服务器

[root@youxi1 ~]# yum -y install targetcli
[root@youxi1 ~]# targetcli  //进入交互配置
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'. /> /backstores/block create test1 /dev/sdb  //使用/dev/sdb创建自定义存储对象test1
Created block storage object test1 using /dev/sdb.
/> /iscsi create iqn.2019-08.com.youxi1:server  //创建ISCSI target
Created target iqn.2019-08.com.youxi1:server.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/acls create iqn.2019-08.com.youxi1:username  //创建ACL规则列表名
Created Node ACL for iqn.2019-08.com.youxi1:username
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/luns create /backstores/block/test1  //指定存储对象为target的逻辑单元,逻辑单元号为LUN0
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2019-08.com.youxi1:username
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/portals/ delete 0.0.0.0 3260  //删除原有监听IP和端口
Deleted network portal 0.0.0.0:3260
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/portals/ create 192.168.5.101 3260  //重新指定监听IP和端口
Using default IP port 3260
Created network portal 192.168.5.101:3260.
/> /iscsi/iqn.2019-08.com.youxi1:server/tpg1/portals/ create 1.1.5.129 3260
Using default IP port 3260
Created network portal 1.1.5.129:3260.
/> saveconfig  //保存
Configuration saved to /etc/target/saveconfig.json
/> exit  //退出
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
[root@youxi1 ~]# systemctl start target && systemctl enable target  //启动并开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
[root@youxi1 ~]# yum -y install net-tools
[root@youxi1 ~]# ss -antup | grep 3260
tcp LISTEN 0 256 192.168.5.101:3260 *:*
tcp LISTEN 0 256 1.1.5.129:3260 *:*
[root@youxi1 ~]# firewall-cmd --permanent --zone=public --add-port=3260/tcp  //防火墙添加端口号
success
[root@youxi1 ~]# firewall-cmd --reload
success

 3)搭建客户端youxi2

[root@youxi2 ~]# yum -y install iscsi-initiator-utils  //安装客户端
[root@youxi2 ~]# vim /etc/iscsi/initiatorname.iscsi  //配置ACL规则列表名称
InitiatorName=iqn.2019-08.com.youxi1:username
[root@youxi2 ~]# systemctl start iscsid && systemctl enable iscsid  //启动并设置开机自启
Created symlink from /etc/systemd/system/multi-user.target.wants/iscsid.service to /usr/lib/systemd/system/iscsid.service.
[root@youxi2 ~]# iscsiadm -m discovery -t st -p 192.168.5.101  //查找ISCSI设备
1.1.5.129:3260,1 iqn.2019-08.com.youxi1:server
192.168.5.101:3260,1 iqn.2019-08.com.youxi1:server
[root@youxi2 ~]# iscsiadm -m node --login  //登录/连接ISCSI设备
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] (multiple)
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] (multiple)
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] successful.
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] successful.
[root@youxi2 ~]# ls /dev/sd*  //可以看到出现了sdb和sdc,这两个是同一个硬盘
/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc
[root@youxi2 ~]# mkfs.xfs /dev/sdb -f  //格式化,只有第一次才需要,如果者服务器端或其他客户端已经格式化,无需操作
meta-data=/dev/sdb isize=512 agcount=4, agsize=1310720 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5242880, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@youxi2 ~]# mkdir /share  //创建挂载目录
[root@youxi2 ~]# mount /dev/sdb /share/  //挂载
[root@youxi2 ~]# echo aabbcc > /share/a.txt
[root@youxi2 ~]# mkdir /share2
[root@youxi2 ~]# mount /dev/sdc /share2  //这是由于sdb和sdc是同一块盘,它们的UUID是相同的,不能重复挂载
mount: 文件系统类型错误、选项错误、/dev/sdc 上有坏超级块、
缺少代码页或助手程序,或其他错误 有些情况下在 syslog 中可以找到一些有用信息- 请尝试
dmesg | tail 这样的命令看看。
[root@youxi2 ~]# blkid /dev/sdb /dev/sdc  //查看UUID
/dev/sdb: UUID="580a45fc-0957-45ee-bcbd-13ce85e11e59" TYPE="xfs"
/dev/sdc: UUID="580a45fc-0957-45ee-bcbd-13ce85e11e59" TYPE="xfs" [root@youxi2 ~]# mount -t xfs -o nouuid /dev/sdc /share2  //跳过UUID进行挂载
[root@youxi2 ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/vg1-root 17G 1.2G 16G 8% /
devtmpfs 476M 0 476M 0% /dev
tmpfs 488M 0 488M 0% /dev/shm
tmpfs 488M 7.7M 480M 2% /run
tmpfs 488M 0 488M 0% /sys/fs/cgroup
/dev/sda1 1014M 130M 885M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/sdb 20G 33M 20G 1% /share
/dev/sdc 20G 33M 20G 1% /share2

 4)查看连接结构

[root@youxi2 ~]# yum -y install tree
[root@youxi2 ~]# tree /var/lib/iscsi/
/var/lib/iscsi/
├── ifaces
├── isns
├── nodes
│   └── iqn.2019-08.com.youxi1:server
│   ├── 1.1.5.129,3260,1
│   │   └── default
│   └── 192.168.5.101,3260,1
│   └── default
├── send_targets
│   └── 192.168.5.101,3260
│   ├── iqn.2019-08.com.youxi1:server,1.1.5.129,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-08.com.youxi1:server/1.1.5.129,3260,1
│   ├── iqn.2019-08.com.youxi1:server,192.168.5.101,3260,1,default -> /var/lib/iscsi/nodes/iqn.2019-08.com.youxi1:server/192.168.5.101,3260,1
│   └── st_config
├── slp
└── static 12 directories, 3 files

 5)回到服务器端查看连接状态

[root@youxi1 ~]# ss -antup | grep 3260
tcp LISTEN 0 256 192.168.5.101:3260 *:*
tcp LISTEN 0 256 1.1.5.129:3260 *:*
tcp ESTAB 0 0 1.1.5.129:3260 1.1.5.130:55902
tcp ESTAB 0 0 192.168.5.101:3260 192.168.5.102:40218

(2).在存储客户端上配置多路径设备

  在以上基础下继续实验,将同一设备的多路径整合,只呈现出一个设备形式,通过使用。

 1)多路径软件Device Mapper Multipath

  多路径软件Device Mapper Multipath(DM-Multipath)可以将服务器节点和存储阵列之间的多条I/O链路配置为一个单独的设备。这些I/O链路是由不同的线缆、交换机、控制器组成的SAN物理链路。Multipath将这些链路聚合在一起,生成一个单独的新的设备。

  特点:

    数据冗余。DM-Multipath可以实现在active/passive(主动/被动)模式下的灾难转移。在active/passive模式下,只有一半的链路在工作,如果链路上的某一部分(线缆、交换机、控制器)出现故障,DM-Multipath就会切换到另一半链路上。

    提高性能。DM-Multipath也可以配置为active/active模式,从而I/O任务以round-robin的方式分布到所有的链路上去。通过配置,DM-Multipath还可以检测链路上的负载情况,动态地进行负载均衡。

 2)客户端安装多路径软件服务

[root@youxi2 ~]# yum -y install device-mapper-multipath
[root@youxi2 ~]# cp /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf /etc/
[root@youxi2 ~]# systemctl start multipathd.service  //注意,一定要把配置文件拷贝到/etc/目录下,否则会报找不到配置文件
[root@youxi2 ~]# multipath -ll  //没有输出信息表示出错
[root@youxi2 ~]# umount /share  //卸载挂载点
[root@youxi2 ~]# umount /share2
[root@youxi2 ~]# systemctl restart iscsid  //重启iscsid服务
[root@youxi2 ~]# systemctl restart multipathd.service  //重启multipathd服务
[root@youxi2 ~]# multipath -ll  //再次查看
//36001405179b62d3082e4604ae5326cd6远程存储设备id,dm-2 LIO-ORG厂商,test1产品ID(我们自己设置的)
mpatha (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active  //默认使用主动模式的链路
| `- 33:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled  //有效的链路,但不是活动链路
`- 34:0:0:0 sdc 8:32 active ready running
[root@youxi2 ~]# ll /dev/mapper/mpatha  //查看生成的设备文件
lrwxrwxrwx 1 root root 7 8月 23 13:55 /dev/mapper/mpatha -> ../dm-2

  每个多路径设备都具备一个全局标识(WWID,World Wide Identifir)。36001405179b62d3082e4604ae5326cd6就是WWID,远程存储设备的产品信息。由于sdb和sdc是同一个远端存储设备,所以产品信息一致,被多路径驱动发现后会生成一个设备文件/dev/mapper/mpatha。

 3)启动高可用负载均衡模式

[root@youxi2 ~]# vim /etc/multipath.conf
//可以再第74行下面添加,也可以从第60行开始启用
multipaths {
multipath {
wwid 36001405179b62d3082e4604ae5326cd6  //指定实际的WWID
alias Web  //映射后的别名,自定义
path_grouping_policy multibus  //路径组策略
path_selector "round-robin 0"  //轮询
failback manual
rr_weight priorities
no_path_retry 5
}
}
[root@youxi2 ~]# systemctl restart multipathd.service  //重启multipathd服务
[root@youxi2 ~]# systemctl restart iscsid  //重启iscsi,重新识别
[root@youxi2 ~]# multipath -ll  //再次查看
Web (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active  //可以看到采用轮询,并且两个都是running
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 active ready running
[root@youxi2 ~]# ll /dev/mapper/Web  //可以看到自定义的映射别名
lrwxrwxrwx 1 root root 7 8月 23 15:35 /dev/mapper/Web -> ../dm-2
[root@youxi2 ~]# mount /dev/mapper/Web /share  //挂载可用
[root@youxi2 ~]# ls /share
a.txt

 4)模拟故障

  关闭服务器端的ens33(192.168.5.101)网卡

[root@youxi1 ~]# ifdown ens33

  过一段时间查看,并进行测试

[root@youxi2 ~]# multipath -ll
Web (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 failed faulty running  //可以看到sdcfailed
[root@youxi2 ~]# echo bbb > /share/b.txt
[root@youxi2 ~]# ls /share
a.txt b.txt

  打开服务器端的ens33(192.168.5.101)网卡,可以发现sdc又恢复了正常

[root@youxi2 ~]# multipath -ll
Web (36001405179b62d3082e4604ae5326cd6) dm-2 LIO-ORG ,test1
size=20G features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 33:0:0:0 sdb 8:16 active ready running
`- 34:0:0:0 sdc 8:32 active ready running

(3).使用udev规则为每个target创建固定名字的软链接(了解)

 1)udev

  udev是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。udev会根据用户添加/删除硬件的行为,自处理/dev目录下所有设备文件。主要配置文件为/etc/udev/udev.conf。设备文件名字规则目录/lib/udev/rules.d/。

[root@youxi2 ~]# ls /lib/udev/rules.d/  //命名规则开头数字,结尾.rules
10-dm.rules 70-touchpad.rules
11-dm-lvm.rules 70-uaccess.rules
11-dm-mpath.rules 71-biosdevname.rules
13-dm-disk.rules 71-seat.rules
40-redhat.rules 73-idrac.rules
......

  运行机制和注意事项:

    1、udev按照规则文件名的数字顺序来查询全部规则文件,然后为匹配规则的设备,创建其设备文件或文件链接。

    2、通常情况下,建议让自己想要的规则文件最先被解析。比如,创建一个名为 /etc/udev/rules.d/10-myrule.rules的文件,并把你的规则写入该文件,这样udev就会在解析系统默认的规则文件之前解析到你的文件。

    3、在规则文件里,除了以“#”开头的行(注释),所有的非空行都被视为一条规则,但是一条规则不能扩展到多行。

    4、规则都是由多个键值对(key-valuepairs)组成,并由逗号隔开,键值对可以分为条件匹配键值对(以下简称“匹配键”)和赋值键值对(以下简称“赋值键”),一条规则可以有多条匹配键和多条赋值键。

    5、匹配键是匹配一个设备属性的条件,当一个设备的属性匹配了该规则里所有的匹配键,就认为这条规则生效,然后按照赋值键的内容,执行该规则的赋值。

udev规则的匹配键:

  1. ACTION: 事件 (uevent) 的行为,例如:add( 添加设备 )、remove( 删除设备 )。

  2. KERNEL: 内核设备名称,例如:sda, cdrom。

  3. DEVPATH:设备的devpath 路径。

  4. SUBSYSTEM: 设备的子系统名称,例如:sda 的子系统为 block。

  5. BUS: 设备在 devpath 里的总线名称,例如:usb。

  6. DRIVER: 设备在 devpath 里的设备驱动名称,例如:ide-cdrom。

  7. ID: 设备在 devpath 里的识别号。

  8. SYSFS{filename}: 设备的 devpath 路径下,设备的属性文件“filename”里的内容。

  9. ENV{key}: 环境变量。在一条规则中,可以设定最多五条环境变量的 匹配键。

    1.PROGRAM:调用外部命令。

    2.RESULT: 外部命令 PROGRAM 的返回结果。

udev重要的赋值键:

  1. NAME:在 /dev下产生的设备文件名。只有第一次对某个设备的 NAME 的赋值行为生效,之后匹配的规则再对该设备的 NAME 赋值行为将被忽略。如果没有任何规则对设备的 NAME 赋值,udev 将使用内核设备名称来产生设备文件。

  2. SYMLINK:为 /dev/下的设备文件产生符号链接。由于 udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的 udev 规则所产生的文件,推荐使用符号链接。

  3. OWNER, GROUP, MODE:为设备设定权限。

  4. ENV{key}:导入一个环境变量

udev规则操作符:

  1. “==”:比较键、值,若等于,则该条件满足;

  2. “!=”: 比较键、值,若不等于,则该条件满足;

  3. “=”: 对一个键赋值;

  4. “+=”:为一个表示多个条目的键赋值。

  5.“:=”:对一个键赋值,并拒绝之后所有对该键的改动。目的是防止后面的规则文件对该键赋值。

  说明:如果有一个设备被内核实别为sdb1,则该条件生效,执行后面的赋值:在/dev下产生一个名为my_ disk的设备文件,并把设备文件的权限设为0666。

 2)在客户端上定义udev规则

  查看共享磁盘的UUID

[root@youxi2 ~]# /usr/lib/udev/scsi_id -g -u /dev/sdb
36001405179b62d3082e4604ae5326cd6

  添加一个新的udev规则

[root@youxi2 ~]# vim /etc/udev/rules.d/10-sda.rules  //底下规则不能转行,这里转行是为了方便查看
KERNEL=="sdb",SUBSYSTEM=="block",PROGRAM="/usr/lib/udev/scsi_id -g -u /dev/sdb",
RESULT=="36001405179b62d3082e4604ae5326cd6",SYMLINK+="my-disk",MODE="0660"

  说明:

    KERNEL:匹配内核设备名称;

    SUBSYSTEM:匹配设备的子系统名称,例如:sda 的子系统为block。udevadm info -a -p  /sys/block;

    PROGRAM:调用外部命令;

    RESULT: 匹配外部命令PROGRAM的返回结果;

    SYMLINK:为/dev/下的设备文件产生符号链接。由于udev 只能为某个设备产生一个设备文件,所以为了不覆盖系统默认的udev 规则所产生的文件,推荐使用符号链接。

    MODE:设置设备的权限

  告知内核,磁盘信息发生了变化,既可以查看

[root@youxi2 ~]# /sbin/partprobe /dev/sdb  //命令二选一即可
[root@youxi2 ~]# systemctl restart systemd-udev-trigger
[root@youxi2 ~]# ll /dev/my-disk  //查看my-disk
lrwxrwxrwx 1 root root 3 8月 23 17:04 /dev/my-disk -> sdb

  使用方法

[root@youxi2 ~]# umount /share
[root@youxi2 ~]# mount /dev/my-disk /share  //这是因为多路径软件正在使用
mount: /dev/sdb 已经挂载或 /share 忙
[root@youxi2 ~]# systemctl stop multipathd && systemctl disable multipathd
Removed symlink /etc/systemd/system/sysinit.target.wants/multipathd.service.
[root@youxi2 ~]# init 6  //重启
[root@youxi2 ~]# iscsiadm -m discovery -t st -p 192.168.5.101  //重新发现iscsi设备
1.1.5.129:3260,1 iqn.2019-08.com.youxi1:server
192.168.5.101:3260,1 iqn.2019-08.com.youxi1:server
[root@youxi2 ~]# iscsiadm -m node --login  //重新登录iscsi设备
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] (multiple)
Logging in to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] (multiple)
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 1.1.5.129,3260] successful.
Login to [iface: default, target: iqn.2019-08.com.youxi1:server, portal: 192.168.5.101,3260] successful.
[root@youxi2 ~]# mount /dev/my-disk /share
[root@youxi2 ~]# ls /share
a.txt b.txt

  说明:multipathd本身就可以给存储设备起一个名字了,有了multipathd就不需要udev来起名字了。所以两者是冲突的,只能同时使用一种方法给存储设备命名。所以一般情况,我们直接使用iscsi存储+多路径就可以了。

ISCSI多路径配置(二)的更多相关文章

  1. iscsi序列二、iscsi多路径配置方式

    一.ISCSI多路径应用 如果存储服务器到交换机只有一条线路的时候,那么一条线路出线故障,整个就没法使用了,所以多线路可以解决这个问题,避免单点故障 如上图,如果SAN服务器与客户端交换机只有一条线路 ...

  2. 配置iSCSI多路径

    1.添加MPIO功能,完成后打开MPIO进行配置,添加对iSCSI多路径的支持,如下图表示已经添加完成后灰色不可选,再打开 MPIO设备 标签页可以看到已安装完成的MPIO所支持的设备:

  3. webpack插件配置(一) webpack-dev-server 路径配置

    本文的路径配置主要涉及到webpack.config.js文件中devServer与output两个选项的配置 webpack-dev-server定义 webpack-dev-server主要是启动 ...

  4. maven的安装、路径配置、修改库文件路径和eclipse中的配置、创建maven工程。

    注:本文来源于:杨四郎2018  <maven的安装.路径配置.修改库文件路径和eclipse中的配置.创建maven工程> 一.maven的安装 首先,先到官网去下载maven.这里是官 ...

  5. 【RAC】 RAC For W2K8R2 安装--操作系统环境配置 (二)

    [RAC] RAC For W2K8R2 安装--操作系统环境配置 (二) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可 ...

  6. 微信小程序配置二

    tabBar 客户端窗口底部的tab页面切换,只能配置最好两个.最多5个tab 属性说明: 属性 类型 必填 默认值 描述 color HexColor 是 tab上的文字默认颜色 selectedC ...

  7. nginx代理路径配置总结

    一.发现问题 配置nginx代理的时候,发现location配置的路径和代理的上下文路径的组合不同,服务端接收到的uri的路径不同,导致了controller的RequestMapping匹配出现问题 ...

  8. iscsi: 多路径

    作者:吴香伟 发表于 2014/10/8 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 上图(a)给出了计算机的总线结构,SCSI磁盘挂在SCSI卡上,SCSI ...

  9. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作

    详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...

随机推荐

  1. stm32自带的flash分布图

    缘由是要用到flash来保存数据,因此查阅了数据手册与参考手册,一般情况下,将要保存的数据存放到比较靠后的地方,page254,page255,4k字节,已经相当多的了,

  2. Kafka+kylin——kylin2.5.0流式构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a_drjiaoda/article/d ...

  3. HDP 大数据平台搭建

    一.概述 Apache Ambari是一个基于Web的支持Apache Hadoop集群的供应.管理和监控的开源工具,Ambari已支持大多数Hadoop组件,包括HDFS.MapReduce.Hiv ...

  4. 使用HttpClient进行Get方式通信(使用HttpGet获取网页数据)

    1.项目结构 导入jar包 jar包去官网下载解压后项目新建lib目录,将解压包中的lib目录中的zip拷入项目lib目录文件夹,然后build path-->配置到项目中 2.TestGet. ...

  5. setState回调

    this.state = {foo: 2}; this.setState({foo: 123}, ()=> { console.log(foo); });

  6. C字符指针数组的使用

    #include <stdio.h> #include <stdlib.h> int main(){ //字符数组的使用 char str[] = {'z','b','c',' ...

  7. ArcGIS Enterprise 10.7.1新特性:批量发布服务

    ArcGIS Enterprise 10.7.1提供了批量发布GIS服务的功能,能大大简化GIS系统管理员的工作量. 作为发布人员和管理人员,支持向Portal for ArcGIS添加云存储.文件共 ...

  8. (22)打鸡儿教你Vue.js

    vue.js 单页面,多页面 Vue cli工具 复杂单页面应用Vue cli工具 交互设计,逻辑设计,接口设计 代码实现,线上测试 git clone,git int 创建分支,推送分支,合并分支 ...

  9. mysql 索引基本概念

    1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B ...

  10. php 数组元素加法

    <?php//添加一个元素 $dirs[] = '1location';//再次添加一个元素 $dirs[] = '2location';//第三次添加一个元素 $dirs[] = '3loca ...