ceph分布式存储-常见MON故障处理

2023-11-16

1. 常见 MON 故障处理


Monitor 维护着 Ceph 集群的信息,如果 Monitor 无法正常提供服务,那整个 Ceph 集群就不可访问。一般来说,在实际运行中,Ceph Monitor的个数是 2n + 1 ( n >= 0) 个,在线上至少3个,只要正常的节点数 >= n+1,Ceph 的 Paxos 算法就能保证系统的正常运行。所以,当 Monitor 出现故障的时候,不要惊慌,冷静下来,一步一步地处理。

1.1 开始排障

在遭遇 Monitor 故障时,首先回答下列几个问题:

Mon 进程在运行吗?

我们首先要确保 Mon 进程是在正常运行的。很多人往往忽略了这一点。

是否可以连接 Mon Server?

有时候我们开启了防火墙,导致无法与 Monitor 的 IP 或端口进行通信。尝试使用 ssh 连接服务器,如果成功,再尝试用其他工具(如 telnetnc 等)连接 monitor 的端口。

ceph -s 命令是否能运行并收到集群回复?

如果答案是肯定的,那么你的集群已启动并运行着。你可以认为如果已经形成法定人数,monitors 就只会响应 status 请求。

如果 ceph -s 阻塞了,并没有收到集群的响应且输出了很多 fault 信息,很可能此时你的 monitors 全部都 down 掉了或只有部分在运行(但数量不足以形成法定人数)。

ceph -s 没完成是什么情况?

如果你到目前为止没有完成前述的几步,请返回去完成。然后你需要 ssh 登录到服务器上并使用 monitor 的管理套接字。

1.2 使用 Mon 的管理套接字

通过管理套接字,你可以用 Unix 套接字文件直接与指定守护进程交互。这个文件位于你 Mon 节点的 run 目录下,默认配置它位于 /var/run/ceph/ceph-mon.ID.asok,但要是改过配置就不一定在那里了。如果你在那里没找到它,请检查 ceph.conf 里是否配置了其它路径,或者用下面的命令获取:

ceph-conf --name mon.ID --show-config-value admin_socket

请牢记,只有在 Mon 运行时管理套接字才可用。Mon 正常关闭时,管理套接字会被删除;如果 Mon 不运行了、但管理套接字还存在,就说明 Mon 不是正常关闭的。不管怎样,Mon 没在运行,你就不能使用管理套接字, ceph 命令会返回类似 Error 111: Connection Refused 的错误消息。

访问管理套接字很简单,就是让 ceph 工具使用 asok 文件。对于 Dumpling 之前的版本,命令是这样的:

ceph --admin-daemon /var/run/ceph/ceph-mon.<id>.asok <command>

对于 Dumpling 及后续版本,你可以用另一个(推荐的)命令:

ceph daemon mon.<id> <command>

ceph 工具的 help 命令会显示管理套接字支持的其它命令。请仔细了解一下 config getconfig showmon_statusquorum_status 命令,在排除 Mon 故障时它们会很有用。

1.3 理解 MON_STATUS

当集群形成法定人数后,或在没有形成法定人数时通过管理套接字, 用 ceph 工具可以获得 mon_status 信息。命令会输出关于 monitor 的大多数信息,包括部分 quorum_status 命令的输出内容。

下面是 mon_status 的输出样例:

{
    "name": "c",
    "rank": 2,
    "state": "peon",
    "election_epoch": 38,
    "quorum": [
        1,
        2
    ],
    "outside_quorum": [],
    "extra_probe_peers": [],
    "sync_provider": [],
    "monmap": { 
        "epoch": 3,
        "fsid": "5c4e9d53-e2e1-478a-8061-f543f8be4cf8",
        "modified": "2013-10-30 04:12:01.945629",
        "created": "2013-10-29 14:14:41.914786",
        "mons": [
            {   
                "rank": 0,
                "name": "a",
                "addr": "127.0.0.1:6789\/0"
            },
            { 
                "rank": 1,
                "name": "b",
                "addr": "127.0.0.1:6790\/0"
            },
            { 
                "rank": 2,
                "name": "c",
                "addr": "127.0.0.1:6795\/0"
            }
        ]
    }
}

