一:redis介绍
redis数据库:是一个非关系型数据库。是一个开源的使用C语言编写支持网络,可基于内存可持久化得日志型的数据库。为了保证效率,数据都是缓存在内存中。
redis服务器程序是单进程模型,可以在一台服务器上同时启动多个redis进程,实际处理速度完全依靠主进程的执行效率。
那么我们先了解一下关系型数据库与非关系型数据库。
(1)关系型数据库:是一个结构化的数据库,创建在关系模型基础上,一般面向记录。它借助于集合代数等数学概念来处理数据库中的数据。SQL语句就是一种基于关系型数据库的语言,用来执行对关系型数据库中数据的检索和操作。
主流的关系型数据库包括:oracle MySQL SQLserver DB2等。
(2)非关系型数据库:除主流的关系型数据库以外都是非关系型数据库。
主流的Nosql(非关系型数据库)有:redis Monbd hbase等。
非关系型数据库优势:非关系型,分布式,开源和横向扩展。
2>>>>>>:关系型数据库现有的问题:
1:对数据库高并发读写需求
2:对海量数据高效存储与访问需求
3:对数据库高扩展性与高可用性需求
关系型数据库关注在关系上,非关系型数据库关注在存储上。
3>>>>>>:redis优点:
(1):具有极高的数据读写速度;数据读取速度最高可达每秒11万次。
(2):支持数据类型丰富;
(3):支持数据持久化,可将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
(4):支持数据备份。
二、如何保持session会话:
在集群系统下实现session统一的有如下几种方案:
1、请求精确定位:sessionsticky,例如基于访问ip的hash策略,即当前用户的请求都集中定位 到一台服务器中,这样单台服务器保存了用户的session登录信息,如果宕机,则等同于单点部 署,会丢失,会话不复制。
2、session复制共享:sessionreplication,如tomcat自带session共享,主要是指集群环境下, 多台应用服务器之间同步session,使session保持一致,对外透明。 如果其中一台服务器发生 故障,根据负载均衡的原理,调度器会遍历寻找可用节点,分发请求,由于session已同步,故 能保证用户的session信息不会丢失,会话复制,。 此方案的不足之处: 必须在同一种中间件之间完成(如:tomcat-tomcat之间). session复制带来的性能损失会快速增加.特别是当session中保存了较大的对象,而且对象变化 较快时, 性能下降更加显著,会消耗系统性能。这种特性使得web应用的水平扩展受到了限制。 Session内容通过广播同步给成员,会造成网络流量瓶颈,即便是内网瓶颈。在大并发下表现并 不好
3、基于cache DB缓存的session共享
基于memcache/redis缓存的 session 共享 即使用cacheDB存取session信息,应用服务器接受新请求将session信息保存在cache DB中,当 应用服务器发生故障时,调度器会遍历寻找可用节点,分发请求,当应用服务器发现session不 在本机内存时,则去cache DB中查找,如果找到则复制到本机,这样实现session共享和高可用。
三、nginx+tomcat+redis实现负载均衡、session共享
1、实验环境
2、实验拓扑:
在这个图中,nginx做为反向代理,实现静动分离,将客户动态请求根据权重随机分配给两台tomcat 服务器,redis做为两台tomcat的共享session数据服务器,mysql做为两台tomcat的后端数据库。
3、nginx安装配置
使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现零宕机的 7x24效果。因为将会话存储在Redis中,因此Nginx就不必配置成stick粘贴某个Tomcat方式,这样 才能真正实现后台多个Tomcat负载平衡。
安装nginx:(之前我们有写过怎样安装nginx及各种优化可看之前的博文)
(1):先使用yum安装缺少的依赖:
[root@localhost ~]# yum -y install pcre-devel
[root@localhost ~]# yum -y install pcre-devel
(2):下载nginx源码包并编译安装:
[root@localhost ~]# tar zxf nginx-1.10.2.tar.gz
[root@localhost ~]#cd nginx-1.10.2/
[root@localhost nginx-1.10.2]# ./configure
[root@localhost nginx-1.10.2]# make && make install
优化nginx程序的执行路径并启动:
[root@localhost nginx-1.10.2] ln -s /usr/local/nginx1.10/sbin/nginx /usr/local/sbin/
[root@localhost nginx-1.10.2] nginx
配置nginx反向代理:反向代理+负载均衡+健康探测:
[root@localhost nginx-1.10.2] vim /usr/local/nginx1.10/conf/nginx.conf
重启nginx服务,使修改生效:
[root@localhost nginx-1.10.2] nginx -s reload
4、安装部署tomcat应用程序服务器(下载安装tomcat源码包并编译安装)
Tomcat 1 和tomcat 2 配置都要相同:
[root@localhost ~]#tar zxf apache-tomcat-8.5.35.tar.gz
将解压生成的文件夹移动到/usr/local/下,并改名为tomcat
[root@localhost ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat
[root@localhost ~]# cd /usr/local/tomcat/
[root@localhost tomcat ~]# /usr/local/tomcat/bin/startup.sh
[root@localhost tomcat ~]# netstat -anput | grep 8080
防火墙规则配置:
[root@tomcat ~]# firewall-cmd --permanent --add-port=8080/tcp
success
[root@tomcat ~]# firewall-cmd --reload
success
按照相同方法在tomcat-2也安装。
打开浏览器分别对tomcat-1和tomcat-2访问测试
如果想关闭tomcat则运行/usr/local/tomcat7/bin/shutdown.sh命令 好了,大家可以看到访成功。说明我们的tomcat安装完成,下面我们来修改配置文件
[root@tomcat ~]# vim /usr/local/tomcat/conf/server.xml
修改默认虚拟主机,并将网站文件路径指向/web/webapp1,在host段增加context段
增加文档目录与测试文件:
[root@tomcat ~]# mkdir -p /web/webapp1
[root@tomcat ~]# cd /web/webapp1/
[root@ tomcat webapp1]# vi index.jsp
index.jsp内容如下:
停止tomcat运行,检查配置文件并启动tomcat
Tomcat-2节点与tomcat-1节点配置基本类似,只是jvmRoute不同,另外为了区分由哪个节点 提供访问,测试页标题也不同(生产环境两个tomcat服务器提供的网页内容是相同的)。其 他的配置都相同。
用浏览器访问nginx主机,验证负载均衡 第一次访问的结果
第二次访问的结果:
从上面的结果能看出两次访问,nginx把访问请求分别分发给了后端的tomcat-1和tomcat-2, 客户端的访问请求实现了负载均衡,但sessionid并不一样。所以,到这里我们准备工作就全 部完成了,下面我们来配置tomcat通过redis实现会话保持。
5、安装redis
下载redis源码,并进行相关操作,如下: wget http://download.redis.io/releases/redis-3.2.3.tar.gz
解压安装redis
[root@localhost ~]#tar zxf redis-4.0.14.tar.gz
[root@localhost ~]#cd redis-4.0.14/
[root@localhost redis-4.0.14 ~]# make&& make install
root@localhost redis-4.0.14 ~]#cd utils/
root@localhost utlis~]# ./install_server.sh
通过上图,我们可以很容易的看出,redis安装到 /usr/local,/usr/local/bin,/usr/local/share,/usr/local/include,/usr/local/lib,/usr/l ocal/share/man目录下。
然后再切换到utils目录下,执行redis初始化脚本install_server.sh,如下:
修改redis配置文件:
[root@localhost utils]# vim /etc/redis/6379.conf
重新启动redis服务:
[root@redis ~]# systemctl restart redis_6379.service
redis配置文件配置完毕后,我们来启动redis并进行简单的操作。如下:
关于redis-cli -h 192.168.1.50 -p 6379 -a 123.com的参数解释 这条命令是说要连接redis服务器,IP是192.168. 1.50,端口是6379,密码是123.com。 keys *是查看redis所有的键值对。
6、配置tomcat session redis同步(回到tomcat两台操作相同)
回到tomcat的lib目录下添加:
修改tomcat的context.xml:
[root@localhost lib]# vim /usr/local/tomcat/conf/context.xml
重启tomcat服务:
说明:
maxInactiveInterval="60":session的失效时间
tomcat-2执行和tomcat-1相同的操作
通过浏览器访问http://192.168.1.10/index.jsp测试页
刷新页面
可以看出,分别访问了不同的tomcat,但是得到的session却是相同的,说明达到了集群的目的。
查看redis是否有保存session会话:
7、tomcat连接数据库:
192.168.1.40作为mysql数据库服务器
[root@db ~]# mysql –u root -p123
mysql> grant all on *.* to javauser@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> create database javatest;
Query OK, 1 row affected (0.01 sec)
mysql> use javatest;
Database changed
mysql> create table testdata(id int not null auto_increment primary key,foo varchar(25),bar int);
Query OK, 0 rows affected (0.02 sec)
插入些数据:
mysql> insert into testdata(foo,bar) values
('lvranbo','123456'),('lrb','654321');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from testdata;
mysql防火墙配置
# firewall-cmd –-permanent –add-port=3306/tcp
# firewall-cmd –reload
配置tomcat服务器连接mysql数据库(回到tomcat)
[root@localhost lib]# vim /usr/local/tomcat/conf/context.xml
保存修改并退出:
[root@tomcat ~]# mkdir /web/webapp1/WEB-INF
[root@tomcat ~]# vi /web/webapp1/WEB-INF/web.xml
添加内容如下:
保存修改并退出,重启tomcat服务(tomcat2相同配置)
[root@tomcat ~]# vim /web/webapp1/test.jsp
添加内容如下:
通过浏览器访问http://192.168.1.10/test.jsp测试页
总结:这篇博文告诉我们session会话如何保持一致性。