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

ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、环境信息
  • 二、部署步骤
    • 2.1 基础环境准备
    • 2.2 各节点docker环境安装
    • 2.3 搭建互信集群
    • 2.4 下载ceph-ansible
  • 三、配置部署文件
    • 3.1 使用本地docker
    • 3.2 配置hosts主机清单文件
    • 3.3 配置group_vars/all.yml文件
    • 3.4 开始部署
    • 3.5 部署ceph-common软件包
    • 3.6 部署结果
  • 四、相关实验
    • 4.1 测试删除osd
    • 4.2 测试增加osd
    • 4.3 将实验4.1中移除的osd更换硬盘后重新加回集群
    • 4.4 新增一个只是osd功能的节点
    • 4.5 删除新增的node04节点
  • 总结


前言

记录一下使用ceph-ansible部署ceph14版本(nautilus)的过程。

ceph-ansible官网地址:https://docs.ceph.com/projects/ceph-ansible/en/latest/osds/scenarios.html


一、环境信息

操作系统版本:centos7.9

机器-磁盘信息表格

机器名称机器IP磁盘一盘符磁盘二盘符磁盘三盘符磁盘四盘符磁盘五盘符
node01192.168.150.72/dev/vdb//dev/vdc//dev/vdd/
node02192.168.150.73/dev/vdb//dev/vdc//dev/vdd//dev/vde/
node03192.168.150.74/dev/vdb//dev/vdc//dev/vdd//dev/vde//dev/vdf/

二、部署步骤

2.1 基础环境准备

基础环境的部署参考
https://blog.csdn.net/baidu_35848778/article/details/145564790

2.2 各节点docker环境安装

我这里的docker配置了自己本地的harbor仓库,镜像都是本地化了的,现在国内源pull不太好使,最好是能自己提前下载好本地化一下来使用。

# 安装docker服务
sudo yum-config-manager --add-repo  http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo;
# 修改cgroupdriver
mkdir -p /etc/docker/;
cat > /etc/docker/daemon.json <<EOF
{"insecure-registries": ["http://harbor.XXX.XX.XX:10002"],"exec-opts":["native.cgroupdriver=systemd"],"log-driver":"json-file","log-opts":{"max-size":"100m"}
}
EOF# 安装软件包
yum install docker-ce docker-ce-cli -y;
# 启动服务,设置自启动
systemctl restart docker;
systemctl enable  docker;# 登录仓库
docker login http://harbor.XXX.XX.XX:10002

2.3 搭建互信集群

搭建互信的方式各不相同,我这边使用的是收集分发authorized_keys的方式。
各节点修改/etc/hosts文件

cat <<EOF >> /etc/hosts
192.168.150.72  node01
192.168.150.73  node02
192.168.150.74  node03
EOF

各节点生成密钥

ssh-keygen -f ~/.ssh/id_rsa -P '' -q

主节点(72节点)发送密钥到各个节点

yum install -y sshpasssshpass -p "password" ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@192.168.150.72sshpass -p "password" ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@192.168.150.73sshpass -p "password" ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no root@192.168.150.74

主节点(72节点)收集各节点密钥

ssh root@192.168.150.73  cat ~/.ssh/id_rsa.pub>> /root/.ssh/authorized_keysssh root@192.168.150.74  cat ~/.ssh/id_rsa.pub>> /root/.ssh/authorized_keys

主节点(72节点)推送密钥汇集文件到各个节点

scp /root/.ssh/authorized_keys  192.168.150.73:/root/.ssh/scp /root/.ssh/authorized_keys  192.168.150.74:/root/.ssh/

2.4 下载ceph-ansible

下载安装包 国内不好访问的话 我是直接买了一个阿里云的香港的抢占式虚拟机下载的

yum install python2-pip ansible git  python-netaddr -y
mkdir -p /data/installceph/ && cd /data/installceph/
git config --global http.postBuffer 5242880
git clone https://github.com/ceph/ceph-ansible.git
cd ceph-ansible
# 切换分支,需要部署的是14 nautilus版本
git checkout stable-4.0