从上面的信息可以看出, monmap 中包含 3 个monitor ( abc),只有 2 个 monitor 形成了法定人数, c 是法定人数中的 peon 角色(非 leader 角色)。

还可以看出, a 并不在法定人数之中。请看 quorum 集合。在集合中只有 12 。这不是 monitor 的名字,而是它们加入当前 monmap 后确定的等级。丢失了等级 0 的 monitor,根据 monmap ,这个 monitor 就是 mon.a

那么,monitor 的等级是如何确定的?

当加入或删除 monitor 时,会(重新)计算等级。计算时遵循一个简单的规则: IP:PORT 的组合值越, 等级越(等级数字越大,级别越低)。因此在上例中, 127.0.0.1:6789 比其他 IP:PORT 的组合值都小,所以 mon.a 的等级是 0 。

1.4 最常见的 Mon 问题

达到了法定人数但是有至少一个 Monitor 处于 Down 状态

当此种情况发生时,根据你运行的 Ceph 版本,可能看到类似下面的输出:

root@OPS-ceph1:~# ceph health detail
HEALTH_WARN 1 mons down, quorum 1,2 b,c
mon.a (rank 0) addr 127.0.0.1:6789/0 is down (out of quorum)
如何解决?

首先,确认 mon.a 进程是否运行。

其次,确定可以从其他 monitor 节点连到 mon.a 所在节点。同时检查下端口。如果开了防火墙,还需要检查下所有 monitor 节点的 iptables ,以确定没有丢弃/拒绝连接。

如果前两步没有解决问题,请继续往下走。

首先,通过管理套接字检查问题 monitor 的 mon_status 。考虑到该 monitor 并不在法定人数中,它的状态应该是 probingelectingsynchronizing 中的一种。如果它恰巧是 leaderpeon 角色,它会认为自己在法定人数中,但集群中其他 monitor 并不这样认为。或者在我们处理故障的过程中它加入了法定人数,所以再次使用 ceph -s 确认下集群状态。如果该 monitor 还没加入法定人数,继续。

probing 状态是什么情况?

这意味着该 monitor 还在搜寻其他 monitors 。每次你启动一个 monitor,它会去搜寻 monmap 中的其他 monitors ,所以会有一段时间处于该状态。此段时间的长短不一。例如,单节点 monitor 环境, monitor 几乎会立即通过该阶段。在多 monitor 环境中,monitors 在找到足够的节点形成法定人数之前,都会处于该状态,这意味着如果 3 个 monitor 中的 2 个 down 了,剩下的 1 个会一直处于该状态,直到你再启动一个 monitor 。

如果你的环境已经形成法定人数,只要 monitor 之间可以互通,新 monitor 应该可以很快搜寻到其他 monitors 。如果卡在 probing 状态,并且排除了连接的问题,那很有可能是该 monitor 在尝试连接一个错误的 monitor 地址。可以根据 mon_status 命令输出中的 monmap 内容,检查其他 monitor 的地址是否和实际相符。如果不相符,请跳至恢复 Monitor 损坏的 monmap。如果相符,这些 monitor 节点间可能存在严重的时钟偏移问题,请首先参考时钟偏移,如果没有解决问题,可以搜集相关的日志并向社区求助。

electing 状态是什么情况?

这意味着该 monitor 处于选举过程中。选举应该很快就可以完成,但偶尔也会卡住,这往往是 monitors 节点时钟偏移的一个标志,跳转至时钟偏移获取更多信息。如果时钟是正确同步的,可以搜集相关日志并向社区求助。此种情况除非是一些(非常)古老的 bug ,往往都是由时钟不同步引起的。

synchronizing 状态是什么情况?

这意味着该 monitor 正在和集群中的其他 monitor 进行同步以便加入法定人数。Monitor 的数据库越小,同步过程的耗时就越短。

然而,如果你注意到 monitor 的状态从 synchronizing 变为 electing 后又变回 synchronizing ,那么就有问题了:集群的状态更新的太快(即产生新的 maps ),同步过程已经无法追赶上了。这种情况在早期版本中可以见到,但现在经过代码重构和增强,在较新版本中已经基本见不到了。

leaderpeon 状态是什么情况?

