当前位置: 首页 > news >正文

私有云平台搭建openstack和ceph结合搭建手册

OpenStack与云计算

什么是云?
如何正确理解云,可以从以下几个方面。
云的构成。
用户:对用户而言是透明无感知的,不用关心底层构成,只需要知道利用云完成自己任务即可。
云提供商:对云资产管理和运维。
云的特点。
弹性扩展;自助服务;标准接口方便二次开发和其他系统对接;付费和计量。
云的定义。
云是指你作为接受服务的对象,是云端,不管你在何时何地,都能享受云计算提供的服务。云是网络、互联网的一种比喻说法。
云分为私有云、公有云、混合云及行业云等等。
OpenStack
既是一个社区,也是一个项目和一个开源软件,提供了一个部署云的操作平台或工具集。用OpenStack易于构建虚拟计算或存储服务的云,既可以为公有云、私有云,也可以为大云、小云提供可扩展、灵活的云计算。
OpenStack是一个管理计算、存储和网络资源的数据中心云计算开放平台,通过一个仪表板,为管理员提供了所有的管理控制,同时通过Web界面为其用户提供资源。

简介

OpenStack部署方式多样化,本文采用脚本方式部署OpenStack Q版本。私有云平台搭建的各项软件包、依赖包、安装脚本等离线安装,可满足私有云平台的搭建、云平台的使用、各组件的运维操作等。

个人使用方面

1、DevStack
2、Rdo
3、手动部署
手动部署all-in-one、multi-node、multi-HA-node环境。

企业、团体方面

1、Puppet
2、ansible

构建OpenStack私有云平台

基本环境配置

image.png
云计算平台的拓扑图如图1所示,IP地址规划如下图所示。
image.png
云计算IaaS控制节点
image.png

本次搭建采用双节点安装,即 controller node 控制节点和 compute node 计算节点。ens34为内部管理网络,ens33 为外部网络。存储节点安装操作系统时划分两个空白分区以 sda,sdb 为例。作为 cinder 和 swift存储磁盘,搭建 ftp 服务器作为搭建云平台的 yum 源。配置文件中密码需要根据实际环境进行配置。

角色接口主机名IP地址用途
controller nodeens33controller192.168.150.10用于外部网络
ens34192.168.200.10用于内部管理网络
compute nodeens33compute192.168.150.20用于外部网络
ens34192.168.200.20用于内部管理网络
ceph nodeens33ceph1192.168.150.11后端分布式存储
ceph nodeens33ceph2192.168.150.12后端分布式存储
ceph nodeens33ceph3192.168.150.13后端分布式存储
安装CentOS7说明

【CentOS7版本】
:::info
CentOS7系统选择1804版本:CentOS-7-x86_64-DVD-1804.iso 最小化安装系统
controller node:4G内存,40G存储
:::
image.png
image.png
compute node:4G内存,40G存储,额外添加一块100G硬盘作为cinder存储。
image.png

配置网络、主机名
controller节点

配置网络:
ens33: 192.168.150.10
ens34: 192.168.200.10

[root@controller ~]# nmcli con mod ens33 ipv4.method manual ipv4.address 192.168.150.10/24 ipv4.gateway 192.168.150.2 ipv4.dns 223.5.5.5 autoconnect yes
[root@controller ~]# nmcli con mod ens34 ipv4.method manual ipv4.address 192.168.200.10/24 autoconnect yes
[root@controller ~]# nmcli con up ens33
[root@controller ~]# nmcli con up ens34

配置主机名:

# hostnamectl set-hostname controller
# 按ctrl+d 退出  重新登陆
compute 节点

配置网络:
ens33: 192.168.150.20
ens34: 192.168.200.20

[root@compute ~]# nmcli con mod ens33 ipv4.method manual ipv4.address 192.168.150.20/24 ipv4.gateway 192.168.150.2 ipv4.dns 223.5.5.5 autoconnect yes
[root@compute ~]# nmcli con mod ens34 ipv4.method manual ipv4.address 192.168.200.20/24 autoconnect yes
[root@compute ~]# nmcli con up ens33
[root@compute ~]# nmcli con up ens34

配置主机名:

# hostnamectl set-hostname compute
# 按ctrl+d 退出  重新登陆
配置yum源(Controller和compute节点)

1)yum源备份

# cd /etc/yum.repos.d/
# mkdir bak_repo
# mv *.repo bak_repo/

2)创建repo文件
controller:

在/etc/yum.repos.d创建CentOS.repo源文件[root@controller yum.repos.d]# cat > CentOS.repo << EOF
[CentOS]
name=CentOS
baseurl=file:///opt/centos
gpgcheck=0
[iaas]
name=iaas
baseurl=file:///opt/iaas-repo
gpgcheck=0
EOF

compute:

在/etc/yum.repos.d创建CentOS.repo源文件[root@compute yum.repos.d]# cat > CentOS.repo << EOF
[CentOS]
name=CentOS
baseurl=ftp://192.168.150.10/centos
gpgcheck=0
[iaas]
name=iaas
baseurl=ftp://192.168.150.10/iaas-repo
gpgcheck=0
EOF

3)挂载iso文件

【挂载CentOS-7-x86_64-DVD-1804.iso】
[root@controller ~]# mount /dev/sr0 /mnt/
[root@controller ~]# mkdir /opt/centos
[root@controller ~]# cp -rf /mnt/* /opt/centos/
[root@controller ~]# umount  /mnt/
【挂载XianDian-IaaS-v2.4.iso】
[root@controller ~]# mount -o loop XianDian-IaaS-V2.4.iso /mnt/
[root@controller ~]# cp -rf /mnt/* /opt/
[root@controller ~]# umount  /mnt/

4)搭建ftp服务器,开启并设置自启

[root@controller ~]# yum install vsftpd -y
[root@controller ~]# vi /etc/vsftpd/vsftpd.conf
添加anon_root=/opt/保存退出[root@controller ~]# systemctl enable --now vsftpd

5)配置防火墙和Selinux

【controller/compute】
编辑selinux文件# sed -i '/^SELINUX=/ c SELINUX=disabled' /etc/selinux/config
# setenforce 0
编辑环境变量

controller和compute节点

yum install iaas-xiandian -y

编辑文件/etc/xiandian/openrc.sh,此文件是安装过程中的各项参数,根据每项参数上一行的说明及服务器实际情况进行配置。

