您的位置:首页 > 数据库 > Memcache

Tomcat + Nginx + 主从 memcached + keepalived 实现高可靠的web 服务

2016-05-04 16:03 609 查看
下面我将和大家分享一下: Tomcat的安装+配置memcached+NGINX+
repcache + keepalive。
注意: 通过 repcache + keepalived,可以让两个memcache server running on Linux 实现memcache master
/ slave 功能。
 1)   repcache可以使者两个memcache自己自动同步数据,一旦master挂了,则slave自动变成listen状态。
         由于 Memcached 自己没有防止单点的措施,因为为了保障 Memcached
服务的高可用,我们需要借助外部的工具来实现高可用的功能。

Repcached 用来实现 Memcached 复制功能的一个工具。它所构建的主从方案是一个单主单从的方案,不支持多主多从。 但是,它的特点是,主从两个节点可以互相读写,从而可以达到互相同步的效果。

2)      keepalived 使这两个memcache所在的server对外提供一个VIP(这个IP只有master memcache上才有),一旦master server挂了,则slaveserver 自动配置这个VIP.
这样在tomcat上,要写入的memcache server 地址就配置成这个VIP就可以了。 通过运行在两个memcache上面的keepalived
向两个tomcat server提供VIP地址、从而实现memcache 的failover功能。
注意:启动Master和Slavememcache时不要加-l参数指定监听地址,否则keepalived无法监听VIP的地址,
然后配置上keepalived就可以作为高可用了。
        在本方案中, keepalived 后面的 real server就是在同机上运行的
memcache server。Keep alived 必须检测它的状态,
然后把进入的memcache 数据转发给mem cache。
        本方案是有两个负载均衡器(每台运行keepalived的就是一个负载均衡器),其中VRRP  VIP,在两个tomcat server配置中被指定为要写入的mem cacher server IP。当keepalive 收到达到VRRP  VIP上,端口是memcache服务端口的TCP数据时,就要转发到本机的memcache server上。
而两个memcache
server利用repcache被配置为master /slave,则两者的数据会被复制的。一旦一个memcache所在的 master keepalived server down了,则slave keep alive会检测到,会启动vip,slave变成master了,而来自两个 tomac t的memcache 数据仍可以写到slave memcache上。
[tomcat
1& 2 ]  ->][ keepalived  master + repcachemaster + memcache 1 ]  <-> [
keepalived  slave + repcache slave + memcache 2 ]

问题和解决:
               由于keep alived 的old master起来后,如果不修改vrrp 优先级,会重新变成 master的,而repcache 不会自动切换回去,则就有问题。
所以当 keep alived 的old master恢复后,则必须修改它的vrrp priority,让它成为slave。

keepalived 配置,则可以参考:  
http://www.keepalived.org/documentation.html

下面说下tomcat配置和Nginx的配置:
1、安装Tomcat
Tomcat官网:http://tomcat.apache.org/

我使用的版本:apache-tomcat-7.0.42.tar.gz

1.1解压在usr/local/目录下(可以自己选)

1.2重命名为Tomcat(不是必须的,只是这样看着习惯)
1.3编辑/etc/profile加上以下语句

CATALINA_BASE=/usr/local/tomcat
CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE CATALINA_HOME

1.4进入tomcat/bin目录下面,运行
# ./startup.sh

1.5然后访问http://localhost:8080看是否访问成功.如果看到了tomcat的欢迎界面,congratulations,
you are a good boy/girl.

--------------------------------------------------------------------------------------------------------------------------------------------------------------
1.6但是现在我们只有一个tomcat。所以,接下来在我们的机器上要搭建多个tomcat,首先我们先复制一份以前的tomcat(我的tomcat是在/usr/local/下),执行命令
cp /usr/local/tomcat /usr/local/tomcat2

1.7应为要两个不同的tomcat使用不同的环境变量,所以我们需要修改/etc/profile的文件配置信息

gedit /etc/profile

然后修改成这样:
#tomcat
CATALINA_BASE=/usr/local/tomcat CATALINA_HOME=/usr/local/tomcat export CATALINA_BASE CATALINA_HOME
#tomcat2
CATALINA_2_BASE=/usr/local/tomcat2
CATALINA_2_HOME=/usr/local/tomcat2
export CATALINA_2_BASE CATALINA_2_HOME
TOMCAT_HOME=/usr/local/tomcat
export TOMCAT_HOME
TOMCAT_2_HOME=/usr/local/tomcat2
export TOMCAT_2_HOME
       1.8最后一步我们需要修改tomcat2里面的配置文件。首先我们修改tomcat2/bin下面的startup.sh和shutdown.sh 添加以下内容
export JAVA_HOME=/usr/local/jdk
export PATH=.:$HADOOP_HOME/bin:$ZOOKEEPER_HOME/bin:$HBASE_HOME/bin:$JAVA_HOME/bin:$PATH

export CATALINA_HOME=$CATALINA_2_HOME
export CATALINA_BASE=$CATALINA_2_BASE
       1.9然后进去tomcat2/server.xml中修改以下几个地方
<Server port="8005" shutdown="SHUTDOWN">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
把8005->8006,8080->8081,8009->8010就好了(具体端口由自己定就行了),增加:  jvmRoute="tomcat2",对tomcat/server.xml只需要增加以下jvmRoute="tomcat"