相关版本信息
stable-3.0 Supports Ceph versions jewel and luminous. This branch requires Ansible version 2.4.
stable-3.1 Supports Ceph versions luminous and mimic. This branch requires Ansible version 2.4.
stable-3.2 Supports Ceph versions luminous and mimic. This branch requires Ansible version 2.6.
stable-4.0 Supports Ceph version nautilus. This branch requires Ansible version 2.9.
stable-5.0 Supports Ceph version octopus. This branch requires Ansible version 2.9.
stable-6.0 Supports Ceph version pacific. This branch requires Ansible version 2.10.
stable-7.0 Supports Ceph version quincy. This branch requires Ansible version 2.12.
main Supports the main (devel) branch of Ceph. This branch requires Ansible version 2.12.

三、配置部署文件

3.1 使用本地docker

/data/installceph/ceph-ansible/roles/ceph-container-engine/tasks/pre_requisites/prerequisites.yml

#- name: install container packages
#  package:
#    name: ['{{ container_package_name }}', '{{ container_binding_name }}']
#    update_cache: true
#  register: result
#  until: result is succeeded
#  tags: with_pkg

3.2 配置hosts主机清单文件

由于是个各节点的硬盘信息不同

cat <<EOF >>  /data/installceph/ceph-ansible/hosts
[mons]
node01
node02
node03[osds]
node01 devices="['/dev/vdb','/dev/vdc','/dev/vdd']"
node02 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde','/dev/vdf']"[mgrs]
node01
node02
node03[mdss]
node01
node02
node03[clients]
node01[rgws]
node01[grafana-server]
node01
EOF

3.3 配置group_vars/all.yml文件

\cp /data/installceph/ceph-ansible/group_vars/all.yml.sample /data/installceph/ceph-ansible/group_vars/all.yml
cat <<EOF >>  /data/installceph/ceph-ansible/group_vars/all.yml######################################################
#               INSTALL OPTIONS BY USER              #
#                                                    #
####################################################### Install options
# -----------------------------
ceph_origin: repository
ceph_repository: community
ceph_mirror: http://mirrors.aliyun.com/ceph
ceph_stable_key: http://mirrors.aliyun.com/ceph/keys/release.asc
ceph_stable_release: nautilus
ceph_stable_repo: "{{ ceph_mirror }}/rpm-{{ ceph_stable_release }}"
# -----------------------------ceph_docker_registry: harbor.XXX.XX.XX:10002
#node_exporter_container_image: "prom/node-exporter:v0.17.0"
#grafana_container_image: "grafana/grafana:5.4.3"
#prometheus_container_image: "prom/prometheus:v2.7.2"
#alertmanager_container_image: "prom/alertmanager:v0.16.2"# Ceph options
# -----------------------------
generate_fsid: true
ceph_conf_key_directory: /etc/ceph
cephx: true
# -----------------------------# Client options
# -----------------------------
rbd_cache: "false"
rbd_client_log_path: /var/log/ceph
# ----------------------------# Monitor options
# -----------------------------
monitor_interface: eth0
# ----------------------------# OSD options
# -----------------------------
journal_size: 5120
public_network: 192.168.150.0/24
cluster_network: 192.168.150.0/24
osd_objectstore: bluestore
# -----------------------------# MDS options
# -----------------------------
radosgw_interface: eth0
# -----------------------------# Testing mode
# -----------------------------
#common_single_host_mode: true
# -----------------------------# DOCKER options
# -----------------------------
ceph_docker_image: "ceph/daemon"
ceph_docker_image_tag: latest-nautilus
containerized_deployment: true
# -----------------------------# DASHBOARD options
# -----------------------------
dashboard_enabled: False
dashboard_protocol: http
dashboard_port: 8443
dashboard_admin_user: admin
dashboard_admin_password: admin123456
grafana_admin_user: admin
grafana_admin_password: admin
# -----------------------------
EOF

3.4 开始部署

cp site-docker.yml.sample site-docker.ymlansible-playbook -i  /data/installceph/ceph-ansible/hosts /data/installceph/ceph-ansible/site-docker.yml

3.5 部署ceph-common软件包

因为更习惯于在本地执行ceph命令,所以安装ceph-common