vim etc/xiandian/openrc.shHOST_IP=192.168.150.10
HOST_PASS=redhat
HOST_NAME=controller
HOST_IP_NODE=192.168.150.20
HOST_PASS_NODE=redhat
HOST_NAME_NODE=compute
network_segment_IP=192.168.150.0/24
RABBIT_USER=redhat
RABBIT_PASS=redhat
DB_PASS=redhat
DOMAIN_NAME=demo
ADMIN_PASS=redhat
DEMO_PASS=redhat
KEYSTONE_DBPASS=redhat
GLANCE_DBPASS=redhat
GLANCE_PASS=redhat
NOVA_DBPASS=redhat
NOVA_PASS=redhat
NEUTRON_DBPASS=redhat
NEUTRON_PASS=redhat
METADATA_SECRET=redhat
INTERFACE_IP=192.168.150.10/192.168.150.20(controllerIP/computeIP)
INTERFACE_NAME=enp9s0 (外部网络网卡名称)
Physical_NAME=provider (外部网络适配器名称)
minvlan=101 (vlan网络范围的第一个vlanID)
maxvlan=200 (vlan网络范围的最后一个vlanID)
CINDER_DBPASS=redhat
CINDER_PASS=redhat
BLOCK_DISK=sdb1 (空白分区)
SWIFT_PASS=redhat
OBJECT_DISK=sdb2 (空白分区)
STORAGE_LOCAL_NET_IP=192.168.150.20
HEAT_DBPASS=redhat
HEAT_PASS=redhat
ZUN_DBPASS=redhat
ZUN_PASS=redhat
KURYR_DBPASS=redhat
KURYR_PASS=redhat
CEILOMETER_DBPASS=redhat
CEILOMETER_PASS=redhat
AODH_DBPASS=redhat
AODH_PASS=redhat
通过脚本安装服务

Compute节点:划分两个分区

[root@compute ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x0e7a20a8.Command (m for help): n
Partition type:
p   primary (0 primary, 0 extended, 4 free)
e   extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-629145599, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-629145599, default 629145599): +150G
Partition 1 of type Linux and of size 150 GiB is setCommand (m for help): n
Partition type:
p   primary (1 primary, 0 extended, 3 free)
e   extended
Select (default p):
Using default response p
Partition number (2-4, default 2):
First sector (314574848-629145599, default 314574848):
Using default value 314574848
Last sector, +sectors or +size{K,M,G} (314574848-629145599, default 629145599):
Using default value 629145599
Partition 2 of type Linux and of size 150 GiB is setCommand (m for help): pDisk /dev/sdb: 322.1 GB, 322122547200 bytes, 629145600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0e7a20a8Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   314574847   157286400   83  Linux
/dev/sdb2       314574848   629145599   157285376   83  LinuxCommand (m for help): w
The partition table has been altered!Calling ioctl() to re-read partition table.
Syncing disks.

基础配置操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:

Controller节点和Compute节点

执行脚本iaas-pre-host.sh进行安装
脚本主要完成安装OpenStack包、配置hosts解析、安装chrony服务
[root@controller ~]# iaas-pre-host.sh

安装完成后同时重启

[root@controller ~]# reboot

通过脚本安装数据库服务

基础服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:

Controller节点

执行脚本iaas-install-mysql.sh进行安装

安装Keystone认证服务

#Controller
通过脚本安装keystone服务
认证服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
脚本主要完成安装keystone软件、创建keystone数据库、配置数据库连接、为keystone服务创建数据库表、创建令牌、创建签名密钥和证书、定义用户、租户和角色、配置环境变量。

Controller节点

执行脚本iaas-install-keystone.sh进行安装。

安装Glance镜像服务

#Controller
通过脚本安装glance服务
镜像服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
脚本主要完成安装glance软件包、创建glance数据库、配置数据库连接、为镜像服务创建数据库表、创建用户、配置镜像服务、创建Endpoint和API端点、启动服务。

Controller 节点

执行脚本iaas-install-glance.sh进行安装

安装Nova计算服务

#Controller
通过脚本安装nova服务 计算服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
#Controller节点
执行脚本iaas-install-nova-controller.sh进行安装

#Compute节点
执行脚本iaas-install-nova-compute.sh进行安装

安装Neutron网络服务

#Controller节点
通过脚本安装neutron服务
网络服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
#Controller节点
执行脚本iaas-install-neutron-controller.sh进行安装
#Compute节点
执行脚本iaas-install-neutron-compute.sh进行安装

安装Dashboard服务
通过脚本安装dashboard服务

dashboard的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
#Controller节点
执行脚本iaas-install-dashboard.sh进行安装

访问dashboard

打开浏览器访问Dashboard
http://controller(或本机内网ip)/dashboard
注:检查防火墙规则,确保允许http服务相关端口通行,或者关闭防火墙。
image.png
image.png

OpenStack命令补全

设置openstack命令补全
很多时候,在输入openstack命令的时候总感觉重复手打输入和记不住想不起来命令时,很困扰,所以为了解决这个问题,下面提供一种方法:

首先执行安装命令:
[root@controller ~]# yum -y install bash-completion
将命令写入到/etc/bash_completion.d/中,这个路径一定要写正确:
[root@controller ~]# openstack complete >> /etc/bash_completion.d/complete
最后执行以下命令即可,最后reboot,即可生效
[root@controller ~]# echo "source /etc/bash_completion.d/complete" >> ~/.bashrc
安装Cinder块存储服务

通过脚本安装Cinder服务
块存储服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:

#Controller
执行脚本iaas-install-cinder-controller.sh进行安装
#Compute节点
执行脚本iaas-install-cinder-compute.sh进行安装

安装Swift对象存储服务

通过脚本安装Swift服务
对象存储服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:

#Controller
执行脚本iaas-install-swift-controller.sh进行安装
#Compute节点
执行脚本iaas-install-swift-compute.sh进行安装

安装Heat编配服务

Controller节点

通过脚本安装heat服务
编配服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
#Controller节点
执行脚本iaas-install-heat.sh进行安装

安装Ceilometer监控服务

通过脚本安装Ceilometer服务
ceilometer监控服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
#Controller节点
执行脚本iaas-install-ceilometer-controller.sh进行安装
#Compute节点
执行脚本iaas-install-ceilometer-compute.sh进行安装

安装Aodh监控服务

