当前位置: 首页 > 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#初学者的书籍和一些优质的视频教程推荐&#xff0c;帮助你快速入门C#开发&#xff1a; 书籍推荐 1. 《C#入门经典》 • 作者&#xff1a;Karli Watson, Christian Nagel 等 • 特点&#xff1a;经典的C#入门书籍&#xff0c;内容全面&#xff0c;从基础语法到…...

XZ_Mac电脑上本地化部署DeepSeek的详细步骤

根据您的需求&#xff0c;以下是Mac电脑上本地化部署DeepSeek的详细步骤&#xff1a; 一、下载并安装Ollama 访问Ollama官网&#xff1a; 打开浏览器&#xff0c;访问 Ollama官网。 下载Ollama&#xff1a; 在官网中找到并点击“Download”按钮&#xff0c;选择适合Mac系统的…...

el-input输入框样式修改

el-input输入框样式修改 目的&#xff1a;蓝色边框去掉、右下角黑色去掉(可能看不清楚) 之前我试过deep不行 最有效的办法就是就是在底部添加一下css文件 代码中针对input的type为textarea&#xff0c;对于非textarea&#xff0c;只需将下面的css样式中的textarea替换成input…...

Promise的三种状态

目录 代码示例 HTML JavaScript 代码&#xff1a; 代码解释 总结 在 JavaScript 中&#xff0c;Promise 是一种异步编程的解决方案&#xff0c;它用于表示异步操作的最终完成&#xff08;或失败&#xff09;及其结果值。Promise 主要有三种状态&#xff1a; Pending&#…...

探秘AES加密算法:多种Transformation全解析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

Python深度学习代做目标检测NLP计算机视觉强化学习

了解您的需求&#xff0c;您似乎在寻找关于Python深度学习领域的代做服务&#xff0c;特别是在目标检测、自然语言处理&#xff08;NLP&#xff09;、计算机视觉以及强化学习方面。以下是一些关于这些领域的概述以及寻找相关服务的建议。 1. Python深度学习代做概述 目标检测&…...

10款视频无损压缩软件介绍(deepseek汇总)

在如今这个视频创作与分享盛行的时代&#xff0c;大家时常面临视频文件过大、占空间多、传输不便的困扰。无损压缩软件就能帮上大忙&#xff0c;既能缩减视频体积&#xff0c;又能保证画质不受损。下面就给大家详细介绍 10 款好用的视频无损压缩软件。 视频无损压缩工具一&…...

rv1103b编译opencv

opencv-3.4.16&#xff0c;png的neon会报错&#xff0c;如果想开可以参考 https://blog.csdn.net/m0_60827485/article/details/137561429 rm -rf build mkdir build cd build cmake -DCMAKE_BUILD_TYPERELEASE \ -DCMAKE_C_COMPILERxxx/arm-rockchip831-linux-uclibcgnueabih…...

细胞计数专题 | LUNA-FX7™新自动对焦算法提高极低细胞浓度下的细胞计数准确性

现代细胞计数仪采用自动化方法&#xff0c;在特定浓度范围内进行细胞计数。其上限受限于在高浓度条件下准确区分细胞边界的能力&#xff0c;而相机视野等因素则决定了下限。在图像中仅包含少量可识别细胞或特征的情况下&#xff0c;自动对焦可能会失效&#xff0c;从而影响细胞…...

C++ 中的继承与派生

在 C 中&#xff0c;继承与派生是面向对象编程的重要特性&#xff0c;它们允许创建新类&#xff08;派生类&#xff09;来复用现有类&#xff08;基类&#xff09;的属性和方法&#xff0c;同时还能添加新的功能或修改现有功能&#xff0c;下面为你详细介绍。 基本概念 继承&…...

数据结构:哈夫曼树

1.概念 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种用于数据压缩的二叉树&#xff0c;由大卫哈夫曼&#xff08;David A. Huffman&#xff09;于1952年提出。它通过构建最优二叉树来实现数据的高效压缩&#xff0c;广泛应用于文件压缩、图像压缩等领域。 哈夫曼树的…...

2025年 Java 面试八股文

第一章-Java基础篇 1. Java中的基本数据类型有哪些&#xff1f;⭐ Java中有8种基本数据类型&#xff08;Primitive Types&#xff09;&#xff0c;分别是&#xff1a; byte&#xff1a;8位&#xff0c;-128 ~ 127short&#xff1a;16位&#xff0c;-32,768 ~ 32,767int&…...

Linux 内核 IPoIB 驱动中 sysfs 属性冲突问题的分析与解决

