ceph-calamari 安装记录
过时提示 @Deprecated基于本文提到的原因,不再对该项目进行跟进、维护和继续探索。该文不再更新。
克隆源码mkdir /tmp/calamari-repocd /tmp/calamari-repo git clone https://github.com/ceph/calamari.gitgit clone https://github.com/ceph/Diamond.git git clone https://github.com/ceph/calamari-clients.git
构建 calamari server 的 rpm 包生成 diamond 安装包cd ../Diamondgit checkout origin/calamariyum install rpm-build -ymake rpm
将 diamond-.noarch.rpm 复制到所有的 ceph 服务器,执行安装:cd dist/# 方案1yum install python-configobjrpm -ivh diamond-<version>.noarch.rpm# 方案2y ...
2019 面试记录
FunPlus (小视频业务)数据库的事务隔离机制隔离级别
READ UNCOMMITTED(未提交读)这个级别,事务中的修改,即使没有提交,对其他事务也都是可见的。事务可以读取未提交的数据,被称为脏读(Dirty Read),这个级别性能不会比其他级别好太多,但缺乏其他级别的很多好处,一般很少使用。
READ COMMITTED(提交读)这个级别是大多数数据库系统的默认隔离级别(但 MySQL 不是)。一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别也叫作不可重复读(nonrepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。
REPEATABLE READ(可重复读)该级别保证了在同一个事务中多次读取同样记录的结果是一致的,但依然无法解决另外一个幻读(Phantom Read)的问题。幻读,指的是当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行(Phantom Row)。InnoDB 和 XtraDB 存储引擎通过多版本并发控制(MVCC)解决了幻读 ...
🐍PyTricks | 如何更新一个嵌套字典的值?
import collectionsdef update_nested_dict(orig_dict, new_dict): """ 更新嵌套字典 params = {'state':'1','message':'9527','result':{'hello':'world','foo':'bar','age':32}} new_dict = {'name':'Peter'} {'state': '1', 'message': '9527', 'name': 'Peter', 'result& ...
TCP 和 UDP 的区别
TCP 传输控制协议( Transmission Control Protocol)和 UDP 用户数据报协议(User Datagram Protocol)是在传输层运行的主要协议。传输控制协议(TCP)和用户数据报协议(UDP)的操作方式非常不同,你可以根据需要选择传输控制协议(TCP)或用户数据报协议(UDP)。
TCP 代表传输控制协议,它保证数据包的传送。该协议提供了广泛的错误检查机制,例如流控制和数据确认。传输控制协议(TCP)是面向连接的协议。在传输数据之前,必须确保在参与数据传输的设备之间建立连接。如果您的应用程序需要保证数据的传输,则必须选择 TCP 作为传输层协议。
UDP 代表用户数据报协议,它以数据报模式运行。在此处应注意的主要区别是用户数据报协议(UDP)是一种无连接协议。用户数据报协议(UDP)仅具有使用校验和的基本错误检查机制。
传输控制协议(TCP)和用户数据报协议(UDP)之间的区别传输控制协议(TCP)
TCP 是面向连接的协议,这意味着设备应在传输数据之前打开连接,并在传输数据后正常关闭连接。
TCP 确保将数据可靠地传递到目的地。
TCP ...
TCP 三次握手与四次挥手
TCP 头部上面就是 TCP 协议头部的格式,它非常重要,是理解其它内容的基础,下面将每个字段的信息都详细的说明一下:
Source Port 16 位,用于标识源端口号(发送机器 TCP 端口)
Destination Port 16 位,用于标识目的端口号(接收端口)
Sequence Number 32 位,用于 TCP 段的字节级别编号。如果使用 TCP 连接,则为数据的每个字节分配一个序列号。如果设置了 SYN 标志(在三向握手连接初始化期间),则是初始序列号。 然后,实际第一个数据字节的序列号将是此序列号加 1。例如,让设备在特定 TCP 报头中的数据的第一个字节在该字段 50000 中将具有其序列号。如果此数据包有 500 字节中的数据,那么此设备发送的下一个数据包将具有 50000 + 500 + 1 = 50501 的序列号。
Acknowledgment Number 32 位,确认序列号包含发送确认的一端所期望收到的下一个序号,因此,确认序号应当是上次已成功收到数据字节序号加 1。不过,只有当标志位中的 ACK 标志(下面介绍)为 1 时该确认序列号的 ...
为什么 Redis 这么快?
太长不看版
Redis 是基于内存的访问,内存的读写速度非常快;
Redis 是单线程的模型。保证了每个操作的原子性,省去了很多上下文切换线程的时间以及竞态而产生的消耗;
Redis 使用多路复用技术,可以处理并发的连接。非阻塞 IO 内部实现采用 epoll,采用了 epoll+自己实现的简单的事件轮询(event loop)框架。epoll 中的读、写、关闭、连接都转化成了事件,然后利用 epoll 的多路复用特性,绝不在 io 上浪费一点时间。
数据结构。Redis 全程使用 hash 结构,读取速度快,还有一些特殊的数据结构,对数据存储进行了优化,如压缩表,对短数据进行压缩存储,再如,跳表,使用有序的数据结构加快读取的速度。
为什么 Redis 使用单线程因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案。
详细原因
不需要各种锁的性能消耗
Redis 的数据结构并不全是简单的 Key-Value,还有 list ...
我的博客 idealyard 待办事项记录
BUGs 记录前端
新建文章报错;
首页无限滚动时提示Duplicate keys detected: 'xxxx'. This may cause an update error.
用户注册页面;
用户注册成功,但是跳转首页之后显示问题;
用户写文章时,作者不是当前登录用户;
点击页内锚点,跳转到文章分类页面,应该在本页面内跳转;
cookie 中密码没有加密;解决办法参考这里
token 超时时弹出很多 message,应该使用更友好的方式!或者精准提示,一次只提示一条即可; 解决办法:如何让 Element UI 的 Message 消息提示每次只弹出一个
标签云
参考这里
这里
这里最终参考VueWordCloud 实现;
记住密码;
标签、分类页面,item 数量为 0 时,点击事件 disable;
[x] 找回密码;
前端异常处理;
[x] 盘古之白
有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其餘三成的人最后只能把遗產留给 ...
如何使用 Gunicorn+Gevent+Supervisor+Nginx 部署 Flask 应用
组件介绍
Nginx: 高性能Web服务器,负责反向代理;
gunicorn: (Green Unicorn,绿色独角兽)高性能 uWSGI 服务器;
gevent: 将Python同步代码转换为异步的协议库;
supervisor: 监控服务流程的工具;
版本信息gunicorn --version
输出gunicorn (version 19.9.0)
安装 gunicorn 和 geventpip install gunicornpip install gevent
pip 安装的 gunicorn 无法找到路径,可以使用sudo apt install gunicorn3(Ubuntu)命令安装,或者手动编写/root/venv/bin/gunicorn(其中 venv 为你的 python 虚拟环境名称)#!/root/venv/bin/python3# -*- coding: utf-8 -*-import reimport sysfrom gunicorn.app.wsgiapp import runif __name__ == '__main__& ...
Python3 报错"TypeError:a-bytes-like-object-is-required,not-'str'"解决办法
今天在解析一个工具输出问题时遇到这两个编码错误,记录一下。
TypeError: a bytes-like object is required, not ‘str’
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xb3 in position 38: invalid start byte
TL;DR
导致这个问题主要的原因是你调用的是字符str类型的方法而你给传递的是一个字节byte类型的对象。
先上代码import subprocessclass ExecCommandError(Exception): passclass ExecCommand: @staticmethod def cust_popen_list(cmdlist, close_fds=True): """ subprocess.call只接受数组变量作为命令,并将数组的第一个元素作为命令,剩下的全部作为该命令的参数。 :param cmdlist: ...
如何在 Vue 中实现显示全部的功能?
功能分析我们可以简单分析一下功能实现:
显示内容是从后台一次性获取到的,不存在点击“阅读更多”再去请求一次后台获取剩余数据的可能;
通过第一步其实可以得出,网站是通过控制显示元素的高度来实现这一功能,而非控制内容的获取;
可以看到“阅读更多”按钮上有一层渐变遮罩层,网站通过这一遮罩挡住剩余内容。
完整代码<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title> ...