这种情况不应该发生,但还是有一定概率会发生,这常和时钟偏移有关。如果你并没有时钟偏移的问题,请搜集相关的日志并向社区求助。

恢复 Monitor 损坏的 monmap

monmap 通常看起来是下面的样子,这取决于 monitor 的个数:

epoch 3
fsid 5c4e9d53-e2e1-478a-8061-f543f8be4cf8
last_changed 2013-10-30 04:12:01.945629
created 2013-10-29 14:14:41.914786
0: 127.0.0.1:6789/0 mon.a
1: 127.0.0.1:6790/0 mon.b
2: 127.0.0.1:6795/0 mon.c

不过也不一定就是这样的内容。比如,在早期版本的 Ceph 中,有一个严重 bug 会导致 monmap 的内容全为 0 。这意味着即使用 monmaptool 也不能读取它,因为全 0 的内容没有任何意义。另外一些情况,某个 monitor 所持有的 monmap 已严重过期,以至于无法搜寻到集群中的其他 monitors 。在这些状况下,你有两种可行的解决方法:

销毁 monitor 然后新建

只有在你确定不会丢失保存在该 monitor 上的数据时,你才能够采用这个方法。也就是说,集群中还有其他运行正常的 monitors,以便新 monitor 可以和其他 monitors 达到同步。请谨记,销毁一个 monitor 时,如果没有其上数据的备份,可能会丢失数据。

给 monitor 手动注入 monmap

通常是最安全的做法。你应该从剩余的 monitor 中抓取 monmap,然后手动注入 monmap 有问题的 monitor 节点。

下面是基本步骤:

1、是否已形成法定人数?如果是,从法定人数中抓取 monmap :

ceph mon getmap -o /tmp/monmap

2、没有形成法定人数?直接从其他 monitor 节点上抓取 monmap (这里假定你抓取 monmap 的 monitor 的 id 是 ID-FOO 并且守护进程已经停止运行):

ceph-mon -i ID-FOO --extract-monmap /tmp/monmap

3、停止你想要往其中注入 monmap 的 monitor。

4、注入 monmap 。

ceph-mon -i ID --inject-monmap /tmp/monmap

5、启动 monitor 。

请记住,能够注入 monmap 是一个很强大的特性,如果滥用可能会对 monitor 造成大破坏,因为这样做会覆盖 monitor 持有的最新 monmap 。

时钟偏移

Monitor 节点间明显的时钟偏移会对 monitor 造成严重的影响。这通常会导致一些奇怪的问题。为了避免这些问题,在 monitor 节点上应该运行时间同步工具。

允许的最大时钟偏移量是多少?

默认最大允许的时钟偏移量是 0.05 秒

如何增加最大时钟偏移量?

通过 mon-clock-drift-allowed 选项来配置。尽管你 可以 修改但不代表你 应该 修改。时钟偏移机制之所以是合理的,是因为有时钟偏移的 monitor 可能会表现不正常。未经测试而修改该值,尽管没有丢失数据的风险,但仍可能会对 monitors 的稳定性和集群的健康造成不可预知的影响。

如何知道是否存在时钟偏移?

Monitor 会用 HEALTH_WARN 的方式警告你。 ceph health detail 应该输出如下格式的信息:

mon.c addr 10.10.0.1:6789/0 clock skew 0.08235s > max 0.05s (latency 0.0045s)

这表示 mon.c 已被标记出正在遭受时钟偏移。

如果存在时钟偏移该怎么处理?

同步各 monitor 节点的时钟。运行 NTP 客户端会有帮助。如果你已经启动了 NTP 服务,但仍遭遇此问题,检查一下使用的 NTP 服务器是否离你的网络太过遥远,然后可以考虑在你的网络环境中运行自己的 NTP 服务器。最后这种选择可趋于减少 monitor 时钟偏移带来的问题。

客户端无法连接或挂载

检查 IP 过滤表。某些操作系统安装工具会给 iptables 增加一条 REJECT 规则。这条规则会拒绝所有尝试连接该主机的客户端(除了 ssh )。如果你的 monitor 主机设置了这条防火墙 REJECT 规则,客户端从其他节点连接过来时就会超时失败。你需要定位出拒绝客户端连接 Ceph 守护进程的那条 iptables 规则。比如,你需要对类似于下面的这条规则进行适当处理:

