负载均衡会话共享

   前言: 公司的产品上线了, 对于大并发量的客户访问和对手的攻击,真是苦不堪言,因此集群的部署重要,如今集群的部署通常有两种方式,第一种,看到大部分人的作法通常是Nginx+Memcached+Tomcat进行一系列的转发部署,可是说实话,咱们本身去搞这个Nginx,转发的效果并非那么的完美,若是Nginx的服务器down掉的话,那么咱们的整个站点,基本上就废除了,因此我这边用的的买了阿里云的ecs,买了一个负载均衡,进行的站点转发功能,其中阿里云的安全骑士也挺好,能够帮咱们检测到攻击,那两台不一样ip的服务器,由一个主ip去进行了映射,好比192.168.1.101和192.168.1.102两台centos上部署了两个tomcat,由咱们的主ip192.168.1.100去访问,转发到二者上,那么问题来了,若是其中的一台down掉后,用户就必须从新登录了,更为严重的是,若是在支付环节出现了这样的问题,那么后果不堪设想,咱们今天使用Memcached +Tomcat7的环境,作一个会话共享转移.javascript

Memcached 环境安装

1.下载编译文件
  wget http://www.memcached.org/files/memcached-1.4.29.tar.gz ----下载memcached源文件
  wget https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.15-stable.tar.gz -----下载libevent源文件
2.安装编译:
# tar zxvf libevent-2.0.5-beta.tar.gz
# cd libevent-2.0.5
# ./configure –prefix=/usr
# make
# make install
tar zxvf memcached-1.4.2.tar.gz
  cd memcached-1.4.2
  ./configure  --with-libevent=/usr
  make
  make install
3.检查是否安装成功
# ls -al /usr/local/bin/mem*
若是执行完毕出现了一行绿色的信息,说明安装成功
4.启动memcached服务
/usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid
-d选项是启动一个守护进程,
-m是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,
-u是运行Memcache的用户,我这里是root,
-l是监听的服务器IP地址,若是有多个地址的话,我这里指定了服务器的IP地址192.168.0.200,
-p是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c选项是最大运行的并发链接数,默认是1024,我这里设置了256,按照你服务器的负载量来设定,
-P是设置保存Memcache的pid文件,我这里是保存在 /tmp/memcached.pid
5.测试是否启动成功
[root@localhost /]# telnet 192.168.141.64 12000
Trying 192.168.141.64...
Connected to 192.168.141.64 (192.168.141.64).
Escape character is '^]'.
set key1 0 60 4
zhou
STORED
get key1
VALUE key1 0 4
zhou
END
到此安装成功了
6.配置启动项
咱们将memcached配置成为开机启动项,省心又省力
假如启动Memcache的服务器端的命令为:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid
想开机自动启动的话,只需在/etc/rc.d/rc.local中加入一行,下面命令
/usr/local/memcached/bin/memcached -d -m 10 -p 12000 -u apache -c 256
上面有些东西能够参考一下:即,ip不指定时,默认是本机,用户:最好选择是:apache 或 deamon
这样,也就是属于哪一个用户的服务,由哪一个用户启动。

Tomcat7 环境安装

tomcat和jdk的安装环境,在此就很少说了,将java环境装好,tomcat下载一个解压版的就能够了,我这边用的是7.063版本的。下载tomcat

配置会话共享

1.添加tomcat环境jar

这是我所用到的jar所有的包,再次我提供一个下载连接,请严格安装下载包中的说明进行部署 下载jar包
上面红色的两个,tc7指的是使用了tomcat7版本,若是是6版本的话请更新为tc6的jar,将如今全部的jar放入tomcat/lib目录下。
注意点:
-msm1.6.5依赖了Couchbase,须要添加couchbase-client的jar包,不然启动会报:java.lang.NoClassDefFoundError: com/couchbase/client/CouchbaseClient。
-tomcat6和7使用不一样msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可选一,不然启动报错。
-msm源码中的lib包版本过低:spymemcached-2.7.jar须要使用2.10.2,不然启动tomcat报错:
java.lang.NoSuchMethodError: net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;
at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)

kryo-serializers-0.8.jar须要使用0.10版本,不然报错:
Caused by: java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
2.修改context.xml
在tomcat目录下conf中找到context.xml文件,并添加为一下内容
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
	    memcachedNodes="n1:112.74.210.155:12000"
	    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" 
	    sessionBackupAsync="false" 
	    sessionBackupTimeout="1800000"
	    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
	    />
到此为止呢,负载均衡的会话共享已经完成了,当使用100去访问,若是其中down掉了一台服务器的话,会话也不会丢失,一下午的辛酸啊 。。。。

Nginx方式

