redis集群介绍
- 多个redis节点网络互联,数据共享
- 所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
- 不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
- 支持在线增加、删除节点
- 客户端可以连任何一个主节点进行读写
唉过年过崩了
大白话:
数据量很大,多台机器组成大集群,解决存储空间、查询速度负载高的瓶颈问题,Redis 上面的数据是共享式的,也就是A server有的B server不一定有。类似于Raid 5,写入数据可能是A磁盘 可能是B磁盘。你可以正常读取,但真正的存储位置需要查询
场景设置
- 两台机器,分别开启三个Redis服务(端口)
- A机器上三个端口:7000、7002、7004,全部为主
- B机器上三个端口:7001、7003、7005,全部为从
- 两台机器上都要编译安装Redis,然后编译并复制三个不同的Redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个Redis服务
master(IP:192.168.8.131)启动三个端口:
[root@root ~]# vim /etc/redis_7000.confport 7000bind 192.168.8.131daemonize yespidfile /var/run/redis_7000.piddir /data/redis_data/7000cluster-enabled yes##开启cluster功能cluster-config-file nodes_7000.conf##该配置文件可以在dir目录下自动生成cluster-node-timeout 10100appendonly yes[root@root ~]# vim /etc/redis_7002.confport 7002bind 192.168.8.131daemonize yespidfile /var/run/redis_7002.piddir /data/redis_data/7002cluster-enabled yescluster-config-file nodes_7002.confcluster-node-timeout 10100appendonly yes[root@root ~]# vim /etc/redis_7004.confport 7004bind 192.168.8.131daemonize yespidfile /var/run/redis_7004.piddir /data/redis_data/7004cluster-enabled yescluster-config-file nodes_7004.confcluster-node-timeout 10100appendonly yes创建各配置文件对应的数据库目录:[root@root ~]# mkdir /data/redis_data[root@root ~]# mkdir /data/redis_data/{7000,7002,7004}依次启动Redis服务7000,7002,7004:[root@root ~]# redis-server /etc/redis_7000.conf启动完成后,结果如下:[root@root ~]# ps aux |grep redisroot 14423 0.6 0.5 145248 2640 ? Ssl 19:35 0:00 redis-server 192.168.8.131:7000 [cluster]root 14438 3.5 0.5 145248 2636 ? Ssl 19:37 0:00 redis-server 192.168.8.131:7002 [cluster]root 14443 13.8 0.5 145248 2636 ? Ssl 19:37 0:01 redis-server 192.168.8.131:7004 [cluster]
slave(IP:192.168.8.132)启动三个端口:
[root@root ~]# vim /etc/redis_7001.confport 7001bind 192.168.8.132daemonize yespidfile /var/run/redis_7001.piddir /data/redis_data/7001cluster-enabled yescluster-config-file nodes_7001.confcluster-node-timeout 10100appendonly yes[root@root ~]# vim /etc/redis_7003.confport 7003bind 192.168.8.132daemonize yespidfile /var/run/redis_7003.piddir /data/redis_data/7003cluster-enabled yescluster-config-file nodes_7003.confcluster-node-timeout 10100appendonly yes[root@root ~]# vim /etc/redis_7005.confport 7005bind 192.168.8.132daemonize yespidfile /var/run/redis_7005.piddir /data/redis_data/7005cluster-enabled yescluster-config-file nodes_7005.confcluster-node-timeout 10100appendonly yes创建各配置文件对应的数据库目录:[root@root ~]# mkdir /data/redis_data[root@root ~]# mkdir /data/redis_data/{7001,7003,7005}依次启动Redis服务7001,7003,7005:[root@root ~]# redis-server /etc/redis_7001.conf启动完成后结果如下:[root@root ~]# ps aux |grep redisroot 5971 0.2 0.5 145248 2632 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7001 [cluster]root 5976 0.1 0.5 145248 2636 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7003 [cluster]root 5981 0.1 0.5 145248 2632 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7005 [cluster]
安装ruby2.2 (只需要一台机器上运行就是master):
Redis集群需要ruby的支持,需要先安装ruby(Ruby只需在一台机器上运行)。Redis4.0需要使用Ruby2.2,安装方法如下(因为本机自带的是2.0版本的ruby,所以需要使用如下方法把源码包包制作成yum安装包,然后借助yum工具安装ruby2.2———升级ruby版本)
安装yum开发工具组:[root@root ~]# yum -y groupinstall "Development Tools"升级库文件:[root@root ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel[root@root ~]# cd /root/创建制作rpm包的目录:[root@root ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}下载Ruby的源码包:[root@root ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES下载specs文件,用于制作rpm包:[root@root ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS制作rpm包:[root@root ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec##此处需要耐心等待…安装Ruby2.2:[root@root ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm[root@root ~]# ruby -vruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
配置集群就一步:
安装Redis配置集群的工具:[root@root ~]# gem install redis将命令redis-trib.rb加入环境变量目录下:(注意自己的redis版本)[root@root ~]# cp /usr/local/src/redis-4.0.2/src/redis-trib.rb /usr/bin/[root@root ~]# redis-trib.rb create --replicas 1 192.168.8.131:7000 192.168.8.131:7002 192.168.8.131:7004 192.168.8.132:7001 192.168.8.132:7003 192.168.8.132:7005[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.##注意:redis-trib.rb create --replicas 1 表示一个master对应几个slave,此处的参数“1”表示master和slave一一对应##然后yes就把主从分好了,双OK代表成功##这里集群配置完成,后面就可以开始操作了
集群配置操作
因为Redis集群是分布式结构,登录任何一个端口都可新建等操作
连接:[root@root ~]# redis-cli -c -h 192.168.8.131 -p 7000##-c:=cluster,表示以集群方式连接创建数据:192.168.8.131:7000> set cluster1 adaitest-> Redirected to slot [8483] located at 192.168.8.132:7001OK##该操作会被重定向到192.168.8.132:7001192.168.8.132:7001> set cluster2 adai222-> Redirected to slot [4416] located at 192.168.8.131:7000OK192.168.8.131:7000> set cluster3 adaitest333OK192.168.8.131:7000> set cluster4 adai2323-> Redirected to slot [12678] located at 192.168.8.131:7002OK查看数据:192.168.8.131:7002> get cluster1-> Redirected to slot [8483] located at 192.168.8.132:7001"adaitest"192.168.8.132:7001> get cluster2-> Redirected to slot [4416] located at 192.168.8.131:7000"adai222"192.168.8.131:7000> get cluster3"adaitest333"192.168.8.131:7000> get cluster4-> Redirected to slot [12678] located at 192.168.8.131:7002"adai2323"
集群相关操作
检测集群状态,任意一个节点都可以:[root@root ~]# redis-trib.rb check 192.168.8.131:7000列出节点:(其中是主是从一目了然)[root@root ~]# redis-cli -c -h 192.168.8.131 -p 7000192.168.8.131:7000> cluster nodes ☆☆☆☆☆☆查看集群信息:☆☆☆☆☆☆192.168.8.131:7000> cluster info添加节点(执行该操作前先在slave创建redis_7007.conf并启动):192.168.8.131:7000> cluster meet 192.168.8.132 7007OK192.168.8.131:7000> cluster nodes52e4b3484838be21fcf53b84198e362efd54bd39 192.168.8.132:7007@17007 master - 0 1507035952000 0 connected##此时7007以master身份存在再添加一个节点:192.168.8.131:7000> cluster meet 192.168.8.131 7006OK192.168.8.131:7000> cluster nodes677f27fb209ce45c823126fe38dbcf0b9fc43d93 192.168.8.131:7006@17006 master - 0 1507036137147 0 connected##同样是以master身份存在##即,使用以上方式添加的新节点都是以master身份存在!
把当前的节点设置为指定节点的从
先更换到要设置的节点:[root@root ~]# redis-cli -c -h 192.168.8.131 -p 7006设定为7007的从:192.168.8.131:7006> cluster replicate 52e4b3484838be21fcf53b84198e362efd54bd39(7007的inode)OK查看:192.168.8.131:7006> cluster nodes52e4b3484838be21fcf53b84198e362efd54bd39 192.168.8.132:7007@17007 master - 0 1507036429244 7 connected677f27fb209ce45c823126fe38dbcf0b9fc43d93 192.168.8.131:7006@17006 myself,slave 52e4b3484838be21fcf53b84198e362efd54bd39 0 1507036429000 0 connected#对比node号,即7006为7007的从移除某节点:192.168.8.131:7006> cluster forget 52e4b3484838be21fcf53b84198e362efd54bd39(error) ERR Can't forget my master!192.168.8.131:7006> cluster forget 677f27fb209ce45c823126fe38dbcf0b9fc43d93(error) ERR I tried hard but I can't forget myself...## 即,不能移除master节点和当前所在节点[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000192.168.8.131:7000> cluster forget 677f27fb209ce45c823126fe38dbcf0b9fc43d93OK查看:192.168.8.131:7000> cluster nodes#此时7006已经不存在了。保存当前配置:192.168.8.131:7000> CLUSTER SAVECONFIGOK