Ceph-部署
Ceph规划
| 主机名 | IP地址 | 角色 | 配置 |
|---|---|---|---|
| ceph_controler | 192.168.87.202 | 控制节点、MGR | Centos7系统500G硬盘 |
| ceph_node1 | 192.168.87.203 | mon,osd | Centos7系统500G硬盘、3块1T硬盘 |
| ceph_node2 | 192.168.87.204 | mon,osd | Centos7系统500G硬盘、3块1T硬盘 |
| ceph_node3 | 192.168.87.205 | mon,osd | Centos7系统500G硬盘、2块1T硬盘 |
系统环境配置
关闭Selinux和防火墙
需要在每台节点上操作
关闭Selinux
sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
配置主机名
hostnamectl set-hostname ceph_controler
hostnamectl set-hostname ceph_node1
hostnamectl set-hostname ceph_node2
hostnamectl set-hostname ceph_node3
配置hosts解析
配置 hosts,并复制到其他两台主机
[root@ceph_controler ~]# vim /etc/hosts
192.168.87.203 ceph_controler
192.168.87.203 ceph_node1
192.168.87.204 ceph_node2
192.168.87.205 ceph_node3
[root@ceph_controler ~]# scp /etc/hosts ceph_node1:/etc/hosts
[root@ceph_controler ~]# scp /etc/hosts ceph_node2:/etc/hosts
[root@ceph_controler ~]# scp /etc/hosts ceph_node3:/etc/hosts
配置SSH免密
在控制节点上生成密钥,不设置密码
[root@ceph_controler ~]# ssh-keygen
将秘钥分别复制到ceph_controler, ceph_node1, ceph_node2, ceph_node3节点上
ssh-copy-id -i /root/.ssh/id_rsa.pub ceph_controler
ssh-copy-id -i /root/.ssh/id_rsa.pub ceph_node1
ssh-copy-id -i /root/.ssh/id_rsa.pub ceph_node2
ssh-copy-id -i /root/.ssh/id_rsa.pub ceph_node3
测试一下免密效果
ssh ceph_node1
ssh ceph_node2
ssh ceph_node3
配置时间同步服务器
在控制节点上搭建时间同步服务器
yum install chrony ntpdate -y ##每台节点都要安装
[root@ceph_controler ~]# vim /etc/chrony.conf
修改如下配置:

重启服务并设置开机自启
systemctl start chronyd && systemctl enable chronyd
在ceph_node1, ceph_node2, ceph_node3节点上安装chrony和ntpdate,并修改配置文件
[root@ceph_node1 ~]# yum install chrony ntpdate -y
[root@ceph_node1 ~]# vim /etc/chrony.conf ##修改时间服务器
server ceph_controler iburst
重启服务并设置开机自启:systemctl start chronyd && systemctl enable chronyd
同步时间:ntpdate 192.168.87.202

