21.22 redis集群介绍
21.23/21.24 redis集群搭建配置
21.25 redis集群操作
扩展
redis 哨兵https://segmentfault.com/a/1190000002680804
21.22 redis集群介绍
redis在官方叫做redis- cluster(3.0版本之后才支持的架构)。作用于单台机器不能够满足存放大量的数据,所以要多台机器构成一个大集群,用来解决存储空间、查询速度、负载太高等类似瓶颈的问题。
redis-cluster是分布式的集群,支持横向扩展,就是增加节点仅仅在配置文件中,加入这个集群就可以了。
codis是第三方的,针对redis集群的另一个解决方案。codis类似于lvs做负载均衡一样,用的是路由这样的技术
1.多个redis节点网络互联,数据共享
并不是说在一个机器上写,就能同步到其他机器上去。比如我们第一次写可能在A节点,第二次写可能在B节点,也就是说我们写了一个键值,他可能存在于A节点也可能存在于B节点。并不是这个数据A上有B上也有
但是我们在写数据的时候,都是会告诉我们在哪个机器上查询和存取的
2.所有的节点都是一主一从(可以是多个从),其中从不提供服务,仅作为备用
目的是增加安全性
3.不支持同时处理多个键(如mset/mget),因为redis需要把键均匀分布在各个节点上,并发量很高的情况下同时创建键值会降低性能并导致不可预测的行为。
只能一个一个的写
4.支持在线增加、删除节点
5.客户端可以连任何一个主节点进行读写
比如我们连接A去读B机器上的数据
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.23/21.24 redis集群搭建配置
1.场景设置:
1.1两台机器,分别开启三个Redis服务(端口)
1.2A机器上三个端口7000,7002,7004,全部为主
1.3B机器上三个端口7001,7003,7005,全部为从 #这样相当于有了6台机器
1.4两台机器上都要编译安装redis,然后编辑并复制3个不同的redis.conf,分别设置不同的端口号、dir等参数,还需要增加cluster相关参数,然后分别启动6个redis服务
具体redis配置文件到https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL下载或者查看
2.安装ruby2.2 (只需要一台机器上运行)
#需要ruby2.2.的支持。yum源(yum list |grep ruby)里面有ruby,但是不是2.2的。一下的操作就是下载源码包,搞成更高版本的rpm包!!!
2.1yum -y groupinstall "Development Tools"
2.2yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
#安装对应的包
2.3cd /root/
2.4mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
#创建把源码包搞成rpm包的几个目录
2.5wget 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
#下载SPECS的文件,不然没办法执行下面的rpmbuild命令
2.6rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
#把源码包做成rpm包。实际上也是编译的过程
2.7yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
#到这就是做成了,安装这个rpm包了
也可以ls看一下这个包(或du -sh)
2.8gem install redis
#gem是ruby自带的工具,用gem去安装redis相关的redis-trib.rb
2.9cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
#放到/usr/bin下是为了下一步可以直接用它
2.10redis-trib.rb create --replicas 1 192.168.208.128:7000 192.168.208.128:7002 192.168.208.128:7004 192.168.208.133:7001 192.168.208.133:7003 192.168.208.133:7005
#以上所有的操作是为了,让redis-trib.rb这条命令顺利的执行,他会将这6台机器组成一个cluster。出现两个绿色的OK就代表已经搭建成功
replicas在这的意思是所谓的redis-cluster
!!在这里他会创建前三个为主,如果我们有指定的就在使用这条命令的时候把想要指定为主的写在前面(比如7000、7001、7002)
实例:
1.先来准备场景(测试)机器
因为2机器上还没有安装redis,步骤如下:
[root@axinlinux-01 ~]# scp -r /usr/local/src/redis-4.0.1 root@192.168.208.133:/usr/local/src/redis-4.0.1.bak #可以直接在1机器上把编译过得源码包拷贝过来
[root@axinlinux-03 redis-4.0.1]# make install #考过来之后,就可以直接make install了。因为已经在1机器上编译过了,编译的过程其实就是生成这些二进制的文件
-----------------------
[root@axinlinux-01 ~]# cd /etc/
[root@axinlinux-01 etc]# vim redis_7000.conf
cat redis_7000.conf
port 7000
bind 192.168.208.128 #这个ip要改为01机器的ip
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes #开启cluster
cluster-config-file nodes_7000.conf #这个配置文件可以自动生成的,在dir目录下
cluster-node-timeout 10100
appendonly yes
[root@axinlinux-01 etc]# cp redis_7000.conf redis_7002.conf #直接拷贝再修改就行了
[root@axinlinux-01 etc]# vim !$
:1,$s/7000/7002/g #全局替换7000改为7002!!!
port 7002
bind 192.168.208.128
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@axinlinux-01 etc]# cp redis_7000.conf redis_7004.conf
[root@axinlinux-01 etc]# vim !$
port 7004
bind 192.168.208.128
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
[root@axinlinux-03 etc]# vim redis7001.conf #第二台机器上也要如此
[root@axinlinux-03 etc]# cp redis_7001.conf redis_7003.conf
[root@axinlinux-03 etc]# cp redis_7001.conf redis_7005.conf
[root@axinlinux-03 etc]# vim redis_7003.conf
[root@axinlinux-03 etc]# vim redis_7005.conf
[root@axinlinux-01 src]# mkdir /data/redis_data #两台机器分别创建dir目录
[root@axinlinux-01 src]# mkdir /data/redis_data/{7000,7002,7004} #这个命令可以在这个目录下,创建多个目录!!!
[root@axinlinux-03 etc]# mkdir /data/redis_data
[root@axinlinux-03 etc]# mkdir /data/redis_data/{7000,7002,7004}
[root@axinlinux-01 redis_data]# redis-server /etc/redis_7000.conf #分别开启1机器上的三个redis
[root@axinlinux-01 redis_data]# redis-server /etc/redis_7002.conf
[root@axinlinux-01 redis_data]# redis-server /etc/redis_7004.conf
[root@axinlinux-01 redis_data]# ps aux |grep redis #可以看到这三个
root 2059 0.1 0.4 145296 7572 ? Ssl 20:37 0:06 redis-server 127.0.0.1:6379
root 19602 0.3 0.4 145300 7568 ? Ssl 21:38 0:00 redis-server 192.168.208.128:7000 [cluster]
root 19607 0.4 0.4 145300 7568 ? Ssl 21:38 0:00 redis-server 192.168.208.128:7002 [cluster]
root 19612 0.5 0.4 145300 7568 ? Ssl 21:38 0:00 redis-server 192.168.208.128:7004 [cluster]
root 19625 0.0 0.0 112724 980 pts/0 S+ 21:38 0:00 grep --color=auto redis
2机器上也要开启三个redis
还要注意,两边的iptables和selinux都要关闭
2.安装ruby2.2 (只需要一台机器上运行)
操作实际上就是安装更高版本的ruby。但是呢,yum是不带rpm包的。那只能去下载源码包,要么编译安装,要么把源码包搞成rpm包。咱们这个方法就是要把源码包搞成rpm包
[root@axinlinux-01 ~]# yum -y groupinstall "Development Tools"
[root@axinlinux-01 ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
[root@axinlinux-01 ~]# cd /root/
[root@axinlinux-01 ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
#创建把源码包搞成rpm包的几个目录
[root@axinlinux-01 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
[root@axinlinux-01 ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
[root@axinlinux-01 ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec #漫长的过程--
[root@axinlinux-01 ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@axinlinux-01 ~]# gem install redis
[root@axinlinux-01 ~]# cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
[root@axinlinux-01 ~]# redis-trib.rb create --replicas 1 192.168.208.128:7000 192.168.208.128:7002 192.168.208.128:7004 192.168.208.133:7001 192.168.208.133:7003 192.168.208.133:7005 #前三个端口数字小的为主。这条命令会将这6个端口(6个机器)组成一个cluster。出现两个绿色的ok即代表搭建成功
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.25 redis集群操作
因为是一个cluster(分布式),所以可以去连任何一个端口
1.redis-cli -c -h 192.168.133.130 -p 7000//-c说明以集群的方式登录
#如果不加-c仅仅只是登录的130:7000的这台机器,不能登录到集群
任意一个节点都可以创建key,或者查看key(演示)
2.redis-trib.rb check 192.168.133.130:7000//检测集群状态,后面跟任何的一个ip端口
#linux界面下执行
3.cluster nodes//列出节点
4.cluster info//查看集群信息
5.cluster meet ip port //添加节点
#cluster meet 192.168.208.133 7007
只要是新添加进来的节点都是master
6.cluster forget node_id //移除某个节点
#如果移除的是master,要讲他设为slave才可以。
移除slave的时候要登录其他的机器才可以,也就是不能在本机上移除自己
7.cluster replicate node_id//将当前节点设置为指定节点的从
#需要登录到这个节点里面去(登录到这个指定为从的机器里面去)
8.cluster saveconfig//保存配置文件。把当前的操作保存到配置文件里
#执行cluster saveconfig的时候,他保存到dir目录下的nodesXXXX.conf配置文件里,每个机器上都会有
实例:
1.
[root@axinlinux-01 ~]# redis-cli -c -h 192.168.208.128 -p 7000 #一定要加-c(以集群的方式进来)
192.168.208.128:7000> set key1 123
-> Redirected to slot [9189] located at 192.168.208.133:7001
OK
#以上,我们set一个数据,他会将这个操作定向到了192.168.208.133:7001上。那么最终这个key1,也会到这个机器上去。
192.168.208.128:7000> set key3 aerfereq #没有提示什么,就代表到了本地机器上
OK
192.168.208.128:7002> get key3
-> Redirected to slot [935] located at 192.168.208.128:7000
"aerfereq"
192.168.208.128:7000> get key4
-> Redirected to slot [13120] located at 192.168.208.128:7002
"efetewtw"
2.
[root@axinlinux-01 ~]# redis-trib.rb check 192.168.208.128:7000 #查看集群状态,后面个任何一个ip和端口
>>> Performing Cluster Check (using node 192.168.208.128:7000)
M: e7d5d070595f69aa235a7eb91fbd52825332d89e 192.168.208.128:7000 #谁是master
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 11929bb8ad6625f9c943f8c169beb8fc3c81f25e 192.168.208.128:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 40e060a8d1a7c73495c82b828d2722d432b446ac 192.168.208.133:7005 #谁是slave
slots: (0 slots) slave
replicates 11929bb8ad6625f9c943f8c169beb8fc3c81f25e
M: 72233bb45423a3d98901284feef716a99174ef74 192.168.208.133:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 5333348a617b0a22242d81935156f9645dc1d244 192.168.208.133:7003
slots: (0 slots) slave
replicates e7d5d070595f69aa235a7eb91fbd52825332d89e
S: 24fc94b3752fc129e0dcef478237249251e479d9 192.168.208.128:7004
slots: (0 slots) slave
replicates 72233bb45423a3d98901284feef716a99174ef74
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
3.
192.168.208.128:7000> CLUSTER nodes #列出节点
11929bb8ad6625f9c943f8c169beb8fc3c81f25e 192.168.208.128:7002@17002 master - 0 1542210458000 2 connected 10923-16383
40e060a8d1a7c73495c82b828d2722d432b446ac 192.168.208.133:7005@17005 slave 11929bb8ad6625f9c943f8c169beb8fc3c81f25e 0 1542210457000 6 connected
#查看slave的时候,ip和端口后面这个长长的字符串就是这个slave的master。这个常常的字符串对应的就是第一个master的ip和端口前面的字符串。所以192.168.208.128:7002为主192.168.208.133:7005为从
e7d5d070595f69aa235a7eb91fbd52825332d89e 192.168.208.128:7000@17000 myself,master - 0 1542210457000 1 connected 0-5460 #这个是本机自己
72233bb45423a3d98901284feef716a99174ef74 192.168.208.133:7001@17001 master - 0 1542210459471 4 connected 5461-10922
5333348a617b0a22242d81935156f9645dc1d244 192.168.208.133:7003@17003 slave e7d5d070595f69aa235a7eb91fbd52825332d89e 0 1542210459000 5 connected
24fc94b3752fc129e0dcef478237249251e479d9 192.168.208.128:7004@17004 slave 72233bb45423a3d98901284feef716a99174ef74 0 1542210459066 4 connected
4.
192.168.208.128:7000> CLUSTER INFO #查看集群的信息
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2792
cluster_stats_messages_pong_sent:2857
cluster_stats_messages_sent:5649
cluster_stats_messages_ping_received:2852
cluster_stats_messages_pong_received:2792
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:5649
5.
192.168.208.128:7000> cluster meet 192.168.208.133 7007 #增加一个节点
OK
192.168.208.128:7000> cluster nodes
ae84d3652d3f7de25b13e58036824863afbb438b 192.168.208.133:7007@17007 master - 0 1542211536000 0 connected #可以看到7007进来就是master的身份
192.168.208.128:7000> cluster meet 192.168.208.128 7006 #我们在添加一个新的节点进来,看他是什么角色
OK
192.168.208.128:7000> cluster nodes #结果他还是master,所以我们只要添加新的节点进来,他都是master
bb580afa0b3f97d47bf8dbc3f85164cb0f214028 192.168.208.128:7006@17006 master - 0 1542212017000 0 connected
7.
[root@axinlinux-01 etc]# redis-cli -c -h 192.168.208.128 -p 7006 #首先进入到7006记得加-c
192.168.208.128:7006> CLUSTER REPLICATE ae84d3652d3f7de25b13e58036824863afbb438b
OK #后面跟的想要成为他的master的nodes号
192.168.208.128:7006> cluster nodes #查看一下
bb580afa0b3f97d47bf8dbc3f85164cb0f214028 192.168.208.128:7006@17006 myself,slave ae84d3652d3f7de25b13e58036824863afbb438b 0 1542212361000 0 connected
ae84d3652d3f7de25b13e58036824863afbb438b 192.168.208.133:7007@17007 master - 0 1542212361896 7 connected
8.
192.168.208.128:7006> CLUSTER SAVECONFIG
OK
[root@axinlinux-03 etc]# cat /data/redis_data/7007/nodes_7007.conf
40e060a8d1a7c73495c82b828d2722d432b446ac 192.168.208.133:7005@17005 slave 11929bb8ad6625f9c943f8c169beb8fc3c81f25e 0 1542212351000 2 connected
72233bb45423a3d98901284feef716a99174ef74 192.168.208.133:7001@17001 master - 0 1542212348938 4 connected 5461-10922
bb580afa0b3f97d47bf8dbc3f85164cb0f214028 192.168.208.128:7006@17006 slave ae84d3652d3f7de25b13e58036824863afbb438b 0 1542212350959 7 connected
5333348a617b0a22242d81935156f9645dc1d244 192.168.208.133:7003@17003 slave e7d5d070595f69aa235a7eb91fbd52825332d89e 0 1542212347932 1 connected
ae84d3652d3f7de25b13e58036824863afbb438b 192.168.208.133:7007@17007 myself,master - 0 1542212349000 7 connected
24fc94b3752fc129e0dcef478237249251e479d9 192.168.208.128:7004@17004 slave 72233bb45423a3d98901284feef716a99174ef74 0 1542212350000 4 connected
e7d5d070595f69aa235a7eb91fbd52825332d89e 192.168.208.128:7000@17000 master - 0 1542212350151 1 connected 0-5460
11929bb8ad6625f9c943f8c169beb8fc3c81f25e 192.168.208.128:7002@17002 master - 0 1542212348000 2 connected 10923-16383
vars currentEpoch 7 lastVoteEpoch 0