通过脚本安装Aodh服务
Alarm监控服务的操作命令已经编写成shell脚本,通过脚本进行一键安装。如下:
#Controller节点
执行脚本iaas-install-aodh.sh进行安装

构建ceph分布式存储

基本环境配置

本文将通过ceph-deloy工具,一个集群自动化部署工具,使用较久,成熟稳定,被很多自动化工具所集成,可用于生产部署。

安装CentOS7说明

【CentOS7版本】
CentOS7系统选择2009版本:CentOS-7-x86_64-Minimal-2009.iso 最小化安装系统
规划:
image.png

三台CentOS7.9服务器,2核CPU,2G内存,根磁盘50GB,新增3块硬盘(sdb、sdc、sdd)其中sdb 200G硬盘,sdc和sdd各100G,sdb划分两个分区各100G,作为journal跟cache的缓存盘,sdc和sdd作为数据共享盘。

集群ceph1管理IP:192.168.150.11
集群ceph2管理IP:192.168.150.12
集群ceph3管理IP:192.168.150.13
配置网络、主机名
关闭防火墙关闭selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
同步时间
yum install chrony -y
sed -i -e '3,6 s/^/#/' -e '3 c server ntp1.aliyun.com iburst' /etc/chrony.conf
systemctl enable --now chronyd
chronyc sources
分别修改三台机器hostname
hostnamectl set-hostname ceph1
hostnamectl set-hostname ceph2
hostnamectl set-hostname ceph3
在三台机器分别添加配置hosts
cat >> /etc/hosts << EOF
192.168.150.11 ceph1
192.168.150.12 ceph2
192.168.150.13 ceph3
EOF
配置ceph1到所有节点root用户免密钥互信。
[root@ceph1 ~]# ssh-keygen -f ~/.ssh/id_rsa -N '' -q
# 公钥分发到所有节点
[root@ceph1 ~]# for i in ceph1 ceph2 ceph3 ; do ssh-copy-id $i; done
配置本地yum源。

ceph1配置为yum仓库服务器,其他节点使用ftp方式使用ceph仓库

# 上传ceph.iso到ceph1
[root@ceph1 ~]# ll ceph.iso
-rw-r--r-- 1 root root 2408808448 Mar 18 09:15 ceph.iso# 安装httpd并设置为开机自启动
[root@ceph1 ~]# yum install -y vsftpd
[root@ceph1 ~]# systemctl enable vsftpd --now# 挂载ceph.iso到/var/ftp
[root@ceph1 ~]# mkdir /var/ftp/ceph
[root@ceph1 ~]# echo "/root/ceph.iso  /var/ftp/ceph  iso9660 defaults 0 0" >> /etc/fstab 
[root@ceph1 ~]# mount -a
# yum文件ceph.repo由后面的ceph-deploy工具安装时自动生成。
部署ceph集群

步骤一:安装ceph-deploy
重要:直接设置环境变量即可,否则集群部署过程将使用官方yum源。

[root@ceph1 ~]# export CEPH_DEPLOY_REPO_URL=ftp://ceph1/ceph/
在ceph1上安装部署工具。
Ceph官方推出了一个用python写的工具 cpeh-deploy,可以很大的简化ceph集群的配置过程[root@ceph1 ~]# yum install /var/ftp/ceph/noarch/ceph-deploy-2.0.1-0.noarch.rpm 
# 注意:安装高版本的ceph-deploy,否则后面配置会报错
ceph1上创建工作目录
[root@ceph1 ~]# mkdir /ceph-cluster
[root@ceph1 ~]# cd /ceph-cluster

步骤二:创建ceph集群,在/ceph-cluster目录下生成配置文件

创建ceph集群

创建一个新集群,并设置mon节点。

ceph1-ceph3添加epel源wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@ceph1 ceph-cluster]# ceph-deploy new ceph1 ceph2 ceph3
[root@ceph1 ceph-cluster]# ll
total 16
-rw-r--r-- 1 root root  235 Mar 18 09:19 ceph.conf
-rw-r--r-- 1 root root 4852 Mar 18 09:19 ceph-deploy-ceph.log
-rw------- 1 root root   73 Mar 18 09:19 ceph.mon.keyring
给所有节点安装ceph相关软件包。
[root@ ceph1 ceph-cluster]# ceph-deploy install ceph1 ceph2 ceph3
添加监控节点
初始化所有节点的mon服务,也就是启动mon服务。
[root@ceph1 ceph-cluster]# ceph-deploy mon create-initial
# 作用是将ceph.conf配置文件拷贝到所有mon节点,并将ceph-mon服务启动并设置开机自启
创建ceph管理节点(mgr)
注意:每个运行了mon的节点上都需要安装mgr节点
[root@ceph1 ceph-cluster]# ceph-deploy mgr create ceph1 ceph2 ceph3 

步骤三:准备日志磁盘分区
注意:sdb1和sdb2两个分区用来做存储服务器的journal缓存盘。生产中固态用于缓存,sas用户共享。

格式化sdb
[root@ceph1 ceph-cluster]# for i in ceph{1..3}
dossh $i parted /dev/sdb mklabel gptssh $i parted /dev/sdb mkpart primary 1 50%ssh $i parted /dev/sdb mkpart primart 50% 100%
done
磁盘分区后的默认权限无法让ceph对其进行读写操作,需要修改权限。
[root@ceph1 ceph-cluster]# for i in ceph{1..3}
dossh $i chown ceph.ceph /dev/sdb1 /dev/sdb2
done

以上操作服务器重启后再次重值导致授权失效,所以需要把规则写到配置文件实现永久有效。

规则1:如果设备名为/dev/sdb1,则设备文件的拥有者和拥有组为ceph
规则2:如果设备名为/dev/sdb2,则设备文件的拥有者和拥有组为ceph

[root@ceph1 ceph-cluster]# vim /etc/udev/rules.d/70-sdb.rules
ENV{DEVNAME}=="/dev/sdb1",OWNER="ceph",GROUP="ceph"
ENV{DEVNAME}=="/dev/sdb2",OWNER="ceph",GROUP="ceph"

复制到其他osd节点

[root@ceph1 ceph-cluster]# for i in ceph{2..3}
doscp /etc/udev/rules.d/70-sdb.rules $i:/etc/udev/rules.d/
done

步骤四:创建OSD存储空间

初始化清空磁盘数据(仅在ceph1操作)

注意ceph-deploy v2.0.0开始不再使用ceph-disk命令来初始化osd磁盘,如果还使用旧的命令初始磁盘报错

