ZAB
基本与raft相同
叫法有些区别
leader周期为epoch 而不是 term
心跳方向相反,followe向leader发送心跳
三种版本
Basic paxos
Multi Paxos
Fast Paxos
paxos的算法基于一个岛屿法律制定的故事
client: 请求的发起者,就是公民
Propser :接收client的请求,向集群发送提议。并在冲突发生时,收到冲突调节的作用,。 就是议员,收集公民提议,整理提议提出议案
Acceptor(Voter):投票和接收议案。只有在形成法定人数的时候,提议才会被最终接收。就是最终决定的领导
Learner:提议接收者,backup,备份,对集群一致性没什么影响,就是用来记录提议的
准备阶段
Propser 议员对client的提议整理出一个 议案,编号X,交给Acceptor 领导
是否允许
由于Propser 有很多个,那么针对 X 议案,如果以前提过,那么拒绝,(其实就是比较编号X的大小)
接待议案
此时还要看是否为多数派都通过, 就是Acceptor数量的超过一半了,那么发送议案请求和编号,那么就 准备立案
立案
在Acceptor接收此议案的过程中没有新的编号议案过来时,则立案,Learner记下议案内容,否则忽略此次议案
加入了
Leader 唯一的propser ,所有的请求都经过此propser
分布式系统常见问题之一致性
多系统之间要想保证一致性,毫无疑问同步是最强的一致性体现,但是同步严重降低了系统之间的可用性
C(consistency) 和 A(available)之间的取舍是当前分布式系统的困扰
Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现,Google的分布式锁系统Chubby作为Paxos实现曾经遭遇到很多坑。后来斯坦福大学提出了Raft算法。
Raft是用于管理复制日志的一致性算法。它的效果相当于(multi-)Paxos,跟Paxos一样高效,但结构与Paxos不同。这使得Raft比Paxos更容易理解,也为构建实用系统提供了更好的基础。
Raft集群包含多个服务器,5个服务器是比较典型的,允许系统容忍两个故障。在任何给定时间,每个服务器都处于以下三种状态之一,领导者(Leader),追随者(Follower)或候选人(Candidate)。 这几个状态间可以相互转换。
Leader:处理所有客户端交互,日志复制等,一般一次只有一个Leader
Follower:类似选民,完全被动
Candidate:类似Proposer律师,可以被选为一个新的领导人
Log Replication
Safety
2pc
选举算法是利用时间窗口的来进行选举
无论集群有多少台机器
每一台集群在指定超时时间 结束前没有收到 leader的心跳,此机器认为集群中没有leader,此时就会发起对自己的投票
既然是每一台机器的都干的活,那么此时 集群中会有多台机器发起投票,发起投票的机器不对其他发起投票的机器做出相应,没有发起投票的机器只能接待最先达到的投票,并给出响应
一轮过去后,发起投票的所有机器中有可能有且仅有一台获得一半以上的票数,此时他就是leader,向集群发送心跳维持关系,其他发起投票机器和投给其他机器的机器收到leader的心跳包,此时认为给他发心跳包的机器就是leader。 如果发起投票的所有机器没有一台超过一半同意,那么超时进行第二轮选,票数重置
client发送一次请求
client 这些外部系统 发送写请求
直接发给leader,那么leader日志备份,并同时发送写请求给集群, 集群 收到之后日志备份,返回 leader,leader此时提交,可以返回给客户端了,同时发送提交心跳包给集群,
(leader 发给 集群,没有收到响应,重新退回候选,选出新leader后在进行 处理请求)
(leader发送给集群,收到响应提交了,但是集群没收到提交包,leader又为候选,重选leader)
(leader发送给集群,收到响应提交了,但是集群只有少部分收到提交包,leader又为候选,重选leader)
“abc”,”ab”
root(pass = 2 , end = 0)
a (pass=2,end =0)
b(pass=2 ,end = 1)
c(pass = 1,end = 1)
1 | package trie; |
1 |
|
O(N^2)的常数项 可以很低
O (N*logN ) 常数一般比较高
所以 O (N*logN )算法和 O(N^2)算法可以一起用
1 | package heap; |
先解决小问题排序,然后解决大问题排序
1 | package merger; |
1 |
|
再SpringBoot里面对SpringSecurity做了很好的集成
1 | org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\ |
1 | @Configuration(proxyBeanMethods = false) |
配置类
1 |
|
配置类
1 |
|
1 | If there is a bean of type WebSecurityConfigurerAdapter, this adds the {@link EnableWebSecurity @EnableWebSecurity} annotation. This will make sure that the annotation is present with default security auto-configuration and also if the user adds custom security and forgets to add the annotation. If {@link EnableWebSecurity @EnableWebSecurity} has already been added or if a bean with name {@value BeanIds#SPRING_SECURITY_FILTER_CHAIN} has been configured by the user, this will back-off. |
1 |
|
1 | /* |
1 | @Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME) |
1 |
|
1 | @Configuration(proxyBeanMethods = false) |
1 | public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware { |
1 |
|
1 | final class OAuth2ImportSelector implements ImportSelector { |
1 | @Configuration(proxyBeanMethods = false) |
1 | @Configuration(proxyBeanMethods = false) |
1 |
|
1 |
|
1 |
|
1 | @Autowired(required = false) |
1 |
|
1 | public final class WebSecurity extends |
1 | protected Filter performBuild() throws Exception { |
会发现使用了一层代理FilterChainProxy
1 | @Override |
1 |
|
Jwt Java web token
单点登录 Single sign on
OAuth 再客户端 与服务器提供商之间 ,设置了一个授权层(authorization layer),客户端不能直接登录 服务提供商,只能登录授权层,已此将用户与客户端区分开来,客户端登录授权所用令牌(token),与用户密码不同,用户可以再登录的时候,指定授权层令牌范围和有效期
Spring Social
Spring Session
JWT
别人系统鉴权时使用
权限认证
伪装请求
token,权限认证
就是普通用户式的流量攻击
跨站点脚本攻击
攻击安全与防御
1 | <dependency> |
1 |
|
MD5,cpu太快 可以暴力破解
MD5(明文+加盐)
MD5(明文+随机盐)
MD5 (MD5+真随机数)
有几种情况:
第一次握手,但是不响应服务端,资源占用
三次握手完成,但是不想服务端发送任何数据,使得连接保持
防:连接占用后,指定时间内没收到信息,取消连接
tcp协议,判断客户端发出第一次握手后,指定时间没有收到客户端第二次响应,于是断开
Shiro是java的一个安全框架,目前,使用Apache Shiro的人越来越多,因为他相当简单,对比Spring Security,可能没有Spring Security强大,但是实际工作中不需要那么复杂的东西,所以使用小而简单的Shiro就足够了
Authentication ,Authorization
Session Manager , Cryptography
Web Support,caching
concurrency ,testing,run as ,Remenber me
Realm :域,Shiro从Realm获取安全数据(用户,角色,权限),就是说SecurityManager要验证用户身份,那么需要从realm获取对应的用户进行比较,可以把realm看成DataSource,安全数据源
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true