CentOS8使用cephadm部署和配置Ceph Octopus

news2024/12/26 13:54:57
  • 部署工具:cephadm
  • 操作系统:CentOS 8
  • Ceph版本:Octopus
  • 操作用户:root

部署前,请注意:根据目前(2020年8月)Ceph官方文档的介绍,cephadm的对各服务的支持情况如下:

  1. 完全支持:MON、MGR、OSD、CephFS、rbd-mirror
  2. 支持但文档不全:RGW、dmcrypt OSDs
  3. 开发中:NFS、iSCSI

准备

除非特别说明,本小节的操作在所有节点进行。

部署环境:

主机IP配置磁盘(除系统盘)服务
ceph-mon1(虚拟机)192.168.7.114C/8GMON、prom+grafana
ceph-mon2(虚拟机)192.168.7.124C/8GMON、MGR
ceph-mon3(虚拟机)192.168.7.134C/8GMON、MGR
ceph-osd1(物理机)192.168.7.1440C/64G1.6T SSD/4T SAS 4OSD、MDS、NFS、RGW
ceph-osd2(物理机)192.168.7.1540C/64G1.6T SSD/4T SAS 4OSD、MDS、NFS、RGW

主机名

确定一下主机名是否正确,尤其是从虚拟机复制过来的节点:

 
  1. hostnamectl set-hostname ceph-mon1

安装容器运行时

cephadm的部署方式是基于容器进行管理的,可以安装dockerpodman

 
  1. dnf install -y podman

podman配置国内镜像源:

 
  1. mv /etc/containers/registries.conf /etc/containers/registries.conf.bak
  2. cat <<EOF > /etc/containers/registries.conf
  3. unqualified-search-registries = ["docker.io"]
  4. [[registry]]
  5. prefix = "docker.io"
  6. location = "anwk44qv.mirror.aliyuncs.com"
  7. EOF

安装epel

并配置阿里云的源。

 
  1. yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
  2. sed -i 's|^#baseurl=https://download.fedoraproject.org/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
  3. sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

安装和配置chrony

 
  1. dnf install -y chrony
  2. mv /etc/chrony.conf /etc/chrony.conf.bak
  3. cat > /etc/chrony.conf <<EOF server ntp.aliyun.com iburst stratumweight 0 driftfile /var/lib/chrony/drift rtcsync makestep 10 3 bindcmdaddress 127.0.0.1 bindcmdaddress ::1 keyfile /etc/chrony.keys commandkey 1 generatecommandkey logchange 0.5 logdir /var/log/chrony EOF
  4. systemctl enable chronyd
  5. systemctl restart chronyd

主机名可访问

修改/etc/hosts文件,添加所有节点的IP(如果用DNS也可以)。

 
  1. 192.168.7.11 ceph-mon1
  2. 192.168.7.12 ceph-mon2
  3. 192.168.7.13 ceph-mon3
  4. 192.168.7.14 ceph-osd1
  5. 192.168.7.15 ceph-osd2

关闭SELINUX

 
  1. setenforce 0

要使 SELinux 配置永久生效(如果它的确是问题根源),需修改其配置文件/etc/selinux/config

 
  1. sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config

安装python3

cephadm以及ceph命令基于python3运行。

 
  1. dnf install -y python3

安装cephadm

以下操作在ceph-mon1节点上进行。

使用curl下载最新的cephadm脚本:

 
  1. curl --silent --remote-name --location https://github.com/ceph/ceph/raw/octopus/src/cephadm/cephadm
  2. chmod +x cephadm

其实这个脚本就可以用来部署了,如果要安装的话:

 
  1. ./cephadm add-repo --release octopus
  2. ./cephadm install

部署一个小集群

除非特别说明,本小节的操作在cephadm所在节点进行。

bootstrap

cephadm的部署策略是先在一个节点上部署一个Ceph cluster,然后把其他节点加进来,再部署各种所需的服务。

首先部署的这个节点是一个MON,需要提供IP地址。

 
  1. mkdir -p /etc/ceph
  2. cephadm bootstrap --mon-ip 192.168.7.11

