redis集群

redis cluster集群介绍

一、redis cluster概述

redis集群搭建的方式有多种,例如哨兵模式、使用zookeeper等,但从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存相应的数据和整个集群实例状态,每个节点都和其他所有节点相互连接;
群集实现需要一个中间件,然后这个中间件负责将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis节点,将这些数据存在这个redis的节点中;
在取值的时候,同样先将key进行计算,得到对应的值,然后就去找对应的redis节点,从对应的节点中取出对应的值;

redis集群_第1张图片
上图中每一个蓝色的圈都代表一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作;

二、redis cluster群集节点数据存取实现原理

首先,在redis的每一个节点上,都会存放以下两种数据;
1.一个是插槽(slot)可以理解为是一个可以存储两个数值的一个变量,这个变量的取值范围是:0-16383;
2.一个就是cluster,这个cluster理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作;

redis集群_第2张图片

三、redis cluster集群结构特点

1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
2.节点的fail是通过集群中超过半数的节点检测失效时才生效;
3.客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;
4.redis-cluster把所有的物理节点映射到 [0-16383]slot上(不一定是平均分配),cluster 负责维护node <—> slot <—> value;
5.redis集群预分好16384个桶,当需要在redis集群中放置一个key-value时,根据CRC16(key)mod 16384的值,决定将一个key放到哪个桶中;

四、安装

1.安装环境
系统环境 IP 实例端口 所需软件
centos7.8 192.168.100.101 (rd1) 6379、6380 redis-5.0.4.tar.gz
centos7.8 192.168.100.102 (rd2) 6379、6380 redis-5.0.4.tar.gz
centos7.8 192.168.100.103 (rd3) 6379、6380 redis-5.0.4.tar.gz
2.安装部署redis环境,三处节点部署一致
[root@rd1 ~]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
[root@rd1 ~]# tar xf redis-5.0.4.tar.gz
[root@rd1 ~]# cd redis-5.0.4/
[root@rd1 redis-5.0.4]# make
3.准备实例,每个节点两个实例
[root@rd1 ~]# mkdir /usr/local/redis{6379..6380}
[root@rd1 ~]# cp redis-5.0.4/src/redis-server /usr/local/redis6379/	#准备实例主程序
[root@rd1 ~]# cp redis-5.0.4/src/redis-server /usr/local/redis6380/
[root@rd1 ~]# cp redis-5.0.4/src/redis-cli /usr/local/redis6379/	#准备实例客户端程序
[root@rd1 ~]# cp redis-5.0.4/src/redis-cli /usr/local/redis6380/
[root@rd1 ~]# cp redis-5.0.4/redis.conf /usr/local/redis6379/		#准备实例主配置文件
[root@rd1 ~]# cp redis-5.0.4/redis.conf /usr/local/redis6380/
[root@rd1 ~]# mkdir /usr/local/redis6379/data	#准备实例数据存放位置
[root@rd1 ~]# mkdir /usr/local/redis6380/data
4.修改实例主配置文件,注意多个实例端口不一致
[root@rd1 ~]# vi /usr/local/redis6379/redis.conf
bind 192.168.100.101		#本机IP
port 6379		#实例1端口6379、实例2端口6380
daemonize yes	#设置redis后台运行
pidfile /var/run/redis_6379.pid		#pidfile文件
logfile "/usr/local/redis6379/redis.log"		#日志位置
dir /usr/local/redis6379/data/		#数据文件存放位置,手动创建
masterauth <123123>		#密码根据实际情况设置
requirepass 123123		#两处密码一致,根据实际情况设置
appendonly yes		# aof日志开启,有需要就开启,时间长了文件会很大
cluster-enabled yes		#开启cluster集群模式
cluster-config-file nodes-7000.conf		#cluster集群配置文件,无需创建,自动生成
cluster-node-timeout 15000				#cluster节点超时时间,默认15秒
5.启动redis实例进程,三处节点一致
[root@rd1 ~]# /usr/local/redis6379/redis-server /usr/local/redis6379/redis.conf
[root@rd1 ~]# /usr/local/redis6379/redis-server /usr/local/redis6380/redis.conf
验证端口状态
[root@rd1 ~]# netstat -utpln |grep redis
tcp        0      0 192.168.100.101:6379    0.0.0.0:*               LISTEN      23798/redis-server  
tcp        0      0 192.168.100.101:6380    0.0.0.0:*               LISTEN      23790/redis-server  
tcp        0      0 192.168.100.101:16379   0.0.0.0:*               LISTEN      23798/redis-server  
tcp        0      0 192.168.100.101:16380   0.0.0.0:*               LISTEN      23790/redis-server
6.创建redis集群
[root@rd1 ~]# /usr/local/redis6379/redis-cli -a 123123 --cluster create 192.168.100.101:6379 192.168.100.101:6380 192.168.100.102:6379 192.168.100.102:6380 192.168.100.103:6379 192.168.100.103:6380 --cluster-replicas 1
#-a	用户设置密码
#--cluster create:创建集群
#--cluster-replicas 1:表示一个master 对应一个slave

redis集群_第3张图片
redis集群_第4张图片

7.验证集群状态
[root@rd1 ~]# /usr/local/redis6379/redis-cli -a 123123 -h 192.168.100.101 -p 6379 -c		#-c:表示集群,不可省略
192.168.100.101:6379> cluster nodes
ea7d12b13afa68dfc55db677c5e1f7e0e48aec54 192.168.100.103:6379@16379 master - 0 1645965731000 5 	connected 10923-16383
ea3bc664387735cef6254d0e4f905a1376218b0b 192.168.100.102:6380@16380 slave c8043ea17379327de9bdf21d8687e1b4d057e100 0 1645965731556 4 connected
1077ab28be4e60b782880b64eaf69c7ae762412b 192.168.100.101:6380@16380 slave ea7d12b13afa68dfc55db677c5e1f7e0e48aec54 0 1645965731000 5 connected
c8043ea17379327de9bdf21d8687e1b4d057e100 192.168.100.101:6379@16379 myself,master - 0 1645965732000 1 connected 0-5460
8d2e2b93298f1d02fdd08e783c1bebef147a242b 192.168.100.102:6379@16379 master - 0 1645965733000 3 connected 5461-10922
d2d03bfa6ae11db9d172276087c3bfa3afe57464 192.168.100.103:6380@16380 slave 8d2e2b93298f1d02fdd08e783c1bebef147a242b 0 1645965733604 6 connected
#master插入数据并验证
192.168.100.101:6379> set name zs
-> Redirected to slot [5798] located at 192.168.100.102:6379		#访问192.168.100.101的6379实例,插入数据时,被写入192.168.100.102的6379实例,并且将终端直接转入相应实例
OK
192.168.100.102:6379> keys *		#且对应实例可以查到相应数据
1) "name"
192.168.100.102:6379> get name
"zs"
192.168.100.102:6379>
#slave验证
[root@rd1 ~]# /usr/local/redis6379/redis-cli  -a 123123 -h 192.168.100.103 -p 6380 -c		#访问相应从节点也是可以看见数据
192.168.100.103:6380> keys *
1) "name"
192.168.100.103:6380> get name
-> Redirected to slot [5798] located at 192.168.100.102:6379
"zs"
8.总结

插入数据时,redis计算key值,将其存放到192.168.100.102的6379实例,会直接跳转到192.168.100.102的6379实例,查找数据时可以通过192.168.100.102的6379实例192.168.100.103的6380实例查看;这也是redis cluster的特点,它是去中心化,每个节点都是对等的,连接哪个节点都可以获取和设置数据;

你可能感兴趣的:(运维,redis,数据库,缓存)