yum install epel-release   -ycat <<END >/etc/yum.repos.d/ceph.repo
[Ceph]
name=Ceph packages for \$basearch
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/\$basearch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc[Ceph-noarch]
name=Ceph noarch packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc[ceph-source]
name=Ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enabled=1
gpgcheck=1
type=rpm-md
gpgkey=https://download.ceph.com/keys/release.asc
ENDyum clean all
yum makecacheyum install -y ceph-common.x86_64

3.6 部署结果

osd部署结果符合预期

[root@node01 ceph-ansible]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       1.17224 root default                            
-3       0.29306     host node01                         0   hdd 0.09769         osd.0       up  1.00000 1.00000 3   hdd 0.09769         osd.3       up  1.00000 1.00000 6   hdd 0.09769         osd.6       up  1.00000 1.00000 
-7       0.39075     host node02                         1   hdd 0.09769         osd.1       up  1.00000 1.00000 4   hdd 0.09769         osd.4       up  1.00000 1.00000 7   hdd 0.09769         osd.7       up  1.00000 1.00000 9   hdd 0.09769         osd.9       up  1.00000 1.00000 
-5       0.48843     host node03                         2   hdd 0.09769         osd.2       up  1.00000 1.00000 5   hdd 0.09769         osd.5       up  1.00000 1.00000 8   hdd 0.09769         osd.8       up  1.00000 1.00000 
10   hdd 0.09769         osd.10      up  1.00000 1.00000 
11   hdd 0.09769         osd.11      up  1.00000 1.00000

四、相关实验

4.1 测试删除osd

实验设计:模拟osd.11异常无法提供服务时的移除操作

# 命令e.g.:ansible-playbook -vv -i hosts infrastructure-playbooks/shrink-osd.yml -e osd_to_kill=1,2,3# 实验命令:ansible-playbook -vv -i hosts infrastructure-playbooks/shrink-osd.yml -e osd_to_kill=11

实验结果

Thursday 13 February 2025  15:33:26 +0800 (0:00:00.373)       0:00:31.086 ***** 
ok: [node01] => changed=false cmd:- docker- exec- ceph-mon-node01- ceph- --cluster- ceph- -sdelta: '0:00:00.547188'end: '2025-02-13 15:33:27.087717'rc: 0start: '2025-02-13 15:33:26.540529'stderr: ''stderr_lines: <omitted>stdout: |2-cluster:id:     84a44515-64c1-4f5c-b9c5-a0cc3e797074health: HEALTH_WARNDegraded data redundancy: 28/627 objects degraded (4.466%), 7 pgs degradedservices:mon: 3 daemons, quorum node01,node02,node03 (age 76m)mgr: node02(active, since 74m), standbys: node01, node03mds: cephfs:1 {0=node03=up:active} 2 up:standbyosd: 11 osds: 11 up (since 14s), 11 in (since 16s); 1 remapped pgsrgw: 1 daemon active (node01.rgw0)task status:data:pools:   6 pools, 144 pgsobjects: 209 objects, 3.4 KiBusage:   11 GiB used, 1.1 TiB / 1.1 TiB availpgs:     28/627 objects degraded (4.466%)135 active+clean3   active+recovery_wait+degraded3   active+recovering+degraded2   active+recovery_wait1   active+recovery_wait+undersized+degraded+remappedio:recovery: 3 B/s, 1 keys/s, 2 objects/sprogress:Rebalancing after osd.11 marked out[==================............]stdout_lines: <omitted>TASK [show ceph osd tree] **************************************************************************************************************************************************
task path: /data/installceph/ceph-ansible/infrastructure-playbooks/shrink-osd.yml:254
Thursday 13 February 2025  15:33:27 +0800 (0:00:00.999)       0:00:32.085 ***** 
ok: [node01] => changed=false cmd:- docker- exec- ceph-mon-node01- ceph- --cluster- ceph- osd- treedelta: '0:00:00.560455'end: '2025-02-13 15:33:28.017771'rc: 0start: '2025-02-13 15:33:27.457316'stderr: ''stderr_lines: <omitted>stdout: |-ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF-1       1.07455 root default-3       0.29306     host node010   hdd 0.09769         osd.0       up  1.00000 1.000003   hdd 0.09769         osd.3       up  1.00000 1.000006   hdd 0.09769         osd.6       up  1.00000 1.00000-7       0.39075     host node021   hdd 0.09769         osd.1       up  1.00000 1.000004   hdd 0.09769         osd.4       up  1.00000 1.000007   hdd 0.09769         osd.7       up  1.00000 1.000009   hdd 0.09769         osd.9       up  1.00000 1.00000-5       0.39075     host node032   hdd 0.09769         osd.2       up  1.00000 1.000005   hdd 0.09769         osd.5       up  1.00000 1.000008   hdd 0.09769         osd.8       up  1.00000 1.0000010   hdd 0.09769         osd.10      up  1.00000 1.00000stdout_lines: <omitted>
META: ran handlersPLAY RECAP *****************************************************************************************************************************************************************
node01                     : ok=19   changed=3    unreachable=0    failed=0    skipped=12   rescued=0    ignored=0   
node02                     : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
node03                     : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