配置源
yum源
每台节点都要配置
cd /etc/yum.repos.d/
mkdir backup && mv C* backup
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
配置epel源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
配置Ceph源
cat << EOF |tee /etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for $basearch
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/\$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-noarch]
name=Ceph noarch packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
priority=1
[Ceph-source]
name=Ceph source packages
baseurl=https://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
EOF
生成 yum 源缓存
yum clean all
yum makecache fast
部署Ceph
部署控制节点
集群部署
在ceph_controler节点上安装ceph-deploy和ceph包
[root@ceph_controler ~]# yum install ceph-deploy ceph -y
在ceph_node1,ceph_node2,ceph_node3节点上安装ceph包
[root@ceph_node1 ~]# yum install ceph -y
在 ceph_controler节点上创建一个cluster 目录,所有命令再此目录下进行操作
[root@ceph_controler ~]# mkdir /cluster ##此目录自定义
[root@ceph_controler ~]# cd /cluster
将 ceph_node1,ceph_node2,ceph_node3 加入集群
[root@ceph_controler cluster]# ceph-deploy new ceph_node1 ceph_node2 ceph_node3
[ceph_deploy.new][DEBUG ] Creating a random mon key...
[ceph_deploy.new][DEBUG ] Writing monitor keyring to ceph.mon.keyring...
[ceph_deploy.new][DEBUG ] Writing initial config to ceph.conf...
出现如上信息表示输出没有报错,部署成功
查看 ceph 版本
[root@ceph_controler cluster]# ceph -v
ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)
生成 mon 角色
[root@ceph_controler cluster]# ceph-deploy mon create-initial ###将所有节点作
为 mon 角色,可以指定那些节点为 mon 角色
生成ceph admin秘钥
[root@ceph_controler cluster]# ceph-deploy admin ceph_controler ceph_node1 ceph_node2 ceph_node3
部署 MGR,提供 web 界面管理 ceph(可选安装)
[root@ceph_controler cluster]# ceph-deploy mgr create ceph_controler ###将ceph_controler节点作为web界面管理,也可以将其他节点作为web界面管理
初始化OSD
ceph-deploy osd create --data /dev/sdb ceph_node1
ceph-deploy osd create --data /dev/sdc ceph_node1
ceph-deploy osd create --data /dev/sdd ceph_node1
ceph-deploy osd create --data /dev/sdb ceph_node2
ceph-deploy osd create --data /dev/sdc ceph_node2
ceph-deploy osd create --data /dev/sdd ceph_node2
ceph-deploy osd create --data /dev/sdb ceph_node3
ceph-deploy osd create --data /dev/sdc ceph_node3
查看OSD状态

查看ceph状态

到此,整个 ceph 的部署就完成了,健康状态也是 ok 的。
Ceph 操作使用
创建存储池
ceph osd pool create it_pool 128 ###创建一个名为it_pool的池,PG大小为128
查看池的副本数
ceph osd pool get it_pool size
查看池的PG大小
ceph osd pool get it_pool pg_num
RBD使用
设置 it_pool 为 rbd,并创建卷,客户端进行挂载, 映射给业务服务器使用。
[root@ceph_controler ceph]# ceph osd pool application enable it_pool rbd ###设置存储池类型为 rbd
[root@ceph_controler ceph]# rbd create it_pool/disk1 --size 1T --image-feature layering ###在存储池里划分一块名为 disk1 的磁盘,大小为 1T的镜像
列出rbd设备镜像(可在任意一台节点上列出)
[root@ceph_controler ceph]# rbd ls
ceph-client1-rbd1
查看创建后的块设备的信息(可以在任意一台ceph节点上查看)
[root@ceph-node1 ~]# rbd --image ceph-client1-rbd1 info
rbd image 'ceph-client1-rbd1':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.857a238e1f29
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
#### 配置web界面管理
yum install ceph-mgr-dashboard -y
ceph mgr module enable dashboard
ceph dashboard create-self-signed-cert
touch /etc/ceph/dashboard_passwd.txt
echo "xxxx" > /etc/ceph/dashboard_passwd.txt
ceph dashboard set-login-credentials admin -i /etc/ceph/dashboard_passwd.txt ###把密码写入到 /etc/ceph/dashboard_passwd.txt,名字随便写
ceph mgr services
ceph mgr module enable dashboard
客户端挂载:
安装 ceph 客户端:
Centos系统:yum install ceph -y
ubuntu系统:sudo apt install ceph -y
将服务端的 ceph.conf 和密钥文件拷贝到 ceph 客户端:
scp /etc/ceph/ceph.conf it@192.168.87.176:/etc/ceph/
scp /etc/ceph/ceph.client.admin.keyring it@192.168.87.176:/etc/ceph/
映射 rbd 块设备:
查看下该镜像支持了哪些特性
[root@ceph-client1 ~]# rbd info ceph-client1-rbd1
rbd image 'ceph-client1-rbd1':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.857a238e1f29
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
flags:
可以看到特性feature一栏,由于我OS的kernel只支持layering,其他都不支持,所以需要把部分不支持的特性disable掉。
以下方法根据实际情况选其一即可!(我这里使用的是方式二)
【方法一:】直接diable这个rbd镜像的不支持的特性:
[root@ceph-client1 ~]# rbd feature disable ceph-client1-rbd1 exclusive-lock object-map fast-diff deep-flatten
[root@ceph-client1 ~]# rbd info ceph-client1-rbd1 #关闭后查看
rbd image 'ceph-client1-rbd1':
size 10240 MB in 2560 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.857a238e1f29
format: 2
features: layering #仅剩一个特性
flags:
【方法二:】在ceph集群中任意节点上创建rbd镜像时就指明需要的特性,如:
$ rbd create --size 10240 ceph-client1-rbd1 --image-feature layering
rbd create --size 10240 ceph-client1-rbd1 --image-feature layering exclusive-lock object-map fast-diff deep-flatten
【方法三:】修改Ceph配置文件/etc/ceph/ceph.conf,在global section下,增加
rbd_default_features = 1
再创建rdb镜像。
rbd create ceph-client1-rbd1 --size 10240
it@it:~$ sudo rbd map it_pool/disk1
查看映射信息
[root@ceph-client1 ~]# rbd showmapped
[root@ceph-client1 ~]# sudo fdisk -l 查看映射盘


磁盘分区挂载:
fdisk /dev/rbd0
mkfs.ext4 /dev/rbd0
mount /dev/rbd0 /mnt/
取消映射块设备:
[root@ceph-client1 ~]# umount /mnt/ceph-vol1/ #取消挂载
[root@ceph-client1 ~]# rbd unmap /dev/rbd/rbd/ceph-client1-rbd1 #取消映射
[root@ceph-client1 ~]# rbd showmapped #查看是否取消成功,如没有任何输出则表示取消映射成功
如下删除块设备,执行以下命令
[root@ceph-node1 ~]# rbd rm ceph-client1-rbd1
Removing image: 100% complete...done.
[root@ceph-node1 ~]# rbd ls
cephfs
部署cephfs
[root@ceph_node1 cluster]# ceph-deploy mds create ceph_node1 ceph_node2 ceph_node3
[ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.conf
[ceph_deploy.cli][INFO ] Invoked (2.0.1): /usr/bin/ceph-deploy mds create ceph_node1 ceph_node2 ceph_node3
[ceph_deploy.cli][INFO ] ceph-deploy options:
[ceph_deploy.cli][INFO ] username : None
[ceph_deploy.cli][INFO ] verbose : False
[ceph_deploy.cli][INFO ] overwrite_conf : False
[ceph_deploy.cli][INFO ] subcommand : create
[ceph_deploy.cli][INFO ] quiet : False
[ceph_deploy.cli][INFO ] cd_conf : <ceph_deploy.conf.cephdeploy.Conf instance at 0x7fb889afe2d8>
[ceph_deploy.cli][INFO ] cluster : ceph
[ceph_deploy.cli][INFO ] func : <function mds at 0x7fb889b3ced8>
[ceph_deploy.cli][INFO ] ceph_conf : None
[ceph_deploy.cli][INFO ] mds : [('ceph_node1', 'ceph_node1'), ('ceph_node2', 'ceph_node2'), ('ceph_node3', 'ceph_node3')]
[ceph_deploy.cli][INFO ] default_release : False
[ceph_deploy.mds][DEBUG ] Deploying mds, cluster ceph hosts ceph_node1:ceph_node1 ceph_node2:ceph_node2 ceph_node3:ceph_node3
[ceph_node1][DEBUG ] connected to host: ceph_node1
[ceph_node1][DEBUG ] detect platform information from remote host
[ceph_node1][DEBUG ] detect machine type
[ceph_deploy.mds][INFO ] Distro info: CentOS Linux 7.9.2009 Core
[ceph_deploy.mds][DEBUG ] remote host will use systemd
[ceph_deploy.mds][DEBUG ] deploying mds bootstrap to ceph_node1
[ceph_node1][DEBUG ] write cluster configuration to /etc/ceph/{cluster}.conf
[ceph_node1][WARNIN] mds keyring does not exist yet, creating one
[ceph_node1][DEBUG ] create a keyring file
[ceph_node1][DEBUG ] create path if it doesn't exist
[ceph_node1][INFO ] Running command: ceph --cluster ceph --name client.bootstrap-mds --keyring /var/lib/ceph/bootstrap-mds/ceph.keyring auth get-or-create mds.ceph_node1 osd allow rwx mds allow mon allow profile mds -o /var/lib/ceph/mds/ceph-ceph_node1/keyring
[ceph_node1][INFO ] Running command: systemctl enable ceph-mds@ceph_node1
创建cephfs pool池
CephFS相关命令 需要创建2个pool池
1.创建MDS Daemon
ceph-deploy mds create <…>
2.创建CephFS Data Pool
ceph osd pool create <…>
3.CephFS Metadata Pool
ceph osd pool create <…>
4.创建CephFS
ceph fs new <…>
5.查看CephFS
ceph fs ls
name: tstfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
6.删除CephFS
ceph fs rm <fs-name> --yes-i-really-mean-it
7.查看MDS状态
ceph mds stat
e8: tstfs-1/1/1 up tstfs2-0/0/1 up {[tstfs:0]=mds-daemon-1=up:active}
• e8
o e表示epoch
o 8是epoch号
• tstfs-1/1/1 up
o tstfs是cephfs名字
o 三个1分别是 mds_map.in/mds_map.up/mds_map.max_mds
o up是cephfs状态
• {[tstfs:0]=mds-daemon-1=up:active}
o [tstfs:0]指tstfs的rank 0
o mds-daemon-1是服务tstfs的mds daemon name
o up:active是cephfs的状态为 up & active
客户端挂载
安装ceph-fuse
下载ceph epel源包
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
安装ceph
yum install ceph ceph-fuse -y
挂载CeophFS
# scp /etc/ceph/ceph.client.admin.keyring 10.65.3.83:/etc/ceph
mkdir /data/cephfs
ceph-fuse -m 10.65.3.76:6789 /data/cephfs
卸载挂载
fusermount -u /mntdir
centos7里没有fusermount命令,可以用umount替代
扩容OSD
在控制节点操作
1.初始化硬盘
ceph-deploy disk zap ceph-node-11 /dev/sdc
2.加入新的osd
ceph-deploy osd create ceph-node-11 --data /dev/sdc
3.查看扩容后的信息
ceph osd status
扩容rbd
在控制节点操作
1.查看当前rbd大小
rbd info mypool1/disk10
2. 扩容rbd
rbd resize --size 10240 mypool1/disk10
3.查看扩容后的rbd大小
rbd info mypool1/disk10
扩容OSD节点
在node节点操作
1、系统初始化
同”四.初始化”一样
2、安装cepe
yum -y install ceph-deploy ceph
3、在控制节点操作
ceph-deploy install --no-adjust-repos ceph_node4 ##添加新node节点
ceph-deploy admin ceph_node4 ##授权
ceph-deploy --overwrite-conf config push ceph_node1 ceph_node2 ceph_node3 ceph_node4 ceph_node5 ceph_controler
ceph status
##初始化硬盘
ceph-deploy osd create --data /dev/sdb ceph_node4
ceph-deploy osd create --data /dev/sdb ceph_node4
ceph-deploy osd create --data /dev/sdc ceph_node4
ceph-deploy osd create --data /dev/sdd ceph_node4
##查看硬盘状态
创建osd
# ceph-deploy osd create --data /dev/sdb $HOSTNAME
(报错“error: GPT headers found, they must be removed on: /dev/sdb”,使用“# sgdisk --zap-all /dev/sdb”解决)
删除osd(0为osd的号码)
# systemctl stop ceph-osd@0
# ceph osd purge osd.0 --yes-i-really-mean-it
删除lvm
# lvdisplay 查看
# lvremove /dev/ceph-265dddd7-ef18-42f7-869e-58e669638032/osd-data-3fa4b9df-6a59-476a-8aaa-4138b29acce9 删除
# ceph-deploy disk zap $HOSTNAME /dev/sdb 格式化磁盘
ceph osd status

删除节点

避坑指南
Q1:
root@ceph_node1 cluster]# ceph-deploy new ceph_node1 ceph_node2 ceph_node3
Traceback (most recent call last):
File "/usr/bin/ceph-deploy", line 18, in <module>
from ceph_deploy.cli import main
File "/usr/lib/python2.7/site-packages/ceph_deploy/cli.py", line 1, in <module>
import pkg_resources
ImportError: No module named pkg_resources
解决方法:yum install python2-pip
Q2:
health: HEALTH_WARN
mons are allowing insecure global_id reclaim
解决方法:ceph config set mon auth_allow_insecure_global_id_reclaim false
Q3:

解决方法:
可以看到, 新增的硬盘中发现了 GPT 分区表, 所以添加失败了, 我们要手动清理掉硬盘的分区表 (当然如果硬盘是全新的, 这里应该就成功了).
这里我们直接暴力干掉分区表, 不用费事的操作 PV 和 VG 了.
注意, 一定要再三检查目标硬盘是否是期望的硬盘, 如果操作错了硬盘, 分区表直接就没了.
[root@storage03-ib ceph-9]# dd if=/dev/zero of=/dev/sde bs=512K count=1
1+0 records in
1+0 records out
524288 bytes (524 kB) copied, 0.00109677 s, 478 MB/s
利用 dd 命令把硬盘的前 512K 填充为 0, 直接干掉分区信息.
注意如果这块盘之前已经挂载了, 那需要重启才能生效.
然后重新添加 OSD:
ceph-deploy osd create --data /dev/sdb ceph_node2
Q4:

解决方案
1:parted -s /dev/sdb mklabel gpt mkpart primary xfs 0% 100%
2:reboot
3:mkfs.xfs /dev/sdb -f
Q5:

Q6:PG报错修复

(1)、查看ceph详细信息
[root@ceph_controler ~]# ceph health detail
(2)、修复PG
[root@ceph_controler ~]# ceph pg repair 3.52
instructing pg 3.52 on osd.5 to repair
(3)、修复PG中的3块OSD
[root@ceph_controler ~]# ceph osd repair 5
instructed osd(s) 5 to repair
[root@ceph_controler ~]# ceph osd repair 10
instructed osd(s) 10 to repair
[root@ceph_controler ~]# ceph osd repair 6
instructed osd(s) 6 to repair

控制节点关机重启后需要重新将ceph.conf,想推送到所有其他节点
ceph-deploy --overwrite-conf config push ceph_node1 ceph_node2
Q7:PG故障修复

1、产生该问题的原因是数据在均衡或者回滚等操作的时候,导致其某个守护进程崩溃了,且没有及时归档,所以集群产生告警
2、解决方法:
[root@ceph_controler ~]# ceph crash ls
ID ENTITY NEW
2023-04-11_09:41:34.223865Z_7112cbeb-91d6-4576-8af4-6f77f4cefcd7 osd.7
2023-04-13_10:39:22.823390Z_fb3879dd-fa6c-41a9-9eb8-dc3218677b86 osd.13
2023-04-23_10:15:52.650617Z_0c69f38f-fd8b-4b28-a47f-d6f491bf24ac osd.13 *
2023-04-24_02:34:07.518349Z_fe5d3c61-dcfb-4798-aaf2-86817588381d osd.11 *
[root@ceph_controler ~]# ceph crash archive <id>
或者
[root@ceph_controler ~]# ceph crash archive-all
3、查看集群状态

Ceph-部署的更多相关文章
- Ceph部署(二)RGW搭建
背景 Ceph RGW简介 Ceph RGW基于librados,是为应用提供RESTful类型的对象存储接口.RGW提供两种类型的接口: 1) S3:兼容Amazon S3RESTful API: ...
- OpenStack Kilo版加CEPH部署手册
OpenStack Kilo版加CEPH部署手册 作者: yz联系方式: QQ: 949587200日期: 2015-7-13版本: Kilo 转载地址: http://mp.weixin.qq.co ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之ceph部署-07
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之ceph部署-07 欢迎加QQ群:1026880196 进行交流学习 近期我发现网上有人转载或者复制原 ...
- Ceph部署(一)集群搭建
背景 Ceph简介 Ceph是一个分布式存储,可以提供对象存储.块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成.一个Ceph集群中有Monitor节点.MDS节点(可选,用于文件存储 ...
- ceph部署实践(mimic版本)
一.准备环境 4台adminos7.4 环境,存储节点上两块磁盘(sda操作系统,sdb数据盘) clientadmin storage1storage2storage3 二.配置环境 1.修改主机名 ...
- ceph部署手册
CentOS7.2部署Luminous版Ceph-12.2.0 在CentOS7.2上安装部署Luminous版Ceph-12.2.0.由于ceph的Luminous版本默认使用bluestore作为 ...
- ceph部署
一.部署准备: 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用: 1台部署节点(配一块硬盘,运行ceph-depo ...
- [ ceph ] CEPH 部署完整版(CentOS 7 + luminous)
1. 前言 拜读了 胖哥的(el7+jewel)完整部署 受益匪浅,目前 CEPH 已经更新到 M 版本,配置方面或多或少都有了变动,本博文就做一个 ceph luminous 版本完整的配置安装. ...
- 分布式存储ceph部署(2)
一.部署准备: 准备5台机器(linux系统为centos7.6版本),当然也可以至少3台机器并充当部署节点和客户端,可以与ceph节点共用: 1台部署节点(配一块硬盘,运行ceph-depo ...
- ceph部署-集群建立
一.配置storage集群1.建立集群管理目录(管理配置文件,密钥)mkdir ceph-clustercd ceph-cluster/ 2.创建一个新集群(需要先将主机名加入/etc/hosts 必 ...
随机推荐
- # 代码随想录算法训练营Day28 回溯算法|93.复原IP地址 78.子集 90.子集II
代码随想录算法训练营 93.复原IP地址 题目链接:93.复原IP地址 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 有效的 IP 地址 正好由四个整数(每个整数位于 0 到 ...
- qq飞车端游最全按键指法教学
目录 起步篇 超级起步 弹射起步 段位起步 基础篇 点飘 撞墙漂移 撞墙点喷 进阶篇 双喷 叠喷 断位漂移 段位双喷 侧身漂移 快速出弯 CW WCW CWW 牵引 甩尾点飘 甩尾漂移 右侧卡 左侧卡 ...
- 一步步教你如何搭建K8S集群
一.环境配置 三台CentOS7虚拟机,默认配置,内存2GB.处理器2核心. 先更新下系统 1 sudo yum update 2 sudo yum upgrade 二.安装并启动 docker 1 ...
- RabbitMQ 工作模式介绍
RabbitMQ 工作模式介绍 1.Hello World RabbitMQ 是一个消息代理:它接受并转发消息.您可以将其视为邮局:当您将要邮寄的邮件放入邮箱时,您可以确定信使最终会将邮件交付给您的收 ...
- 高分辨率大图像可缩放 Web 查看器的实践
高分辨率大图像可缩放 Web 查看器的实践 一.使用 vips 将高分辨率大图像转换为 DZI 安装 vips 具体安装步骤请参考libvips Install. 注意,在 windows 11 中安 ...
- 使用Mybatis生成树形菜单-适用于各种树形场景
开发中我们难免会遇到各种树形结构展示的场景.比如用户登录系统后菜单的展示,某些大型购物网站商品的分类展示等等,反正开发中会遇到各种树形展示的功能,这些功能大概处理的思路都是一样的,所以本文就总结一下树 ...
- Python初学者友好丨详解参数传递类型
摘要: 本文清晰地解释了Python中的不同参数传递类型,并提供了示例代码来说明每种类型的用法.对于初学者或不清楚Python传参的读者们来说是非常有益的,文中提供了足够的信息来理解和使用Python ...
- Cause: org.apache.ibatis.builder.BuilderException: Ambiguous collection type for property 'emps'. You must specify 'javaType' or 'resultMap'
错误原因 这个错误通常表示在解析 Mybatis 映射文件(Mapper XML)时出现了问题,可能的原因有两个: 集合属性缺少 javaType 或 resultMap 属性:该错误信息显示了 &q ...
- IDEA中去除竖线
IDEA中去除竖线 使用IDEA时突然多出了一条竖线 , 进入设置取消竖线
- IcedID恶意文档钓鱼手法剖析
析 利用oletools静态分析,提取宏代码,如图: Function contents() With ActiveDocument.Content.Find loveDoor = .Execute( ...