[root@ceph1 ceph-cluster]# for i in ceph{1..3}
dossh $i parted /dev/sdc mklabel gptssh $i parted /dev/sdd mklabel gpt
done

#清理磁盘

[root@ceph1 ceph-cluster]# for i in ceph{1..3}
do ssh $i ceph-volume lvm zap /dev/sdcssh $i ceph-volume lvm zap /dev/sdd
done
创建OSD存储空间
// 创建osd存储设备,sdc提供存储空间,sdb1提供缓存
[root@ceph1 ceph-cluster]# ceph-deploy osd create --data /dev/sdc --journal /dev/sdb1 ceph1
[root@ceph1 ceph-cluster]# ceph-deploy osd create --data /dev/sdd --journal /dev/sdb2 ceph1
[root@ceph1 ceph-cluster]# ceph-deploy osd create --data /dev/sdc --journal /dev/sdb1 ceph2
[root@ceph1 ceph-cluster]# ceph-deploy osd create --data /dev/sdd --journal /dev/sdb2 ceph2
[root@ceph1 ceph-cluster]# ceph-deploy osd create --data /dev/sdc --journal /dev/sdb1 ceph3
[root@ceph1 ceph-cluster]# ceph-deploy osd create --data /dev/sdd --journal /dev/sdb2 ceph3

步骤五:查看ceph状态,验证在主节点生成的ceph.client.admin.keyring文件拷贝至所有节点的/etc/ceph下

[root@ceph1 ceph-cluster]# ceph-deploy admin ceph1 ceph2 ceph3# 检查集群状态:使用命令 ceph health 或者 ceph -s
[root@ceph1 ceph-cluster]# ceph health
HEALTH_OK
[root@ceph1 ~]# ceph -scluster:id:     55eafb95-ab53-4045-9c64-82d2726a6b31health: HEALTH_OKservices:mon: 3 daemons, quorum ceph1,ceph2,ceph3 (age 68m)mgr: ceph1(active, since 68m), standbys: ceph3, ceph2osd: 6 osds: 6 up (since 75s), 6 in (since 75s)data:pools:   0 pools, 0 pgsobjects: 0 objects, 0 Busage:   6.0 GiB used, 594 GiB / 600 GiB avail
pgs:   

步骤六:启用dashboard自 nautilus开始,dashboard作为一个单独的模块独立出来了,使用时需要在所有的mgr节点上单独安装

# 在所有的mgr节点上单独安装
[root@ceph1 ceph-cluster]# for i in ceph{1..3}
dossh $i yum install -y ceph-mgr-dashboard
done# 启用dashboard
[root@ceph1 ceph-cluster]# ceph mgr module enable dashboard --force
# 默认启用SSL/TLS,所以需要创建自签名根证书
[root@ceph1 ceph-cluster]# ceph dashboard create-self-signed-cert# 创建具有管理员角色的用户
[root@ceph1 ceph-cluster]# ceph dashboard ac-user-create admin admin administrator
{"username": "admin", "lastUpdate": 1616031372, "name": null, "roles": ["administrator"], "password": "$2b$12$4wa4pCKkDf.pvDO9LFldZuwn1GRt.W6zDXvV9QHxnjovrmpA3inWS",
"email": null}# 查看ceph-mgr服务
[root@ceph1 ~]# ceph mgr services
{"dashboard": "https://ceph1:8443/"
}

image.png
image.png
(注)如果仪表盘(dashboard)密码忘了,可以使用以下命令重置密码
ceph dashboard ac-user-set-password admin “RedHat@123”

ceph和openstack集成

OpenStack 使用 Ceph 作为后端存储可以带来以下好处:

  • 不需要购买昂贵的商业存储设备,降低 OpenStack 的部署成本
  • Ceph 同时提供了块存储、文件系统和对象存储,能够完全满足 OpenStack 的存储类型需求
  • RBD COW 特性支持快速的并发启动多个 OpenStack 实例
  • 为 OpenStack 实例默认的提供持久化卷
  • 为 OpenStack 卷提供快照、备份以及复制功能
  • 为 Swift 和 S3 对象存储接口提供了兼容的 API 支持
配置Ceph环境

首先,openstack和ceph节点统一hosts解析:

192.168.150.11 ceph1
192.168.150.12 ceph2
192.168.150.13 ceph3
192.168.150.10 controller
192.168.150.20 compute
创建后端需要的存储池(ceph-01节点操作)
# cinder卷的存储池
root@ceph1:~# ceph osd pool create volumes 32
# glance存储池
root@ceph1:~# ceph osd pool create images 32
# 备份存储池
root@ceph1:~# ceph osd pool create backups 32
# 创建实例存储池
root@ceph1:~# ceph osd pool create vms 32# 查看存储池
root@ceph1:~# ceph osd pool ls
volumes
images
backups
vms
root@ceph1:~# ceph osd pool ls detail
pool 1 'volumes' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 68 flags hashpspool stripe_width 0
pool 2 'images' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 71 flags hashpspool stripe_width 0
pool 3 'backups' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 74 flags hashpspool stripe_width 0
pool 4 'vms' replicated size 3 min_size 2 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode warn last_change 77 flags hashpspool stripe_width 0
创建后端用户

2.1创建密钥(ceph1节点操作)
在ceph上创建cinder、glance、cinder-backup、nova用户创建密钥,允许访问使用Ceph存储池

2.1.1创建用户client.cinder

对volumes存储池有rwx权限,对vms存储池有rwx权限,对images池有rx权限

root@ceph1:~# ceph auth get-or-create client.cinder mon “allow r” osd “allow class-read object_prefix rbd_children,allow rwx pool=volumes,allow rwx pool=vms,allow rx pool=images”

class-read:x的子集,授予用户调用类读取方法的能力 object_prefix 通过对象名称前缀。下例将访问限制为任何池中名称仅以 rbd_children 为开头的对象。

2.1.2 创建用户client.glance

对images存储池有rwx权限

root@ceph1:~# ceph auth get-or-create client.glance mon “allow r” osd “allow class-read object_prefix rbd_children,allow rwx pool=images”

2.1.3 创建用户client.cinder-backup

对backups存储池有rwx权限

root@ceph1:~# ceph auth get-or-create client.cinder-backup mon “profile rbd” osd “profile rbd pool=backups”
使用 rbd profile 为新的 cinder-backup 用户帐户定义访问权限。然后,客户端应用使用这一帐户基于块来访问利用了 RADOS 块设备的 Ceph 存储。