移除完毕后,将主机配置文件中osd对应的硬盘信息移除

[osds]
node01 devices="['/dev/vdb','/dev/vdc','/dev/vdd']"
node02 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
# 移除osd11前的记录node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde','/dev/vdf']"
# 下列为移除osd11之后的记录
node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"

4.2 测试增加osd

实验设计:在node01节点增加一个新硬盘名为/dev/vde的osd
将主机配置文件中新增osd对应的硬盘信息

[osds]
node01 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
node02 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
# 移除osd11前的记录node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde','/dev/vdf']"
# 下列为移除osd11之后的记录
node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"

执行命令

命令e.g.:ansible-playbook -i  /data/installceph/ceph-ansible/hosts site-docker.yml --limit osd-node-name实验命令:ansible-playbook -i  /data/installceph/ceph-ansible/hosts site-docker.yml --limit node01

实验结果:

[root@node01 ceph-ansible]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       1.17224 root default                            
-3       0.39075     host node01                         0   hdd 0.09769         osd.0       up  1.00000 1.00000 3   hdd 0.09769         osd.3       up  1.00000 1.00000 6   hdd 0.09769         osd.6       up  1.00000 1.00000 
11   hdd 0.09769         osd.11      up  1.00000 1.00000 
-7       0.39075     host node02                         1   hdd 0.09769         osd.1       up  1.00000 1.00000 4   hdd 0.09769         osd.4       up  1.00000 1.00000 7   hdd 0.09769         osd.7       up  1.00000 1.00000 9   hdd 0.09769         osd.9       up  1.00000 1.00000 
-5       0.39075     host node03                         2   hdd 0.09769         osd.2       up  1.00000 1.00000 5   hdd 0.09769         osd.5       up  1.00000 1.00000 8   hdd 0.09769         osd.8       up  1.00000 1.00000 
10   hdd 0.09769         osd.10      up  1.00000 1.00000

4.3 将实验4.1中移除的osd更换硬盘后重新加回集群

将主机配置文件中新增osd对应的硬盘信息

[osds]
node01 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
node02 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde','/dev/vdf']"

执行命令

命令e.g.:ansible-playbook -i  /data/installceph/ceph-ansible/hosts site-docker.yml --limit osd-node-name实验命令:ansible-playbook -i  /data/installceph/ceph-ansible/hosts site-docker.yml --limit node03

实验结果

