1.安裝ruby與相關(guān)組件:
查看服務(wù)器是否安裝ruby:
yum list | grep ruby
rpm -qa | grep ruby
若沒(méi)有安裝,則安裝組件:
yum install ruby
安裝gem相關(guān):
yum install rubygems
gem install redis
2、下載
mkdir redis-cluster
$ wget http://download.redis.io/releases/redis-4.0.1.tar.gz
$ tar xzf redis-4.0.1.tar.gz
$ cd redis
$ make && make install
3、將 redis-trib.rb 復(fù)制到 /usr/local/bin 目錄下
cd src
cp redis-trib.rb /usr/local/bin/
4、在redis同級(jí)新建目錄
mkdir redis7001
復(fù)制src目錄中redis-server redis-cli redis-benchmark到redis7001目錄
復(fù)制redis.conf到redis7001中
5、修改redis.conf
port 7001 //端口7001,7002,7003
bind 本機(jī)ip //默認(rèn)ip為127.0.0.1 需要改為其他節(jié)點(diǎn)機(jī)器可訪問(wèn)的ip 否則創(chuàng)建集群時(shí)無(wú)法訪問(wèn)對(duì)應(yīng)的端口,無(wú)法創(chuàng)建集群
daemonize yes //redis后臺(tái)運(yùn)行
pidfile /var/run/redis_7001.pid //pidfile文件對(duì)應(yīng)7001,7002,7003,
cluster-enabled yes //開啟集群 把注釋#去掉
cluster-config-file nodes-7001.conf //集群的配置 配置文件首次啟動(dòng)自動(dòng)生成 7001,7002,7003
cluster-node-timeout 5000 //請(qǐng)求超時(shí) 默認(rèn)15秒,可自行設(shè)置
appendonly yes //aof日志開啟 有需要就開啟,它會(huì)每次寫操作都記錄一條日志
逐一復(fù)制新建7002-7006,修改配置
6、配置啟動(dòng)各個(gè)節(jié)點(diǎn)
編寫啟動(dòng)腳本redis.sh
for port in $(seq 7001 7006) ;do /usr/local/redis-cluster/redis/src/redis-server /usr/local/redis-cluster/redis$port/redis.conf;done
編寫stop腳本rediskill.sh
for port in $(seq 7001 7006) ;do /usr/local/redis-cluster/redis/src/redis-cli -h 127.0.0.1 -p $port shutdown;done
執(zhí)行即可啟動(dòng)各個(gè)節(jié)點(diǎn)
7、創(chuàng)建集群
redis-trib.rb 是一個(gè) ruby 腳本工具,用來(lái)建立和管理 redis 集群
由于redis-trib.rb 復(fù)制到 /usr/local/bin 可以直接在命令行中使用了。使用下面這個(gè)命令即可完成安裝。
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
這個(gè)命令在這里用于創(chuàng)建一個(gè)新的集群, 選項(xiàng)–replicas 1 表示我們希望為集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建一個(gè)從節(jié)點(diǎn)。
之后跟著的其他參數(shù)則是這個(gè)集群實(shí)例的地址列表,3個(gè)master3個(gè)slave redis-trib 會(huì)打印出一份預(yù)想中的配置給你看, 如果你覺(jué)得沒(méi)問(wèn)題的話, 就可以輸入 yes , redis-trib 就會(huì)將這份配置應(yīng)用到集群當(dāng)中,讓各個(gè)節(jié)點(diǎn)開始互相通訊
>>> 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: 7c735d9b65e18d784ae7eb3c897e9845562d4c4e 127.0.0.1:7001
slots:0-5460 (5461 slots) master
M: 8d32fdf39eea5d4fd1dc91520d2584f4c8394897 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
M: 33be8b61603fef126471b850b3e1387a49898df9 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
S: 1319ecdc9d441f10ca4034d2ca39339e7d972154 127.0.0.1:7004
replicates 7c735d9b65e18d784ae7eb3c897e9845562d4c4e
S: 76dfb2c1850f0c1b16e13e956d2b80904d181d63 127.0.0.1:7005
replicates 8d32fdf39eea5d4fd1dc91520d2584f4c8394897
S: 41468246b5fd6e94cc01235baab78082798ceb22 127.0.0.1:7006
replicates 33be8b61603fef126471b850b3e1387a49898df9
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: 7c735d9b65e18d784ae7eb3c897e9845562d4c4e 127.0.0.1:7001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 8d32fdf39eea5d4fd1dc91520d2584f4c8394897 127.0.0.1:7002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 1319ecdc9d441f10ca4034d2ca39339e7d972154 127.0.0.1:7004
slots: (0 slots) slave
replicates 7c735d9b65e18d784ae7eb3c897e9845562d4c4e
M: 33be8b61603fef126471b850b3e1387a49898df9 127.0.0.1:7003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 41468246b5fd6e94cc01235baab78082798ceb22 127.0.0.1:7006
slots: (0 slots) slave
replicates 33be8b61603fef126471b850b3e1387a49898df9
S: 76dfb2c1850f0c1b16e13e956d2b80904d181d63 127.0.0.1:7005
slots: (0 slots) slave
replicates 8d32fdf39eea5d4fd1dc91520d2584f4c8394897
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
出現(xiàn)上面即為成功
進(jìn)入redis7001
執(zhí)行:
./redis-cli -c -p 7001則進(jìn)入客戶端.測(cè)試
若為ip則redis-cli -h 192.168.31.245 -c -p 7002 ,加參數(shù) -C 可連接到集群,因?yàn)樯厦?redis.conf 將 bind 改為了ip地址,所以 -h 參數(shù)不可以省略。
127.0.0.1:7002> set name test
OK
127.0.0.1:7002> get name
"test"
127.0.0.1:7003> get name
-> Redirected to slot [5798] located at 127.0.0.1:7002
"test"
8、設(shè)置密碼
注意事項(xiàng):
1.如果是使用redis-trib.rb工具構(gòu)建集群,集群構(gòu)建完成前不要配置密碼,集群構(gòu)建完畢再通過(guò)config set + config rewrite命令逐個(gè)機(jī)器設(shè)置密碼
2.如果對(duì)集群設(shè)置密碼,那么requirepass和masterauth都需要設(shè)置,否則發(fā)生主從切換時(shí),就會(huì)遇到授權(quán)問(wèn)題,可以模擬并觀察日志
3.各個(gè)節(jié)點(diǎn)的密碼都必須一致,否則Redirected就會(huì)失敗
方法一:
[root@root redis7001]# vi redis.conf
masterauth <abc>
requirepass abc
方法二:
[root@root 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
默認(rèn)前面存在#號(hào)的,修改密碼需要把#刪除
修改完重啟
9、Redis Cluster 再次安裝出現(xiàn)的異常
今天補(bǔ)充一下一個(gè)異常,當(dāng)你Redis Cluster 集群在集群一次,比如IP地址要變化或者什么的,你再次集群的時(shí)候你會(huì)發(fā)現(xiàn)一個(gè)異常:
Node 127.0.0.1:10001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解決之道:這個(gè)時(shí)候你需要把開始生成的nodes_*.conf 、appendonly.aof 、dump.rdb 文件刪除,再次集群就可以了。
10、redis啟動(dòng)腳本單個(gè)文件
vi /etc/init.d/redis
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
# chkconfig: 2345 90 10
# 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
#設(shè)置為開機(jī)自啟動(dòng)服務(wù)器
chkconfig redisd on
#打開服務(wù)
service redisd start
#關(guān)閉服務(wù)
service redisd stop