session工作流程,寻找cookie中的session id。根据session id去服务器内存中找到相应的用户资料。如果没有找到则新建,根据资料来判断用户访问的状态。
一般通过redis集群来同步seesion,解决负载均衡指向不同服务器的情况。
session与cookie的区别:
- 1、存放位置不同
Cookie保存在客户端,Session保存在服务端。
- 2 、存取方式的不同
Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。
而Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。
- 3、安全性(隐私策略)的不同
Cookie存储在浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。而Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。而假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。
+ 4、有效期上的不同只需要设置Cookie的过期时间属性为一个很大很大的数字,Cookie就可以在浏览器保存很长时间。 由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了浏览器(一次会话结束),该Session就会失效。
+ 5、对服务器造成的压力不同Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。而Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。
+ 6、 跨域支持上的不同Cookie支持跨域名访问,例如将domain属性设置为“.baidu.com”,则以“.baidu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中。而Session则不会支持跨域名访问。Session仅在他所在的域名内有效。
rm -rf避免
- 方法一:校验rm中使用的变量
提醒一下,在shell脚本中使用到rm命令并且rm命令的参数中有带有变量时,需要特别注意变量名是否与上面声明的保持一致,还有一种做法就是:在引用变量的时候使用下面的方法,可以确保变量不会为空。
比如上面的DIRPATH变量,在引用此变量作为rm的参数的时候,使用如下方式:
rm -rf ${DIRPATH:-default}/bin/
${DIRPATH:-default}:表示如果变量DIRPATH没有被声明或者已经声明,但是赋值为空,那么就使用默认值default,否则就使用DIRPATH初始化的值 - 方法二:回收站,在重定向rm命令
- 方法三:改用safe-rm命令,在配置文件中配置不会被删除的路径
K8S容灾及高可用
【安全版本】
Kubernetes v1.13.12
Kubernetes v1.14.8
Kubernetes v1.15.5
Kubernetes v1.16.2
- k8s中需要高可用的组件(包括内置已实现的)以及实现方式?
https://www.cnblogs.com/ants/p/11489598.html#_labelTop
http://press.demo.kuboard.cn/install/install-kubernetes.html- SLB(LVS+HAProxy)
- etcd集群
为什么需要3台物理机以上?
主要是考虑到了etcd的问题,如果只有两台物理机部署了5个etcd节点,那么部署了3个etcd的那台物理机故障了,则不满足etcd失败容忍度而导致etcd集群宕机,从而导致k8s集群宕机 - K8S Node (Master / Worker)
三个 master 组成主节点集群,通过内网 loader balancer 实现负载均衡;至少需要三个 master 节点才可组成高可用集群,否则会出现 脑裂 现象
多个 worker 组成工作节点集群,通过外网 loader balancer 实现负载均衡
- k8s中需要常期备份的组件及文件,容灾恢复?
答:- etcd定义及作用:
基于GO开发的高可用的分布式键值(key-value)数据库,用于服务发现(即在同一个分布式集群中的进程或服务如何才能找到对方并建立连接),实现分布式系统数据的可用性和一致性。
优点:1.支持SSL证书验证,2.提供HTTP API。
备份方法:通kind: CronJob,挂载/var/lib/etcd,执行etcdctl备份命令。
恢复:移除损坏的/var/lib/etcd,docker镜像任务挂载/var/lib/etcd,执行etcdctl恢复命令【待恢复的机器上,机器名称和ip地址需要与崩溃前的主节点配置完成一样】。 - 用户主目录下.kube/config文件(kubectl连接认证)
- 【2】/etc/kubernetes/目录下的所有文件(证书,manifest文件)
- 【3】/var/lib/kubelet/目录下所有文件(plugins容器连接认证)
(2),(3)可通过CronJob进行每日备份,tar。 - 恢复步骤:
- kubeadm reset,iptables等
- 恢复etcd数据
- 删除/etc/kubernetes/manifest/目录下的文件,及/var/lib/kubelet/pki/目录下的文件
- 还原【2】【3】
- kubeadm init
- 还原./kube/config,执行命令测试。
- etcd定义及作用:
- k8s-master集群有哪些组件
- apiserver:一个api服务器,所有外部与k8s集群的交互都需要经过它。(可水平扩展)
- controller-manager:执行控制器逻辑(循环通过apiserver监控集群状态做出相应的处理)(一个master集群中只会有一个节点处于激活状态)
- scheduler:将pod调度到具体的节点上(一个master集群中只会有一个节点处于激活状态)
python:魔术方法
- 构造函数,析构函数
__init__,__del__,__new__:
__new__:是用来创建类并返回这个类的实例
__init__:将传入的参数来初始化该实例。
__del__:对象生命周期结束时调用。
- 对象的字符串显示
__str__,__repr__
__str__:print(类)
__repr__:如果没有__str__,则自动调用__repr__
- format魔术方法
__format__:format(类名时)自动调用__format__
"Name:{b.name}, State:{b.state}, Author:{b.author}".format(b=b)
- 类的切片操作
__getitem__:如-类['column'],通过字典的方式获取类属性
__setitem__:修改类属性
__delitem__:删除类属性
- 重复与连接及成员操作符
__add__:类的相加,如-使用哪个属性
__mul__:类的相乘,如-使用哪个属性
__contains__:'something' in Class,返回布尔值。用in来判断类是否包含某属性。
__iter__:类的for,for i in Class,指定迭代属性。
python深拷贝和浅拷贝
- 模块
import copy
浅拷贝: copy.copy
深拷贝: copy.deepcopy
- 定义
直接赋值: 其实就是对象的引用(别名),赋值的两边指向的是同一个对象
浅拷贝(copy): 拷贝父对象,不会拷贝对象的内部的子对象
深拷贝(deepcopy):拷贝父对象,同时会开辟空间,逐层拷贝内部子对象
- 代码解释
浅拷贝
>>>import copy
>>>a = [1,2,3,4,['a','b']]
>>>b = copy.copy(a)
>>>a,b
([1,2,3,4,['a','b']],[1,2,3,4,['a','b']])
>>>a.append(5)
>>>a,b
([1,2,3,4,['a','b'],5],[1,2,3,4,['a','b']])
可以看到a新增了元素5,而浅拷贝的b未新增元素
>>>a[4].append('c')
>>>a,b
([1,2,3,4,['a','b','c'],5],[1,2,3,4,['a','b','c']])
可以看到原对象修改已有元素,也会同时影响浅拷贝对象
#####################################################
深拷贝
>>>import copy
>>>a = [1,2,3,4,['a','b']]
>>>c = copy.deepcopy(a)
>>>a.append(5)
>>>a[4].append('c')
>>>a,c
([1,2,3,4,['a','b','c'],5],[1,2,3,4,['a','b']])
可以看到深拷贝对象未受影响
#####################################################
>>>a = [1,2,3,4,['a','b']]
>>>b = a
>>>b.append(5)
>>>b[4].append('c')
a,b
([1,2,3,4,['a','b','c'],5],[1,2,3,4,['a','b','c'],5])
可以看到赋值,两个变量相同。即简单的拷贝对象的引用,两个对象的id相同
- 总结
- 1.赋值: 简单的拷贝对象的引用,两个对象的id相同
- 2.浅拷贝: 创建一个新的对象,这个心的对象与原对象共享内存中的子对象
- 3.深拷贝: 创建一个新的组合对象,和原来的对象空间是独立的.新的组合对象和原对象,没有任何的关联.
虽然实际上会共享不可变的子对象,但是不影响它们的相互独立性
zookeeper集群选举机制
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!