[root@node01 ceph-ansible]# ceph -s cluster:id:     84a44515-64c1-4f5c-b9c5-a0cc3e797074health: HEALTH_OKservices:mon: 3 daemons, quorum node01,node02,node03 (age 27m)mgr: node02(active, since 2h), standbys: node01, node03mds: cephfs:1 {0=node02=up:active} 2 up:standbyosd: 13 osds: 13 up (since 69s), 13 in (since 69s)rgw: 1 daemon active (node01.rgw0)task status:data:pools:   6 pools, 144 pgsobjects: 209 objects, 3.4 KiBusage:   13 GiB used, 1.3 TiB / 1.3 TiB availpgs:     144 active+clean[root@node01 ceph-ansible]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       1.26993 root default                            
-3       0.39075     host node01                         0   hdd 0.09769         osd.0       up  1.00000 1.00000 3   hdd 0.09769         osd.3       up  1.00000 1.00000 6   hdd 0.09769         osd.6       up  1.00000 1.00000 
11   hdd 0.09769         osd.11      up  1.00000 1.00000 
-7       0.39075     host node02                         1   hdd 0.09769         osd.1       up  1.00000 1.00000 4   hdd 0.09769         osd.4       up  1.00000 1.00000 7   hdd 0.09769         osd.7       up  1.00000 1.00000 9   hdd 0.09769         osd.9       up  1.00000 1.00000 
-5       0.48843     host node03                         2   hdd 0.09769         osd.2       up  1.00000 1.00000 5   hdd 0.09769         osd.5       up  1.00000 1.00000 8   hdd 0.09769         osd.8       up  1.00000 1.00000 
10   hdd 0.09769         osd.10      up  1.00000 1.00000 
12   hdd 0.09769         osd.12      up  1.00000 1.00000 

4.4 新增一个只是osd功能的节点

前提:先把基础环境安装好,然后进行互信集群的扩容,我这边就不展示互信的操作了。

将主机配置文件中新增osd节点及对应的硬盘信息

[osds]
node01 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
node02 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"
node03 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde','/dev/vdf']"
node04 devices="['/dev/vdb','/dev/vdc','/dev/vdd','/dev/vde']"

执行命令

命令e.g.:ansible-playbook -i  /data/installceph/ceph-ansible/hosts site-docker.yml --limit osd-node-name实验命令:ansible-playbook -i  /data/installceph/ceph-ansible/hosts site-docker.yml --limit node04

实验结果:

[root@node01 ceph-ansible]# ceph -s cluster:id:     84a44515-64c1-4f5c-b9c5-a0cc3e797074health: HEALTH_OKservices:mon: 3 daemons, quorum node01,node02,node03 (age 63s)mgr: node02(active, since 2h), standbys: node01, node03mds: cephfs:1 {0=node02=up:active} 2 up:standbyosd: 17 osds: 17 up (since 111s), 17 in (since 111s)rgw: 1 daemon active (node01.rgw0)task status:data:pools:   6 pools, 144 pgsobjects: 209 objects, 3.4 KiBusage:   17 GiB used, 1.6 TiB / 1.7 TiB availpgs:     144 active+clean[root@node01 ceph-ansible]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       1.66068 root default                            
-3       0.39075     host node01                         0   hdd 0.09769         osd.0       up  1.00000 1.00000 3   hdd 0.09769         osd.3       up  1.00000 1.00000 6   hdd 0.09769         osd.6       up  1.00000 1.00000 
11   hdd 0.09769         osd.11      up  1.00000 1.00000 
-7       0.39075     host node02                         1   hdd 0.09769         osd.1       up  1.00000 1.00000 4   hdd 0.09769         osd.4       up  1.00000 1.00000 7   hdd 0.09769         osd.7       up  1.00000 1.00000 9   hdd 0.09769         osd.9       up  1.00000 1.00000 
-5       0.48843     host node03                         2   hdd 0.09769         osd.2       up  1.00000 1.00000 5   hdd 0.09769         osd.5       up  1.00000 1.00000 8   hdd 0.09769         osd.8       up  1.00000 1.00000 
10   hdd 0.09769         osd.10      up  1.00000 1.00000 
12   hdd 0.09769         osd.12      up  1.00000 1.00000 
-9       0.39075     host node04                         
13   hdd 0.09769         osd.13      up  1.00000 1.00000 
14   hdd 0.09769         osd.14      up  1.00000 1.00000 
15   hdd 0.09769         osd.15      up  1.00000 1.00000 
16   hdd 0.09769         osd.16      up  1.00000 1.00000 

4.5 删除新增的node04节点

实验设计:先删除node04节点上的全部osd,再删除掉host node04
执行命令

命令e.g.:ansible-playbook -vv -i hosts infrastructure-playbooks/shrink-osd.yml -e osd_to_kill=1,2,3ansible-playbook -vv -i hosts infrastructure-playbooks/shrink-osd.yml -e osd_to_kill=13,14,15,16

实验结果:
osd都删除掉了,但是这个host还在,在playbook列表里面也没有找到类似的playbook,个人猜测可能是版本较早,且这个功能场景不太常见的原因。

