Redis集羣的安裝(Redis3.0.3 + CentOS6.6_x64)node
要讓Redis3.0集羣正常工做至少須要3個Master節點,要想實現高可用,每一個Master節點要配備至少1個Slave節點。根據以上特色和要求,進行以下的集羣實施規劃:linux
使用6臺服務器(物理機或虛擬機)部署3個Master + 3個Slave;redis
主機名數據庫 |
IP安全 |
服務端口ruby 默認6379服務器 |
集羣端口app 服務端口數+10000tcp |
主/從測試 |
dubbo-redis-01 |
192.168.1.111 |
7111 |
17111 |
Master |
dubbo-redis-02 |
192.168.1.112 |
7112 |
17112 |
Master |
dubbo-redis-03 |
192.168.1.113 |
7113 |
17113 |
Master |
dubbo-redis-04 |
192.168.1.114 |
7114 |
17114 |
Slave |
dubbo-redis-05 |
192.168.1.115 |
7115 |
17115 |
Slave |
dubbo-redis-06 |
192.168.1.116 |
7116 |
17116 |
Slave |
按規劃:防火牆中打開相應的端口
192.168.1.111
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17111 -j ACCEPT
192.168.1.112
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7112 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17112 -j ACCEPT
192.168.1.113
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7113 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17113 -j ACCEPT
192.168.1.114
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7114 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17114 -j ACCEPT
192.168.1.115
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7115 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17115 -j ACCEPT
192.168.1.116
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7116 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17116 -j ACCEPT
安裝目錄:/usr/local/redis3
用戶:root
編譯和安裝所需的包:
# yum install gcc tcl
下載(或上傳)Redis3最新穩定版(當前最新版redis-3.0.3.tar.gz)
# cd /usr/local/src
# wget http://download.redis.io/releases/redis-3.0.3.tar.gz
建立安裝目錄:
# mkdir /usr/local/redis3
解壓:
# tar -zxvf redis-3.0.3.tar.gz
# cd redis-3.0.3
安裝(使用PREFIX指定安裝目錄):
# make PREFIX=/usr/local/redis3 install
安裝完成後,能夠看到/usr/local/redis3目錄下有一個bin目錄,bin目錄裏就是redis的命令腳本:
redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server
建立集羣配置目錄,並拷貝redid.conf配置文件到各節點配置目錄:
192.168.1.111
# mkdir -p /usr/local/redis3/cluster/7111
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7111/redis-7111.conf
192.168.1.112
# mkdir -p /usr/local/redis3/cluster/7112
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7112/redis-7112.conf
192.168.1.113
# mkdir -p /usr/local/redis3/cluster/7113
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7113/redis-7113.conf
192.168.1.114
# mkdir -p /usr/local/redis3/cluster/7114
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7114/redis-7114.conf
192.168.1.115
# mkdir -p /usr/local/redis3/cluster/7115
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7115/redis-7115.conf
192.168.1.116
# mkdir -p /usr/local/redis3/cluster/7116
# cp /usr/local/src/redis-3.0.3/redis.conf /usr/local/redis3/cluster/7116/redis-7116.conf
修改配置文件中的下面選項:
6個節點的redis.conf配置文件內容,注意修改下紅色字體部分的內容便可,其餘都相同:
配置選項 |
選項值 |
說明 |
daemonize |
yes |
是否做爲守護進程運行 |
pidfile |
/var/run/redis-7111.pid |
如之後臺進程運行,則需指定一個pid, 默認爲/var/run/redis.pid |
port |
7111 |
監聽端口,默認爲6379 注意:集羣通信端口值默認爲此端口值+10000,如17111 |
databases |
1 |
可用數據庫數,默認值爲16,默認數據庫存儲在DB 0號ID庫中,無特殊需求,建議僅設置一個數據庫 databases 1 |
cluster-enabled |
yes |
打開redis集羣 |
cluster-config-file |
/usr/local/redis3/cluster/7111/nodes.conf |
集羣配置文件(啓動自動生成),不用人爲干涉 |
cluster-node-timeout |
15000 |
節點互連超時時間。毫秒 |
cluster-migration-barrier |
1 |
數據遷移的副本臨界數,這個參數表示的是,一個主節點在擁有多少個好的從節點的時候就要割讓一個從節點出來給另外一個沒有任何從節點的主節點。 |
cluster-require-full-coverage |
yes |
若是某一些key space沒有被集羣中任何節點覆蓋,集羣將中止接受寫入。 |
appendonly |
yes |
啓用aof持久化方式 由於redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認值爲no |
dir |
/usr/local/redis3/cluster/7111 |
節點數據持久化存放目錄(建議配置) |
包含了最少選項的集羣配置文件示例以下:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
使用以下命令啓動這6個Redis節點實例:
192.168.1.111
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf
192.168.1.112
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7112/redis-7112.conf
192.168.1.113
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7113/redis-7113.conf
192.168.1.114
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7114/redis-7114.conf
192.168.1.115
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7115/redis-7115.conf
192.168.1.116
# /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7116/redis-7116.conf
啓動以後用PS命令查看實例啓動狀況:
[root@dubbo-redis-01 cluster]# ps -ef | grep redis
root 5443 1 0 22:49 ? 00:00:00 /usr/local/redis3/bin/redis-server *:7111 [cluster]
[root@dubbo-redis-02 cluster]# ps -ef | grep redis
root 5421 1 0 22:49 ? 00:00:00 /usr/local/redis3/bin/redis-server *:7112 [cluster]
[root@dubbo-redis-03 cluster]# ps -ef | grep redis
root 5457 1 0 22:49 ? 00:00:00 /usr/local/redis3/bin/redis-server *:7113 [cluster]
[root@dubbo-redis-04 cluster]# ps -ef | grep redis
root 5379 1 0 22:50 ? 00:00:00 /usr/local/redis3/bin/redis-server *:7114 [cluster]
[root@dubbo-redis-05 cluster]# ps -ef | grep redis
root 5331 1 0 22:50 ? 00:00:00 /usr/local/redis3/bin/redis-server *:7115 [cluster]
[root@dubbo-redis-06 cluster]# ps -ef | grep redis
root 5687 1 0 22:50 ? 00:00:00 /usr/local/redis3/bin/redis-server *:7116 [cluster]
注意:啓動完畢後,6個Redis實例還沒有構成集羣。
接下來準備建立集羣
安裝ruby和rubygems(注意:須要ruby的版本在1.8.7 以上)
# yum -y install
ruby ruby-devel rubygems rpm-build
檢查ruby版本:
# ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
gem 安裝 redis ruby 接口:
# gem install redis
Successfully installed redis-3.2.1
1 gem installed
Installing ri documentation for redis-3.2.1...
Installing RDoc documentation for redis-3.2.1...
若是執行以上的gem install redis拋錯redis requires Ruby version >=2.2.2時
解決辦法:升級ruby版本
一、卸載當前ruby
yum remove ruby
二、下載ruby穩定版(網上找的是2.5.3,但我實際用的2.4.2https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.2.tar.gz)
cd /usr/local/src wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.3.tar.gz
三、安裝ruby
tar zxvf ruby-2.5.3.tar.gz cd ruby-2.5.3 ./configure --prefix=/usr/local/ruby make
make install
查看安裝後的版本
/usr/local/ruby/bin/ruby -v
設置環境變量
echo "export PATH=$PATH:/usr/local/ruby/bin" >> /etc/profile source /etc/profile
驗證下
echo $PATH
五、安裝
gem install redis
至此,game install redis 報錯已解決
執行Redis集羣建立命令(只須要在其中一個節點上執行一次則可)
# cd /usr/local/src/redis-3.0.3/src/
# cp redis-trib.rb /usr/local/bin/redis-trib
# redis-trib create --replicas 1 192.168.1.114:7114 192.168.1.115:7115 192.168.1.116:7116 192.168.1.111:7111 192.168.1.112:7112 192.168.1.113:7113
>>> Creating cluster
Connecting to node 192.168.1.114:7114: OK
Connecting to node 192.168.1.115:7115: OK
Connecting to node 192.168.1.116:7116: OK
Connecting to node 192.168.1.111:7111: OK
Connecting to node 192.168.1.112:7112: OK
Connecting to node 192.168.1.113:7113: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.113:7113
192.168.1.112:7112
192.168.1.111:7111
Adding replica 192.168.1.116:7116 to 192.168.1.113:7113
Adding replica 192.168.1.115:7115 to 192.168.1.112:7112
Adding replica 192.168.1.114:7114 to 192.168.1.111:7111
S: 007a3fe8d7451d3d0a78fffd2653c8641809499c 192.168.1.114:7114
replicates 94e140b9ca0735040ae3428983835f1d93327aeb
S: ea69b6b6e2e7723eed50b1dabea9d244ccf3f098 192.168.1.115:7115
replicates c642b3071c4b2b073707ed3c3a2c16d53a549eff
S: 5f09dc0671732cf06a09f28631c90e0c68408520 192.168.1.116:7116
replicates 896a3c99da4fcf680de1f42406fccb551d8c40c3
M: 94e140b9ca0735040ae3428983835f1d93327aeb 192.168.1.111:7111
slots:10923-16383 (5461 slots) master
M: c642b3071c4b2b073707ed3c3a2c16d53a549eff 192.168.1.112:7112
slots:5461-10922 (5462 slots) master
M: 896a3c99da4fcf680de1f42406fccb551d8c40c3 192.168.1.113:7113
slots:0-5460 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
(輸入 yes 並按下回車確認以後,集羣就會將配置應用到各個節點,並鏈接起(join)各個節點,也就是讓各個節點開始互相通信)
>>> 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 192.168.1.114:7114)
M: 007a3fe8d7451d3d0a78fffd2653c8641809499c 192.168.1.114:7114
slots: (0 slots) master
replicates 94e140b9ca0735040ae3428983835f1d93327aeb
M: ea69b6b6e2e7723eed50b1dabea9d244ccf3f098 192.168.1.115:7115
slots: (0 slots) master
replicates c642b3071c4b2b073707ed3c3a2c16d53a549eff
M: 5f09dc0671732cf06a09f28631c90e0c68408520 192.168.1.116:7116
slots: (0 slots) master
replicates 896a3c99da4fcf680de1f42406fccb551d8c40c3
M: 94e140b9ca0735040ae3428983835f1d93327aeb 192.168.1.111:7111
slots:10923-16383 (5461 slots) master
M: c642b3071c4b2b073707ed3c3a2c16d53a549eff 192.168.1.112:7112
slots:5461-10922 (5462 slots) master
M: 896a3c99da4fcf680de1f42406fccb551d8c40c3 192.168.1.113:7113
slots:0-5460 (5461 slots) master
一切正常的狀況下輸出如下信息:
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
最後一行信息表示集羣中的 16384 個槽都有至少一個主節點在處理, 集羣運做正常。
集羣建立過程說明:
(1) 給定 redis-trib 程序的命令是 create , 這表示咱們但願建立一個新的集羣;
(2) 這裏的 --replicas 1 表示每一個主節點下有一個從節點;
(3) 以後跟着的其它參數則是實例的地址列表,程序使用這些地址所指示的實例來建立新集羣;
總的來講,以上命令的意思就是讓 redis-trib 程序建立一個包含三個主節點和三個從節點的集羣。
接着,redis-trib 會打印出一份預想中的配置給你看,若是你以爲沒問題的話(注意覈對主從關係是不是你想要的),就能夠輸入 yes , redis-trib 就會將這份配置應用到集羣當中。
集羣簡單測試
使用 redis-cli命令進入集羣環境
[root@dubbo-redis-04 bin]# ./redis-cli -c -p 7114
127.0.0.1:7114> set huangkejie huangkejie
-> Redirected to slot [8559] located at 192.168.1.112:7112
OK
[root@dubbo-redis-01 bin]# ./redis-cli -c -p 7111
127.0.0.1:7111> get huangkejie
-> Redirected to slot [8559] located at 192.168.1.112:7112
"huangkejie"
[root@dubbo-redis-02 bin]# ./redis-cli -c -p 7112
127.0.0.1:7112> get huangkejie
"huangkejie"
127.0.0.1:7112>
[root@dubbo-redis-01 bin]# ./redis-cli -p 7111 cluster nodes
將Redis配置成服務
(非僞集羣適用,也就是每一個節點都單獨物理機部署的狀況下):
按上面的操做步驟,Redis的啓動腳本爲:/usr/local/src/redis-3.0.3/utils/redis_init_script
將啓動腳本複製到/etc/rc.d/init.d/目錄下,並命名爲redis:
# cp /usr/local/src/redis-3.0.3/utils/redis_init_script /etc/rc.d/init.d/redis
編輯/etc/rc.d/init.d/redis,修改相應配置,使之能註冊成爲服務:
# vi /etc/rc.d/init.d/redis
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDISPORT=6379
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/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
查看以上redis服務腳本,關注標爲橙色的幾個屬性,作以下幾個修改的準備:
#chkconfig: 2345 80 90
(若是不添加上面的內容,在註冊服務時會提示:service redis does not support chkconfig)
CONF="/etc/redis/${REDISPORT}.conf"
改成 CONF="/usr/local/redis3/cluster/${REDISPORT}/redis-${REDISPORT}.conf"
$EXEC $CONF & #「&」做用是將服務轉到後面運行
修改後的/etc/rc.d/init.d/redis服務腳本內容爲(注意各節點的端口不一樣):
#!/bin/sh
#chkconfig: 2345 80 90
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDISPORT=7111
EXEC=/usr/local/redis3/bin/redis-server
CLIEXEC=/usr/local/redis3/bin/redis-cli
PIDFILE=/var/run/redis-${REDISPORT}.pid
CONF="/usr/local/redis3/cluster/${REDISPORT}/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
以上配置操做完成後,即可將Redis註冊成爲服務:
# chkconfig --add redis
防火牆中打開對應的端口,各節點的端口不一樣(前面已操做則可跳過此步)
# vi /etc/sysconfig/iptables
添加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7111 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 17111 -j ACCEPT
重啓防火牆:
# service iptables restart
啓動Redis服務
# service redis start
將Redis添加到環境變量中:
# vi /etc/profile
在最後添加如下內容:
## Redis env
export PATH=$PATH:/usr/local/redis3/bin
使配置生效:
# source /etc/profile
如今就能夠直接使用redis-cli等redis命令了:
關閉Redis服務
# service redis stop
默認狀況下,Redis未開啓安全認證,能夠經過/usr/local/redis3/cluster/7111/redis-7111.conf的requirepass指定一個驗證密碼。