一、引言 在 Linux 内核的设备驱动开发中,sysfs 文件系统是一种重要的机制,用于向用户空间暴露内核对象的属性信息。通过 sysfs,用户空间程序可以读取或修改设备的属性,从而实现对硬件设备的监控和配置。然而,在实际开发中,可能会遇到 sysfs 属性冲突的问题,特别是在复…...

深度学习框架探秘|TensorFlow vs PyTorch:AI 框架的巅峰对决

在深度学习框架中&#xff0c;TensorFlow 和 PyTorch 无疑是两大明星框架。前面两篇文章我们分别介绍了 TensorFlow&#xff08;点击查看&#xff09; 和 PyTorch&#xff08;点击查看&#xff09;。它们引领着 AI 开发的潮流&#xff0c;吸引着无数开发者投身其中。但这两大框…...

鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍

鸿蒙Harmony-UIAbility内状态-LocalStorage详细介绍 1.1 Localstorage的概念 LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例&#xff0c;LocalStorage也可以在UIAbility内&#xff0c;页面间共享状态 1.2 Lo…...

Mysql中使用sql语句生成雪花算法Id

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

android的第一个app项目(java版)

一.学习java重要概念 java的基本类型的语言方法和C语言很像&#xff0c;这都是我们要学的东西和学过的东西。那些基础东西&#xff0c;就不和大家讨论了&#xff0c;一起看一下java的一些知识架构。 1.封装 封装是面向对象编程中的一个核心概念&#xff0c;它涉及到将数据和操…...

第6章 6.2使用ASP.NET Core 开发WebAPI ASP.NET Core Web API

6.2.1 Web API项目的搭建 进入VS&#xff0c;【创建新项目】&#xff0c;选择【ASP.NET Core Web API】模板&#xff0c;【下一步】&#xff0c;编辑项目名称及项目位置&#xff0c;【下一步】&#xff0c;选择框架&#xff0c;其他选项默认即可&#xff0c;【创建】。 进入项…...

常见的网络协议汇总(涵盖了不同的网络层次)

网络层协议 IP协议&#xff1a;IP指网际互连协议&#xff08;Internet Protocol&#xff09;&#xff0c;是TCP/IP体系中的网络层协议。IP协议包括IPv4和IPv6&#xff0c;用于为数据包提供源地址和目标地址&#xff0c;从而实现网络通信。ICMP协议&#xff1a;ICMP&#xff08…...

【Java 面试 八股文】Redis篇

Redis 1. 什么是缓存穿透&#xff1f;怎么解决&#xff1f;2. 你能介绍一下布隆过滤器吗&#xff1f;3. 什么是缓存击穿&#xff1f;怎么解决&#xff1f;4. 什么是缓存雪崩&#xff1f;怎么解决&#xff1f;5. redis做为缓存&#xff0c;mysql的数据如何与redis进行同步呢&…...

嵌入式EasyRTC实时通话支持海思hi3516cv610,编译器arm-v01c02-linux-musleabi-gcc

EasyRTC已经完美支持海思hi3516cv610&#xff0c;编译器arm-v01c02-linux-musleabi-gcc&#xff0c;总体SDK大小控制在680K以内&#xff08;预计还能压缩100K上下&#xff09;&#xff1a; EasyRTC在hi3516cv610芯片上能双向通话、发送文字以及二进制指令&#xff0c;总体运行…...

自然语言处理NLP入门 -- 第四节文本分类

目标 本章的目标是帮助你理解文本分类的基本概念&#xff0c;并通过具体示例学习如何使用 scikit-learn 训练文本分类模型&#xff0c;以及如何利用 OpenAI API 进行文本分类。 5.1 什么是文本分类&#xff1f; 文本分类&#xff08;Text Classification&#xff09;是自然语…...

深入解析:如何在C#和C/C++之间安全高效地通过P/Invoke传递多维数组

在工业控制、机器人编程和物联网等领域&#xff0c;我们经常需要让C#这样的托管语言与C/C编写的底层库进行交互。在这个过程中&#xff0c;遇到需要传递多维数组的场景时&#xff0c;许多开发者会意外遭遇System.Runtime.InteropServices.MarshalDirectiveException异常。本文将…...

Spring Boot全局异常处理终极指南:从青铜到王者的实战演进

一、为什么需要全局异常处理&#xff1f; 在用户中心这类核心服务中&#xff0c;优雅的异常处理是系统健壮性的生命线。未处理的异常会导致&#xff1a; 服务雪崩&#xff1a;单点异常扩散到整个系统&#xff08;✖️&#xff09;信息泄露&#xff1a;暴露敏感堆栈信息&#…...

【Elasticsearch】match_bool_prefix查询