[root@node01 ceph-ansible]# ceph osd tree
ID CLASS WEIGHT  TYPE NAME       STATUS REWEIGHT PRI-AFF 
-1       1.26993 root default                            
-3       0.39075     host node01                         0   hdd 0.09769         osd.0       up  1.00000 1.00000 3   hdd 0.09769         osd.3       up  1.00000 1.00000 6   hdd 0.09769         osd.6       up  1.00000 1.00000 
11   hdd 0.09769         osd.11      up  1.00000 1.00000 
-7       0.39075     host node02                         1   hdd 0.09769         osd.1       up  1.00000 1.00000 4   hdd 0.09769         osd.4       up  1.00000 1.00000 7   hdd 0.09769         osd.7       up  1.00000 1.00000 9   hdd 0.09769         osd.9       up  1.00000 1.00000 
-5       0.48843     host node03                         2   hdd 0.09769         osd.2       up  1.00000 1.00000 5   hdd 0.09769         osd.5       up  1.00000 1.00000 8   hdd 0.09769         osd.8       up  1.00000 1.00000 
10   hdd 0.09769         osd.10      up  1.00000 1.00000 
12   hdd 0.09769         osd.12      up  1.00000 1.00000 
-9             0     host node04 

总结

记录一下

相关文章:

ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、环境信息二、部署步骤2.1 基础环境准备2.2 各节点docker环境安装2.3 搭建互信集群2.4 下载ceph-ansible 三、配置部署文件3.1 使用本地docker3.2 配置hosts…...

