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 | 磁盘一盘符 | 磁盘二盘符 | 磁盘三盘符 | 磁盘四盘符 | 磁盘五盘符 |
|---|---|---|---|---|---|---|
| node01 | 192.168.150.72 | /dev/vdb/ | /dev/vdc/ | /dev/vdd/ | ||
| node02 | 192.168.150.73 | /dev/vdb/ | /dev/vdc/ | /dev/vdd/ | /dev/vde/ | |
| node03 | 192.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部署实验记录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、环境信息二、部署步骤2.1 基础环境准备2.2 各节点docker环境安装2.3 搭建互信集群2.4 下载ceph-ansible 三、配置部署文件3.1 使用本地docker3.2 配置hosts…...
【C++】C++ 旅馆管理系统(含 源码+报告)【独一无二】
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求二、设…...
快速排序
目录 什么是快速排序: 图解: 递归法: 方法一(Hoare法): 代码实现: 思路分析: 方法二(挖坑法): 代码实现: 思路分析: 非递…...
国内 ChatGPT Plus/Pro 订阅教程
1. 登录 chat.openai.com 依次点击 Login ,输入邮箱和密码 2. 点击升级 Upgrade 登录自己的 OpenAI 帐户后,点击左下角的 Upgrade to Plus,在弹窗中选择 Upgrade plan。 如果升级入口无法点击,那就访问这个网址,htt…...
易仓科技ai面试
请解释PHP中的面向对象编程的基本概念,并举例说明如何在PHP中定义一个类。 回答思路:需理解类、对象、继承和多态等基本概念,并能通过实例代码展示如何定义类及其属性和方法。 . 类(Class) 类是一个封装了数据和操作…...
LabVIEW用户界面(UI)和用户体验(UX)设计
作为一名 LabVIEW 开发者,满足功能需求、保障使用便捷与灵活只是基础要求。在如今这个用户体验至上的时代,为 LabVIEW 应用程序设计直观且具有美学感的界面,同样是不容忽视的关键任务。一个优秀的界面设计,不仅能提升用户对程序的…...
字玩FontPlayer开发笔记14 Vue3实现多边形工具
目录 字玩FontPlayer开发笔记14 Vue3实现多边形工具笔记整体流程临时变量多边形组件数据结构初始化多边形工具mousedown事件mousemove事件监听mouseup事件渲染控件将多边形转换为平滑的钢笔路径 字玩FontPlayer开发笔记14 Vue3实现多边形工具 字玩FontPlayer是笔者开源的一款字…...
低代码与 Vue.js:技术选型与架构设计
在当下数字化转型的浪潮中,企业对应用开发的效率和质量有着极高的追求。低代码开发平台的兴起,为企业提供了一条快速构建应用的捷径,而 Vue.js 作为热门的前端框架,与低代码开发平台的结合备受关注。如何做好两者的技术选型与架构…...
比较循环与迭代器的性能:Rust 零成本抽象的威力
一、引言 在早期的 I/O 项目中,我们通过对 String 切片的索引和 clone 操作来构造配置结构体,这种方法虽然能确保数据所有权的正确传递,但既显得冗长,又引入了不必要的内存分配。随着对 Rust 迭代器特性的深入了解,我…...
一文了解zookeeper
1.ZooKeeper是什么 简单来说,她是一个分布式的,开放源码的分布式应用程序协调服务 具体来说,他可以做如下事情: 分布式配置管理:ZooKeeper可以存储配置信息,应用程序可以动态读取配置信息。分布式同步&a…...
算法题(67):最长连续序列
审题: 需要我们在O(n)的时间复杂度下找到最长的连续序列长度 思路: 我们可以用两层for循环: 第一层是依次对每个数据遍历,让他们当序列的首元素。 第二层是访问除了该元素的其他元素 但是此时时间复杂度来到…...
大中型企业专用数据安全系统 | 天锐蓝盾终端安全 数据安全
天锐蓝盾系列产品是专门为大中型企业量身定制的数据安全防护产品体系,涵盖天锐蓝盾DLP、天锐蓝盾终端安全管理系统、天锐蓝盾NAC以及其他搭配产品,致力于实现卓越的数据安全防护、施行严格的网络准入控制以及构建稳固的终端安全管理体系。通过全方位的防…...
Deepseek解读 | UE像素流送与实时云渲染技术的差别
为了实现UE引擎开发的3D/XR程序推流,绝大多数开发者会研究像素流送(Pixel Streaming)的使用方法,并尝试将插件集成在程序中。对于短时、少并发、演示场景而言,像素流送可以满足基本需求。当3D/XR项目进入落地交付周期后…...
CTFSHOW-WEB入门-PHP特性109-115
题目:web 109 1. 题目: 2. 解题思路:题目要求获得两个参数,v1 v2,if语句中的意思是要求两个参数都包含字母,条件满足的话,执行 echo new 类名(方法()…...
模糊综合评价法:原理、步骤与MATLAB实现
引言 在复杂决策场景中,评价对象往往涉及多个相互关联的模糊因素。模糊综合评价法通过建立模糊关系矩阵,结合权重分配与合成算子,实现对多因素系统的科学评价。本文详细讲解模糊综合评价法的数学原理、操作步骤,并辅以MATLAB代码…...
【数据结构-红黑树】
文章目录 红黑树红黑树介绍红黑树的五个基本性质红黑树的平衡原理红黑树的操作红黑树的操作 代码实现节点实现插入和查询操作 红黑树 红黑树介绍 红黑树(Red-Black Tree)是一种自平衡的二叉查找树(Binary Search Tree, BST)&…...
【STM32】舵机SG90
1.舵机原理 舵机内部有一个电位器,当转轴随电机旋转,电位器的电压会发生改变,电压会带动转一定的角度,舵机中的控制板就会电位器输出的电压所代表的角度,与输入的PWM所代表的角度进行比较,从而得出一个旋转…...
【Linux】Socket编程—TCP
🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…...
c++11 for auto不定参数
数量不定的模板参数。参数分为一个和一包两部分。 冒号的左边声明一个变量。右手边必须是一个容器。从容器(某种数据结构)中找出每一个元素设置到左边这个变量。11之前可以用容器的迭代器去取数据。或者标准库里的foreach...
C#+redis实现消息队列的发布订阅功能
代码 参考c#redis stream实现消息队列以及ack机制文章的思路,实现 SubscribeAttribute.cs using System;namespace DotnetQueue.Attributes {/// <summary>/// 订阅特性/// </summary>[AttributeUsage(AttributeTargets.Method, Inherited false)]pu…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...
C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