REJECT all -- anywhere anywhere reject-with icmp-host-prohibited

你还需要给 Ceph 主机的 IP 过滤表增加规则,以确保客户端可以访问 Ceph monitor (默认端口 6789 )和 Ceph OSD (默认 6800 ~ 7300 )的相关端口。

iptables -A INPUT -m multiport -p tcp -s {ip-address}/{netmask} --dports 6789,6800:7300 -j ACCEPT

或者,如果你的环境允许,也可以直接关闭主机的防火墙。

1.5 Monitor 数据库失败

数据库崩溃的表现

Ceph monitor 把集群的各种 map 信息存放在 key/value 数据库中,如 LevelDB 。如果 monitor 是因为数据库崩溃而失败,在 monitor 的 log 日志中应该会有如下错误信息:

Corruption: error in middle of record

或:

Corruption: 1 missing files; e.g.: /var/lib/ceph/mon/mon.0/store.db/1234567.ldb
通过健康的 Monitor(s) 恢复

如果还有幸存的 monitor,我们通常可以用新的数据库替换崩溃的数据库。并且在启动后,新加入的成员会和其他健康的伙伴进行同步,一旦同步完成,它就可以为客户端提供服务了。

通过 OSDs 恢复

但是万一所有的 monitors 都同时失败了该怎么办?由于建议用户在部署集群时至少安装 3 个 monitors,同时失效的可能性较小。但是数据中心意外的断电,再加上磁盘/文件系统配置不当,可能会引起底层文件系统失败,从而杀掉所有的 monitors 。这种情况下,我们可以通过存放在 OSDs 上的信息来恢复 monitor 的数据库:

ms=/tmp/mon-store
mkdir $ms
# collect the cluster map from OSDs
for host in $hosts; do
    rsync -avz $ms user@host:$ms
    rm -rf $ms
    ssh user@host <<EOF
        for osd in /var/lib/osd/osd-*; do
            ceph-objectstore-tool --data-path $osd --op update-mon-db --mon-store-path $ms
        done
    EOF
    rsync -avz user@host:$ms $ms
done
# rebuild the monitor store from the collected map, if the cluster does not
# use cephx authentication, we can skip the following steps to update the
# keyring with the caps, and there is no need to pass the "--keyring" option.
# i.e. just use "ceph-monstore-tool /tmp/mon-store rebuild" instead
ceph-authtool /path/to/admin.keyring -n mon. \
  --cap mon allow 'allow *'
ceph-authtool /path/to/admin.keyring -n client.admin \
  --cap mon allow 'allow *' --cap osd 'allow *' --cap mds 'allow *'
ceph-monstore-tool /tmp/mon-store rebuild -- --keyring /path/to/admin.keyring
# backup corrupted store.db just in case
mv /var/lib/ceph/mon/mon.0/store.db /var/lib/ceph/mon/mon.0/store.db.corrupted
mv /tmp/mon-store/store.db /var/lib/ceph/mon/mon.0/store.db

上面的这些步骤:

  1. 从所有的 OSD 主机上收集 map 信息。
  2. 重建数据库。
  3. 用恢复副本替换 mon.0 上崩溃的数据库。

已知的限制

下面这些信息无法通过上述步骤恢复:

  • 一些新增的 keyring : 通过 ceph auth add 命令增加的所有 OSD keyrings 都可以恢复。用 ceph-monstore-tool 可以导入 client.admin 的 keyring 。但是 MDS 和其他 keyrings 在被恢复的那个 monitor 数据库中就会丢失。你可能需要手动重新添加一下。
  • pg 的设置:通过 ceph pg set_full_ratioceph pg set_nearfull_ratio 命令设置的 full rationearfull ratio 值会丢失。
  • MDS Maps:MDS maps 会丢失。
磁盘空间不足导致 MON DOWN

当 monitor 进程检测到本地可用磁盘空间不足时,会停止 monitor 服务。Monitor 的日志中应该会有类似如下信息的输出:

2016-09-01 16:45:54.994488 7fb1cac09700  0 mon.jyceph01@0(leader).data_health(62) update_stats avail 5% total 297 GB, used 264 GB, avail 18107 MB
2016-09-01 16:45:54.994747 7fb1cac09700 -1 mon.jyceph01@0(leader).data_health(62) reached critical levels of available space on local monitor storage -- shutdown!

清理本地磁盘,增大可用空间,重启 monitor 进程,即可恢复正常。

通过 Mon 数据库的备份恢复

具体请参考本手册第三部分 2. Monitor 的备份和恢复

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ceph分布式存储-常见MON故障处理 的相关文章

  • cmd简单游戏代码_python简单游戏应用——剪刀石头布!

    我们的基础中的基础 在前几文中已经介绍完了 其他的知识用什么学什么就对了 接下来我们做款小游戏 纵观全文 先引入了一个函数 random 随机数 单用random 这个函数 会产生一个随机的实数 范围在 0 1 若是要从自定的范围取出一个
  • 在flask框架中,设置执行完视图函数后自动将数据提交回数据库

    设置执行完视图函数后自动提交操作回数据库 app config SQLALCHEMY COMMIT ON TEARDOWN True
  • pytorch GPU版本安装

    使用驱动精灵安装 参考 pytorch GPU版本安装 尘世猫的博客 CSDN博客 pytorchgpu版本 安装cuda 高版本的cuda是可以兼容低版本的cuda的 比如我的电脑支持cuda11 0 我就可以安装cuda10 0 cud
  • 汽车OBD初级开发入门

    汽车OBD初级开发入门 我所认识的OBD 从何开始学习OBD stm32的CAN总线 OBD的标准协议 我所认识的OBD 直观的从名称上来说是英文On Board Diagnostics的缩写 中文翻译为 车载诊断系统 书面上的解释就是处理
  • 太强了!100个Python算法实例.pdf

    常言道 算法才是编程的灵魂 不管是java python还是PHP 都跨不过算法这个门槛 算法确实不好学 但算法也是真必要 各大公司为了筛选人才 面试程序员的时候多多少少都会考察你的算法能力 学习算法无非这几种目的 学习基本编程语法和思想
  • Python VTK numpy数据3D可视化

    在Python的3D图像处理中 通常用numpy array来进行非常方便的计算或者转化 这里记录一下numpy数据的VTK可视化基本流程 包括面绘制 Surfase Rendering 和体绘制 Volume Rendering 除去数据
  • 全局变量、静态全局变量、静态局部变量和普通局部变量的区别

    按存储区域分 全局变量 静态全局变量和静态局部变量都存放在内存的全局数据区 局部变量存放在内存的栈区 按作用域分 1 全局变量在整个工程文件内都有效 2 静态全局变量只在定义它的文件内有效 3 静态局部变量只在定义它的函数内有效 且程序仅分
  • 【FAQ】API6低代码开发问题汇总

    参考文档 低代码开发参考文档 文档中心 使用低代码进行开发 基于景区模板开发元服务 文档中心 模板简介 使用API6低代码开发遇到的问题汇总情况如下 1 低代码环境下 如何实现box shadow阴影效果的配置 答 低码目前不支持box s
  • 蓝牙之十七-bluedroid scan流程

    蓝牙扫描过程是指扫描蓝牙设备 app层 这里有两张截图 第一张图显示的是安卓设置setting菜单栏中有Bluetooth这一项 点进去以后 点击右上角显示如下的截图 其中Refresh就是刷新设备列表 也就会扫描设备信息 上图显示的三个菜
  • Gated Mechanism for Attention Based Multi Modal Sentiment Analysis 阅读笔记

    GATED MECHANISM FOR ATTENTION BASED MULTIMODAL SENTIMENT ANALYSIS 阅读笔记 最近在跟进多模态的情感分析发现多模态榜一又被刷下来了 这篇论文是当前时间内的最好的效果 下面就对论
  • linux服务器补丁怎么修复,linux 服务器打补丁

    linux 服务器打补丁 内容精选 换一换 MindStudio和Ascend cann toolkit开发套件包可以安装在Linux服务器上 可以使用Linux服务器上原生桌面自带的终端gnome terminal进行安装 也可以在Win
  • Python数据挖掘-机器学习

    目录 零 概念 算法 开发流程 一 机器学习概述 1 数据集 1 sklearn自带数据集应用 2 数据集划分 二 特征工程 1 特征抽取 1 字典特征提取 sklearn feature extraction DictVectorizer
  • windows下修改mysql时区设置

    root身份登录MySQL mysql u root p 查看time zone变量 show variables like time zone 显示 time zone 变量 设置time zone变量 set time zone 08
  • dobbo源码解析目录地址

    肥朝 Dubbo 源码解析 作者 肥朝 博客 http www jianshu com u f7daa458b874 目录 Dubbo 源码解析 集群容错架构设计 Dubbo 源码解析 Directory Dubbo 源码解析 Router
  • 模糊匹配之——BK树与拼写纠正

    介绍 拼写纠错功能常常出现在比较高级的文本编辑应用中 例如大家熟知的word 高级一点的IDE例如Jet Brains系列 在一些在线翻译上 也有自动校正拼写的功能 例如谷歌翻译 原理 拼写纠正的实现方式有多种 这里使用的是一种名为BK树的
  • 【Java项目推荐】值得写到简历上的项目--黑马点评

    优惠卷秒杀 前言 优惠券秒杀 实现优惠券秒杀下单 超卖问题 一人一单 分布式锁 redis中加锁的一些特殊情况 手动实现分布式锁 分布式锁误删情况1 分布式锁误删情况2 lua脚本解决多条命令的原子性问题 Redisson 秒杀优化 异步秒
  • Mac使用Python接入东方财富量化接口Choice,调试与获取数据

    这篇博客用来把在Mac平台上使用python接入东方财富Choice接口的流程细化并重写 官方文档有些地方说的太含糊了 有的地方博主尝试了多种方法才试出来 这里直接把标准答案给到大家 尽量避坑吧 吐槽 同花顺科技感很足 赞 但是没有Mac版
  • 什么是虚拟键码、虚拟密钥码、扫描码

    虚拟键码 虚拟密钥码 扫描码
  • spring_boot-启动错误笔记

    2018 07 15 17 15 42 443 INFO 10892 restartedMain s b a e w s WebMvcEndpointHandlerMapping Mapped actuator health methods
  • ElementUI tabs标签页样式改造美化

    今天针对ElementUI的Tabs标签页进行了样式修改 更改为如下图所属的样子 在线运行地址 JSRUN项目 ElementUI tabs标签页样式改造 大家如果有需要可以拿来修改使用 下面我也简单的贴上代码 代码没有注释 很抱歉 时间比