【C++】C++ 旅馆管理系统(含 源码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求二、设…...

快速排序

目录 什么是快速排序&#xff1a; 图解&#xff1a; 递归法&#xff1a; 方法一&#xff08;Hoare法&#xff09;&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 方法二&#xff08;挖坑法&#xff09;&#xff1a; 代码实现&#xff1a; 思路分析&#xff1a; 非递…...

国内 ChatGPT Plus/Pro 订阅教程

1. 登录 chat.openai.com 依次点击 Login &#xff0c;输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后&#xff0c;点击左下角的 Upgrade to Plus&#xff0c;在弹窗中选择 Upgrade plan。 如果升级入口无法点击&#xff0c;那就访问这个网址&#xff0c;htt…...

易仓科技ai面试

请解释PHP中的面向对象编程的基本概念&#xff0c;并举例说明如何在PHP中定义一个类。 回答思路&#xff1a;需理解类、对象、继承和多态等基本概念&#xff0c;并能通过实例代码展示如何定义类及其属性和方法。 . 类&#xff08;Class&#xff09; 类是一个封装了数据和操作…...

LabVIEW用户界面(UI)和用户体验(UX)设计

作为一名 LabVIEW 开发者&#xff0c;满足功能需求、保障使用便捷与灵活只是基础要求。在如今这个用户体验至上的时代&#xff0c;为 LabVIEW 应用程序设计直观且具有美学感的界面&#xff0c;同样是不容忽视的关键任务。一个优秀的界面设计&#xff0c;不仅能提升用户对程序的…...

字玩FontPlayer开发笔记14 Vue3实现多边形工具

目录 字玩FontPlayer开发笔记14 Vue3实现多边形工具笔记整体流程临时变量多边形组件数据结构初始化多边形工具mousedown事件mousemove事件监听mouseup事件渲染控件将多边形转换为平滑的钢笔路径 字玩FontPlayer开发笔记14 Vue3实现多边形工具 字玩FontPlayer是笔者开源的一款字…...

低代码与 Vue.js:技术选型与架构设计

在当下数字化转型的浪潮中&#xff0c;企业对应用开发的效率和质量有着极高的追求。低代码开发平台的兴起&#xff0c;为企业提供了一条快速构建应用的捷径&#xff0c;而 Vue.js 作为热门的前端框架&#xff0c;与低代码开发平台的结合备受关注。如何做好两者的技术选型与架构…...

比较循环与迭代器的性能:Rust 零成本抽象的威力

一、引言 在早期的 I/O 项目中&#xff0c;我们通过对 String 切片的索引和 clone 操作来构造配置结构体&#xff0c;这种方法虽然能确保数据所有权的正确传递&#xff0c;但既显得冗长&#xff0c;又引入了不必要的内存分配。随着对 Rust 迭代器特性的深入了解&#xff0c;我…...

一文了解zookeeper

1.ZooKeeper是什么 简单来说&#xff0c;她是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务 具体来说&#xff0c;他可以做如下事情&#xff1a; 分布式配置管理&#xff1a;ZooKeeper可以存储配置信息&#xff0c;应用程序可以动态读取配置信息。分布式同步&a…...

算法题(67):最长连续序列

审题&#xff1a; 需要我们在O&#xff08;n&#xff09;的时间复杂度下找到最长的连续序列长度 思路&#xff1a; 我们可以用两层for循环&#xff1a; 第一层是依次对每个数据遍历&#xff0c;让他们当序列的首元素。 第二层是访问除了该元素的其他元素 但是此时时间复杂度来到…...

大中型企业专用数据安全系统 | 天锐蓝盾终端安全 数据安全

天锐蓝盾系列产品是专门为大中型企业量身定制的数据安全防护产品体系&#xff0c;涵盖天锐蓝盾DLP、天锐蓝盾终端安全管理系统、天锐蓝盾NAC以及其他搭配产品&#xff0c;致力于实现卓越的数据安全防护、施行严格的网络准入控制以及构建稳固的终端安全管理体系。通过全方位的防…...

Deepseek解读 | UE像素流送与实时云渲染技术的差别

为了实现UE引擎开发的3D/XR程序推流&#xff0c;绝大多数开发者会研究像素流送&#xff08;Pixel Streaming&#xff09;的使用方法&#xff0c;并尝试将插件集成在程序中。对于短时、少并发、演示场景而言&#xff0c;像素流送可以满足基本需求。当3D/XR项目进入落地交付周期后…...

CTFSHOW-WEB入门-PHP特性109-115

题目&#xff1a;web 109 1. 题目&#xff1a; 2. 解题思路&#xff1a;题目要求获得两个参数&#xff0c;v1 v2&#xff0c;if语句中的意思是要求两个参数都包含字母&#xff0c;条件满足的话&#xff0c;执行 echo new 类名&#xff08;方法&#xff08;&#xff09;&#xf…...

模糊综合评价法:原理、步骤与MATLAB实现

引言 在复杂决策场景中&#xff0c;评价对象往往涉及多个相互关联的模糊因素。模糊综合评价法通过建立模糊关系矩阵&#xff0c;结合权重分配与合成算子&#xff0c;实现对多因素系统的科学评价。本文详细讲解模糊综合评价法的数学原理、操作步骤&#xff0c;并辅以MATLAB代码…...

【数据结构-红黑树】

文章目录 红黑树红黑树介绍红黑树的五个基本性质红黑树的平衡原理红黑树的操作红黑树的操作 代码实现节点实现插入和查询操作 红黑树 红黑树介绍 红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉查找树&#xff08;Binary Search Tree, BST&#xff09;&…...

【STM32】舵机SG90

1.舵机原理 舵机内部有一个电位器&#xff0c;当转轴随电机旋转&#xff0c;电位器的电压会发生改变&#xff0c;电压会带动转一定的角度&#xff0c;舵机中的控制板就会电位器输出的电压所代表的角度&#xff0c;与输入的PWM所代表的角度进行比较&#xff0c;从而得出一个旋转…...

【Linux】Socket编程—TCP

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

c++11 for auto不定参数

数量不定的模板参数。参数分为一个和一包两部分。 ​ 冒号的左边声明一个变量。右手边必须是一个容器。从容器(某种数据结构)中找出每一个元素设置到左边这个变量。11之前可以用容器的迭代器去取数据。或者标准库里的foreach...

C#+redis实现消息队列的发布订阅功能

代码 参考c#redis stream实现消息队列以及ack机制文章的思路&#xff0c;实现 SubscribeAttribute.cs using System;namespace DotnetQueue.Attributes {/// <summary>/// 订阅特性/// </summary>[AttributeUsage(AttributeTargets.Method, Inherited false)]pu…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...