match_bool_prefix查询是 Elasticsearch 中一种用于全文搜索的查询方式&#xff0c;适用于需要同时匹配多个词汇&#xff0c;但词汇顺序不固定的情况&#xff0c;它结合了布尔查询&#xff08;bool&#xff09;和前缀查询&#xff08;prefix&#xff09;的功能&#xff0c;适用…...

Unity-Mirror网络框架-从入门到精通之Multiple Additive Scenes示例

文章目录 前言Multiple Additive Scenes示例Additive Scenes示例MultiSceneNetManagerPhysicsCollisionRewardSpawner总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题…...

[开源]MaxKb+Ollama 构建RAG私有化知识库

MaxKbOllama&#xff0c;基于RAG方案构专属私有知识库 关于RAG工作原理实现方案 一、什么是MaxKb&#xff1f;二、MaxKb的核心功能三、MaxKb的安装与使用四、MaxKb的适用场景五、安装方案、 docker版Docker Desktop安装配置MaxKb安装和配置 总结和问题 MaxKB 是一款基于 LLM 大…...

Ubuntu 下 nginx-1.24.0 源码分析 - NGX_HAVE_GETTIMEZONE 宏

表示当前平台支持通过 gettimezone() 直接获取时区偏移值&#xff08;以分钟为单位&#xff09; 该宏用于适配不同操作系统对时区信息获取方式的差异。 当 NGX_HAVE_GETTIMEZONE 被定义时&#xff0c;Nginx 会调用 ngx_gettimezone() 获取时区偏移 在 Ubuntu 环境下&#xff0c…...

数据结构之队列,哈希表

一 队列(先进先出) 1.定义&#xff1a;从一端进行数据插入&#xff0c;另一端进行删除的线性存储结构 队列类型 常见操作 - 入队&#xff08;Enqueue&#xff09;&#xff1a;将新元素添加到队列的尾部。若队列有空间&#xff0c;新元素会成为队列的新尾部元素&#xff1b;若…...

缓存的介绍

相关面试题 &#xff1a; ● 为什么要用缓存&#xff1f; ● 本地缓存应该怎么做&#xff1f; ● 为什么要有分布式缓存?/为什么不直接用本地缓存? ● 为什么要用多级缓存&#xff1f; ● 多级缓存适合哪些业务场景&#xff1f; 缓存思想 空间换时间(索引&#xff0c;集群&a…...

372_C++_当有多个通道,开启不同告警的同一种的开关时,限制该开关的打开数量(比如视频上传开关)

GetCloudUploadNum函数 GetCloudUploadNum 函数主要用于统计和控制云端视频上传的通道数量,其主要功能如下: 功能目的// 检查每个通道的云端视频上传配置,并统计启用云端上传的通道总数 int CloudUploadNum = 0; bool InValidCloudUploadChn[MAX_CHN_NUMPARA] = {};...

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件&#xff0c;请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...

Unity崩溃后信息结合符号表来查看问题

目录 SO文件符号表对调试和分析的重要性调试方面分析方面 错误数据安装Logcat解释符号表设置符号文件路径生成解析 相关参考 SO文件 so 文件&#xff08;Shared Object File&#xff0c;共享目标文件&#xff09;和符号表紧密相关&#xff0c;它们在程序的运行、调试和分析过程…...

【云安全】云原生- K8S API Server 未授权访问

API Server 是 Kubernetes 集群的核心管理接口&#xff0c;所有资源请求和操作都通过 kube-apiserver 提供的 API 进行处理。默认情况下&#xff0c;API Server 会监听两个端口&#xff1a;8080 和 6443。如果配置不当&#xff0c;可能会导致未授权访问的安全风险。 8080 端口…...

【Matlab算法】基于人工势场的多机器人协同运动与避障算法研究(附MATLAB完整代码)

📚基于人工势场的多机器人协同运动与避障算法研究 摘要1. 引言2. 方法说明2.1 人工势场模型2.2 运动控制流程3. 核心函数解释3.1 主循环结构3.2 力计算函数4. 实验设计4.1 参数配置4.2 测试场景5. 结果分析5.1 典型运动轨迹5.2 性能指标6. 总结与建议成果总结改进方向附录:完…...

Django项目中创建app并快速上手(pycharm Windows)

1.打开终端 我选择的是第二个 2.运行命令 python manage.py startapp 名称 例如&#xff1a; python manage.py startapp app01 回车&#xff0c;等待一下&#xff0c;出现app01的文件夹说明创建成功 3.快速上手 1.app注册 增加一行 "app01.apps.App01Config"&#…...

前端骨架怎样实现

前端骨架屏&#xff08;Skeleton Screen&#xff09;是一种优化页面加载体验的技术&#xff0c;通常在内容加载时展示一个简易的占位符&#xff0c;避免用户看到空白页面。骨架屏通过展示页面结构的骨架样式&#xff0c;让用户有页面正在加载的感觉&#xff0c;而不是等待内容加…...