2.2 导出密钥(ceph-01节点操作)

# 切换到ceph目录
root@ceph1:~# cd /etc/ceph/# 导出glance密钥
root@ceph1:/etc/ceph# ceph auth get client.glance -o ceph.client.glance.keyring# 导出cinder密钥
root@ceph1:/etc/ceph# ceph auth get client.cinder -o ceph.client.cinder.keyring# 导出cinder-backup密钥
root@ceph1:/etc/ceph# ceph auth get client.cinder-backup -o ceph.client.cinder-backup.keyring
拷贝密钥

3.1 创建存放目录(openstack节点执行)

root@controller:~# mkdir /etc/ceph/

3.2 拷贝密钥到控制节点(ceph1节点操作)

# 拷贝glance密钥
root@ceph1:/etc/ceph# scp ceph.client.glance.keyring root@controller:/etc/ceph/# 拷贝cinder密钥
root@ceph-01:/etc/ceph# scp ceph.client.cinder.keyring root@controller:/etc/ceph/# 拷贝ceph集群认证配置文件
root@ceph-01:/etc/ceph# scp ceph.conf root@controller:/etc/ceph/

3.3 拷贝密钥到计算节点(ceph-01节点操作)

# 拷贝cinder密钥
[root@compute ~]# mkdir /etc/ceph
root@ceph1:/etc/ceph# scp ceph.client.cinder.keyring root@compute:/etc/ceph/# 拷贝cinder-backup密钥(backup服务节点)
root@ceph1:/etc/ceph# scp ceph.client.cinder-backup.keyring root@compute:/etc/ceph/# 拷贝ceph集群认证配置文件
root@ceph1:/etc/ceph# scp ceph.conf root@compute:/etc/ceph/
添加libvirt密钥(计算节点执行)
# 生成密钥(PS:注意,如果有多个计算节点,它们的UUID必须一致)
root@compute:~# cd /etc/ceph/
root@compute:/etc/ceph# UUID=bf168fa8-8d5b-4991-ba4c-12ae622a98b1
root@compute:/etc/ceph# cat >> secret.xml << EOF
<secret ephemeral='no' private='no'><uuid>$UUID</uuid><usage type='ceph'><name>client.cinder secret</name></usage>
</secret>
EOF# 执行命令写入secret
[root@compute ~]# virsh secret-define --file secret.xml# 查看添加后端密钥
root@compute ~:/etc/ceph# virsh secret-listUUID                                   Usage
-------------------------------------------------------------------bf168fa8-8d5b-4991-ba4c-12ae622a98b1   ceph client.cinder secret# 加入key
# 将key值复制出来
[root@compute ~]# cat ceph.client.cinder.keyring
AQCvztRk8ssALhAAXshR1E+Y90HvIyxkhal1cQ==[root@compute ~]# virsh secret-set-value --secret ${UUID} --base64 $(cat ceph.client.cinder.keyring | grep key | awk -F ' ' '{print $3}')
注意:本文controller节点复用计算节点,执行相同操作。
安装ceph客户端(openstack所有节点执行)
# 主要作用是OpenStack可调用Ceph资源
root@controller:~# yum install -y ceph-common
root@compute:~# yum install -y ceph-common
ceph和openstack glance集成
配置glance后端存储(控制节点执行)
# 更改glance密钥属性
root@controller:~# chown glance.glance /etc/ceph/ceph.client.glance.keyring# 修改配置文件
root@controller:~# cp /etc/glance/glance-api.conf{,.bak}
root@controller:~# vim /etc/glance/glance-api.conf
root@controller:~# sed -n "14,23p" /etc/glance/glance-api.conf
[DEFAULT]
...
# enable COW cloning of images
show_image_direct_url = True
[glance_store]# stores = file,http
# default_store = file
# filesystem_store_datadir = /var/lib/glance/images/stores = rbd,file,http
default_store = rbd
rbd_store_pool = images
rbd_store_user = glance
rbd_store_ceph_conf = /etc/ceph/ceph.conf
rbd_store_chunk_size = 8# 重启生效ceph配置
root@controller:~# systemctl restart openstack-glance-api.service# 设置开机自启动
root@controller:~# systemctl enable openstack-glance-api.service# 配置管理员环境变量
root@controller ~# vim admin-openrc.sh
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=redhat
export OS_AUTH_URL=http://192.168.150.10:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export PS1='[\u@\h \W(keystone_admin)]\$ '
# 上传镜像
root@controller ~# 
root@controller ~# ll CentOS-7-x86_64-GenericCloud-2009.qcow2
-rw-r--r--. 1 root root 888995840 Dec 23 13:04 CentOS-7-x86_64-GenericCloud-2009.qcow2root@controller:~# openstack image create centos7 --disk-format qcow2 --file CentOS-7-x86_64-GenericCloud-2009.qcow2 --public
# openstack image list
+--------------------------------------+---------+--------+--------+
| ID                                    | Name  | Status |
+--------------------------------------+---------+--------+--------+
| 88342def-69e7-4aaa-a8d2-936473b0cb0e | centos7 | active |
+--------------------------------------+---------+--------+--------+
验证镜像(ceph1节点执行)
root@ceph1:/etc/ceph# rbd ls images
88342def-69e7-4aaa-a8d2-936473b0cb0e[root@ceph1 ceph]# ceph df
RAW STORAGE:CLASS     SIZE        AVAIL       USED        RAW USED     %RAW USED hdd       600 GiB     591 GiB     2.6 GiB      8.6 GiB          1.43 TOTAL     600 GiB     591 GiB     2.6 GiB      8.6 GiB          1.43 POOLS:POOL        ID     STORED      OBJECTS     USED        %USED     MAX AVAIL volumes      1         0 B           0         0 B         0       187 GiB images       2     848 MiB         112     2.5 GiB      0.44       187 GiB backups      3         0 B           0         0 B         0       187 GiB vms          4         0 B           0         0 B         0       187 GiB 
ceph和openstack cinder集成
更改cinder密钥属性(openstack节点执行)
root@controller:~# chown cinder.cinder /etc/ceph/ceph.client.cinder.keyring
root@compute:~# chown cinder.cinder /etc/ceph/ceph.client.cinder.keyring
修改cinder配置文件

控制节点执行