这个命令会:

  • 创建一个有MON和MGR的新cluster。
  • 为Ceph cluster生成一个SSH key,并添加到/root/.ssh/authorized_keys
  • 生成一个最小化的/etc/ceph/ceph.conf配置文件。
  • 为用户client.admin生成/etc/ceph/ceph.client.admin.keyring
  • 生成公钥/etc/ceph/ceph.pub,这是cephadmceph orch命令)用来连接其他节点的公钥。

上面这几条是官方文档里介绍的,其实用podman ps查看一下,发现已经启动了几个容器:

  • mon(ceph/ceph:v15)
  • mgr(ceph/ceph:v15)
  • crash(ceph/ceph:v15),这是干嘛的?
  • prometheus和node-exporter,用于收集监控指标数据
  • alertmanager,以前没用过,应该是告警用的
  • grafana,可以利用prometheus收集到的数据进行监控的可视化

命令的输出如下:

 
  1. ...
  2. ...
  3. INFO:cephadm:Ceph Dashboard is now available at:
  4. URL: https://ceph-mon1:8443/
  5. User: admin
  6. Password: 91qoulprnv
  7. INFO:cephadm:You can access the Ceph CLI with:
  8. sudo /usr/sbin/cephadm shell --fsid 1be68a48-de06-11ea-ae5e-005056b10c97 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring
  9. INFO:cephadm:Please consider enabling telemetry to help improve Ceph:
  10. ceph telemetry on
  11. For more information see:
  12. https://docs.ceph.com/docs/master/mgr/telemetry/
  13. INFO:cephadm:Bootstrap complete.

ceph cli

由于有了这些容器,其实就不需要本机安装任何Ceph的包了。

cephadm shell能够连接容器并利用其中已安装的ceph包和命令行工具。所以执行

 
  1. cephadm shell

就可以进入容器内部,然后执行cephrbdrados等命令了。也可以添加别名:

 
  1. alias ceph='cephadm shell -- ceph'
  2. # 或利用上面的输出中给出的完整的命令
  3. alias ceph='/usr/sbin/cephadm shell --fsid 1be68a48-de06-11ea-ae5e-005056b10c97 -c /etc/ceph/ceph.conf -k /etc/ceph/ceph.client.admin.keyring -- ceph'

ceph包

前面的./cephadm add-repo --release octopus命令创建了/etc/yum.repos.d/ceph.repo文件,处理一下使用阿里云的源:

 
  1. sed -i 's#download.ceph.com#mirrors.aliyun.com/ceph#' /etc/yum.repos.d/ceph.repo
  2. dnf makecache

然后就可以安装ceph命令行工具了:

 
  1. dnf install -y ceph-common
  2. ceph -v
  3. ceph -s

添加节点到集群

  1. 将cluster的SSD公钥配置到新节点的authorized_keys文件(即SSH免密):

    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon2
    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-mon3
    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd1
    ssh-copy-id -f -i /etc/ceph/ceph.pub root@ceph-osd2

  2. 添加节点到cluster:

    ceph orch host add ceph-mon2
    ceph orch host add ceph-mon3
    ceph orch host add ceph-osd1
    ceph orch host add ceph-osd2

添加MON节点

通常Ceph需要部署3或5个MON节点,如果后来添加的节点与bootstrap的节点是在一个子网里,那么Ceph会自动将添加的节点部署上MON服务,直至达到5个。如要调整:

 
  1. # ceph orch apply mon *<number-of-monitors>*
  2. ceph orch apply mon 3

(方法一)如果要指定MON部署到哪几个具体的节点:

 
  1. # ceph orch apply mon *<host1,host2,host3,...>*
  2. ceph orch apply mon ceph-mon1,ceph-mon2,ceph-mon3

(方法二)此外,还可以用标签来进行指定:

 
  1. # ceph orch host label add *<hostname>* mon
  2. ceph orch host label add ceph-mon1 mon
  3. ceph orch host label add ceph-mon2 mon
  4. ceph orch host label add ceph-mon3 mon
  5. # 然后指定
  6. ceph orch apply mon label:mon