不少人仍是中意于不花钱的Nginx的方式去实现负载均衡,那么上述的共享session的方式不变,咱们只须要搭建一个Nginx的转发http服务便可
1.安装Nginx
#yum install pcre* //nginx 依赖pcre类库
#useradd nginx
#tar xf /share/soft/lamp/nginx/nginx-1.4.7.tar.gz -C /usr/src/
#cd /usr/src/nginx-1.4.7
#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module
# make && make install
2.配置转发服务
user nginx nginx;

worker_processes 5;

error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

pid logs/nginx.pid;

events {

worker_connections 1024;

use epoll;

}

http {

upstream session {

server 10.1.1.217:8080 weight=1 max_fails=2 fail_timeout=30s;

server 10.1.1.218:8080 weight=1 max_fails=2 fail_timeout=30s;

}

server {

listen 80;

server_name 10.1.1.217;

root /nginxroot/;

location ~ \.(txt|jsp)$ {

proxy_pass http://session;

}

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;
}
}
mkdir /nginxroot/

Manager标签属性说明
1.className 必须
类名:de.javakaffee.web.msm.MemcachedBackupSessionManager
2.memcachedNodes 必须
memcached节点:此属性应该包含全部运行的 memcached节点或者membase bucket的uri地址,每个memcached节点的属性定义格式为<id>:<host>:<port>, 多个节点定义直接使用空格或者逗号分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",若是只 有单个的memcached节点,则<id>是可选项,只需配置<host>:<port>便可,形 如:memcachedNodes="localhost:11211"。
若是咱们配置的是membase,那么从1.6.0版本开始,咱们能够配置指定一个或者多个membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名称和密码经过属性username,password来定义。membase buckets链接须要遵循memcached协议,传输数据经过二进制流方式。
3.failoverNodes 可选项
故障转移节点:可选项,对非黏性session不可用,属性必须包含memcached节点集群的全部ids。节点id之间用空格或者逗号分隔。
4.username 可选项
从1.6.0版开始使用,而且是可选的。用来进行membase bucket或者SASL验证,密码能够为空。
5.password 可选项
从1.6.0版开始使用,而且是可选的。用来进行membase bucket或者SASL验证,密码能够为空。
6.memcachedProtocol 可选项
定义memcached协议,默认使用text文本,出属性指明memcached使用的存储协议。只支持text或者binary。
7.sticky 可选项
定义session方式为黏性或非黏性,默认为true,多个tomcat时需使用非黏性
8.lockingMode 可选项
只有非黏性session才使用,默认值为none
none: 从不对session进行锁定
all: session将一直被锁定,知道请求结束
auto: 对于只读请求,session将不会被锁定,若是是非只读请求,则session会被锁定
uriPattern:<regexp>: 经过正则表达式的方式来对请求uri以及查询字符串进行匹配,只有匹配上的才会被锁定。
9.requestUriIgnorePattern 可选项
此属性是那些不能改备份Session的请求的正则表达式。若是像css,javascript,图片等静态文件被同一个Tomcat和同一个应用 上下文来提供,这些请求也会经过memcached-session-manager。可是这些请求在一个http会话中几乎没什么改变,因此他们不必 触发Session备份。因此那些静态文件不必触发Session备份,你就可使用此属性定义。此属性必须符合java regex正则规范。
如:".*\.(png|gif|jpg|css|js)$"

10.sessionBackupAsync 可选项
指定Session是否应该被异步保存到Memcached中。 若是被设置为true,backupThreadCount设置起做用,若是设置false,经过sessionBackupTimeout设置的过时时间起做用。
11.backupThreadCount 可选项
用来异步保存Session的线程数,(若是sessionBackupAsync="true")。默认值为cup的内核数。
12.sessionBackupTimeout 可选项
设置备份一个Session所用的时间,若是操做超过期间那么保存失败。此属性只在sessionBackupAsync="false"是起做用。默认100毫秒
13.operationTimeout 可选项
从1.6.0版开始使用, 默认值为1000
14.sessionAttributeFilter 可选项
此属性是用来控制Session 中的那个属性值保存到Memcached中的正则表达式。郑则表达式被用来匹配Session中属性名称。如 sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"属性保存到Memcached中。依赖于选择的序列化策略。
15.transcoderFactoryClass 可选项
此属性值是建立序列化和反序列化 保存到Memcached中的Session的编码转换器的工厂类名。这个指定的类必须实现了 de.javakaffee.web.msm.TranscoderFactory和提供一个无参的构造方法。例如其余的有效的实如今其余 packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm- javolution-serializer.
默认为 de.javakaffee.web.msm.JavaSerializationTranscoderFactory
16.copyCollectionsForSerialization 可选项
默认值为false。
17.customConverter 可选项
本身定义特殊的类注册到kryo自定义转换器中,实现序列化
18.enableStatistics 可选项
用来指定是否进行统计。 默认值为true。
19.enabled 可选项
指定Session保存到Memcached中是否可用和是否能够经过JMX进行改变。只用于粘性Session。 默认值为true。
css

相关文章
相关标签/搜索