輕鬆搭建Redis緩存高可用集羣

一、Redis集羣方案比較

  • 哨兵模式java

在redis3.0之前的版本要實現集羣通常是藉助哨兵sentinel工具來監控master節點的狀態,若是master節點異常,則會作主從切換,將某一臺slave做爲master,哨兵的配置略微複雜,而且性能和高可用性等各方面表現通常,特別是在主從切換的瞬間存在訪問瞬斷的狀況node

  • 高可用集羣模式redis

redis集羣是一個由多個主從節點羣組成的分佈式服務器羣,它具備複製、高可用和分片特性。Redis集羣不須要sentinel哨兵也能完成節點移除和故障轉移的功能。須要將每一個節點設置成集羣模式,這種集羣模式沒有中心節點,可水平擴展,據官方文檔稱能夠線性擴展到1000節點。redis集羣的性能和高可用性均優於以前版本的哨兵模式,且集羣配置很是簡單ruby

二、redis高可用集羣搭建

  • redis安裝服務器

下載地址:http://redis.io/download
安裝步驟:
# 安裝gcc
yum install gcc

# 把下載好的redis-3.0.0-rc2.tar.gz放在/usr/local文件夾下,並解壓
tar -zxvf redis-3.0.0-rc2.tar.gz

# 進入到解壓好的redis-3.0.0目錄下,進行編譯
make

# 進入到redis-3.0.0/src目錄下進行安裝,安裝完成驗證src目錄下是否已經生成了redis-server 、redis-cil
make install

# 創建倆個文件夾存放redis命令和配置文件
mkdir -p /usr/local/redis/etc
mkdir -p /usr/local/redis/bin

# 把redis-3.0.0下的redis.conf複製到/usr/local/redis/etc下
cp redis.conf /usr/local/redis/etc/

# 移動redis-3.0.0/src裏的幾個文件到/usr/local/redis/bin下
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin

# 啓動並指定配置文件
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf(注意要使用後臺啓動,因此修改redis.conf裏的daemonize改成yes)

# 驗證啓動是否成功
ps -ef | grep redis 

# 查看是否有redis服務或者查看端口
netstat -tunpl | grep 6379

# 進入redis客戶端 
/usr/local/redis/bin/redis-cli 

# 退出客戶端
quit

# 退出redis服務: 
(1)pkill redis-server 
(2)kill 進程號                       
(3)/usr/local/redis/bin/redis-cli shutdown
  • redis集羣搭建微信

redis集羣須要至少要三個master節點,咱們這裏搭建三個master節點,而且給每一個master再搭建一個slave節點,總共6個redis節點,因爲節點數較多,這裏採用在一臺機器上建立6個redis實例,並將這6個redis實例配置成集羣模式,因此這裏搭建的是僞分佈式集羣模式,固然真正的分佈式集羣的配置方法幾乎同樣,搭建僞分佈式集羣的步驟以下:app

第一步:在/usr/local下建立文件夾redis-cluster,而後在其下面分別建立6個文件夾以下
(1)mkdir -p /usr/local/redis-cluster
(2)mkdir 800一、 mkdir 800二、 mkdir 800三、 mkdir 800四、 mkdir 800五、 mkdir 8006

第一步:把以前的redis.conf配置文件copy到8001下,修改以下內容:
(1)daemonize yes
(2)port 8001(分別對每一個機器的端口號進行設置)
(3)bind 192.168.0.61(必需要綁定當前機器的ip,這裏方便redis集羣定位機器,不綁定可能會出現循環查找集羣節點機器的狀況)
(4)dir /usr/local/redis-cluster/8001/(指定數據文件存放位置,必需要指定不一樣的目錄位置,否則會丟失數據)
(5)cluster-enabled yes(啓動集羣模式)
(6)cluster-config-file nodes-8001.conf(這裏800x最好和port對應上)
(7)cluster-node-timeout 5000
(8)appendonly yes

第三步:把修改後的配置文件,分別 copy到各個文夾下,注意每一個文件要修改第二、四、6項裏的端口號

第四步:因爲 redis集羣須要使用 ruby命令,因此咱們須要安裝 ruby
(1)yum install ruby
(2)yum install rubygems
(3)gem install redis --version 3.0.0(安裝redis和 ruby的接囗)

第五步:分別啓動6個redis實例,而後檢查是否啓動成功
(1)/usr/local/redis/bin/redis-server /usr/local/redis-cluster/800*/redis.conf
(2)ps -ef | grep redis 查看是否啓動成功

第六步:在redis的安裝目錄下執行 redis-trib.rb命令
(1)cd /usr/local/redis-3.0.0/src
(2)./redis-trib.rb create --replicas 1 192.168.0.61:8001 192.168.0.61:8002 192.168.0.61:8003 192.168.0.61:8004 192.168.0.61:8005 192.168.0.61:8006

第七步:驗證集羣:
(1)鏈接任意一個客戶端便可:./redis-cli -c -h -p (-c表示集羣模式,指定ip地址和端口號)如:/usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 800*
(2)進行驗證: cluster info(查看集羣信息)、cluster nodes(查看節點列表)
(3)進行數據操做驗證
(4)關閉集羣則須要逐個進行關閉,使用命令:
/usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 800* shutdown

PS:當出現集羣沒法啓動時,刪除redis的臨時數據文件,再次從新啓動每個redis服務,而後從新構造集羣環境。

三、Java操做redis集羣

藉助redis的java客戶端jedis能夠操做以上集羣,引用jedis版本的maven座標以下:maven

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

Java編寫訪問redis集羣的代碼很是簡單,以下所示:分佈式

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 訪問redis集羣
 * @author aaron.rao
 *
 */
public class RedisCluster 
{
    public static void main(String[] args) throws IOException
    {
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("192.168.0.61", 8001));
        jedisClusterNode.add(new HostAndPort("192.168.0.61", 8002));
        jedisClusterNode.add(new HostAndPort("192.168.0.61", 8003));
        jedisClusterNode.add(new HostAndPort("192.168.0.61", 8004));
        jedisClusterNode.add(new HostAndPort("192.168.0.61", 8005));
        jedisClusterNode.add(new HostAndPort("192.168.0.61", 8006));
        
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(100);
        config.setMaxIdle(10);
        config.setTestOnBorrow(true);
        JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 10, config);
        System.out.println(jedisCluster.set("student", "aaron"));
        System.out.println(jedisCluster.set("age", "18"));
        
        System.out.println(jedisCluster.get("student"));
        System.out.println(jedisCluster.get("age"));
        
        jedisCluster.close();
    }
}
運行效果以下:
OK
OK
aaron
18

更多關於Redis深刻學習的文章請掃描下方二維碼關注微信公號「輕風吟工具

相關文章
相關標籤/搜索