1. 程式人生 > >java叢集之redis sentinel、nginx、session共享配置詳解

java叢集之redis sentinel、nginx、session共享配置詳解

說明

1、看此篇文章之前,你需要對spring 基礎,redis等相關技術基礎.
2、redis 服務端使用2主2從,分佈交叉部署至2臺伺服器,且分佈部署2臺tomcat web應用,兩臺伺服器分別部署2臺nginx來實現負載均衡。
3、你需要對叢集的概念有所瞭解(redis的叢集以及failover請看之前的文章)。
4、redis官方推薦部署為 3主3從。

java spring-data-redis

相關包引入

spring-session-data-redis

<!--https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis -->
<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> <version>1.0.0.RELEASE</version> </dependency>

以上並不是實際的jar包,是配置了4個包的依賴。分別為:
sprign-data-redis
common-pool2
spring-session
jedis

ok,因為我已經有部分包,所以這裡單獨引入部分即可

<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version
>
1.7.4.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.2.2.RELEASE</version> </dependency>

spring-data-redis之sentinel配置

在spring配置檔案中:

<!-- ========================= spring jedis 相關配置 開始 =========================== -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="2048" />
        <property name="maxIdle" value="200" />
        <property name="numTestsPerEvictionRun" value="1024" />
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <property name="minEvictableIdleTimeMillis" value="-1" />
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <property name="maxWaitMillis" value="1500" />
        <property name="testOnBorrow" value="true" />
        <property name="testWhileIdle" value="true" />
        <property name="testOnReturn" value="false" />
        <property name="jmxEnabled" value="true" />
        <property name="blockWhenExhausted" value="false" />
    </bean>

上面相關屬性可以檢視相關api,基本應用預設這些即可。
sentinel配置:
<bean id="redisSentinelConfiguration"
        class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
        <property name="master">
            <bean class="org.springframework.data.redis.connection.RedisNode">
                <property name="name" value="你的redis master名稱">
                </property>
            </bean>
        </property>
        <property name="sentinels">
            <set>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="伺服器IP1" />
                    <constructor-arg name="port" value="sentinel埠1" />
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisNode">
                    <constructor-arg name="host" value="伺服器IP2" />
                    <constructor-arg name="port" value="sentinel埠2" />
                </bean>
            </set>
        </property>
    </bean>

上面注意更改對應的伺服器IP和sentinel埠,使用sentinel,我們不關注具體的master相關資訊,通過sentinel去監控想對應名稱的master介面,做到redis master的failover。

redis連線池redisTemplate bean配置。

<bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:password="tmbj">
        <constructor-arg name="sentinelConfig" ref="redisSentinelConfiguration"></constructor-arg>
        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
    </bean>

    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="redisConnectionFactory" />
    </bean>

這裡我配置的RedisTemplate, 如果操作String,你可以配置StringTemplate bean。

spring-data-redis測試