1.10然后进入tomcat1/bin,tomcat2/bin下面执行
./startup.sh
好了,nice
       1.11用浏览器进去localhost:8080和localhost:8081看看把,两个tomcat就已经搭建成功了
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2、为Tomcat配置memcached

NGINX负载的几种方式
nginx 的 upstream目前支持 4 种方式的分配 

1)、轮询(默认) 

      每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。 

2)、weight 

      指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 

2)、ip_hash 

      每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。  

3)、fair(第三方) 

      按后端服务器的响应时间来分配请求,响应时间短的优先分配。  

4)、url_hash(第三方)'
       我们使用最简单的ip_hash来实现,而且还可以解决session问题

ip_hash其实上不能够完全解决ip问题,因为有很多用户的ip随时都可能在变动,ip_hash这个名字你就知道,是通过hash散列的原理将用户的ip散列到指定的tomcat上,自然而然的想当然的解决了session问题,最好是用memcached存取来实现session共享,下面看我的nginx.conf的配置:

#运行nginx所在的用户名和用户组
#user  www www;

#启动进程数
worker_processes 8;
#全局错误日志及PID文件
error_log  /usr/local/nginx/logs/nginx_error.log  crit;
pid       /usr/local/nginx/nginx.pid;
#Specifies the value for maximum file descriptors that can be opened by this process.
worker_rlimit_nofile 65535;
#工作模式及连接数上限
events
{
use epoll;
worker_connections 65535;
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http
{
#设定mime类型
include       mime.types;
default_type  application/octet-stream;
include /usr/local/nginx/conf/proxy.conf;
#charset  gb2312;
#设定请求缓冲
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
#client_max_body_size 8m;

sendfile on;
tcp_nopush     on;

keepalive_timeout 60;

tcp_nodelay on;

#  fastcgi_connect_timeout 300;
#  fastcgi_send_timeout 300;
#  fastcgi_read_timeout 300;
#  fastcgi_buffer_size 64k;
#  fastcgi_buffers 4 64k;
#  fastcgi_busy_buffers_size 128k;
#  fastcgi_temp_file_write_size 128k;

#  gzip on;
#  gzip_min_length  1k;
#  gzip_buffers     4 16k;
#  gzip_http_version 1.0;
#  gzip_comp_level 2;
#  gzip_types       text/plain application/x-javascript text/css application/xml;
#  gzip_vary on;

#limit_zone  crawler  $binary_remote_addr  10m;
upstream tomcat{                      # 负载均衡站点的名称为tomcat,可以自己取
# ip_hash;           		 # 可选,根据来源IP方式选择web服务器,省略的话按默认的轮循方式选择web服务器
server 127.0.0.1:8080;       # web服务器的IP地址及tomcat发布端口
server 127.0.0.1:8081;
}
server {
listen       80;                   # 站点侦听端口80
server_name  localhost;            # 站点名称

location / {
root   html;
index  index.html index.htm;
proxy_pass http://tomcat;      # 负载均衡指向的发布服务tomcat
}
}
}

2.1 Tomcat要支持memcached管理Session,需要调用一些jar库文件如下(网上有的文章中可能所说的jar包不全,或者版本不样的会报错,但这里我已经经过验证了,简直nice):
                   1) couchbase-client-1.2.2.jar

                          2) javolution-5.5.1.jar

                          3) kryo-1.03.jar

                          4) kryo-serializers-0.10.jar

                          5) memcached-session-manager-1.6.5.jar

                          6) memcached-session-manager-tc7-1.6.5

                          7) minlog-1.2.jar

                          8) msm-kryo-serializer-1.6.3.jar

                          9) reflectasm-1.01.jar

                         10)spymemcached-2.10.2.jar
特别要注意,这些jar包的版本,要不然你会难受至极:
                         1)msm1.6.5依赖了Couchbase,需要添加couchbase-client的jar包,否则启动会报:java.lang.NoClassDefFoundError:com/couchbase/client/CouchbaseClient。

                                2)Tomcat6和Tomcat7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可选一,否则启动报错。

                                3)msm源码中的lib包版本太低:spymemcached需要使用2.10.2,否则启动tomcat报错:java.lang.NoSuchMethodError:net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;atde.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)

                                4)kryo-serializers需要使用0.10版本,否则报错:

                                      Caused by:java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
下载后,将这些库文件放到tomcat\lib目录下。

2.2为Tomcat配置memcached
     配置文件目录:tomcat\conf\context.xml,记得两个Tomcat都要配的哦。

            打开配置文件,在<Context>...</Context>节点中添加如下内容:

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:127.0.0.1:11211"
requestUriIgnorePattern=".*\.(png|gif|jpg|css|js|ico|jpeg|htm|html)$"
sessionBackupAsync="false"
sessionBackupTimeout="100"
copyCollectionsForSerialization="false" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
          
 参数说明:memcachedNodes:memcached服务器信息,多个服务器时,使用空格分开,
如:    n1:127.0.0.1:11211 n2:127.0.0.1:11211

在上面那个例子中,则 memcachedNode 设置为 keepalived 的 VIP 地址。
这样,tomcat任何时候只能向active master memcached写session数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: