发表于: 2018-04-25 16:08:39

1 686


今天完成的事:

任务六总结与深度思考

1.为什么要使用memcache?memcashe有什么作用?

memcache是一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。


MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。


这里也说一下Redis:Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。


Redis与Memcached的区别:

1.由于Redis只使用单核,而Memcached可以使用多核

2. redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化.而memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

3.redis在数据支持上要比memecache多的多,Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。



2.什么是负载均衡,为什么要做负载均衡?

随着 Internet 的快速发展和业务量的不断提高,基于网络的数据访问流量迅速增长,特别是对数据 中心、大型企业以及门户网站等的访问,其访问流量甚至达到了 10Gb/s 的级别;同时,服务器网 站借助 HTTP、FTP、SMTP 等应用程序,为访问者提供了越来越丰富的内容和信息,服务器逐渐 被数据淹没;另外,大部分网站(尤其电子商务等网站)都需要提供不间断 24 小时服务,任何服 务中断或通信中的关键数据丢失都会造成直接的商业损失。所有这些都对应用服务提出了高性能和 高可靠性的需求。 但是,相对于网络技术的发展,服务器处理速度和内存访问速度的增长却远远低于网络带宽和应用 服务的增长,网络带宽增长的同时带来的用户数量的增长,也使得服务器资源消耗严重,因而服务 器成为了网络瓶颈。传统的单机模式,也往往成为网络故障点。

由此就产生了 组建服务器集群,利用负载均衡技术在服务器集群间进行业务均衡。


负载均衡原理:

系统的扩展可分为纵向(垂直)扩展和横向(水平)扩展。纵向扩展,是从单机的角度通过增加硬件处理能力,比如CPU处理能力,内存容量,磁盘等方面,实现服务器处理能力的提升,不能满足大型分布式系统(网站),大流量,高并发,海量数据的问题。因此需要采用横向扩展的方式,通过添加机器来满足大型网站服务的处理能力。比如:一台机器不能满足,则增加两台或者多台机器,共同承担访问压力。这就是典型的集群和负载均衡架构:如下图:


应用集群:将同一应用部署到多台机器上,组成处理集群,接收负载均衡设备分发的请求,进行处理,并返回相应数据。

负载均衡设备:将用户访问的请求,根据负载均衡算法,分发到集群中的一台处理服务器。(一种把网络请求分散到一个服务器集群中的可用服务器上去的设备)

负载均衡的作用:

1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);

2.提供故障转移,实现高可用;

3.通过添加或减少服务器数量,提供网站伸缩性(扩展性);

4.安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)


3.nginx如何实现负载均衡?

nginx负载均衡原理:单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机而某台服务器闲置的情况。那么负载均衡的前提就是要有多台服务器才能实现,也就是两台以上即可。Nginx像是一个中转站,在形式上省略了客户端输入端口,而他在帮我们填入端口号时会选择不同的端口号,只要你有设置,就像一个一个中转站帮我们转入地址。


nginx是通过upstream模块来进行负载均衡。upstream具有数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx摆脱只能为终端节点提供单一功能的限制,而使它具备了网路应用级别的拆分、封装和整合的战略功能。


负载衡方法:

nginx支持以下负载均衡机制(或者方法):

  • round-robin/轮询: 到应用服务器的请求以round-robin/轮询的方式被分发
  • least-connected/最少连接:下一个请求将被分派到活动连接数量最少的服务器
  • ip-hash/IP散列: 使用hash算法来决定下一个请求要选择哪个服务器(基于客户端IP地址)


默认是round-robin/轮询负载均衡设置:

http {

    upstream myapp1 {

        server srv1.example.com;

        server srv2.example.com;

        server srv3.example.com;

    }

    server {

        listen 80;

        location / {

            proxy_pass http://myapp1;

        }

    }

}


最少连接负载均衡:

另一个负载均衡方式是least-connected/最少连接。当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。

使用最少连接负载均衡时,nginx试图尽量不给已经很忙的应用服务器增加过度的请求, 而是分配新请求到不是那么忙的服务器实例。

nginx中通过在服务器集群配置中使用least_conn指令来激活最少连接负载均衡方法

upstream myapp1 {

    least_conn;

    server srv1.example.com;

    server srv2.example.com;

    server srv3.example.com;

}


会话持久化(ip-hash):

在轮询和最少连接负载均衡方法中,每个客户端的后续请求被分派到不同的服务器。对于同一个客户端没有任何方式保证发送给同一个服务器。

如果需要将一个客户端绑定给某个特定的应用服务器——用另一句话说,将客户端会话"沾住"或者"持久化",以便总是能选择特定服务器——,那么可以使用ip-hash负载均衡机制。

使用ip-hash时,客户端IP地址作为hash key使用,用来决策选择服务器集群中的哪个服务器来处理这个客户端的请求。这个方法保证从同一个客户端发起的请求总是定向到同一台服务器,除非服务器不可用。

要配置使用ip-hash负载均衡,只要在服务器集群配置中使用ip_hash指令:

upstream myapp1 {

    ip_hash;

    server srv1.example.com;

    server srv2.example.com;

    server srv3.example.com;

}


健康检查:

nginx中的反向代理实现包含in-band/带内(或者说被动)的服务器健康检查。如果某台服务器响应失败,nginx将标记这台服务器为"失败",之后的一段时间将尽量避免选择这台服务器来处理后续请求。

max_fails 指令设置在fail_timeout时间内和服务器通讯连续不成功尝试的数量。默认,max_fails设置为0.如果设置为0, 则关闭这台服务器的健康检查。fail_timeout参数同样也定义了服务器被标记为"失败"的时间长度。

在服务器失败之后的fail_timeout间隔时间后, nginx会开始温和的用来自实际客户端的请求来探测服务器。如果探测成功, 服务器将被标记是存活。


java任务六总结:


任务名称:Java=task1

成果连接:

      github地址:https://github.com/IT-xzy/Task/tree/master/Java/duanwenkai/Task6

任务耗时:共耗时11天。

官方技能脑图


自己的技能脑图:


任务六知识点:

JMeter:JMeter是基于Java的压力测试工具,用于对软件做压力测试。(压测这里我做的不是很好,与师兄的并发相差较大)

Memcached、Redis缓存:缓存在上面介绍的很详细了(什么是缓存、为什么使用缓存)

Nginx动静分离:将静态文件存放到Nginx上,动态文件与程序放在web服务器上。


任务六主要学习了缓存的知识:Mmcached与redis(这里使用的是Spring对redis的封装),了解了开发中为什么使用缓存技术和怎样使用缓存。也对软件测试有了简单的了解。






返回列表 返回列表
评论

    分享到