小米运维开发工程师0903复习资料

目录

一、redis部分(基于redis+mysql+gearmand项目)

1.redis在公司还是实验室?讲一下redis项目?redis的数据结构?redis的key用的什么字段?redis的数据与mysql数据的映射(mysql数据修改如何映射到redis)?gearman的逻辑?

2.如何触发同步?create会触发吗?

3.除update还能如何触发同步?

4.mysql表结构的更新会对key-value造成影响吗?

5.mysql的部署方式?

6.redis的部署?

7.redis高可用?

8.看过redis的配置文件吗?

9.redis的数据访问协议?用的什么客户端?

10.二进制传输为什么安全?

11.string数据类型的数据结构?如何把它放入redis中?

12.key-value往redis写的协议

13.测试系统流量跑到多高?平台访问量有多少?redis对mysql的优势体现?

14.mysql与redis的对比

15.redis优缺点

16、Redis的内存淘汰策略

18.redis持久化

1)什么是Redis持久化?

2)Redis 的持久化机制是什么?各自的优缺点?

3)如何选择合适的持久化方式

4)Redis持久化数据和缓存怎么做扩容?

二、memcache部分

1.tomcat+nginx+jdk+memcache项目介绍

项目背景

项目目的

实验环境

项目流程

项目中插件简介

2.cookie与session的区别

3.memcache与redis的相似点与区别

4.memcache高可用

三、CMDB项目

1.项目介绍

项目目的:

项目步骤:

项目中遇到的难点:

1.sqlite与mysql的区别

2.简述django请求的生命周期?

3.Django 、Flask、Tornado的对比及为什么使用Django

4.ORM是什么?优势?

5.简述什么是FBV和CBV

四、ansible自动化部署负载均衡高可用集群



一、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的配置文件吗?

https://blog.csdn.net/cristianoxm/article/details/105694128?biz_id=102&utm_term=redis%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-105694128&spm=1018.2118.3001.4187



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参数来定义快照的周期。

img

优点:

  • 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恢复。

img

优点:

  • 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项目介绍

项目背景

在交易类的电子商务网站,需要有购物车记录用户的购买信息,用户每次购买请求都是向购物车中增加商品;在社交类的网站中,需要记录用户的当前登录状态、最新发布的消息及好友状态等, 用户每次刷新页面都需要更新这些信息。而基于 nginx+tomcat+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自动化部署负载均衡高可用集群

ansible 自动化构建系统负载均衡高可用架构
 
项目描述 随着企业信息化的不断发展,需要面对越来越复杂的业务和越来越多样化的用户需求,自动
化运维工具 ansible 通过自动化运维能最大限度地在更少的维修时间内实现运维目标,提高运维服务质
量。
 
我的职责: 项目通过为各项服务建立 Ansible roles,实现层次化、结构化地组织 Playbook。建立 Haproxy 角色负载均衡调度后端真实 Nginx 服务器,Keepalived 角色实现系统调度器的高可用。整个 构建过程拆分为如下过程:
 
1. Ansible 角色初始化:生成各服务角色的层级目录文件,如 tasks,vars,handlers 等。
2. 功能实现:各角色任务(tasks)文件实现服务的安装,templates 存放服务配置文件,handlers 实现
服务的触发重启,vars 实现服务配置的差异性,如 keepalived 服务参数配置。
3. 服务的远程推送:远程主机执行脚本实现服务的自动部署, Keepalived 实现在两台 Haproxy 之间
切换,后端 Nginx 服务器处理调度器发来的请求。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值