Redis集群
• 多个redis节点网络互联,数据共享
• 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
• 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
• 支持在线增加、删除节点
• 从不提供服务,如果主机宕机了,从马上接替
• 客户端可以连任何一个主节点进行读写
Redis集群配置
• 场景设置:
• 两台机器,分别开启三个Redis服务(端口)
• A机器上三个端口7000,7002,7004,全部为主
• B机器上三个端口7001,7003,7005,全部为从
• 两台机器上都要编译安装redis,然后编辑并复制3个不同的redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
• 具体redis配置文件大家到https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL下载或者查看
Redis集群配置
• 安装ruby2.2 (只需要一台机器上运行)
• yum -y groupinstall "Development Tools"
• yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
• cd /root/
• mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
• wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
• wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
• rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
• yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
• gem install redis
实例:
在B机器上面操作
root@localhost 01]# yum list | grep ruby #查看yum自带的ruby软件版本
[root@localhost 01]# yum -y groupinstall "Development Tools"
设置redis_7000.conf、redis_7002.conf配置文件
[root@localhost 01]# cd /etc/
[root@localhost 01]# vim redis_7000.conf
port 7000
bind 192.168.133.130 #ip要换成你本机的ip
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes
cluster-config-file nodes_7000.conf
cluster-node-timeout 10100
appendonly yes
[root@localhost 01]# cp redis_7000.conf redis_7002.conf
[root@localhost 01]# vim !$
port 7002
bind 192.168.133.131
daemonize yes
pidfile /var/run/redis_7002.pid
dir /data/redis_data/7002
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 10100
appendonly yes
~
[root@localhost 01]# cp redis_7000.conf redis_7004.conf
[root@localhost 01]# vim !$
port 7004
bind 192.168.133.131
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes
替换:1,$s/7000/7004/g
启动
[root@localhost 01]# redis-server /etc/redis_7000.conf
16892:C 09 Jul 17:11:31.280 # Can't chdir to '/data/redis_data/7000': No such file or directory
[root@localhost 01]# mkdir /data/redis_data
[root@localhost 01]# mkdir /data/redis_data/ {7000,7002,7004}
[root@localhost 01]# redis-server /etc/redis_7000.conf
[root@localhost 01]# redis-server /etc/redis_7002.conf
[root@localhost 01]# redis-server /etc/redis_7004.conf
[root@localhost 01]# ps aux | grep redis #查看进程
root 2811 0.1 0.5 145296 5928 ? Ssl 14:37 0:16 redis-server 127.0.0.1:6379
root 4526 0.0 0.3 151616 3104 pts/1 T 16:20 0:00 vim /etc/redis.conf
root 16820 0.0 0.5 151864 5444 pts/1 T 17:04 0:00 vim redis_7004.conf
root 16931 0.1 0.7 145300 7580 ? Ssl 17:15 0:00 redis-server 192.168.133.131:7000 [cluster]
root 16985 0.1 0.5 145300 5536 ? Ssl 17:19 0:00 redis-server 192.168.133.131:7002 [cluster]
root 16998 0.0 0.2 145300 2640 ? Ssl 17:19 0:00 redis-server 192.168.133.131:7004 [cluster]
root 17016 0.0 0.0 112720 972 pts/1 R+ 17:20 0:00 grep --color=auto redis
[root@localhost 01]# iptables -nvL #关闭iptables
[root@localhost 01]# getenforce
Disabled
在B机器上面操作
如果02机器没有,redis,可以执行下面的操作
[root@localhost 01]# cd /usr/local/src/
[root@localhost src]# ls
[root@localhost src]# scp -r redis-4.0.1 192.168.133.133:/usr/local/src/ #上传到02机器上面已经的/usr/local/src/已经编译源码包
然后在02机器上面操作
[root@localhost src]# cd /usr/local/src/redis-4.0.1/
[root@localhost src]# make install
[root@localhost src]# redis-server #运行一个命令,做测试
[root@localhost src]#
[root@localhost src]#
[root@localhost 02]# vim redis_7001.conf
port 7001
bind 192.168.133.132 #ip要换成你本机的ip
daemonize yes
pidfile /var/run/redis_7001.pid
dir /data/redis_data/7001
cluster-enabled yes
cluster-config-file nodes_7001.conf
cluster-node-timeout 10100
appendonly yes
[root@localhost 02]# cp redis_7001.conf redis_7003.conf
[root@localhost 02]# cp redis_7001.conf redis_7005.conf
[root@localhost 02]# vi/etc/reids_7003.conf
替换:1,,$s/7001/7003/g
[root@localhost 02]# vi/etc/reids_7005.conf
替换:1,,$s/7001/7005/g
[root@localhost 02]# vi/etc/reids_7005.conf
[root@localhost 02]# mkdir /data/redis_data
[root@localhost 02]# mkdir /data/redis_data{7001,7003,7005}
[root@localhost 02]# redis-server /etc/redis_7001.conf
[root@localhost 02]# redis-server /etc/redis_7003.conf
[root@localhost 02]# redis-server /etc/redis_7005.conf
[root@localhost 02]# ps aux | grep redis #查看启动7001,7003,7005的服务
[root@localhost 02]# netstat -lntp
[root@localhost 02]# iptables -nvL #关闭iptables
[root@localhost 02]# getenforce
Disabled
安装高版本ruby:
yum里面的版本太低,我们这里下载源码包,将其制作成rpm包安装文件!
[root@localhost 01]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
[root@localhost 01]# cd /root/
把源码包改成rpm包的
[root@localhost root]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
[root@localhost root]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
[root@localhost root]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
[root@localhost 01]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
安装RPM包
[root@localhost 01]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@localhost 01]# ruby -v #查看版本
[root@localhost 01]# gem install redis ##安装redis的工具trib;
##这里我要说一下:
##生产环境一般不会一台机器多个端口,因为这样没有了集群的意义(一台机器宕机 端口都不能用);
##我们可以看到,主从已经分配了(其实是按端口顺序来的,如果需要指定60.11所有redis都为主的话,我们可以修改端口达到目的)
Redis集群配置、操作
• cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
• redis-trib.rb create --replicas 1 192.168.133.130:7000 192.168.133.130:7002 192.168.133.130:7004 192.168.133.132:7001 192.168.133.132:7003 192.168.133.132:7005
• redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
• 任意一个节点都可以创建key,或者查看key(演示)
• redis-trib.rb check 192.168.133.130:7000//检测集群状态
• cluster nodes//列出节点
• cluster info//查看集群信息
• cluster meet ip port //添加节点
• cluster forget node_id //移除某个节点
• cluster replicate node_id//将当前节点设置为指定节点的从
• cluster saveconfig//保存配置文件
实例:
[root@localhost 01]# cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
[root@localhost 01]# redis-trib.rb create --replicas 1 192.168.133.130:7000 192.168.133.130:7002 192.168.133.130:7004 192.168.133.132:7001 192.168.133.132:7003 192.168.133.132:7005
:yes
[root@localhost 01]# redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
任意一个节点都可以创建key,或者查看key(演示)
redis-trib.rb check 192.168.133.130:7000 //检测集群状态
cluster nodes //列出节点
cluster info //查看集群信息
cluster meet ip port //添加节点
cluster forget node_id //移除某个节点
cluster replicate node_id //将当前节点设置为指定节点的从
cluster saveconfig //保存配置文件
[root@localhost 01]#
redis集群操作
[root@localhost 01]# redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
任意一个节点都可以创建key,或者查看key(演示)
[root@localhost 01]# redis-trib.rb check 192.168.133.130:7001 //检测7001端口集群状态,六个端口都可以切换
cluster nodes//列出节点
cluster info//查看集群信息
cluster meet ip port //添加节点
cluster forget node_id //移除某个节点
cluster replicate node_id//将当前节点设置为指定节点的从
cluster saveconfig//保存配置文件
[root@localhost 01]# redis-cli -c -h 192.168.60.12 -p 7001
##-c是以集群的方式登录,如果没有-c则以单独redis登录;不会有集群效果
192.168.60.12:7001> set key1 123 #创建key1
OK
192.168.60.12:7001> set key2 123 ##操作被定向到60.11的7000端口
-> Redirected to slot [4998] located at 192.168.60.11:7000
OK
192.168.60.11:7000> set key3 123 #说明创建到了本机上面
OK
192.168.60.11:7000> set key4 123
-> Redirected to slot [13120] located at 192.168.60.11:7002
OK
192.168.60.11:7002> get key2 ##查询也是从60.11的7000里面查询;
-> Redirected to slot [4998] located at 192.168.60.11:7000
"123"
192.168.60.11:7000> get key4
-> Redirected to slot [13120] located at 192.168.60.11:7002
"123"
192.168.60.11:7002> quit
[root@localhost 01]# redis-cli -c -h 192.168.60.12 -p 7001
##列出节点;
192.168.60.12:7001> cluster nodes
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508208564000 1 connected 0-5460
##这一行说明了myself;即本机登录
192.168.60.12:7001> cluster info
##查看集群信息;
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
[root@localhost 02]# vi !$
替换:1,,$s/7001/7007/g
[root@localhost 02]# mkdir /data/redis_data/7007
[root@localhost 02]# redis-server /etc/redis_7007.conf
[root@localhost 02]# ps -aux | grep redis #查看添加的节点有没有成功
切换到01机器
添加节点
192.168.60.12:7001> cluster meet 192.168.60.12 7007
##添加节点;下面我们cluster nodes可以看到该节点为主(若再添加一个新节点,也是master那么多和弄slave从呢?)下面有法子设置slave从;
##cluster replicate node_id//将当前节点设置为指定节点的从(登录一个想要成为master的节点,执行命令cluster replicate node_id--节点的node信息 即可)
OK
192.168.60.12:7001> cluster nodes #查找7007,
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508208878187 1 connected 0-5460
daa308972c148b6dc819ee5ba1a17654bdc1c788 192.168.60.12:7007@17007 master - 0 1508208879197 0 connected
7e398f3003d9a2d1bbef32d01cc9d3c62760830d 192.168.60.12:7001@17001 myself,master - 0 1508208875000 4 connected 5461-10922
9f44617279ac675df4df29e54f3fd6f7555fa6bc 192.168.60.12:7005@17005 slave
[root@localhost 01]# cd /etc/
[root@localhost etc]# cp redis_7000.conf redis_7006.conf
[root@localhost etc]# vim !$
替换:1,,$s/7001/7006/g
启动7006服务
[root@localhost etc]# mkdir /data/redis_data/7006
[root@localhost etc]# redis-server /etc/redis_706.conf
[root@localhost etc]# redis-cli -c -h 192.168.133.131 - p 700
192.168.133.131:7000> CLUSTER MEET 192.168.133.131 7006 #连接刚刚创建的7006节点
192.168.133.131:7000> CLUSTER nodes #查看7006节点,是否存在
1f39268503aeaf02e2a1d4b81a3d572f71fd389f 192.168.60.11:7000@17000 master - 0 1508209726000 1 connected 0-5460
daa308972c148b6dc819ee5ba1a17654bdc1c788 192.168.60.12:7007@17007 master - 0 1508209726023 0 connected
将当前节点设置为指定节点的从
[root@localhost etc]# redis-cli -c -h 192.168.133.131 - p 700 #进入7006节点里面
192.168.133.131:7000> CLUSTER REPLICATE daa308972c148b6dc819ee5ba1a17654bdc1c788
192.168.133.131:7000> CLUSTER nodes #查看7006设置的节点,后面有,slave,说明配置成功了
移除7007节点
##如果移除不了,看看是否为主/主下有没有从,将主设为从即可移除
##无法移除正在登录的节点,先退出 再删除;
192.168.133.131:7000> CLUSTER FORGET daa308972c148b6dc819ee5ba1a17654bdc1c788
(error)ERR Can't forget my master!
192.168.133.131:7000>
[root@localhost 01]# redis-cli -c -h 192.168.133.131 - p 7000 #登录7000节点
192.168.133.131:7000> CLUSTER FORGET daa308972c148b6dc819ee5ba1a17654bdc1c788
OK
192.168.133.131:7000> CLUSTER nodes #查看节点有没有被删除
192.168.133.131:7000> cluster saveconfig//保存配置文件
[root@localhost 01]# ps aux | gre redis
[root@localhost 01]# ls /data/redis_data/7001/ #保存后生成的文件
appendonly.aof dump.rdb nodes_7001.conf
[root@localhost 01]# ls -lt !$
[root@localhost 01]# cat /data/redis_data/7001/node_7001.conf #查看保存的配置文件
常见问题:
用 cluster forget 移除了某个节点后,quit退出后,再用 redis-cli -c 登录,又会看到被移除的节点恢复了
1、redis 做三主三从,开发连接redis时,是连接其中一个主节点吗?如果这个主节点down掉了,那么怎么达到高可用的效果?
答:对于代码(比如php)连redis集群时,连接的ip是多个,并不是单个。 不用考虑单点故障。
给你一个链接作为参考
https://www.zybuluo.com/phper/note/248555
2、删除节点7006和7007两个节点,在保存集群配置 cluster saveconfig,查看任意节点的配置文件 (nodes_7000.conf),是不会显示出7006和7007这两个节点的信息
3、其中一个key在某一个master节点上 我把这个master节点的id kill掉 发现这个key会自动复制到这个master节点的slave上,这个过程是怎么实现的?
答:这个是集群内部机制实现。
4、每次set key都是在装了ruby的主机中操作,那么开发团队连redis服务器的时候是不是也是连这台主机,如果这台主机宕机了怎么办?
答:
对于代码(比如php)连redis集群时,连接的ip是多个,并不是单个。 不用考虑单点故障。
给你一个链接作为参考
https://www.zybuluo.com/phper/note/248555