# 指定存储类型,否则在创建卷时,类型为 __DEFAULT__
root@controller:~# vim /etc/cinder/cinder.conf
root@controller:~# sed -n "1,2p" /etc/cinder/cinder.conf
[DEFAULT]
default_volume_type = ceph# 重启服务生效配置
root@controller:~# systemctl restart openstack-cinder-scheduler.service
# 计算节点执行
root@compute:~# vim /etc/cinder/cinder.conf
root@compute:/etc/ceph# sed -n "1,2p;28,39p" /etc/cinder/cinder.conf[DEFAULT]
#enabled_backends = lvm
enabled_backends = ceph,lvm[ceph]
volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool = volumes
rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot = false
rbd_max_clone_depth = 5
rbd_store_chunk_size = 4
rados_connect_timeout = -1
glance_api_version = 2
rbd_user = cinder
rbd_secret_uuid = bf168fa8-8d5b-4991-ba4c-12ae622a98b1
volume_backend_name = ceph# 重启服务生效配置
root@compute:/etc/ceph# systemctl restart openstack-cinder-volume.service
创建卷类型(控制节点执行)
# 创建卷类型
root@controller:~# openstack volume type create ceph
root@controller:~# openstack volume type create lvm# 设置卷类型元数据
root@controller:~# cinder --os-username admin --os-tenant-name admin type-key ceph set volume_backend_name=ceph
root@controller:~# cinder --os-username admin --os-tenant-name admin type-key lvm set volume_backend_name=lvm
# 查看存储类型root@controller:~# openstack volume type list
+--------------------------------------+------+-----------+--------+
| ID                                   | Name | Is Public |
+--------------------------------------+---------+--------+--------+
| a64c49a3-b5a2-4c2d-a26f-ba392f91d22f | lvm  | True   |
| 2e42be46-1f70-481f-9db0-8638547e9011 | ceph | True   |
+--------------------------------------+------+-----------+--------+# 创建卷测试
root@controller:~# openstack volume create ceph01 --type ceph --size 1
# 查看volumes存储池是否存在卷
root@ceph1:/etc/ceph# rbd ls volumes
volume-22ddb8e3-7390-4390-be67-dbd83ea1394f 
配置cinder卷备份
配置卷备份(计算节点执行)
# 更改密钥属性
root@compute:/etc/ceph# chown cinder.cinder /etc/ceph/ceph.client.cinder-backup.keyring# 修改配置文件
root@compute-01:/etc/ceph# vim /etc/cinder/cinder.conf
root@compute-01:/etc/ceph# sed -n "1,9p" /etc/cinder/cinder.conf
[DEFAULT]
backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
backup_ceph_conf=/etc/ceph/ceph.conf
backup_ceph_user = cinder-backup
backup_ceph_chunk_size = 4194304
backup_ceph_pool = backups
backup_ceph_stripe_unit = 0
backup_ceph_stripe_count = 0
restore_discard_excess_bytes = true# 重启生效配置
root@compute-01:/etc/ceph# systemctl restart openstack-cinder-backup.service# 设置开机自启动
root@compute-01:/etc/ceph# systemctl enable openstack-cinder-backup.service
创建卷备份(控制节点执行)
root@controller:~# openstack volume backup create --name ceph_backup ceph01
验证卷备份(ceph1节点执行)
root@ceph1:/etc/ceph# rbd ls backups
volume-22ddb8e3-7390-4390-be67-dbd83ea1394f.backup.base
ceph和openstack nova集成

注意:vmware嵌套虚拟化环境需要修改nova配置文件,修改virt_type=qemu,然后重启nova-compute服务。

修改nova配置文件(计算节点执行)
# 修改nova配置文件root@compute:/etc/ceph# vim /etc/nova/nova.conf
root@compute:/etc/ceph# sed -n "1,2p;47,52p" /etc/nova/nova.conf
[DEFAULT]
live_migration_flag = "VIR_MIGRATE_UNDEFINE_SOURCE,VIR_MIGRATE_PEER2PEER,VIR_MIGRATE_LIVE"[libvirt]
images_type = rbd
images_rbd_pool = vms
images_rbd_ceph_conf = /etc/ceph/ceph.conf
rbd_user = cinder
rbd_secret_uuid = bf168fa8-8d5b-4991-ba4c-12ae622a98b1# 重启nova服务生效配置
root@compute1:/etc/ceph# systemctl restart openstack-nova-compute.service
创建实例测试(控制节点执行)
# 创建云主机类型
openstack flavor create --vcpus 1 --ram 2048 --disk 20 --public m1.web# 创建外部网络
openstack network create --share --external --provider-physical-network provider 
--provider-network-type flat public
# 创建子网
openstack subnet create --network public --allocation-pool start=192.168.150.100,end=192.168.150.200 --dns-nameserver 223.5.5.5 --gateway 192.168.150.2 --subnet-range 192.168.150.0/24 public_150# 创建云主机
openstack server create --flavor m1.web --image centos7 --security-group default --nic net-id=ba8a9f55-9d0e-4f08-9db7-e38ea8526ab4 vm01

image.png

验证是否到ceph中的vms存储池(ceph1节点执行)
oot@ceph1:/etc/ceph# rbd ls vms
ae046a56-79d5-46b0-a62a-380fc677a3e4_disk在存储节点Ceph OSD使能pool
[root@ceph1 ceph]# ceph osd pool application enable volumes rbd
enabled application 'rbd' on pool 'volumes'
[root@ceph1 ceph]# ceph osd pool application enable vms rbd
enabled application 'rbd' on pool 'vms'
[root@ceph1 ceph]# ceph osd pool application enable images rbd
enabled application 'rbd' on pool 'images'
[root@ceph1 ceph]# ceph osd pool application enable backups rbd
enabled application 'rbd' on pool 'backups'

查看ceph状态
image.png

相关文章:

私有云平台搭建openstack和ceph结合搭建手册

OpenStack与云计算 什么是云&#xff1f; 如何正确理解云&#xff0c;可以从以下几个方面。 云的构成。 用户&#xff1a;对用户而言是透明无感知的&#xff0c;不用关心底层构成&#xff0c;只需要知道利用云完成自己任务即可。 云提供商&#xff1a;对云资产管理和运维。 云…...

debug mccl 02 —— 环境搭建及初步调试

