目录
一、redis部分(基于redis+mysql+gearmand项目)
4.mysql表结构的更新会对key-value造成影响吗?
11.string数据类型的数据结构?如何把它放入redis中?
13.测试系统流量跑到多高?平台访问量有多少?redis对mysql的优势体现?
1.tomcat+nginx+jdk+memcache项目介绍
3.Django 、Flask、Tornado的对比及为什么使用Django
一、redis部分(基于redis+mysql+gearmand项目)
1.redis在公司还是实验室?讲一下redis项目?redis的数据结构?redis的key用的什么字段?redis的数据与mysql数据的映射(mysql数据修改如何映射到redis)?gearman的逻辑?
1)redis+mysql+gearmand项目原理:
用redis给mysql做前端缓存,并在mysql更新时用触发器与gearmand同步至redis
server1(job):安装nginx+php+gearmand 配置php测试页面
server2:部署redis
server3(workers):部署mysql与gearman-mysql-udf
注册udf函数插件及指定gearman服务器
定义触发器
客户端通过nginx和php访问后端数据库时,先在redis这个数据库缓存中查找,看是否含有想要的数据,如果没有就去后端数据库查找,将查找到数据返回给客户端一份,另外在redis中缓存一份。下次如果访问相同的数据就直接去redis,缩短时间同时也减轻数据库的查找压力
2)redis数据结构为string
3)key为字符串
4) redis与mysql的数据映射:
mysql的变更触发了触发器 trigger ,然后 json_map插件将变更的数据格式化为json格式便于处理,然后找到 mysql 的 gearman 和 udf 的插件 ,然后找到 gearman(job-server / server1)。 job-server 将任务分发给 worker。worker 与 php-gearman 和 php-redis 通信,将数据同步到server2上的 redis,redis 再发送到客户端,同时同步到本地缓存。
5)gman的逻辑
客户端程序把请求提交给gearmand,gearmand会把请求转发给合适的worker来处理这个请求,最后还通过gearmand返回结果。
2.如何触发同步?create会触发吗?
create不会触发 update可以
3.除update还能如何触发同步?
4.mysql表结构的更新会对key-value造成影响吗?
5.mysql的部署方式?
1)安装mariadb-devel
2)编译用户自定义函数并拷贝到数据库的默认插件目录中
3)注册udf函数,创建一个json对象,把数据全部映射为json格式,因为json格式可读性强
4)注册udf函数插件及指定gearman服务器
5)定义触发器
6.redis的部署?
单实例
源码编译,安装gcc,编辑配置文件
检查配置文件不为slave 并清除数据避免影响
7.redis高可用?
哨兵模式
Redis Sentinel是Redis官方的高可用性解决方案。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
8.看过redis的配置文件吗?
9.redis的数据访问协议?用的什么客户端?
RESP协议是二进制安全的,并且不需要处理从一个进程传输到另一个进程的块数据的大小,因为它使用前缀长度(prefixed-length)的方式来传输块数据的。
10.二进制传输为什么安全?
“二进制安全”就是说你传给我的数据的二进制是什么样,存在我这里的就是什么样,只要传给到我,我肯定保证它在这里是不会被篡改的。(我不会对这些数据进行再编码,再序列化)。
Redis 用二进制安全的好处:存和取都按字节数组来,在这里没有类型,不会变化存储的数据,不会有溢出和覆盖,不会有乱码问题。
11.string数据类型的数据结构?如何把它放入redis中?
12.key-value往redis写的协议
13.测试系统流量跑到多高?平台访问量有多少?redis对mysql的优势体现?
压测
14.mysql与redis的对比
Redis
基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,而内存成本较高;
MySQL
基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高;
mysql+redis的优势:
MySQL做为主存储,Redis用于缓存,加快访问速度,提高访问效率。需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。
15.redis优缺点
优点
- 读写性能优异, Redis能读的速度是110000次/s,写的速度是81000次/s。
- 支持数据持久化,支持AOF和RDB两种持久化方式。
- 支持事务,Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行。
- 数据结构丰富,除了支持string类型的value外还支持hash、set、zset、list等数据结构。
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
缺点
- 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
- Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
- Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
16、Redis的内存淘汰策略
Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
全局的键空间选择性移除
- noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
- allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这个是最常用的)
- allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。
设置过期时间的键空间选择性移除
- volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
- volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
- volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
总结
Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。
18.redis持久化
1)什么是Redis持久化?
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
2)Redis 的持久化机制是什么?各自的优缺点?
Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:
RDB:是Redis DataBase缩写快照
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
优点:
- 1、只有一个文件 dump.rdb,方便持久化。
- 2、容灾性好,一个文件可以保存到安全的磁盘。
- 3、性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
- 4.相对于数据集大时,比 AOF 的启动效率更高。
缺点:
- 1、数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
- 2、AOF(Append-only file)持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储)保存为 aof 文件。
AOF:持久化
AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
优点:
- 1、数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次 命令操作就记录到 aof 文件中一次。
- 2、通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。
- 3、AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点:
- 1、AOF 文件比 RDB 文件大,且恢复速度慢。
- 2、数据集大的时候,比 rdb 启动效率低。
AOF与RDB的对比
- AOF文件比RDB更新频率高,优先使用AOF还原数据。
- AOF比RDB更安全也更大
- RDB性能比AOF好
- 如果两个都配了优先加载AOF
3)如何选择合适的持久化方式
-
一般来说, 如果想达到足以媲美PostgreSQL的数据安全性,你应该同时使用两种持久化功能。在这种情况下,当 Redis 重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
-
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。
-
有很多用户都只使用AOF持久化,但并不推荐这种方式,因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外,使用RDB还可以避免AOF程序的bug。
-
如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。
4)Redis持久化数据和缓存怎么做扩容?
-
如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
-
如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。
二、memcache部分
1.tomcat+nginx+jdk+memcache项目介绍
项目背景
项目目的
同一客户端访问业务网站,经过调度器负载调度到达后端,不管选择的是那个后端,session ID都不变,都保存在两台或多台的memcached缓存中(负载冗余);以保持会话;客户端请求时nginx通过负载调度算法将请求调度至某一后端服务器;并把session存储到两台memcached中;客户端刷新(不换浏览器)时,请求换成另一个后端服务器响应时session ID保持不变;
实验环境
server1:nginx调度器
server2、server3:安装tomcat、jdk,编写test.jsp
项目流程
1.环境:server1:nginx server2 : tomcat 实验完添加server3:tomcat
编写test.jsp实现用户登录信息页面。使得nginx将对jsp的访问代理至后端tomcat,只开启一个tomcat时,产生的数据会保存到本地。再实现nginx+tomcat负载均衡。
问题:当开启两个tomcat时,由于在负载均衡状态,受到nginx的调度,server2端提交数据后直接跳到了server3,与之前的建立的session断开了,再次回来数据就不存在了。
2.重新编译nginx,加入sticky模块,避免请求来回跳,信息丢失。此时只要访问的server2不挂,数据会一直保存。
问题:如果server2的tomcat挂掉,那么server2上的数据依然会丢失,因此我们需要memcache的加入实现session交叉存放,就是将访问server2中的tomcat上的数据存放在sever3中的memcache去,将访问server3中tomcat上的数据存放在server2中。
3.serve2、server3配置session管理器,将tomcat/conf/context.xml,n1改为n2,即将2中的缓存存至3中,反之亦然。开启memcache,并重启tomcat,此时多次登录仍会保存之前的登录信息,且当一个服务端挂掉时,另一个服务端会接管并保存之前的登录信息在页面中。
项目中插件简介
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。
2.cookie与session的区别
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。
3.memcache与redis的相似点与区别
Redis 和 Memcache 都是基于内存的数据存储系统。Memcached是高性能分布式内存缓存服务;Redis是一个开源的key-value存储系统。memcache通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 应用的速度、提高可扩展性。
以下为区别
1)数据操作不同。
Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能。Redis支持服务器端的数据操作相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,支持list、set、sorted set、hash等众多数据结构,还同时提供了持久化和复制等功能。
2)内存管理机制不同。
在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以保持超过其机器本身内存大小的数据。
而Memcached默认使用Slab Allocation机制管理内存,其主要思想是按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。
3)存储数据安全性不同
memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化),数据丢失后可以通过aof恢复;
4)集群管理不同
Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。
Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储。
5)应用场景不同
Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
4.memcache高可用
2015:使用magent代理
出现故障:使用Magent代理Memcache节点出现故障恢复导致缓存返回为空,即当master挂了之后再次启动就会把用户踢出去,也就是sesson miss。
2018:Repcached
全称replication cached,日本人高可用技术,简称复制缓冲区技术。
使用场景:它是一个单Master单Slave的方案,但它的Master和Slave都是可读可写的,而且可以相互同步,并且Master和Slave会自动切换(主变从,从变主自由切换)。如果Master宕机,Slave侦测到连接断了,它会自动Listen而成为Master,而如果Slave坏掉,Master也会侦测到连接断了,它就会重新等待新的Slave加入。
优点:
1)能够实现memcached节点冗余备份
2)主从之间可以互相读写
缺点:
1)只支持一主一从备份,单对单
2)冗余备份,占用内存较多
三、CMDB项目
1.项目介绍
项目目的:
当用户发起HTTP请求时, Django的采集接口将HTTP请求的头部信息headers里面的IP和UA信息采集,并存储到数据库中。 当用户想要访问采集数据时, 从数据库中读取,以界面的方式展示给用户。
基于Django框架实现Web形式的自动化运维系统, 远程控制服务器, 提高运维工程师的工作质量和效率。
项目步骤:
1.配置settings.py 定义数据库的信息(配置mysql数据库,其中数据库名字,用户密码,其中都需要提前主机中创建好)
2.models.py定义数据库的结构并生成迁移脚本并写入数据库:
内容包括主机ip地址、mac地址、操作系统信息等等,并定义各个数据类型的数据格式。
命令:
python3 manage.py makemigrations
python3 manage.py migrate
3.建立admin.py管理登录用户
4.建立views.py(保存函数或者类的视图文件)完成视图层的创建:
nmap扫描存活主机;
telnetlib判断ssh服务是否开启,即是否为linux服务器;
paramiko实现远程登录。
5.前端html文件配置
6.路由文件配置(主路由调用admin,子路由调用views)
项目中遇到的难点:
1.Linux中使用mysql需要mysqlclient模块,需安装mysql-devel这个依赖项才可使用。
SQLITE功能简约,小型化,追求最大磁盘效率;MYSQL功能全面,综合化,追求最大并发效率。如果只是单机上用的,数据量不是很大,需要方便移植或者需要频繁读/写磁盘文件的话,就用SQLite比较合适;如果是要满足多用户同时访问,或者是网站访问量比较大是使用MYSQL比较合适。
2.各个模块的探索,以及,views编写的困难,utils的分离
1.sqlite与mysql的区别
性能方面
SQLITE是单机数据库。功能简约,小型化,追求最大磁盘效率
MYSQL是完善的服务器数据库。功能全面,综合化,追求最大并发效率
安全方面
SQLite没有内置的身份验证机制,任何人都可以访问数据库文件。但是,MySQL带有许多内置的安全功能。这包括使用用户名,密码和SSH进行身份验证。
2.简述django请求的生命周期?
(1)用户输入网址,浏览器发起请求
(2)WSGI(服务器网关接口)创建socket服务端,接受请求
(3)中间件处理请求
(4)url路由,根据当前请求的url找到相应的视图函数
(5)进入view,进行业务处理,执行类或者函数,返回字符串
(6)再次通过中间件处理相应
(7)WSGI返回响应
(8)浏览器渲染
3.Django 、Flask、Tornado的对比及为什么使用Django
Django:python界最全能的web开发框架,各种功能完善,可维护性金和开发速度一级棒。
Flas:微框架的典范,号称python代码写得最好的项目之一。flask灵活。
Tornado:天生异步,性能强悍,诸多的功能需要自己完善。
1.Django走的是大而全的方向,开发效率高。它的MTV框架,自带的ORM,admin后台管理,自带的sqlit数据库
和开发测试用的服务器给开发者提供了
超高的开发效率
2.Flask是轻量级的框架,自由,灵活,可扩展性很强,核心基于Werkzeug WSGI工具和jinja2模板引擎
3.Tornado走的是少而精的方向,性能优越。它最出名的是异步非阻塞的设计方式
4.ORM是什么?优势?
什么是ORM:
ORM(Object-relational mapping),中文翻译为对象关系映射,是一种为了解决面向对象与关系数据库
存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中
的对象自动持久化到关系数据库中。
优势:
1)orm的技术特点,提高了开发效,可以自动对实体Entity对象与数据库中的Table进行字段与属性的映射;
2) 不用直接SQL编码,能够像操作对象一样从数据库中获取数据
5.简述什么是FBV和CBV
FBV和CBV本质是一样的
基于函数的视图叫做FBV,基于类的视图叫做CBV
在python中使用CBV的优点:
1)提高了代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
2)可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性
四、ansible自动化部署负载均衡高可用集群