可以查看一下标签情况:

 
  1. ❯ ceph orch host ls
  2. HOST ADDR LABELS STATUS
  3. ceph-mon1 ceph-mon1 mon
  4. ceph-mon2 ceph-mon2 mon
  5. ceph-mon3 ceph-mon3 mon
  6. ceph-osd1 ceph-osd1
  7. ceph-osd2 ceph-osd2

(方法三)还支持用YAML文件来指定:

 
  1. service_type: mon
  2. placement:
  3. hosts:
  4. - ceph-mon1
  5. - ceph-mon2
  6. - ceph-mon3

配置MGR

本小节及以后的操作可以在任何安装有ceph-common包并且能够连接Ceph集群(有/etc/ceph/ceph.conf和具有管理权限的key文件)的节点上运行。

添加节点后,Ceph会自动启动MGR节点:

 
  1. ❯ ceph orch ls --service_type mgr
  2. NAME RUNNING REFRESHED AGE PLACEMENT IMAGE NAME IMAGE ID
  3. mgr 2/2 10m ago 74m count:2 docker.io/ceph/ceph:v15 54fa7e66fb03

可以看到,它启动了两个,其中一个是bootstrap的时候指定的ceph-mon1节点。

使用ceph orch ps --daemon_type mgr可以看到,在那两台节点上运行有mgr的容器。

我这部署的时候占用了ceph-osd1节点,仿照MON的标签方式:

 
  1. ceph orch host label add ceph-mon2 mgr
  2. ceph orch host label add ceph-mon3 mgr
  3. ceph orch apply mgr label:mgr

在OSD节点安装smartmontools(7),默认安装的6版本无法满足需求,会在Dashboard报warning:

Smartctl has received an unknown argument (error code -22). You may be using an incompatible version of smartmontools. Version >= 7.0 of smartmontools is required to successfully retrieve data.

 
  1. # 在OSD节点上,先下载smartmontool的rpm
  2. wget http://fr2.rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/smartmontools-7.1-1.el8.x86_64.rpm
  3. # 然后复制到各个OSD容器中(先用podman ps查看一下容器名称或ID)
  4. podman cp smartmontools-7.1-1.el8.x86_64.rpm ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5:/tmp
  5. # 然后安装
  6. podman exec -it ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5 rpm -Uvh /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  7. podman exec -it ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5 rm -f /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  8. # 查看安装结果
  9. podman exec -it ceph-e09db8ae-f95c-11ea-931c-90e2ba8a2734-osd.5 smartctl --version

当然,也可以批量操作:

 
  1. wget http://fr2.rpmfind.net/linux/centos/8-stream/BaseOS/x86_64/os/Packages/smartmontools-7.1-1.el8.x86_64.rpm
  2. for pod in $(podman ps | grep osd. | awk '{print $1}'); do
  3. podman cp smartmontools-7.1-1.el8.x86_64.rpm $pod:/tmp
  4. podman exec -it $pod rpm -Uvh /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  5. podman exec -it $pod rm -f /tmp/smartmontools-7.1-1.el8.x86_64.rpm
  6. podman exec -it $pod smartctl --version | head -n 1
  7. done

添加OSD设备

查看设备:

 
  1. ceph orch device ls

满足以下条件的设备时AVAIL=True的:

  • 没有分区
  • 没有LVM配置
  • 没有被挂载
  • 没有文件系统
  • 没有Ceph BlueStore OSD
  • 大于5GB

否则无法置备对应的设备。

两种添加办法:

  • 自动添加所有的可用设备

    ceph orch apply osd —all-available-devices

  • 手动添加设备(这里先只添加2个ssd和2个hdd)

    ceph orch daemon add osd :

    ceph orch daemon add osd ceph-osd1:/dev/nvme0n1
    ceph orch daemon add osd ceph-osd2:/dev/nvme0n1
    ceph orch daemon add osd ceph-osd1:/dev/sdb
    ceph orch daemon add osd ceph-osd2:/dev/sdb

