最近在研究etcd的权限机制,etcd用的认证方式比较简单basic auth。原理也比较简单易懂,但轻率上线后,发现一个大坑,就是认证时候用来比较密码的哈希是bcript,而且是每个请求都会调。这个耗时很大,导致集群性能下降的厉害,基本不能用了。
查遍官方文档,说3.1+ 用https common name的方式可以解决这个问题,但是我就不想上https,涉及改造的工作量有点大,就想通过auth简单的把误操作的行为隔离一下。
于是乎只能开始动手改了,简单的加一个cache先用。
首先我们用的etcd版本为2.1.1
git clone https://github.com/coreos/etcd.git
git checkout v2.1.1
下载代码后,切换到 v2.1.1 tag下
打开目录 etcdserver
在目录下添加新文件,姑且叫做 password_map.go
添加如下代码
// author:ZeaLoVe // password map of etcd v2 api package auth import ( "fmt"
"sync"
) // key : string meke by hashed password + plaintext password // value: error the result of CompareHashAndPassword type PasswordMap struct { sync.RWMutex
M map[string]error
} var DefaultPasswdMap = PasswordMap{ M: make(map[string]error),
} func (this *PasswordMap) Hit(hashed, pt string) bool { this.RLock()
defer this.RUnlock()
if _, ok := this.M[hashed+pt]; ok {
return ok
}
return false
} // Get must called after Hit func (this *PasswordMap) Get(hashed, pt string) error { this.RLock()
defer this.RUnlock()
if val, ok := this.M[hashed+pt]; ok {
return val
}
return fmt.Errorf("no hit")
} func (this *PasswordMap) Set(hashed string, pt string, err error) { if hashed == "" {
return
}
this.Lock()
defer this.Unlock()
this.M[hashed+pt] = err
} |
打开该文件夹下的auth.go 找到 CheckPassword函数
修改为
func (u User) CheckPassword(password string) bool { if DefaultPasswdMap.Hit(u.Password, password) {
return DefaultPasswdMap.Get(u.Password, password) == nil
}
err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(password))
DefaultPasswdMap.Set(u.Password, password, err)
return err == nil
} |
对于其他版本,虽然实现上可能有些区别,但整个原理是一样的(我看过3.1的基本没怎么改变)。此改造不会影响第一次请求的耗时,但后面不会对相同的密码再次调用bcript,会直接返回缓存的结果,极大提高了性能
但该实现没有回收缓存的空间,所以如果有人对同一个账号用各种不同的密码轮番攻击,可能会导致内存持续上升。但经过压测,发现即使试十万次内存也只上涨不到30M。可以暂时忽略这个问题。
即使内存大到一定程度,重启也可以恢复。
相关推荐
CPU cache系统介绍,详细介绍了cache的组成等等内容。
cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验cache实验...
为了缓和CPU与存储器之间的速度差距,在计算机系统的CPU与主存之间引入了cache。但在多处理器系统中,由于多个处理器可能对同一数据块进行读写操作,当某个处理器对共享的数据块进行写操作时,其它处理器的cache中该...
五级流水cpu,cache存储,30条指令,延时槽实现
SuperCache实现专利的数据块级别的缓存技术,除提高系统性能之外,还能独自进行 NT 文件级别缓存。 SuperCache使用获得专利的块级高速缓存技术来提升系统的性能,这种技术远胜于单纯使用NT文件级的高速缓存。通过...
cache数据库基础操作资料,包含建库建表,关联查询
自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与 Windows、UNIX 一起占据了操作系统领域几乎所有的市场份额。特别是在高性能计算领域,Linux 已经成为一个占...
通过实验获得的真实数据记录与分析,Cache的大小对系统性能的影响。
等待事件row cache lock,latch row cache objects处理过程
Cache-Memory处于Memory Hierarch的最顶端,其下是主存储器和外部存储器,合理使用Cache是降低存储器访问时间的有效途径。介绍了的Cache的工作原理组成结构等。
Cache数据库系统开发培训,非常好的资料。 Cache数据库系统开发培训 Cache
cache性能分析实验报告
该工程包含数据缓存D_Cache和指令缓存I_Cache的Verilog代码和仿真文件,Cache的详细技术参数包含在.v文件的注释中。 直接相连16KB D_Cache Cache写策略: 写回法+写分配 (二路)组相连16KB I_Cache Cache替换策略: ...
Cachecloud文档Cachecloud文档
当片上多处理器系统上运行多个不同程序时,如何给这些不同的应用程序分配适当的cache空间成为一个难题。Cache划分就是解决这一难题的有效方法,目前大部分的划分方法都是针对最后一级共享cache设计的。私有cache划分...
PC系统高速缓冲存储器Cache的原理、设计及实现
头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2路组相联cache设计头歌计算机组成原理2...
关于二级缓存的介绍 L2cache存储方式有set way等概念,具体有实例图的
primocache3.09+破解批处理,
执行BAT脚本,对PrimoCache软件重置试用期60天。 支持版本如下: 2.4.0 2.5.0 2.6.0 脚本原始主体来自网络,非我原创。 虽然没见过原始脚本之前就发现了准确的文件和注册表信息位置, 但是对于重置标志开关,自己...