Redis3.0.7集群部署

Redis 是一個(gè)高性能的key-value數(shù)據(jù)庫(kù)。它支持存儲(chǔ)多種value類(lèi)型,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類(lèi)型)。這些數(shù)據(jù)類(lèi)型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。同時(shí),為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。Redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。

準(zhǔn)備工作

要讓集群正常工作至少需要3個(gè)主節(jié)點(diǎn),在這里我們要?jiǎng)?chuàng)建6個(gè)redis節(jié)點(diǎn)并部署到2臺(tái)物理節(jié)點(diǎn)上,其中三個(gè)為主節(jié)點(diǎn),三個(gè)為從節(jié)點(diǎn),對(duì)應(yīng)的redis節(jié)點(diǎn)的ip和端口對(duì)應(yīng)關(guān)系如下)

192.168.1.121:7000
192.168.1.121:7001
192.168.1.121:7002

192.168.1.122:7000
192.168.1.122:7001
192.168.1.122:7002

一、安裝Redis

  • 下載redis,這里需要下載3.0之后的版本,之前的版本不支持集群模式,本文采用最新的3.0.7版本。(所有節(jié)點(diǎn))
cd /home/soft
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
  • 解壓,編譯 編譯前確保安裝好了gcc(所有節(jié)點(diǎn))
tar -zxvf redis-3.0.7.tar.gz
cd /home/soft/redis3.0.7  
make 
make install
  • 創(chuàng)建集群需要的目錄(節(jié)點(diǎn)1)
mkdir -p /home/soft/cluster
cd /home/soft/cluster
mkdir 7000
mkdir 7001
mkdir 7002
  • 修改配置文件redis.conf(節(jié)點(diǎn)1)
cp /home/soft/redis3.0.7/redis.conf  /home/soft/cluster
vi redis.conf

修改配置文件中的下面選項(xiàng)

port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
  • 修改完redis.conf配置文件中的這些配置項(xiàng)之后把這個(gè)配置文件分別拷貝到7000/7001/7002目錄下面(節(jié)點(diǎn)1)
cp /home/soft/cluster/redis.conf /home/soft/cluster/7000
cp /home/soft/cluster/redis.conf /home/soft/cluster/7001
cp /home/soft/cluster/redis.conf /home/soft/cluster/7002

注意:拷貝完成之后要修改7001/7002目錄下面redis.conf文件中的port參數(shù),分別改為對(duì)應(yīng)的文件夾的名稱(chēng)。

  • 將節(jié)點(diǎn)1上的cluster目錄拷貝到其他節(jié)點(diǎn)上(節(jié)點(diǎn)1)
scp -r /home/soft/cluster root@192.168.1.122:/home/soft/
  • 分別啟動(dòng)這6個(gè)redis實(shí)例
//節(jié)點(diǎn)1
cd /home/soft/cluster/7000
redis-server redis.conf
cd /home/soft/cluster/7001
redis-server redis.conf
cd /home/soft/cluster/7002
redis-server redis.conf

//節(jié)點(diǎn)2
cd /home/soft/cluster/7000
redis-server redis.conf
cd /home/soft/cluster/7001
redis-server redis.conf
cd /home/soft/cluster/7002
redis-server redis.conf
  • 啟動(dòng)之后使用命令查看redis的啟動(dòng)情況
ps -ef|grep redis

如下圖顯示則說(shuō)明對(duì)應(yīng)節(jié)點(diǎn)的redis實(shí)例啟動(dòng)成功。


redis實(shí)例啟動(dòng)

二、創(chuàng)建集群

  • 安裝ruby環(huán)境
yum -y install ruby
  • 安裝rubygems
yum -y install rubygems
  • 安裝gem redis
gem install -l redis
  • 執(zhí)行redis的創(chuàng)建集群命令創(chuàng)建集群(單節(jié)點(diǎn)即可)
cd /home/soft/redis3.0.7/src 
./redis-trib.rb  create --replicas 1 192.168.1.121:7000 192.168.1.121:7001 192.168.1.121:7002 192.168.1.122:7000 192.168.1.122:7001 192.168.1.122:7002

--replicas表示為每個(gè)master節(jié)點(diǎn)創(chuàng)建多少個(gè)slave節(jié)點(diǎn)。
創(chuàng)建過(guò)程中,redis-trib 會(huì)打印出一份預(yù)想中的配置給你看, 如果你覺(jué)得沒(méi)問(wèn)題的話(huà), 就可以輸入 yes , redis-trib 就會(huì)將這份配置應(yīng)用到集群當(dāng)中,讓各個(gè)節(jié)點(diǎn)開(kāi)始互相通訊,配置完成。

至此redis集群即搭建成功!

  • 使用redis-cli命令進(jìn)入集群環(huán)境
redis-cli -c -p 7000
//或者指定訪問(wèn)ip
redis-cli -c -p 7000 -h 192.168.1.121

簡(jiǎn)單測(cè)試下

redis集群模式測(cè)試

從圖中可以看出,它總是依靠 Redis 集群節(jié)點(diǎn)來(lái)將它轉(zhuǎn)向(redirect)至正確的節(jié)點(diǎn)。

三、設(shè)置開(kāi)機(jī)自啟

  • 設(shè)置redis.conf中daemonize為yes,確保守護(hù)進(jìn)程開(kāi)啟。
  • 編寫(xiě)開(kāi)機(jī)自啟動(dòng)腳本
vi /etc/init.d/redis7000

腳本內(nèi)容如下:

# chkconfig: 2345 10 90  
# description: Start and Stop redis   
  
PATH=/usr/local/bin:/sbin:/usr/bin:/bin
REDISPORT=7000
EXEC=/usr/local/bin/redis-server
REDIS_CLI=/usr/local/bin/redis-cli

PIDFILE=/var/run/redis.pid
CONF="/home/soft/cluster/7000/redis.conf" 
AUTH=""  

case "$1" in   
        start)   
                if [ -f $PIDFILE ]   
                then   
                        echo "$PIDFILE exists, process is already running or crashed."  
                else  
                        echo "Starting Redis server..."  
                        $EXEC $CONF   
                fi   
                if [ "$?"="0" ]   
                then   
                        echo "Redis is running..."  
                fi   
                ;;   
        stop)   
                if [ ! -f $PIDFILE ]   
                then   
                        echo "$PIDFILE exists, process is not running."  
                else  
                        PID=$(cat $PIDFILE)   
                        echo "Stopping..."  
                       $REDIS_CLI -p $REDISPORT  SHUTDOWN    
                        sleep 2  
                       while [ -x $PIDFILE ]   
                       do  
                                echo "Waiting for Redis to shutdown..."  
                               sleep 1  
                        done   
                        echo "Redis stopped"  
                fi   
                ;;   
        restart|force-reload)   
                ${0} stop   
                ${0} start   
                ;;   
        *)   
               echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2  
                exit 1  
esac

編寫(xiě)完成后保存退出。

  • 設(shè)置權(quán)限
chmod 755 redis
  • 啟動(dòng)
/etc/init.d/redis7000 start

啟動(dòng)成功會(huì)提示如下信息:

Starting Redis server...
Redis is running...
  • 設(shè)置開(kāi)機(jī)自啟動(dòng)
chkconfig redis on
  • 關(guān)機(jī)重啟測(cè)試
reboot

四、Cluster操作

  • 集群
CLUSTER INFO 打印集群的信息  
CLUSTER NODES 列出集群當(dāng)前已知的所有節(jié)點(diǎn)(node),以及這些節(jié)點(diǎn)的相關(guān)信息。  
  • 節(jié)點(diǎn)
CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節(jié)點(diǎn)添加到集群當(dāng)中,讓它成為集群的一份子。  
CLUSTER FORGET <node_id> 從集群中移除 node_id 指定的節(jié)點(diǎn)。  
CLUSTER REPLICATE <node_id> 將當(dāng)前節(jié)點(diǎn)設(shè)置為 node_id 指定的節(jié)點(diǎn)的從節(jié)點(diǎn)。  
CLUSTER SAVECONFIG 將節(jié)點(diǎn)的配置文件保存到硬盤(pán)里面。 
  • 槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 將一個(gè)或多個(gè)槽(slot)指派(assign)給當(dāng)前節(jié)點(diǎn)。  
CLUSTER DELSLOTS <slot> [slot ...] 移除一個(gè)或多個(gè)槽對(duì)當(dāng)前節(jié)點(diǎn)的指派。  
CLUSTER FLUSHSLOTS 移除指派給當(dāng)前節(jié)點(diǎn)的所有槽,讓當(dāng)前節(jié)點(diǎn)變成一個(gè)沒(méi)有指派任何槽的節(jié)點(diǎn)。  
CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節(jié)點(diǎn),如果槽已經(jīng)指派給另一個(gè)節(jié)點(diǎn),那么先讓另一個(gè)節(jié)點(diǎn)刪除該槽>,然后再進(jìn)行指派。  
CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節(jié)點(diǎn)的槽 slot 遷移到 node_id 指定的節(jié)點(diǎn)中。  
CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節(jié)點(diǎn)中導(dǎo)入槽 slot 到本節(jié)點(diǎn)。  
CLUSTER SETSLOT <slot> STABLE 取消對(duì)槽 slot 的導(dǎo)入(import)或者遷移(migrate)。 
CLUSTER KEYSLOT <key> 計(jì)算鍵 key 應(yīng)該被放置在哪個(gè)槽上。  
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對(duì)數(shù)量。  
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個(gè) slot 槽中的鍵。 

五、客戶(hù)端操作

需要注意的是集群模式目前不支持多數(shù)據(jù)庫(kù)操作,即只能使用database 0,使用select命令會(huì)報(bào)錯(cuò)。

JedisPoolConfig config = new JedisPoolConfig();  
config.setMaxTotal(20);  
config.setMaxIdle(2);

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.1.121", 7002));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.1.122", 7002));
 // 超時(shí),最大的轉(zhuǎn)發(fā)數(shù),最大鏈接數(shù),最小鏈接數(shù)都會(huì)影響到集群  
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 5000, 10, config);  
jedisCluster.set("key","value");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容