此时,在ceph-osd1ceph-osd2两个节点可以看到为每一个OSD启动了一个容器。

虽然标签对OSD不起作用,不过还是打上,方便查看:

 
  1. ceph orch host label add ceph-osd1 osd
  2. ceph orch host label add ceph-osd2 osd

配置存储池

为了分别测试SSD和HDD的性能,配置两个存储池,存储池ssd落在两块SSD上,而存储池hdd落在HDD上。

通过CRUSH rule来实现这一点,执行ceph osd tree查看现有的osd:

 
  1. ❯ ceph osd tree
  2. ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
  3. -1 10.18738 root default
  4. -3 5.09369 host ceph-osd1
  5. 2 hdd 3.63820 osd.2 up 1.00000 1.00000
  6. 0 ssd 1.45549 osd.0 up 1.00000 1.00000
  7. -5 5.09369 host ceph-osd2
  8. 3 hdd 3.63820 osd.3 up 1.00000 1.00000
  9. 1 ssd 1.45549 osd.1 up 1.00000 1.00000

可以看到CLASS一列已经自动对添加的设备进行了ssdhdd的分类。

下面创建两个CRUSH rule,根据CLASS进行区分:

 
  1. # 先查看现有的rule
  2. ❯ ceph osd crush rule ls
  3. replicated_rule
  4. # 创建两个replicated rule
  5. # 格式:ceph osd crush rule create-replicated <rule-name> <root> <failure-domain> <class>
  6. ❯ ceph osd crush rule create-replicated on-ssd default host ssd
  7. ❯ ceph osd crush rule create-replicated on-hdd default host hdd

故障域设置为host,由于我这只有两台host,所以replica_size只能为2

 
  1. ceph config set global osd_pool_default_size 2

创建两个存储池,并通过rule进行约束:

 
  1. ❯ ceph osd pool create bench.ssd 64 64 on-ssd
  2. pool 'bench.ssd' created
  3. ❯ ceph osd pool create bench.hdd 128 128 on-hdd
  4. pool 'bench.hdd' created
  5. ❯ ceph osd pool ls detail
  6. pool 1 'device_health_metrics' replicated size 3 min_size 2 crush_rule 0 ...
  7. pool 2 'bench.ssd' replicated size 2 min_size 1 crush_rule 1 object_hash rjenkins pg_num 64 pgp_num 64 autoscale_mode on last_change 46 flags hashpspool stripe_width 0
  8. pool 3 'bench.hdd' replicated size 2 min_size 1 crush_rule 2 object_hash rjenkins pg_num 125 pgp_num 120 pg_num_target 32 pgp_num_target 32 pg_num_pending 124 autoscale_mode on last_change 67 lfor 0/67/67 flags hashpspool stripe_width 0

可以看到,新增加的两个pool都是size 2,不过bench.hdd的pg数量有些奇怪,ceph -s看一下:

 
  1. ❯ ceph -s
  2. cluster:
  3. id: 1be68a48-de06-11ea-ae5e-005056b10c97
  4. health: HEALTH_OK
  5. services:
  6. mon: 3 daemons, quorum ceph-mon2,ceph-mon3,ceph-mon1 (age 35m)
  7. mgr: ceph-mon2.puzrvy(active, since 2d), standbys: ceph-mon3.gvdtdw
  8. mds: 2 up:standby
  9. osd: 4 osds: 4 up (since 2d), 4 in (since 2d); 1 remapped pgs
  10. data:
  11. pools: 3 pools, 146 pgs
  12. objects: 4 objects, 0 B
  13. usage: 4.1 GiB used, 10 TiB / 10 TiB avail
  14. pgs: 0.685% pgs not active
  15. 145 active+clean
  16. 1 clean+premerge+peered
  17. progress:
  18. PG autoscaler decreasing pool 3 PGs from 128 to 32 (4m)
  19. [=============...............] (remaining: 4m)

