Redis集群安装
目标:在linux一台机器上安装redis,并部署6节点集群
1.下载redis,安装redis
cd /data/redis-server
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
tar -zxvf redis-4.0.1.tar.gz
cd redis-4.0.1
make && make install
|
若无redis-server目录,mkdir redis-server
2.创建redis节点
在redis-4.0.1目录下 创建目录
mkdir redis_cluste
cd redis_cluste
|
在redis_cluste目录中创建6个节点目录
mkdir 7000 7001 7002 7003 7004 7005
|
退出到redis-4.0.1目录下,将redis.conf配置文件拷贝到各节点目录下
cp redis.conf redis_cluster/7000
cp redis.conf redis_cluster/7001
cp redis.conf redis_cluster/7002
cp redis.conf redis_cluster/7003
cp redis.conf redis_cluster/7004
cp redis.conf redis_cluster/7005
|
对应修改各节点下的redis.conf文件如下:
port:7000 //对应相应节点的端口号
//默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。
//你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP,此处绑定本机ip。
bind:127.0.0.1
//默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。
//当redis作为守护进程运行的时候,它会写一个 pid 到 /var/run/redis_700x.pid 文件里面。
daemonize yes
//根据对应节点的端口号,自定义作为守护线程后台运行的redis的pid文件存储位置
pidfile /var/run/redis_7000.pid
cluster-config-file nodes-7000.conf //集群配置
cluster-node-timeout 5000 //请求超时时间
appendonly yes //aof日志开启,会在每次写数据时,记录日志
//dir 设置的是节点的文件存放目录 存放文件:appendonly.aof dump.rdb nodes-7000.conf redis.conf
dir /data/redis-server/redis-4.0.1/redis_cluster/7000/
3.启动集群中的各个节点
进入redis-4.0.1/src目录下分别执行以下命令,启动各个节点
./redis-server ../redis_cluster/7000/redis.conf
./redis-server ../redis_cluster/7001/redis.conf
./redis-server ../redis_cluster/7002/redis.conf
./redis-server ../redis_cluster/7003/redis.conf
./redis-server ../redis_cluster/7004/redis.conf
./redis-server ../redis_cluster/7005/redis.conf
|
启动后 ps -ef|grep redis 查看各节点启动情况
root 2542 1 0 13:59 ? 00:00:00 ./redis-server 127.0.0.1:7000 [cluster]
root 2707 1 0 14:00 ? 00:00:00 ./redis-server 127.0.0.1:7001 [cluster]
root 2750 1 0 14:00 ? 00:00:00 ./redis-server 127.0.0.1:7002 [cluster]
root 2794 1 0 14:01 ? 00:00:00 ./redis-server 127.0.0.1:7003 [cluster]
root 2861 1 0 14:01 ? 00:00:00 ./redis-server 127.0.0.1:7004 [cluster]
root 3343 1 0 14:01 ? 00:00:00 ./redis-server 127.0.0.1:7005 [cluster]
root 3570 1326 0 14:01 pts/2 00:00:00 grep --color=auto redis
|
4.创建集群
参考redis官方集群教程(http://www.redis.cn/topics/cluster-tutorial.html)
进入/data/redis-server/redis-4.0.1/src目录下,执行以下脚本构建集群
redis-trib.rb create --replicas 1 127.0.0.1:7000 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
PS前面的的步骤都如此顺滑,以至于想象着要大功告成了,但万万没想到,噩梦才刚刚开始,当去执行这个脚本的时候出错了,报的错误信息,大致是找不到ruby,于是参考网上资料,原来是需要先安装ruby。于是,按照攻略用如下脚本执行安装
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
|
在执行第二步的时候完美出错。
[root@localhost Redis]# gem install redis-4.0.0.gem
ERROR: Error installing redis-4.0.0.gem:
redis requires Ruby version >= 2.2.2.
错误信息显示本地ruby版本低于最低要求版本。于是我决定卸载本地的1.8版本的ruby,重装一个高版本的
yum -y remove ruby
|
以上命令卸载本地ruby后,接下来通过下方命令获取一个高版本的ruby安装
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
|
然后这一步果断失败了,ruby的默认源简直慢到爆炸,于是在网上找了个ruby-2.4.1.tar.gz的包,通过ftp上传到/data/ruby/目录下
执行下面的命令编译安装
tar xzvf ruby-2.4.1.tar.gz
cd ruby-2.4.1
./configure
make
make install
|
这个过程也是异常的慢,而且,还失败了。好了,现在低版本的ruby也没了,高版本的也没安上
于是,在去网上需求方案,得到的思路是通过安装ruby的管理工具rvm来安装ruby 于是,执行以下命令
curl -L get.rvm.io | bash -s stable
|
依然报错,错误信息大致是签名失效之类的,按照错误信息里的提示改用以下命令执行
curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
|
依然报错,到这里已经折腾许久了,而且参考网上经验,都是到这一步往下就顺滑了,可我卡在这里走不下去了,什么鬼。没办法又去在网上找了一通,依旧没有找到类似的情况。鬼使神差的我又执行了遍 curl -L get.rvm.io | bash -s stable ,居然成功了。此刻我仿佛看到了胜利的曙光。
安装rvm成功后,执行
find / -name rvm.sh
source /etc/profile.d/rvm.sh
|
其中find命令查找rvm.sh脚本的文件位置。 然后source 此文件位置,让rvm配置生效
rvm -v
//查看rvm版本,验证rvm安装成功 显示 rvm 1.29.3 (latest) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io]
接下来,开始畅想着通过rvm来安装ruby,然后redis集群就可以起飞了,于是我欢快的敲下如下命令
rvm install 2.3.3
|
//此刻是北京时间晚上9点,下载包总大小23M,下载速度稳定在6~7,单位kb,预计时间一个小时。然后我想着等到十点吧,就下完了。想象总是美好的,当下到一半的时候,已经耗时半个多点了,这当然不是最重要的,最重要的是,连接超时,下载失败了,重新下载。几经折腾。也去找了国内的下载源。各种问题替换不了下载源。最后晚上在家,下载安装成功,此刻曙光终于来临
ruby -v
|
查看ruby版本 显示ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
gem -v
|
查看gem版本 显示 2.6.14
如果此处高版本ruby安装不成功,考虑以下两种方案
1.因为上述的以下的两个命令安装的ruby版本,应该是支持reids3.0版本的。所以可以降低redis版本到3.0
yum -y install ruby ruby-devel rubygems rpm-build
gem install redis
2.redis集群文档里提供了一个快速开启集群的简单脚本方法,即在redis-4.0.1/utils/create-cluster 目录下有一个简单的处理脚本create-cluster,可以快速的开启三主三从的集群
开启方式如下
create-cluster start
create-cluster create
此处期间,会列出集群配置,回复yes确定,而如果想要关闭集群,执行
create-cluster stop
//正常情况,我们已经安装好了ruby和gem,接下来切入主题,进入/data/redis-server/redis-4.0.1/src/
./redis-trib.rb create --replicas 1 127.0.0.1:7000 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
|
出现如下提示
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
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
M: c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: 18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: 589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003
replicates c9eb555f3940e3357fed95e408acc831f075c5ea
S: d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004
replicates bd22616bb1e8dcb87118849f58786b80dddfa64b
S: 99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005
replicates 18a51268926237775f2bbdfd1dd659f8354e506f
Can I set the above configuration? (type 'yes' to accept):
|
此为脚本给出主从配置,回复yes 确认配置
从这个list里可以得到如下信息 7000节点为主节点,拥有5461个槽,槽位从0-5460,其从节点为7003
7000的节点id为c9eb555f3940e3357fed95e408acc831f075c5ea
7003replicates c9eb555f3940e3357fed95e408acc831f075c5ea即7003是7000的从节点
其他节点与此类似
此刻,我们在查看下相应的7000文件夹下的nodes-7000.conf集群节点配置文件
d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004@17004 slave bd22616bb1e8dcb87118849f58786b80dddfa64b 0 1511417184031 5 connected
99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005@17005 slave 18a51268926237775f2bbdfd1dd659f8354e506f 0 1511417185032 6 connected
c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000@17000 myself,master - 0 1511417183000 1 connected 0-5460
bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001@17001 master - 0 1511417183530 2 connected 5461-10922
589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003@17003 slave c9eb555f3940e3357fed95e408acc831f075c5ea 0 1511417184031 4 connected
18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002@17002 master - 0 1511417183029 3 connected 10923-16383
vars currentEpoch 6 lastVoteEpoch 0
|
此配置文件依然是显示集群内的主从关系,最后两个变量 currentEpoch表示当前集群内节点数量,lastVoteEpoch与主节点挂掉,而从节点投票选举新的主节点相关。
5.测试集群
执行以下命令进入7000节点
[input4hua@node /data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7000
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> set hello redis
OK
127.0.0.1:7000> keys *
1) "hello"
127.0.0.1:7000> get hello
"redis"
127.0.0.1:7000> exit
[input4hua@node /data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7002
127.0.0.1:7002> keys *
(empty list or set)
127.0.0.1:7002> exit
[input4hua@node /data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7003
127.0.0.1:7003> keys *
1) "hello"
127.0.0.1:7003> get hello
-> Redirected to slot [866] located at 127.0.0.1:7000
"redis"
127.0.0.1:7000> exit
[input4hua@node /data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7002
127.0.0.1:7002> set hello bli
-> Redirected to slot [866] located at 127.0.0.1:7000
OK
127.0.0.1:7000> keys *
1) "hello"
|
//分析以上现象 ,hello作为key值按照redis内部算法特定的存放到了7000节点的866槽位上,并且其从节点7003对hello这个key可见,在7003上获取get hello,跳转到其主节点7000上获取数据
用以下命令来关闭相应节点 模拟主节点挂掉
redis-cli -h 127.0.0.1 -c -p 7000 shutdown
|
[input4hua@node /data/redis-server/redis-4.0.1/redis_cluster/7000]$ redis-cli -h 127.0.0.1 -c -p 7003
127.0.0.1:7003> keys *
1) "hello"
127.0.0.1:7003> get hello
"bli"
127.0.0.1:7003> cluster nodes
18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002@17002 master - 0 1511429474504 3 connected 10923-16383
bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001@17001 master - 0 1511429474103 2 connected 5461-10922
99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005@17005 slave 18a51268926237775f2bbdfd1dd659f8354e506f 0 1511429473000 6 connected
d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004@17004 slave bd22616bb1e8dcb87118849f58786b80dddfa64b 0 1511429474000 5 connected
589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003@17003 myself,master - 0 1511429473000 7 connected 0-5460
c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000@17000 master,fail - 1511429376707 1511429375000 1 disconnected
127.0.0.1:7003>
127.0.0.1:7003> set we nb
-> Redirected to slot [11725] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set hello redis
-> Redirected to slot [866] located at 127.0.0.1:7003
OK
|
//以上可以看到7003依旧能查询和写入数据,并且 通过命令cluster nodes查看集群情况,此时7003已跃居成为主节点,而7000显示失败
//为了恢复7000节点,在root用户权限下恢复7000节点
[input4hua@node /data/redis-server/redis-4.0.1/src]$ ./redis-server ../redis_cluster/7000/redis.conf
24828:C 23 Nov 17:33:08.209 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
24828:C 23 Nov 17:33:08.209 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=24828, just started
24828:C 23 Nov 17:33:08.209 # Configuration loaded
root@node3:/data/redis-server/redis-4.0.1/src$redis-cli -h 127.0.0.1 -c -p 7000
127.0.0.1:7000> keys *
1) "hello"
127.0.0.1:7000> get hello
-> Redirected to slot [866] located at 127.0.0.1:7003
"bli"
|
//看到7000节点此时已恢复,依然可以访问到key数据,且数据读取跳转到主节点7003
127.0.0.1:7003> cluster nodes
18a51268926237775f2bbdfd1dd659f8354e506f 127.0.0.1:7002@17002 master - 0 1511430452706 3 connected 10923-16383
bd22616bb1e8dcb87118849f58786b80dddfa64b 127.0.0.1:7001@17001 master - 0 1511430451503 2 connected 5461-10922
99d139a77b3393fd4432c545a2d6cc8898ef01a7 127.0.0.1:7005@17005 slave 18a51268926237775f2bbdfd1dd659f8354e506f 0 1511430452000 6 connected
d4155a184e1d4acee1bade09fbed3d8e6819ca9a 127.0.0.1:7004@17004 slave bd22616bb1e8dcb87118849f58786b80dddfa64b 0 1511430451703 5 connected
589fc4792a5e7702dbdcd5ed3b636989d6fc849e 127.0.0.1:7003@17003 myself,master - 0 1511430451000 7 connected 0-5460
c9eb555f3940e3357fed95e408acc831f075c5ea 127.0.0.1:7000@17000 slave 589fc4792a5e7702dbdcd5ed3b636989d6fc849e 0 1511430451503 7 connected
127.0.0.1:7003>
|
//查看集群节点信息,7000已恢复成为7003的从节点
//删除测试数据
127.0.0.1:7000> keys *
1) "hello"
127.0.0.1:7000> del hello
-> Redirected to slot [866] located at 127.0.0.1:7003
(integer) 1
127.0.0.1:7003> keys *
(empty list or set)
127.0.0.1:7003> exit
127.0.0.1:7000> keys *
(empty list or set)
|
//上面7000节点已经没有数据了,此时在7000节点下 get we ,而we存放在7002节点下,槽位11725,此处也说明在redis集群下任意节点都可以得到集群下的所有数据,如下所示:
127.0.0.1:7000> get we
-> Redirected to slot [11725] located at 127.0.0.1:7002
"nb"
127.0.0.1:7002>
|
posted on 2017-11-25 22:18 听风tingfeng 阅读(1179) 评论(0) 编辑 收藏 举报