发表于: 2017-10-19 22:55:15
1 715
一.今日完成
1.整理memcached相关知识点
(1)许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。memcached是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。
(2)关于memcached的内存存储,删除机制,分布式算法以及应用等可以参见memcached全面剖析 (http://tech.idv2.com/2008/08/17/memcached-pdf/).
整合Spring,使用java连接memcache服务器的实现昨天的日报里已经做了说明.
2.学习nginx的负载均衡实现
(1)nginx常用负载均衡算法:
轮询(默认算法)——每个请求会依次分配给后端不同的应用程序服务器,不理会后端服务器的实际压力
加权轮询——权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况
IP HASH——当同IP进行重复访问时会被指定到上次访问到的服务器,可以解决动态网站SESSION共享问题
(2)upstream模块常用参数说明:
server 192.168.0.100:80 | 负载均衡后端RealServer的IP或者域名,端口不写的话默认为80。高并发场景用域名,再通过DNS进行负载均衡 |
weight=5 | 权重,默认为1,权重越大接收的请求越多 |
max_fails=2 | 最大尝试的失败次数,默认为1,0表示禁止失败尝试 |
fail_timeout=10s | 失败超时时间,默认是10秒,通常3s左右比较合适 |
backup | 热备配置,前段RealServer出现问题后会自动上线backup服务器 |
down | 标志服务器不可用,这个参数通常配合IP_HASH使用 |
(3)Nginx负载均衡设置:
1)默认的负载均衡配置
http { #upstream模块包含在http模块下
upstream linuxidc{ #定义upstream名字,下面会引用
server 192.168.1.100; #指定后端服务器地址
server 192.168.1.110; #指定后端服务器地址
server 192.168.1.120; #指定后端服务器地址
}
server {
listen 80;
server name www.jnshujavatask.com;
location / {
proxy_pass http://39.108.61.3; #引用upstream
}
}
}
2)加权负载均衡
http {
upstream linuxidc{
server 192.168.1.100 weight=3; #指定后端服务器地址,权重为3
server 192.168.1.110;
}
server {
listen 80;
server name www.jnshujavatask.com;
location / {
proxy_pass http://39.108.61.3;
}
}
}
在上面配置中,每3个请求分配给192.168.1.100,然后第4个请求会分配给192.168.1.110,如此循环下去。
3)IP HASH负载均衡
upstream linuxidc {
ip_hash; #采用IP HASH算法
server 192.168.1.100;
server 192.168.1.110;
server 192.168.1.120;
}
如果需要将客户与后端一台服务器“绑定”起来,可以使用ip-hash负载平衡机制,确保来自相同客户机的请求总是指向相同的服务器除非该服务器不可用。
(4)Nginx高可用的实现
1)利用backup标签,可以实现高可用,当主服务挂掉后,backup服务器会自动接管服务,当主服务恢复后,backup也会自动放弃服务.
http {
upstream linuxidc{
server 192.168.1.100
server 192.168.1.110 backup;
}
server {
listen 80;
server name www.jnshujavatask.com;
location / {
proxy_pass http://39.108.61.3;
}
}
}
Nginx的upstream模块相当于是建立一个函数库一样,把后端的服务器地址放在了一个池子里,而proxy模块则是从这个池子里调用了这些服务器。
2)http_proxy_module模块常用参数:
proxy_set_header
让后端服务器能获取到前端用户真实IP,而不只是代理服务器的IP;
proxy_set_header Host $host;
当后端服务器配置多个web站点时,该选项可以让服务器识别出具体要访问的是哪个站点,而不会将第一个站点作为默认站点传递给用户.
proxy_set_header X-Forwarded-For $remote_addr;
如果后端服务器需要获取用户的真实IP,需要该选项
client_body_buffer_size;
客户端请求主体缓冲区大小
proxy_connect_timeout;
代理服务器和后端真实服务器握手连接超时时间
proxy_send_timeout;
后端服务器回传数据给Nginx的时间,需要在设置的时间范围内发送完所有数据,否则Nginx将断开连接
proxy_read_timeout;
代理服务器和后端服务器连接成功后,等待后端服务器响应时间
参考资料:http://www.linuxidc.com/Linux/2016-04/130350.htm
3.把连接池的概念进行梳理
(1)数据库连接池是Connection对象的工厂,常用参数如下:
Ø 数据库的初始连接数
Ø 连接池的最大连接数
Ø 连接池的最小连接数
Ø 连接池每次增加的容量
(2)DataSource通常被称为数据源,包含连接池和连接池管理.
(1)DBCP数据源
i. commons-dbcp.jar: 连接池的实现
ii. commons-pool.jar 连接池实现的依赖库
(2)C3P0数据源
c3p0-0.9.1.2.jar 连接池的实现
不仅可以自动清理不再使用的Connection,还可以自动清理Statement和ResultSet,性能更加优秀.
4.学习SLF4J相关知识点
1)SLF4J(Simple logging Facade for Java)不是一个真正的日志实现,而是一个抽象层( abstraction layer),允许在后台使用任意一个日志类库。
2)占位符(place holder),在代码中表示为“{}”的特性。类似于在String的format()方法中的%s,{}在运行时被某个提供的实际字符串所替换。不仅降低了代码中字符串连接次数,而且还避免了重复新建的String对象.
logf4实现:
if (logger.isDebugEnabled()) {
logger.debug("Processing trade with id: " + id + " symbol: " + symbol);
}
SLF4J的实现:
logger.debug("Processing trade with id: {} and symbol : {} ", id, symbol);
2)为了使用SLF4J,不仅需要包含SLF4J的API jar包,还需要相关Jar包,这取决于使用的日志类库。Log4J 2与SLF4J配合使用,还另外需要引入依赖:
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
二.明日计划
1.在任务代码中调用memcached,集合nginx,进行测试;
2.继续学习redis的使用.
三.遇到问题
暂无.
四.收获
以上.
评论