1. 程式人生 > >CentOS7 配置redis3.0叢集開機啟動

CentOS7 配置redis3.0叢集開機啟動

 1. Redis Cluster的架構圖。

1.1redis-cluster架構圖

架構細節

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

(4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value

1.2 redis--cluster

(1)領著選舉過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.

(2):什麼時候整個叢集不可用(cluster_state:fail),當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

    a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成進群的slot對映[0-16383]不完成時進入fail狀態.

    b:如果進群超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.

   ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error)CLUSTERDOWN Thecluster is down)錯誤。

2.redis叢集安裝

線上的統一聊天和推送專案使用的是Redis主從,redis版本3.0

redis主從和MySQL主從目的差不多,但redis主從配置很簡單,主要在從節點配置檔案指定主節點ip和埠:slaveof  120.77.213.193  6379,然後啟動主從,主從就搭建好了redis主從中如果主節點發生故障,不會自動切換,需要藉助redis的Sentinel或者keepalive來實現主的故障轉移

redis叢集是一個無中心的分散式redis儲存

架構,可以在多個節點之間進行資料共享,解決了redis高可用、可擴充套件等問題,redis叢集提供了以下兩個好處
(1)、將資料自動切分(split)到多個節點
(2)、當叢集中的某一個節點故障時,redis還可以繼續處理客戶端的請求。
一個 Redis 叢集包含 16384 個雜湊槽(hash slot),資料庫中的每個資料都屬於這16384個雜湊槽中的一個。叢集使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪個槽。叢集中的每一個節點負責處理一部分雜湊槽。
叢集中的主從複製
叢集中的每個節點都有1個至N個複製品,其中一個為主節點,其餘的為從節點,如果主節點下線了,叢集就會把這個主節點的一個從節點設定為新的主節點,繼續工作。這樣叢集就不會因為一個主節點的下線而無法正常工作

下面開始搭建redis叢集

因為redis-cluster要求最少6個節點(maseter*3 + slave*3)主  附

1.安裝ruby與相關元件:

檢視伺服器是否安裝ruby:
yum list | grep ruby
rpm -qa | grep ruby

若沒有安裝,則安裝元件:

yum install ruby
然後輸入y則安裝成功

安裝gem相關:

yum install rubygems


gem install redis

這裡可能無法安裝,因為無法連線gem伺服器:
[@zw_22_90 src]# gem install redis --version 3.0.0
ERROR: Could not find a valid gem 'redis' (= 3.0.0) in any repository
ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError)

需要手工下載並安裝:
wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem
gem install -l ./redis-3.2.1.gem

2. 安裝redis

redis 6個節點的ip和埠對應關係

120.77.213.193:7001

120.77.213.193:7002

120.77.213.193:7003

120.77.213.193:7004

120.77.213.193:7005

120.77.213.193:7006

[[email protected] ~]# cd  /usr/java
[[email protected] java]# mkdir redis-cluster
[[email protected] java]# cd redis-cluster
[[email protected] redis-cluster]# wget http://download.redis.io/releases/redis-3.0.6.tar.gz  
[[email protected] redis-cluster]# tar -zxvf  redis-3.0.6.tar.gz
[[email protected] redis-cluster]# mkdir redis7001
[[email protected] redis-cluster]# mkdir redis7002
[[email protected] redis-cluster]# mkdir redis7003
[[email protected] redis-cluster]# mkdir redis7004
[[email protected] redis-cluster]# mkdir redis7001
[[email protected] redis-cluster]# mkdir redis7001
[[email protected] redis-cluster]# cd  redis-3.0.6
[[email protected] redis-3.0.6]#make     			編譯

3、修改配置檔案redis.conf

拷貝/redis-3.0.6/src目錄下的3個檔案:

redis-server    redis-cli     redis-benchmark到redis-3.0.6目錄

複製redis-3.0.6的檔案到7001個redis資料夾下,執行命令:

[[email protected] redis-cluster]# cp -Rf redis-3.0.6/*   redis7001
[[email protected] redis-cluster]# cd redis7001
[[email protected] redis-cluster]#  vi redis.conf
修改配置檔案
daemonize    yes                    //redis後臺執行
port  7001                         //埠10000
cluster-enabled  yes                  //開啟叢集  把註釋#去掉
cluster-config-file  nodes_10000.conf         //叢集的配置  配置檔案首次啟動自動生成
cluster-node-timeout  5000            	//請求超時  設定5秒夠了
appendonly  yes                      //aof日誌開啟  有需要就開啟,它會每次寫操作都記錄一條日誌[[email protected] redis-cluster]# cp -Rf redis7001/*   redis7002
	//請求超時  設定5秒夠了
appendonly  yes                      //aof日誌開啟  有需要就開啟,它會每次寫操作都記錄一條日誌[[email protected] redis-cluster]# cp -Rf redis7001/*   redis7002
[[email protected] redis-cluster]# cp -Rf redis7001/*   redis7003
[[email protected] redis-cluster]# cp -Rf redis7001/*   redis7004
[[email protected] redis-cluster]# cp -Rf redis7001/*   redis7005
[[email protected] redis-cluster]# cp -Rf redis7001/*   redis7006

拷貝完成之後要分別修改7002/7003/7004/7005/7006目錄下面redis.conf檔案中的port引數

4 分別進入6個檔案,啟動6個redis例項

redis-server redis.conf 

[[email protected] redis-cluster]# cd redis7001
[[email protected] redis7001]# ./redis-server ./redis.conf 
[[email protected] redis7001]# cd ../redis7002
[[email protected] redis7002]# ./redis-server ./redis.conf 
[[email protected] redis7002]# cd ../redis7003
[[email protected] redis7003]# ./redis-server ./redis.conf 
[[email protected] redis7003]# cd ../redis7004
[[email protected] redis7004]# ./redis-server ./redis.conf 
[[email protected] redis7004]# cd ../redis7005
[[email protected] redis7005]# ./redis-server ./redis.conf 
[[email protected] redis7005]# cd ../redis7006
[[email protected] redis7006]# ./redis-server ./redis.conf 

啟動完成後:

執行ps -ef|grep redis可看到如下:

[[email protected] redis-cluster]# ps -ef|grep redis
root      5478     1  0 14:24 ?        00:00:00 ./redis-server *:7001 [cluster]
root      5485     1  0 14:24 ?        00:00:00 ./redis-server *:7002 [cluster]
root      5489     1  0 14:24 ?        00:00:00 ./redis-server *:7003 [cluster]
root      5493     1  0 14:24 ?        00:00:00 ./redis-server *:7004 [cluster]
root      5497     1  0 14:24 ?        00:00:00 ./redis-server *:7005 [cluster]
root      5502     1  0 14:24 ?        00:00:00 ./redis-server *:7006 [cluster]
root      5512  4934  0 14:26 pts/1    00:00:00 grep --color=auto redis

5.執行redis的建立叢集命令建立叢集(注意ip地址和埠號)

將src資料夾下的redis-trib.rb檔案拷貝到redis-cluster目錄下,執行命令:

./redis-trib.rb  create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006

提示是否允許修改配置檔案,輸入yes----即可啟動redis叢集  

[[email protected] redis-cluster]# ./redis-trib.rb  create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: c60d1642a36bb253364daa244b1e1e868606c4a6 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: 63eedc9839436f369be521e724d59822a7291841 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: 312cbfb3f8f7613587b923eb091b43510942898e 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: f7fde42093d0cd2797a55d4712667f19811c5237 127.0.0.1:7004
   replicates c60d1642a36bb253364daa244b1e1e868606c4a6
S: 2e7ba20edd2012eb861ad9c6cc4402ffb1bbc68a 127.0.0.1:7005
   replicates 63eedc9839436f369be521e724d59822a7291841
S: d3173bad6d9564470ea98f69d7552cd666c44d60 127.0.0.1:7006
   replicates 312cbfb3f8f7613587b923eb091b43510942898e
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: c60d1642a36bb253364daa244b1e1e868606c4a6 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: 63eedc9839436f369be521e724d59822a7291841 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: 312cbfb3f8f7613587b923eb091b43510942898e 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
M: f7fde42093d0cd2797a55d4712667f19811c5237 127.0.0.1:7004
   slots: (0 slots) master
   replicates c60d1642a36bb253364daa244b1e1e868606c4a6
M: 2e7ba20edd2012eb861ad9c6cc4402ffb1bbc68a 127.0.0.1:7005
   slots: (0 slots) master
   replicates 63eedc9839436f369be521e724d59822a7291841
M: d3173bad6d9564470ea98f69d7552cd666c44d60 127.0.0.1:7006
   slots: (0 slots) master
   replicates 312cbfb3f8f7613587b923eb091b43510942898e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

這樣就可以登入客戶端檢視叢集狀況:

進入redis7001

執行:

./redis-cli -c -p 7001則進入客戶端.

測試

[[email protected] redis-cluster]# cd redis7001
[[email protected] redis7001]# ./redis-cli -c -p 7001
127.0.0.1:7001> get key
-> Redirected to slot [12539] located at 127.0.0.1:7003
(nil)
127.0.0.1:7003> set name test
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set adress lye
-> Redirected to slot [1562] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get key
-> Redirected to slot [12539] located at 127.0.0.1:7003
(nil)
127.0.0.1:7003> set key val
OK
127.0.0.1:7003> get key
"val"
127.0.0.1:7003> set key2 val2
-> Redirected to slot [4998] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get key2
"val2"

查詢所有的key   

keys *

叢集狀態檢視:

cluster nodes
cluster info 

6.設定密碼

注意事項:

1.如果是使用redis-trib.rb工具構建叢集,叢集構建完成前不要配置密碼,叢集構建完畢再通過config set + config rewrite命令逐個機器設定密碼

2.如果對叢集設定密碼,那麼requirepass和masterauth都需要設定,否則發生主從切換時,就會遇到授權問題,可以模擬並觀察日誌

3.各個節點的密碼都必須一致,否則Redirected就會失敗

方法一:

[[email protected] redis7001]# vi redis.conf 

masterauth  <abc>

requirepass  abc

預設前面存在#號的,修改密碼需要把#刪除

修改完重啟

[[email protected] redis7001]# ./redis-server ./redis.conf&

方法二:

[[email protected] redis7001]# ./redis-cli -c -p 7001
127.0.0.1:7001> config set masterauth abc
OK
127.0.0.1:7001> config set requirepass abc
OK
127.0.0.1:7001> config rewrite


測試:

[[email protected] redis-cluster]# cd redis7001
[[email protected] redis7001]# ./redis-cli -c -p 7001 
127.0.0.1:7001> cluster nodes
NOAUTH Authentication required.   #因為設定了密碼,所以如何操作需要輸入密碼驗證
127.0.0.1:7001> auth "abc"        #這裡輸入設定密碼
OK
127.0.0.1:7001> cluster nodes
d3173bad6d9564470ea98f69d7552cd666c44d60 127.0.0.1:7006 slave 312cbfb3f8f7613587b923eb091b43510942898e 0 1483519617809 6 connected
2e7ba20edd2012eb861ad9c6cc4402ffb1bbc68a 127.0.0.1:7005 slave 63eedc9839436f369be521e724d59822a7291841 0 1483519618809 5 connected
63eedc9839436f369be521e724d59822a7291841 127.0.0.1:7002 master - 0 1483519621815 2 connected 5461-10922
c60d1642a36bb253364daa244b1e1e868606c4a6 127.0.0.1:7001 myself,master - 0 0 1 connected 0-5460
312cbfb3f8f7613587b923eb091b43510942898e 127.0.0.1:7003 master - 0 1483519619811 3 connected 10923-16383
f7fde42093d0cd2797a55d4712667f19811c5237 127.0.0.1:7004 slave c60d1642a36bb253364daa244b1e1e868606c4a6 0 1483519620814 4 connected
127.0.0.1:7001> 

Redis Cluster 再次安裝出現的異常

今天補充一下一個異常,當你Redis Cluster 叢集在叢集一次,比如IP地址要變化或者什麼的,你再次叢集的時候你會發現一個異常:

  1. Node127.0.0.1:10001isnot empty.Either the nodealready knows other nodes (check with CLUSTER NODES)or contains some key in database 0.

這個時候你需要把開始生成的nodes_*.conf 、appendonly.aof 、dump.rdb  檔案刪除,再次叢集就可以了。

這裡是設定的是某一個redis開機啟動,沒有使用叢集,這裡設定的是7001

1. 根據啟動指令碼要求,將修改好的配置檔案以埠為名複製一份到指定目錄。需使用root使用者

mkdir /etc/redis
cp redis.conf /etc/redis/7001.conf

修改7001.conf檔案

daemonize no 改為 daemonize  yes

pidfile  /var/run/redis.pid  改為  pidfile  /var/run/redis_7001.pid


 2. 將啟動指令碼複製到/etc/init.d目錄下,本例將啟動指令碼命名為redis。

cp  utils/redis_init_script   /etc/init.d/redis


編輯redis,插入下面2行註釋

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 80 90
# description: Redis is a persistent key-value database# chkconfig: 2345 80 90
# description: Redis is a persistent key-value database

完整配置為

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 80 90
# description: Redis is a persistent key-value database

REDISPORT=7001
EXEC=/usr/java/redis-cluster/redis7001/redis-server
CLIEXEC=/usr/java/redis-cluster/redis7001/redis-cli

PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/${REDISPORT}.conf"

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
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -p $REDISPORT shutdown
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
    *)
        echo "Please use start or stop as first argument"
        ;;
esac
#註冊為服務
chkconfig --add redis
#設定為開機自啟動伺服器
chkconfig redis on
#開啟服務
service redis start
#關閉服務
service redis stop