1, 搭建nccl 调试环境 下载 nccl 源代码 git clone --recursive https://github.com/NVIDIA/nccl.git 只debug host代码&#xff0c;故将设备代码的编译标志改成 -O3 (base) hipperhipper-G21:~/let_debug_nccl/nccl$ git diff diff --git a/makefiles/common.mk b/makefiles/…...

ros python 接收GPS RTK 串口消息再转发 ros 主题消息

代码是一个ROS(Robot Operating System)节点,用于从GPS设备读取RTK(实时动态)数据并通过ROS主题发布。 步骤: 导入必要的模块: rospy 是ROS的Python库,用于ROS的节点、发布者和订阅者。serial 用于串行通信。NavSatFix 和 NavSatStatus 是从GPS接收的NMEA 0183标准消息…...

2024年网络安全竞赛-页面信息发现任务解析

页面信息发现任务说明: 服务器场景:win20230305(关闭链接)在渗透机中对服务器信息收集,将获取到的服务器网站端口作为Flag值提交;访问服务器网站页面,找到主页面中的Flag值信息,将Flag值提交;访问服务器网站页面,找到主页面中的脚本信息,并将Flag值提交;访问服务器…...

ARM DMA使用整理

Direct Memory Access&#xff0c; 直接存储访问。同SPI,IIC,USART等一样&#xff0c;属于MCU的一个外设&#xff0c;用于在不需要MCU介入的情况下进行数据传输。可以将数据从外设传输到flash&#xff0c;也可以将数据从flash传输到外设&#xff0c;或者flash内部数据移动。 它…...

移动通信原理与关键技术学习(第四代蜂窝移动通信系统)

前言&#xff1a;LTE 标准于2008 年底完成了第一个版本3GPP Release 8的制定工作。另一方面&#xff0c;ITU 于2007 年召开了世界无线电会议WRC07&#xff0c;开始了B3G 频谱的分配&#xff0c;并于2008 年完成了IMT-2000&#xff08;即3G&#xff09;系统的演进——IMT-Advanc…...

光明源@智慧厕所技术:优化生活,提升卫生舒适度

在当今数字科技飞速发展的时代&#xff0c;我们的日常生活正在经历一场革命&#xff0c;而这场革命的其中一个前沿领域就是智慧厕所技术。这项技术不仅仅是对传统卫生间的一次升级&#xff0c;更是对我们生活品质的全方位提升。从智能感应到数据分析&#xff0c;从环保设计到舒…...

【Bootstrap学习 day13】

Bootstrap5 下拉菜单 下拉菜单通常用于导航标题内&#xff0c;在用户鼠标悬停或单击触发元素时显示相关链接列表。 基础的下拉列表 <div class"dropdown"><button type"button" class"btn btn-primary dropdown-toggle" data-bs-toggl…...

Shell:常用命令之dirname与basename

一、介绍 1、dirname命令用于去除文件名中的非目录部分&#xff0c;删除最后一个“\”后面的路径&#xff0c;显示父目录。 语法&#xff1a;dirname [选项] 参数 2、basename命令用于打印目录或者文件的基本名称&#xff0c;显示最后的目录名或文件名。 语法&#xff1a;basen…...

Linux-v4l2框架

框架图 从上图不难看出&#xff0c;v4l2_device作为顶层管理者&#xff0c;一方面通过嵌入到一个video_device中&#xff0c;暴露video设备节点给用户空间进行控制&#xff1b;另一方面&#xff0c;video_device内部会创建一个media_entity作为在media controller中的抽象体&a…...

VPC网络架构下的网络上数据采集

介绍 想象这样一个场景&#xff0c;一开始在公司里&#xff0c;所有的部门的物理机、POD都在一个经典网络内&#xff0c;它们可以通过 IP 访问彼此&#xff0c;没有任何限制。因此有很多系统基于此设计了很多点对点 IP 直连的访问&#xff0c;比如中心控制服务器 S 会主动访问物…...

模拟算法(模拟算法 == 依葫芦画瓢)万字

模拟算法 基本思想引入算法题替换所有的问号提莫攻击Z字形变换外观数列数青蛙 基本思想 模拟算法 依葫芦画瓢解题思维要么通俗易懂&#xff0c;要么就是找规律&#xff0c;主要难度在于将思路转换为代码。 特点&#xff1a;相对于其他算法思维&#xff0c;思路比较简单&#x…...

QtApplets-SystemInfo

QtApplets-SystemInfo ​ 今天是2024年1月3日09:18:44&#xff0c;这也是2024年的第一篇博客&#xff0c;今天我们主要两件事&#xff0c;第一件&#xff0c;获取系统CPU使用率&#xff0c;第二件&#xff0c;获取系统内存使用情况。 ​ 这里因为写博客的这个本本的环境配置不…...

vue3防抖函数封装与使用,以指令的形式使用

utils/debounce.js /*** 防抖函数* param {*} fn 函数* param {*} delay 暂停时间* returns */ export function debounce(fn, delay 500) {let timer nullreturn function (...args) {// console.log(arguments);// const args Array.from(arguments)if (timer) {clearTim…...

Hive学习(13)lag和lead函数取偏移量

hive里面lag函数 在数据处理和分析中&#xff0c;窗口函数是一种重要的技术&#xff0c;用于在数据集中执行聚合和分析操作。Hive作为一种大数据处理框架&#xff0c;也提供了窗口函数的支持。在Hive中&#xff0c;Lag函数是一种常用的窗口函数&#xff0c;可以用于计算前一行…...

Centos Unable to verify the graphical display setup

ERROR: Unable to verify the graphical display setup. 在Linux下安装Oracle时 运行 ./runInstaller 报错 ERROR: Unable to verify the graphical display setup. This application requires X display. Make sure that xdpyinfo exist under PATH variable. No X11 DISPL…...

Java 说一下 synchronized 底层实现原理?

Java 说一下 synchronized 底层实现原理&#xff1f; synchronized 是 Java 中用于实现同步的关键字&#xff0c;它保证了多个线程对共享资源的互斥访问。底层实现涉及到对象头的 Mark Word 和锁升级过程。 synchronized 可以用于方法上或代码块上&#xff0c;分别对应于方法…...

nginx访问路径匹配方法

目录 一&#xff1a;匹配方法 二&#xff1a;location使用: 三&#xff1a;rewrite使用 一&#xff1a;匹配方法 location和rewrite是两个用于处理请求的重要模块&#xff0c;它们都可以根据请求的路径进行匹配和处理。 二&#xff1a;location使用: 1&#xff1a;简单匹配…...

偌依 项目部署及上线步骤

准备实验环境&#xff0c;准备3台机器 1.作为前端服务器&#xff0c;mysql,redis服务器--同时临时作为代码打包服务器 192.168.2.65 nginx-server 2.作为后端服务器 192.168.2.66 java-server-1 192.168.2.67 java-server-2 安装nginx/mysql #安装nginx [rootweb-nginx ~]…...

PHP特性知识点扫盲 - 上篇

概述 之前在分析thinkphp源码的时候&#xff0c;对依赖注入等等php高级的特性一直想做一个梳理和总结&#xff0c;一直没有时间&#xff0c;好不容易抽一点时间对技术的盲点做一个扫盲和总结。 特性 1.命名空间 命名空间是在PHP5.3中引入&#xff0c;是一个很重要的工具&am…...

Docker一键极速安装Nacos,并配置数据库!

1 部署方式 1.1 DockerHub javaedgeJavaEdgedeMac-mini ~ % docker run --name nacos \ -e MODEstandalone \ -e JVM_XMS128m \ -e JVM_XMX128m \ -e JVM_XMN64m \ -e JVM_MS64m \ -e JVM_MMS64m \ -p 8848:8848 \ -d nacos/nacos-server:v2.2.3 a624c64a1a25ad2d15908a67316d…...

交换机04_远程连接

通过远程管理方式连接交换机 1、telnet简介 telnet 是应用层协议 基于传输层TCP协议的&#xff0c;默认端口&#xff1a;23 采用的是明文密码方式 不是很安全&#xff0c;一般用于内网管理。 2、ssh协议简介 ssh 是应用层的协议&#xff0c;基于传输层的TCP协议&#x…...

ES6定义一个类(函数内部定义属性,,原型定义方法 ), 实现继承?

ES6中使用class关键字定义一个类&#xff0c;使用extends关键字实现继承。下面是一个示例&#xff1a; class Animal {constructor(name) {this.name name;}sayHello() {console.log(Hello, my name is ${this.name});} }class Dog extends Animal {constructor(name, breed)…...

使用 Process Explorer 和 Windbg 排查软件线程堵塞案例分享

目录 1、问题说明 2、线程堵塞的可能原因分析 3、使用Windbg和Process Explorer确定线程中发生了死循环 4、根据Windbg中显示的函数调用堆栈去查看源码&#xff0c;找到问题 4.1、在Windbg定位发生死循环的函数的方法 4.2、在Windbg中查看变量的值去辅助分析 4.3、是循环…...

“智慧”千里眼助力水泵站

泵站是为水提供势能和压能&#xff0c;解决无自流条件下的排灌、供水和水资源调配问题的唯一动力来源&#xff0c;在工农业用水、防洪、排涝和抗旱减灾等方面发挥着重要作用。一旦出现异常&#xff0c;对经济生产将造成难以估量的损失&#xff0c;给水利安全管理造成负担。因此…...

C++多态性——(5)运算符重载(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 身先才能率人&#xff0c;律己才能服人…...

ES -极客学习

Elasticsearch 简介及其发展历史 起源 Lucene 于 Java 语言开发的搜索引擎库类创建于 1999 年&#xff0c;2005 年成为 Apache 顶级开源项目Lucene 具有高性能、易扩展的优点Lucene 的局限性 只能基于 Java 语言开发类库的接口学习曲线陡峭原生并不支持水平扩展原生并不支持水…...

【大厂秘籍】系列 - Java多线程面试题

Java多线程面试题 友情提示&#xff0c;看完此文&#xff0c;在Java多线程这块&#xff0c;基本上可以吊打面试官了 线程和进程的区别 进程是资源分配的最小单位&#xff0c;线程是CPU调度的最小单位 线程是进程的子集&#xff0c;一个进程可以有很多线程&#xff0c;每条线…...

vue实现画笔回放,canvas转视频播放功能

示例图&#xff1a; 一、vue2版本 <template><div class"canvas-video"><canvasref"myCanvasByVideo"class"myCanvas"id"myCanvasByVideo":width"width":height"height"></canvas><d…...

Docker中镜像的相关操作

1.辅助操作 docker version&#xff1a;用查看docker客户端引擎和server端引擎版本信息。 docker info&#xff1a;用来查看docker引擎的详细信息。 docker --help&#xff1a;用来查看帮助信息。 2.镜像Image docker images&#xff1a;查看当前本地仓库中存在哪些镜像。 …...

商城网站制作 价格/郑州搜狗关键词优化顾问

在日常管理中&#xff0c;可能有让sql 重新解析的需求&#xff0c;比如使用了绑定变量窥探&#xff0c;但是第一次绑定的执行计划不一定很好&#xff0c;需要重新执行硬解析&#xff0c;这时我们可以使用 dbms_shared_pool.purge 10:43:12 hlbCRMUAT>create table hlb(id …...

wordpress媒体库查看404/seo工具查询

1、创建一个svn的仓库&#xff1a;E:\> svnadmin create svn_server2、迁出svn仓库&#xff1a;D:\> svn co file:///e:/svn_server svn_client3、设置svnignore创建一个svnignore文件用于统一管理ignore选项&#xff0c;这里仅添加一行&#xff1a;*.class&#xff0c;用…...

网站弹窗在中间位置/网站收录查询系统

在Card_Info表中&#xff0c;有一个字段是“Status”&#xff0c;这篇博客的由来就是我在考虑Status这个字段到底有没有用的过程中产生的。 …...

沂南网站设计/风云榜百度

转载于:https://www.cnblogs.com/yoursmlie/p/8846778.html...

wordpress有哪些好模版/seo优化前景

一、最小化安装 1、进入系统之后&#xff0c;要配置network网络。 首先ping www.baidu.com (Ctrlz 推出正在执行的命令) 如果ping不通&#xff0c;则修改&#xff1a; vi /etc/sysconfig/network-scripts/ifcfg-ens33 ONBOOTyes 修改之后重启network&#xff1a; servi…...

交友网站初期怎么做/地推任务网

我们在制作网站的时候,尤其是各种电子商务网站,首先都会让用户填写一些表格来获取注册用户的各种信息,因为用户有可能输入各式各样的信息,而有些不符合要求的数据会给我们的后端ASP处理程序带来不必要的麻烦,甚至导致网站出现一些安全问题。因此我们在将这些信息保存到网站的数…...