服务器使用centos7.9操作系统前需要做的准备工作

文章目录 前言1.操作记录 总结 前言 记录一下centos7.9操作系统的服务器在部署业务服务之前需要做的准备工作。 大家可以复制到自己的编辑器里面&#xff0c;有需求的注释一些步骤。 备注&#xff1a;有条件的项目推荐使用有长期支持的操作系统版本。 1.操作记录 # 更换阿里云…...

【git-hub项目:YOLOs-CPP】本地实现01:项目构建

目录 写在前面 项目介绍 最新发布说明 Segmentation示例 功能特点 依赖项 安装 克隆代码仓库 配置 构建项目 写在前面 前面刚刚实现的系列文章: 【Windows/C++/yolo开发部署01】 【Windows/C++/yolo开发部署02】 【Windows/C++/yolo开发部署03】 【Windows/C++/yolo…...

oracle表分区--范围分区

文章目录 oracle表分区分区的原因分区的优势oracle表分区的作用oracle表分区类型一、范围分区二、 创建分区表和使用&#xff1a;1、按照数值范围划分2、按照时间范围3、MAXVALUE2. 向现有表添加新的分区3、 分区维护和重新组织&#xff08;合并/删除&#xff09; oracle表分区…...

第12周:LSTM(火灾温度)

1.库以及数据的导入 1.1库的导入 import torch.nn.functional as F import numpy as np import pandas as pd import torch from torch import nn1.2数据集的导入 data pd.read_csv("woodpine2.csv")dataTimeTem1CO 1Soot 100.00025.00.0000000.00000010.22825.…...

Xlua中C#引用Lua变量,导致Lua侧的GC无法回收的原因及解决方法

1. 引用关系导致&#xff1a; 在 XLua 中&#xff0c;当 C# 端引用了 Lua 变量时&#xff0c;Lua 的垃圾回收器&#xff08;GC&#xff09;不会回收这些被引用的变量。这是因为 Lua 的 GC 机制是基于引用计数和标记 - 清除算法的。当 C# 端持有对 Lua 变量的引用时&#xff0c;…...

Win10系统IP地址修改_出现了一个意外的情况不能完成所有你在设置中所要求的更改---Windows工作笔记001

今天在修改win10系统中的ip地址的时候报错了 来看看如何解决吧,挺简单,简单记录一下 这个时候就需要使用cmd命令来修改 一定要使用,管理员权限,运行cmd才可以 然后首先: 输入 netsh 然后输入 ip 然后输入: set address "以太网" 172.19.126.199 255.255.255.0…...

Generate html

"Generate HTML"&#xff08;生成 HTML&#xff09;指的是通过程序或工具自动创建 HTML 代码的过程。HTML&#xff08;超文本标记语言&#xff09;是用于创建网页内容和结构的标准语言。生成 HTML 通常意味着通过某些方式自动化地构建或生成网页的结构和元素&#xf…...

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…...

全面了解HTTP(一)

全面了解HTTP&#xff08;二&#xff09;-CSDN博客 web及网络基础 使用HTTP协议访问web&#xff1a; HTTP: 网络基础TCP/IP 与HTTP关系密切的协议&#xff1a;IP,TCP,DNS 负责域名解析的DNS服务 各种协议与HTTP协议的关系 URI和URL 简单的HTTP协议 HTTP协议用于客户端和服…...

PCDN“无盘业务”

PCDN&#xff08;Proactive Content Delivery Network&#xff09;的无盘业务&#xff0c;相对于有盘业务而言&#xff0c;主要指的是在不依赖本地磁盘存储的情况下进行内容分发。在PCDN网络中&#xff0c;无盘业务通常依赖于内存或其他形式的非持久性存储来缓存和分发内容。以…...

【LLM】13:大模型算法面试题库

一、Transformer篇 1. Transformer的结构是什么 Transformer 由 编码器&#xff08;Encoder&#xff09; 和 解码器&#xff08;Decoder&#xff09; 两部分组成&#xff0c;两部分都包含目标嵌入层、位置编码、多头注意力层、前馈网络&#xff0c;且有残差连接和层归一化&am…...

redis集群

文章目录 节点启动节点集群数据结构CLUSTER MEET命令的实现 槽指派记录节点的槽指派信息专播节点的槽指派信息17.2.3记录集群所有槽的指派信息CLUSTER ADDSLOTS命令的实现 在集群中执行命令计算键属于哪个槽判断槽是否由当前节点负责处理MOVED错误节点数据库的实现 重新分片ASK…...