随机推荐

  • python的运行方式有哪两种 有何区别_python程序的两种运行方式是什么

    python程序的两种运行方式是什么 第一种方式 REPL 所谓REPL即read eva print loop 读取 计算 打印 循环 实现REPL运行方式有以下两种 1 IDLE 集成开发环境或集成开发和学习环境 是Python的集成开
  • 在ESXi安装ubuntu中,ubuntu20.04是LVM管理的,lvm盘只有识别100G ,需扩展逻辑卷来使用更多的空间

    sudo fdisk l Device Start End Sectors Size Type dev sda1 2048 4095 2048 1M BIOS boot dev sda2 4096 4198399 4194304 2G Li
  • SpringCloud中Hystrix中熔断器的简单配置和调用

    SpringCloud中Hystrix组件 用于在云环境中远程调用方法失败后的处理机制 它通过配置一个处理类实现接口重写其方法提供调用失败后的紧急处理 是一个非常好用的组件 1 首先在没有配置熔断器之前启动项目访问 只启动了一个模块 注册中
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • Java接口登录实现页面跳转

    方式一 在Java中 可以通过使用接口和实现类来实现页面跳转功能 以下是一个简单的示例代码 首先 创建一个接口 例如LoginService public interface LoginService void login String u
  • linux设备驱动归纳总结(六):1.中断的实现

    一 什么是中断 中断分两种 1 中断 又叫外部中断或异步中断 它的产生是由于外设向处理器发出中断请求 其中外部中断也有两种 这是由配置寄存器设定的 普通中断请求 IRQ 和快速中断请求 FIQ 一般地 linux下很少使用快速中断请求 2
  • OVP电路应用(一)_12V电源_DIO1280

    目录 前言 一 基本信息 二 基本电气特性 1 PIN定义 2 电气特性 3 OVP值的设置 4 时序 5 其他 三 实际设计案例 1 电路原理图 PCB Layout 2 测试 3 问题与对策 四 USB的VBUS应用 其他举例 1 电路
  • 关于DecimalFormat类的数字格式化

    文章目录 基本格式化 不同特殊符号代码的格式 不同符号的使用 当我们遇到小数时 必定会设置保留小数的位数 也可能会涉及数字的格式转换 那么在Java中肯定也有这样的一个类 就是DecimalFormat类能帮助我们方便快捷的解决此类小数格式
  • Atlantis

    点击打开链接 Description There are several ancient Greek texts that contain descriptions of the fabled island Atlantis Some of
  • error: expected ';', ',' or ')' before '&' token 解决方法

    在用Devcpp验证函数 引用传递 的时候 出现了错误提示 Error expected or before token 源代码如下 include
  • vue3 下载router之后,路由未生效及控制台警告问题

    在控制台页面会报出警告 Failed to resolve component router link 无法识别router link import createApp from vue import App from App vue im
  • 前端常见的适配方法

    一 固定布局 pc端 静态布局 以像素作为页面的基本单位 不管设备和浏览器宽度 只设计一套尺寸 这种不太现实 二 根据不同根据不同的分辨率 加载不同的CSS样式文件 可切换的固定布局 自适应布局
  • 关于考试管理系统的实现

    关于考试管理系统的实现 背景 随着各地人事机构招考需求不断增强 规模不断扩大 考务管理工作量不断加大 尤其是报名 缴费 考场编排和准考证制作这几项非常重要且有繁琐的工作 若是再依靠传统的线下人工方式进行 那将浪费大量的人力 时间和资源 针对
  • 单片机毕业设计 RFID智能门禁系统

    文章目录 1 简介 2 绪论 2 1 课题背景与目的 3 射频识别 3 1 射频识别技术 3 2 射频识别模块 3 2 1 RFID模块 3 2 2 RFID模块组成 4 系统设计 4 1 系统架构 4 1 1 硬件部分 4 1 2 软件部
  • 使用 git 提交到指定远程分支

    使用 git 提交到指定远程分支 git add git commit 或者使用 git commit m messges git pull origin 远程分支名 相当于指定分支的代码与当前分支的代码合并到了一起 git push or
  • 1分钟部署一个属于自己的网站,借助云开发静态网站部署属于自己的网站

    今天来教大家部署一个属于自己的第一个静态网站 因为这里借助小程序云开发的静态服务器资源 所以可以轻松的实现自己网站的部署 部署完以后可以在电脑浏览器 手机浏览器 微信公众号里面展示 老规矩 先看效果图 简单起见 我这里写一个最简单的html
  • IEEE 802.3以太网帧封装

    要求 1 要求画出界面 以太网帧的数据部分 源MAC地址和目的MAC地址均从界面输入 2 计算后的校验和字段和封装后的结果可以从界面上输出 3 生成多项式G X X8 X2 X1 1 或者生成多项式G X X32 X26 X23 X22 X
  • SpringBoot-基础篇复习(全)

    本文包含SpringBoot基础篇的所有知识点 大家一起来学习吧 开启一段新的旅程 加油吧 springboot是由Picotal团队提供的全新框架 用来简化spring的搭建和开发过程的配置 因为spring的配置比较繁琐 故引入了spr
  • 不吐不快:程序员到底有没有前途(一位前辈写的)

    早上到单位 看昨天晚上QQ群里的内容 有人在问做程序员怎么样 马上就有人跳出来告诉他程序员又苦 又累 要求又高 赚得也不比人多 而且30岁以后肯定失业那一套 对程序员的前途 自己有自己的想法 但这没什么好说的 而且每个人都有适合本人的路 也
  • ceph分布式存储-常见MON故障处理

    1 常见 MON 故障处理 Monitor 维护着 Ceph 集群的信息 如果 Monitor 无法正常提供服务 那整个 Ceph 集群就不可访问 一般来说 在实际运行中 Ceph Monitor的个数是 2n 1 n gt 0 个 在线上