发现健康状况是HEALTH_OK的,不过下方的progress确实正在进行PG数量的调整,原来在Ceph nautilus版本引入了PG的自动调整功能,难道不用指定具体的pg_numpgp_num了吗,试一下:

 
  1. ❯ ceph osd pool create testpg on-hdd
  2. pool 'testpg' created
  3. ❯ ceph osd pool ls detail
  4. ...
  5. pool 4 'testpg' replicated size 2 min_size 1 crush_rule 2 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 458 flags hashpspool stripe_width 0

不错,看来以后不用找公式算PG个数了。删除测试pool:

 
  1. ❯ ceph config set mon mon_allow_pool_delete true
  2. ❯ ceph osd pool rm testpg testpg --yes-i-really-really-mean-it
  3. pool 'testpg' removed

RGW

部署RGW daemon

首先,创建RGW的realmzonegroupzone

 
  1. # radosgw-admin realm create --rgw-realm=<realm-name> --default
  2. ❯ radosgw-admin realm create --rgw-realm=testenv --default
  3. # radosgw-admin zonegroup create --rgw-zonegroup=<zonegroup-name> --master --default
  4. ❯ radosgw-admin zonegroup create --rgw-zonegroup=mr --master --default
  5. # radosgw-admin zone create --rgw-zonegroup=<zonegroup-name> --rgw-zone=<zone-name> --master --default
  6. ❯ radosgw-admin zone create --rgw-zonegroup=mr --rgw-zone=room1 --master --default

部署RGW的命令如下(实例命令部署在了两个OSD的机器上):

 
  1. # ceph orch apply rgw *<realm-name>* *<zone-name>* --placement="*<num-daemons>* [*<host1>* ...]"
  2. ❯ ceph orch apply rgw testenv mr-1 --placement="2 ceph-osd1 ceph-osd2"

配置dashboard

由于RGW拥有自己的一套账号体系,所以为了让Dashboard能够查看RGW相关信息,需要在RGW中创建一个dashboard用的账号,以便能够查询相关信息

首先,创建用户:

 
  1. ❯ radosgw-admin user create --uid=dashboard --display-name=dashboard --system
  2. ...
  3. "keys": [
  4. {
  5. "user": "dashboard",
  6. "access_key": "EC25NETO4CXIISOB32WY",
  7. "secret_key": "XrZQcFv7c56kidMtnwFGBSDApseQLwA1VPYolCZA"
  8. }
  9. ],
  10. ...

然后,将access_keysecret_key配置到dashboard:

 
  1. ❯ ceph dashboard set-rgw-api-access-key "EC25NETO4CXIISOB32WY"
  2. ❯ ceph dashboard set-rgw-api-secret-key "XrZQcFv7c56kidMtnwFGBSDApseQLwA1VPYolCZA"

修改相关存储池到SSD上

除了具体放对象数据的存储池(通常是以.data结尾的),将其他的存储池迁至SSD上,如:

 
  1. ceph osd pool set .rgw.root crush_rule on-ssd
  2. ...

块存储

首先,为bench.hdd两个存储池开启rbd的application。

 
  1. ❯ ceph osd pool application enable bench.hdd rbd
  2. enabled application 'rbd' on pool 'bench.hdd'

然后创建RBD镜像:

 
  1. ❯ rbd create bench.hdd/disk1 --size 102400

将RBD镜像映射到块设备:

 
  1. ❯ rbd map bench.hdd/disk1
  2. /dev/rbd0

然后用XFS格式化,并挂载:

 
  1. ❯ mkfs.xfs /dev/rbd0
  2. ❯ mount /dev/rbd0 /mnt/rbd

CephFS

配置MDS节点

同样用标签的方式:

 
  1. ceph orch host label add ceph-osd1 mds
  2. ceph orch host label add ceph-osd2 mds
  3. # ceph orch apply mds <cephfs_name> label:mds
  4. ceph orch apply mds cephfs label:mds

创建CephFS

有两种方式:

1.利用ceph的编排功能自动创建(名称为cephfs):

 
  1. ❯ ceph fs volume create cephfs

关于CephFS,可以从下图了解其基本原理:

CephFS底层是基于RADOS的,具体来说是基于RADOS上的两个存储池,一个用来存储文件,一个用来存储文件的元数据。所以,诸如文件的目录结构等信息都是在元数据存储池里的,因此,如果有SSD,建议把元数据的存储池放在SSD上,一方面加速,另一方面,元数据的体积并不会特别大。而文件数据存储池应该放在HDD上。

 
  1. # 先查看一下两个存储池
  2. ❯ ceph osd pool ls detail
  3. ...
  4. pool 5 'cephfs.cephfs.meta' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 463 flags hashpspool stripe_width 0 pg_autoscale_bias 4 pg_num_min 16 recovery_priority 5 application cephfs
  5. pool 6 'cephfs.cephfs.data' replicated size 2 min_size 1 crush_rule 0 object_hash rjenkins pg_num 32 pgp_num 32 autoscale_mode on last_change 464 flags hashpspool stripe_width 0 application cephfs
  6. # 通过修改CRUSH rule来将它们分别约束到SSD和HDD上
  7. ❯ ceph osd pool set cephfs.cephfs.meta crush_rule on-ssd
  8. set pool 5 crush_rule to on-ssd
  9. ❯ ceph osd pool set cephfs.cephfs.data crush_rule on-hdd
  10. set pool 6 crush_rule to on-hdd

2.手动创建CephFS

当然,也可以通过手动的方式创建CephFS(假设名称为mycephfs):

 
  1. # 先创建两个存储池
  2. ❯ ceph osd pool create cephfs.mycephfs.meta on-ssd
  3. ❯ ceph osd pool create cephfs.mycephfs.data on-hdd
  4. # 然后创建CephFS
  5. # ceph fs new <CephFS名称> <元数据存储池> <文件数据存储池>
  6. ❯ ceph fs new mycephfs cephfs.mycephfs.meta cephfs.mycephfs.data

最后,挂载CephFS(需要安装ceph-commons):

 
  1. ❯ mkdir -p /mnt/cephfs
  2. ❯ mount -t ceph :/ /mnt/cephfs -o name=admin,secret=AQBYSjZfQF+UJBAAC6QJjNACndkw2LcCR2XLFA==

NFS

Ceph推荐使用NFS-ganesha来提供NFS服务。

首先创建存储池nfs-ganesha(创建在SSD上):

 
  1. ❯ ceph osd pool create nfs-ganesha on-ssd
  2. # 以下这句可以不用执行,不过会有个”1 pool(s) do not have an application enabled“的WARN
  3. ❯ ceph osd pool application enable nfs-ganesha nfs

然后利用cephadm部署NFS服务(这里我放在了两个OSD主机上了):

 
  1. # ceph orch apply nfs *<svc_id>* *<pool>* *<namespace>* --placement="*<num-daemons>* [*<host1>* ...]"
  2. ❯ ceph orch apply nfs nfs nfs-ganesha nfs-ns --placement="ceph-osd1 ceph-osd2"

为了在dashboard中进行操作,可以进行如下设置:

 
  1. ❯ ceph dashboard set-ganesha-clusters-rados-pool-namespace nfs-ganesha/nfs-ns

Ceph的NFS是基于CephFS提供的,我们首先在CephFS中创建一个/nfs目录,用于作为NFS服务的根目录。

 
  1. # 前一步骤中已经挂载了CephFS到/mnt/cephfs
  2. ❯ mkdir /mnt/cephfs/nfs

其中mount的时候的secret是/etc/ceph/ceph.client.admin.keyring的值,也可以替换成secretfile=/etc/ceph/ceph.client.admin.keyring

最后,在dashboard中创建一个NFS即可:

挂载NFS:

 
  1. mount -t nfs 192.168.7.14:/nfs /mnt/nfs

CentOS8使用cephadm部署和配置Ceph Octopus-蒲公英云 (dandelioncloud.cn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/439233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3D WEB端渲染引擎如何使用服务器端的转换程序?1个案例教会你

前言 HOOPS SDK是用于3D工业软件开发的工具包&#xff0c;其中包括4款工具&#xff0c;分别是用于读取和写入30多种CAD文件格式的HOOPS Exchange、专注于Web端工程图形渲染的HOOPS Communicator、用于移动端和PC端工程图形渲染的HOOPS Visualize、支持将3D数据以原生3D PDF、H…

html+css+js本地音乐播放器,实现可视化音频频谱

效果 htmlcssjs本地音乐播放器&#xff0c;实现可视化音频频谱 前言 之前用swing写了个本地音乐播放器&#xff08;如下图&#xff09;&#xff0c;但是效果一言难尽&#xff0c;界面丑&#xff0c;功能bug也多&#xff0c;唉 所以后面又重新用html写了个&#xff0c;界面样式…

港联证券:为什么会出现股票跌停?股票跌停应该怎么卖出?

股票跌停的意思是股票跌落到交易规则设定的涨跌幅限制范围外&#xff0c;致使股票无法正常卖出的现象。那么为什么会呈现股票跌停&#xff1f;股票跌停应该怎样卖出&#xff1f;下面就由港联证券为大家分析&#xff1a; 为什么会呈现股票跌停&#xff1f; 1、主力出货 当某只…

【竞赛知识ONE】取余问题

前言: 在一些竞赛题中,往往要求对最终的数据结果进行取余或者求模运算。但是如果仅仅只是在输出最终结果的时候对某个数取模,那么可能会导致数据溢出等问题,所以在计算过程中也需要对中间数据进行取模操作。 定理: 举例: 1. 案例一 解题分析:思路并不难理解计算…

TryHackMe-Fusion Corp(ez Windows域渗透)

Fusion Corp 你不久前与Fusion Corp联系。他们联系了你&#xff0c;说他们已经修补了所有报告的内容&#xff0c;你可以开始重新测试了。 端口扫描 循例nmap 将fusion.corp域名加入hosts Web枚举 gobuster扫 访问backup 下载该文件&#xff0c;打开发现是一些用户名 保存下来…

大模型的三大法宝:Finetune, Prompt Engineering, Reward

编者按&#xff1a;基于基础通用模型构建领域或企业特有模型是目前趋势。本文简明介绍了最大化挖掘语言模型潜力的三大法宝——Finetune, Prompt Engineering和RLHF——的基本概念&#xff0c;并指出了大模型微调面临的工具层面的挑战。 以下是译文&#xff0c;Enjoy! 作者 | B…

MySQL索引原理及实战

MySQL索引原理及实战 一、一条Select语句二、索引介绍1、索引是什么2、索引的优势和劣势优势&#xff1a;劣势&#xff1a; 三、索引的使用1、索引的类型普通索引&#xff1a;唯一索引&#xff1a;全文索引&#xff1a;空间索引&#xff1a;前缀索引 &#xff1a;按照索引列的数…

dolt:自带版本管理的数据库

在做数据分析或算法优化时&#xff0c;有一个需求是比较常见的&#xff1a;在调整了一些代码后&#xff0c;产生了新的结果数据&#xff0c;需要将这些数据以及产生它们的代码存储下来以便事后进行分析。解决这个问题的核心就在于如何对代码和结果数据进行版本管理&#xff0c;…

Web3中文|从以太坊升级寻找下一个热点赛道

今天来聊一聊以太坊升级的事情&#xff0c;但我们想换个角度&#xff0c;不谈上海升级的影响、不谈Layer2的创新、不谈Rollup的技术革命&#xff0c;而是从整个以太坊升级之路来解读为什么当下Layer2、ZK、LSD等赛道会火。 这些其实都是有迹可循的&#xff0c;一旦思路捋顺了&a…

Linux通过Redis源码安装Redis-server

1、下载安装包&#xff08;https://redis.io/download/&#xff09; 选择版本6.2.12 2、解压&#xff1a;tar zxvf redis-6.2.12.tar.gz 3、进入解压后的文件夹&#xff1a;cd redis-6.2.12 4、检查gcc版本&#xff0c;gcc -v &#xff08;因为redis6.0需要gcc5.3.0以上版本才能…

MongoDB实现---WiredTiger

WiredTiger 参考&#xff1a;https://zhuanlan.zhihu.com/p/265222573 MongoDB默认的存储引擎&#xff0c;其和InnoDb类似 通过MVCC实现乐观锁通过索引文件通过B-Tree树加快访问数据的速度&#xff1b; 数据文件通过BTree记录通过日志先行的策略提升并发处理能力&#xff08;…

ASP.NET Core MVC 从入门到精通之路由

随着技术的发展&#xff0c;ASP.NET Core MVC也推出了好长时间&#xff0c;经过不断的版本更新迭代&#xff0c;已经越来越完善&#xff0c;本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容&#xff0c;适用于初学者&#xff0c;在校毕业生&#xff0c…

TCP协议内部工作机制一(确认应答,超时重传,连接管理)

目录 TCP报文结构 TCP的首部长度 保留(6位) TCP特点 TCP内部的工作机制 一确认应答 超时重传 连接管理 建立建立(三次握手) TCP断开连接(四次挥手) TCP报文结构 TCP的报文结构中,16位源端口,16位目的端口,16位校验和和UDP是一样的,本篇文章就暂不介绍了,可参考俺之前写…

设计模式:创建者模式 - 建造者模式

文章目录 1.概述2.结构3.实例4.优缺点5.使用场景6.模式扩展 1.概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某…

记录一次VMwame的故障

故障发生时间 2023年4月12日 故障发生现象 无法启动虚拟机 启动虚拟机&#xff0c;报错权限不足&#xff0c;无法访问文件&#xff0c;打不开磁盘"******"或它所依赖的某个磁盘快照&#xff0c;启动”Disk”模块失败 故障解决过程 找资料&#xff0c;网上的解…

vba:文件夹和文件夹的处理,dir

Option Explicit 1 判断文件夹是否存在 dir函数的第二个参数是vbdirectory时可以返回路径下的指定文件和文件夹&#xff0c;如果结果为""&#xff0c;则表示不存在。 Sub w1() If Dir(ThisWorkbook.path & "\2011年报表2", vbDirectory) &q…

( “树” 之 BST) 230. 二叉搜索树中第K小的元素 ——【Leetcode每日一题】

二叉查找树&#xff08;BST&#xff09;&#xff1a;根节点大于等于左子树所有节点&#xff0c;小于等于右子树所有节点。 二叉查找树中序遍历有序。 230. 二叉搜索树中第K小的元素 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查…

Oracle中Interval几种常用的写法

目录 每分钟执行&#x1f4a8; 每天定时执行&#x1f4a8; 每周定时执行&#x1f4a8; 每月定时执行&#x1f4a8; 每季度定时执行&#x1f4a8; 每半年定时执行&#x1f4a8; 每年定时执行&#x1f4a8; 其他更多示例&#x1f937;‍♀️&#x1f937;‍♀️ 每分钟执…

【线性dp 例题 大综合】dp——数字三角形模型【线性dp】

数字三角形模型 一、数字三角形模型1. 摘花生(最大值)2. 最低通行费(需要把边界置成0x3f)我的错题点 3. ★★★ 取方格数路径长度为k,第一条路线到x1i,第二条路线到x2j的所有方案 4. ★★★★★ 传纸条就是 取方格数 的 题意延申一下 0x51 线性dp经典例题&#xff1a;LIS LCS 数…

Databend v1.1 版本发布!

各位社区小伙伴们&#xff0c;Databend 于 2023 年 4 月 14 日迎来了 v1.1.0 版本的正式发布&#xff01; 这次新版本是 Databend 发布1.0 版本之后的第一个大版本&#xff01;相较于 v1.0.0 版本&#xff0c;开发者们一共新增了 1,616 次commit&#xff0c; 共计 505 个优化和…