@Service
public class RedisService{

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * @param key (命名必須符合平臺架構規範)
     * @param value 
     * @param time 有效期,單位:秒
     * @return true=SUCCESS,false=FAILED
     */
    public boolean setString(String key,String value,int timeout) {
        try{
            ValueOperations<String, String> vp = redisTemplate.opsForValue();
            vp.set(key, value);
            vp.set(key, value, timeout, TimeUnit.SECONDS);
            return true;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 根據 key獲取值
     * @param key
     * @return String value
     */
    public String getString(String key) {
        ValueOperations<String, String> vp = redisTemplate.opsForValue();
        return vp.get(key);
    }

}

ok,以上是一個基本的獲取值和設定值得方法,詳細的api使用請檢視spring RedisTemplate相關api。這裡廢話一句,為了便於後期的維護,redis的key建議有一定的規則。

單元測試如下:

public class RedisServiceTest extends JUnitDaoBase {
    @Autowired
    private RedisService  redisService;

    @Test
    public void test_1(){
        redisService.setString("k1", "test11",3000);
        String str = redisService.getString("k1");
        System.out.println("獲取到的="+str);
        //RedisService s = new RedisService();
        //s.setString("k1", "test");
    }
}

看看執行日誌以及結果:

十一月 27, 2016 10:55:49 下午 redis.clients.jedis.JedisSentinelPool initSentinels
十一月 27, 2016 10:55:49 下午 redis.clients.jedis.JedisSentinelPool initSentinels
資訊: Redis master running at xxx.xxx.xxx, starting Sentinel listeners...
十一月 27, 2016 10:55:49 下午 redis.clients.jedis.JedisSentinelPool initPool
資訊: Created JedisPool to master at xxx.xxx.xxx:16319

獲取到的=test11
從上面中可以看到,結果正常, sentinel會啟動監聽,獲取到對應master的連線,感興趣的童鞋可以去下載對應的原始碼,看看實際的執行過程。
oK,繼續下一步...

spring-session 共享配置

spring 配置檔案

在之前配置檔案的基礎上加上:

<!-- spring redis seesion同步bean -->
    <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration">
        <!-- session失效時間 單位seconds -->
        <property name="maxInactiveIntervalInSeconds" value="600" />
    </bean>

上面的有效時間配置,可以自由更改,單位為S.

web.xml配置

<!-- spring data redis session同步過濾器 -->
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSessionRepositoryFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

這裡沒有什麼特殊的地方,配置過濾器。

sesion同步測試

在login.jsp(等下訪問的jsp)中輸出sessionId

<%String s = session.getId(); //獲取session ID  %>  
 <%=s %>  

ok,工程打包併發布到tomat 伺服器。
在瀏覽器中訪問jsp地址.
然後進入redis伺服器檢視session資訊:

[[email protected] ~]# redis-cli -p 16319
127.0.0.1:16319> keys *

keys * 命令檢視所有的key資訊,你會看到sessionId已經同步到redis中,如下:

"spring:session:sessions:expires:cea9e9ea-53f5-43c9-991f-d5b340fa1889"

 "spring:session:expirations:1480260480000"

jsp中輸出sessionId會和redis中sessionId相同,多個瀏覽器訪問redis中會有多個session資訊,redis中一個為sessionID,另一個為session的有效時間。
至此,redis session同步OK咯,接著看nginx負載均衡配置。

Nginx配置

nginx安裝這裡暫時不贅述,如有需要請檢視nginx安裝相關資料。
1、將工程部署至2臺伺服器對應的tomcat。
2、找到nginx安裝目錄conf 中的nginx.conf檔案,並將配置一個域名,指向該nginx伺服器IP地址。然後修改nginx.conf檔案,在http{}中加入如下配置:

nginx.conf

upstream manager_tomcat {
    server tomcat伺服器IP1:8092;
    server tomcat服務IP2:8092;
    }

    server {
        listen 80;
    server_name uat.xxx.com;
        location / {
            proxy_next_upstream http_502 http_504 error timeout invalid_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_pass http://manager_tomcat;
        }
    }

如上,注意更改對應的tomcat IP 和埠。
這裡nginx upstream負載有5方式,簡單介紹如下。
5種方式如下:

輪詢

每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。 

權重weight

 upstream manager_tomcat { 
    server ip1 weight=30; 
    server ip2 weight=70; 
} 
 指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。

ip_hash

例如:
upstream manager_tomcat { 
    ip_hash; 
    server ip1:port1; 
    server ip2:port2;  
} 
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題,都不需要處理session同步的問題啦。

fair

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。 
upstream manager_tomcat { 
server server1; 
server server2; 
fair; 
} 

url_hash

按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取時比較有效。 

OK,樓主查看了相關資料,本身自帶的應該就是前面三種,後面兩種屬於第三方外掛,感興趣的童鞋可以看看相關資料。這裡我使用預設的輪詢方式。

叢集測試

瀏覽器訪問應用的域名加上project URL,應用 一切正常。

文章說明

1、至此,spring-data-redis sentienl配置,session 同步配置,nginx負載均衡配置都已經完成。

2、對於文章頭部說到 redis 有2主2從,並且nginx分別部署到了2臺伺服器,在文章中並沒有體現,都只是使用到了單臺。

是因為 樓主考慮到不同的業務或者不同的應用子系統訪問不同的redis master,以便於維護以及效能和擴充套件性考慮。
nginx伺服器,樓主外網負載均衡使用阿里雲的負載均衡器,內網才使用nginx負載均衡,所以文章中並沒有體現,只是使用單臺(單臺和多臺配置相同,只是多了一層負載均衡)。

OK,文章完成,如有不當之處,煩請指正。

相關推薦

java叢集redis sentinelnginxsession共享配置

說明 1、看此篇文章之前,你需要對spring 基礎,redis等相關技術基礎. 2、redis 服務端使用2主2從,分佈交叉部署至2臺伺服器,且分佈部署2臺tomcat web應用,兩臺伺服器分別部署2臺nginx來實現負載均衡。 3、你需要對叢集的概念有所

Nginx反向代理和配置(正向代理反向代理負載均衡原理Nginx反向代理原理和配置講解)

nginx概述 nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;nginx可以作為一個HTTP伺服器進行網站的釋出處理,另外nginx可以作為反向代理進行負載均衡的實現。 Nginx是一款開原始碼的高效能HT

shell指令碼正則表示式函式grepsedawkprintf等基本命令配置

一、正則表示式 簡介: 正則表示式(或稱Regular Expression,簡稱RE)就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或多個字串。正則表示式作為一個模板,將某個字元模式與所搜尋的字串進

java web項目中redis集群或單擊版配置

redis集群 redis單機 jedis jedis客戶端集群 jedis客戶端單機 單機版配置 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--

華為OSPFBGP路由反射器配置

cost mas -o 技巧 ali 所有 工程 moment pack 對於網絡工程師而言,OSPF、BGP的重要性不言而喻,本篇文章我們就來回顧下OSPF、BGP的配置技巧,重點如下1.熟悉DHCP配置;2.熟悉OSFP配置;3.BGP路由反射器配置 入下圖所示,要求如

webpack4 css打包壓縮分離去重等優化配置

Webpack 4 目前版本已經到了4.27 相較於前面的版本還是有一些改動的,具體可以參考升級指南 遷移到新版本 這裡只介紹 css 的 打包、壓縮、分離、去重 的方法; 不懂的或者有更優的方案,歡迎評論交流 用到的外掛及loader 外掛描述備註 mini-css-extract-plugin

基於nginx tomcat redis分散式web應用的session共享配置

apply plugin: 'java' apply plugin: 'maven' apply plugin: 'signing' group = 'com.orangefunction' version = '2.0.0' repositories { mavenCentral

Nginx反向代理Tomcat實現現負載均衡(高可用)以及利用redis+Session同步會話共享配置

簡介: 一、Redis介紹 redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sortedset --有序集合)和hash(雜湊型別)。與m

Nginx做負載均衡時session共享問題

壓縮 多臺 nts 獲得 hash 常見 hub img font 用nginx做負載均衡時,同一個IP訪問同一個頁面會被分配到不同的服務器上,如果session不同步的話,就會出現很多問題,比如說最常見的登錄狀態。 再者Nginx連接Memcached集群時,Nignx的

nginx正反向代理配置

test cat 公司 cti emc cati nbsp conf 返回 nginx正反向代理配置詳解一、nginx正向代理介紹及配置1、環境介紹代理服務器系統環境為:centos7.3nginx代理服務器為:192.168.10.10測試客戶端為局域網內任意window

NGINX源碼安裝配置(./configure),最全解析

unzip roo without rpc服務 所有 googl 版本 並且 大文件 NGINX ./configure詳解 在"./configure"配置中,"--with"表示啟用模塊,也就是說這些模塊在編譯時不會自動構建&qu

Nginx URL重寫規則配置

開發十年,就只剩下這套架構體系了! >>>   

轉:Nginx的超時keeplive_timeout配置

時間 detail cond conn start other solver out ide https://blog.csdn.net/weixin_42350212/article/details/81123932 Nginx 處理的每個請求均有相應的超時設置。

Java高架構師分散式架構高可擴充套件高效能高併發效能優化Spring bootRedisActiveMQNginxMycatNettyJvm大型分散式專案實戰學習架構師

工作1-5年開發經驗,當你們提出漲工資的時候,或者要offer的時候底氣怎麼樣,是不是底氣十足,不給漲工資就辭職,是不是有自信提出來主管、或者是專案經理都能同意,他們相當設法把你留住。如果這樣你才是成功。什麼技術都沒有何談工資! 給你分析一下這些技術,給大家羅列一些技術,看

15套java架構師集群高可用高可擴展高性能高並發性能優化Spring bootRedisActiveMQNginxMycatNettyJvm大型分布式項目實戰視頻教程

mycat 擴展 並發解決方案 入門到 -1 高端 資料 src nio * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; color: #FF0 } 15套java

java高級視頻課程DubboRedisActiveMQNginxMycatSpringMongoDBZeroMQGitNosqlJvmMecachedNettyNioMina

strong 程序設計 queue隊列 frp lin 海量數據 並發解決方案 elkstack line * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架構師、集群、

java基礎變量和常量類型轉換

聲明 src .cn ble .com 不能 需要 bsp 字母 一、 變量 變量是可改變的量,每賦個值便會開辟一個新內存地址。 1、首先,變量需要一個聲明,例如:int a,這個a也可以當作是一個標簽,它指向了一個內存地址,這個地址是屬於int類型的套餐,可以通過

KVM虛擬化MySQLNginxRabbitMQRedis組件安裝指導

mysql字符集 eas www cat listen copy 測試 arc remove 1 檢查服務器的配置信息 1.1 檢查服務器的CPU信息 [root@localhost iso]#cat /proc/cpuinfo | grep na

伺服器叢集負載均衡(F5ArrayNginxLVSHAProxy)區別以及選型

PS:Nginx/LVS/HAProxy是目前使用最廣泛的三種負載均衡軟體,本人都在多個專案中實施過,參考了一些資料,結合自己的一些使用經驗,總結一下。 一般對負載均衡的使用是隨著網站規模的提升根據不同的階段來使用不同的技術。具體的應用需求還得具體分析,如果是中小型的Web應用,比如日P

Java基礎數據比較IntegerShortintshort

類型 lean system ref 拆箱 ots padding and 引用 基礎很重要,基礎很重要,基礎很重要。重要的事情說三遍,。 今天聊一聊Java的數據比較,這個範圍比較大,基礎類型的比較、引用類型的比較。 前提: 1、Java和c#都提供自動裝箱和自動拆