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儲存
(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地址要變化或者什麼的,你再次叢集的時候你會發現一個異常:
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