一、redis集群环境准备

1、部署Redis集群的目的:

多台服务器一起提供数据存储服务;
实现数据的分布式存储;
可以实现服务的高可用;
可用实现数据自动备份;

2、服务器IP地址及端口:

主机名          IP地址          	  端口
redisA       192.168.4.61         6379     
redisB       192.168.4.62         6379     
redisC       192.168.4.63         6379     
redisD       192.168.4.64         6379
redisE       192.168.4.65         6379
redisF       192.168.4.66         6379
mgm68      192.168.4.68           无

redisA、B、C、D、E、F安装redis服务即可

3、redisA修改监控地址和启用redis集群相关功能

[root@redisA ~]# /etc/init.d/redis_6379 stop

4、启用redis集群相关功能

[root@redisA ~]# vim /etc/redis/6379.conf
70 bind 192.168.4.61						#修改监控地址
815  cluster-enabled yes					#取消注释,启用集群功能
823  cluster-config-file nodes-6379.conf		#取消注释,存储集群信息相关文件
829  cluster-node-timeout 5000				#设置集群通信的超时时间(5000秒)
[root@redisA ~]# /etc/init.d/redis_6379 start
[root@redisA ~]# ss -ntulp | grep redis

5、连接redis服务,查看集群信息

[root@redisA ~]# redis-cli -h 192.168.4.61 -p 6379

6、做redis集群时,要保证所有的节点的数据为空,flushall(清空所有数据)

192.168.4.61:6379> keys *
192.168.4.61:6379> cluster info		#查看集群的相关信息
cluster_state:fail          			#集群状态,失败

7、redisB、C、D、E、F相同操作,只是监听的地址换成各自本机的地址

二、创建redis集群

配置管理主机
部署 ruby 脚本运行环境
创建管理集群脚本 redis-trib.rb

1、部署ruby 脚本运行环境,在mgm68上操作

# gem命令,用于安装ruby脚本连接redis服务的软件
[root@mgm68 ~]# yum -y install ruby rubygems
[root@mgm68 ~]# which gem		#查看gem命令是否存在
[root@mgm68 ~]# gem install redis-3.2.1.gem 	此软件,用于ruby脚本连接redis服务
[root@mgm68 ~]# ls redis-4.0.8/src/*.rb	#在redis源码包目录下,找到管理redis集群脚本
redis-4.0.8/src/redis-trib.rb

2、便于管理,将脚本拷贝到linux命令的默认查找路径下

[root@mgm68 ~]# echo $PATH		#查看linux命令的默认查找路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

3、创建目录,将管理脚本拷贝到该目录下,授予执行权限

[root@mgm68 ~]# mkdir  /root/bin
[root@mgm68 ~]# cp /root/redis-4.0.8/src/redis-trib.rb  /root/bin/
[root@mgm68 ~]# chmod +x  /root/bin/redis-trib.rb

4、Tab键,可以直接以脚本的名称直接运行,help 查看使用方法

[root@mgm68 ~]# redis-trib.rb  help

5、创建集群

#create 创建集群;
#redis集群在创建时,默认会将集群列表中的前3台服务器配置成主服务器,剩下的服务器才会被配置成从服务器;
#–replicas 1 指给每一台主服务器分配1台从服务器,需要6台服务器;
#–replicas 2 指给每一台主服务器分配2台从服务器,需要9台服务器;
#–replicas 3 指给每一台主服务器分配3台从服务器,需要12台服务器;
#最后用IP地址和端口号,指定redis集群的列表,前三台默认为主服务器

[root@mgm68 ~]# redis-trib.rb create --replicas 1  192.168.4.61:6379  192.168.4.62:6379  192.168.4.63:6379  192.168.4.64:6379  192.168.4.65:6379   192.168.4.66:6379

Creating cluster
Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.4.61:6379    #主服务器
192.168.4.62:6379    #主服务器
192.168.4.63:6379    #主服务器

#### 192.168.4.65 为 192.168.4.61的从服务器
Adding replica 192.168.4.65:6379 to 192.168.4.61:6379

#### 192.168.4.66 为 192.168.4.62的从服务器
Adding replica 192.168.4.66:6379 to 192.168.4.62:6379

#### 192.168.4.64 为 192.168.4.63的从服务器
Adding replica 192.168.4.64:6379 to 192.168.4.63:6379

#### M 指的是主服务器(占用hash槽); 
#### S 指的是从服务器(不占用hash槽,从主服务器同步数据)
M: c1198049c748cd11daff4a2477bd9dcdb3358fba 192.168.4.61:6379
   slots:0-5460 (5461 slots) master
M: 1417e06b26368b5e465fad155ad8a5520a937402 192.168.4.62:6379
   slots:5461-10922 (5462 slots) master
M: 4515ec026b1fba677cc13f0d8f72d18afde8b6b8 192.168.4.63:6379
   slots:10923-16383 (5461 slots) master
S: eb6558d188e64bb36016390030657f0eaa34f2cb 192.168.4.64:6379
   replicates 4515ec026b1fba677cc13f0d8f72d18afde8b6b8
S: 8a527e4080f47e5172715ef8cba58321534a125c 192.168.4.65:6379
   replicates c1198049c748cd11daff4a2477bd9dcdb3358fba
S: bbe8589f4a41adfd24ccfaae3a4fe27d5b5c4b53 192.168.4.66:6379
   replicates 1417e06b26368b5e465fad155ad8a5520a937402

###########输入 yes,确认配置
Can I set the above configuration? (type 'yes' to accept): yes
 
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.4.61:6379)
M: c1198049c748cd11daff4a2477bd9dcdb3358fba 192.168.4.61:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: bbe8589f4a41adfd24ccfaae3a4fe27d5b5c4b53 192.168.4.66:6379
   slots: (0 slots) slave
   replicates 1417e06b26368b5e465fad155ad8a5520a937402
S: eb6558d188e64bb36016390030657f0eaa34f2cb 192.168.4.64:6379
   slots: (0 slots) slave
   replicates 4515ec026b1fba677cc13f0d8f72d18afde8b6b8
S: 8a527e4080f47e5172715ef8cba58321534a125c 192.168.4.65:6379
   slots: (0 slots) slave
   replicates c1198049c748cd11daff4a2477bd9dcdb3358fba
M: 4515ec026b1fba677cc13f0d8f72d18afde8b6b8 192.168.4.63:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: 1417e06b26368b5e465fad155ad8a5520a937402 192.168.4.62:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...

[OK] All 16384 slots covered.				#所有的slots(槽)分配完成

6、查看集群信息,选择查看任何节点均可,结果相同

[root@mgm68 ~]# redis-trib.rb info 192.168.4.65:6379
192.168.4.61:6379 (c1198049...) -> 0 keys | 5461 slots | 1 slaves.
192.168.4.63:6379 (4515ec02...) -> 0 keys | 5461 slots | 1 slaves.
192.168.4.62:6379 (1417e06b...) -> 0 keys | 5462 slots | 1 slaves.
主服务器地址和端口(ID值) ——> 存储变量的个数 | 占用槽的个数 | 从服务器个数

7、check 查看集群的详细信息,M 指的是主服务器(占用hash槽); S 指的是从服务器(不占用hash槽,从主服务器同步数据),最后指定主服务器的ID值

[root@mgm68 ~]# redis-trib.rb check 192.168.4.65:6379

redis服务器本机上,查看集群信息,在redisA上操作
[root@redisA ~]# cat  /var/lib/redis/6379/nodes-6379.conf
[root@redisA ~]# redis-cli -h 192.168.4.61 -p 6379
192.168.4.61:6379> cluster info		#查看集群的状态信息
cluster_state:ok            #集群状态,OK
cluster_slots_assigned:16384
...
cluster_known_nodes:6        #集群中有6台服务器
cluster_size:3               #集群中有3台主服务器
...
192.168.4.61:6379> cluster nodes		#查看所有节点的信息
#节点在集群中的ID值(唯一的)    ID对应节点的IP地址,端口号及集群端口号   myself为当前访问的节点,master为主服务器,slave指从服务器  .......

8、vpc50客户端,访问集群存取数据

客户端通过-c 访问redis集群,访问任何一个节点都可以
[root@vpc50 ~]#  redis-cli -c -h 192.168.4.63 -p 6379

##redis集群中存入数据,给数据分配槽编号为5798
##根据槽编号所在的位置,将数据存入到4.62主机上,切换到4.62主机中
192.168.4.63:6379> set name plj
-> Redirected to slot [5798] located at 192.168.4.62:6379
192.168.4.62:6379> keys *
1) "name"

查看4.62主机的从服务器信息,到从服务器4.66本机上,验证数据是否同步
192.168.4.62:6379> info replication
# Replication
role:master               #4.62为主服务器
connected_slaves:1        #4.62的从服务器为4.66
slave0:ip=192.168.4.66,port=6379,state=online,offset=2813,lag=1


##redis集群中继续存入数据,给数据分配槽编号为741
##根据槽编号所在的位置,将数据存入到4.61主机上,切换到4.61主机中
192.168.4.62:6379> set age 19
-> Redirected to slot [741] located at 192.168.4.61:6379

##查看4.61主机的从服务器信息,到从服务器4.65本机上,验证数据是否同步
192.168.4.61:6379> info replication
# Replication
role:master             #4.61为主服务器
connected_slaves:1      #4.61的从服务器为4.65   
slave0:ip=192.168.4.65,port=6379,state=online,offset=3777,lag=0
.....
##查看当前库下的所有变量,可以看到数据
192.168.4.61:6379> keys *

##redis集群中继续存入数据,给数据分配槽编号为8455
##根据槽编号所在的位置,将数据存入到4.62主机上,切换到4.62主机中
192.168.4.61:6379> set school tarena
-> Redirected to slot [8455] located at 192.168.4.62:6379
edis集群中继续存入数据,继续存储在4.62主机上
192.168.4.62:6379> set class nsd2020

#查看4.62主机上的所有变量
192.168.4.62:6379> keys *
1) "school"
2) "class"
3) "name"

9、redis集群数据存储

#1》redis集群在部署完成后,每个 master主机 都被分配了一批不同编号的槽;
#2》存储数据时,会根据算法,为数据分配不同编号的槽;
#3》根据槽编号所在的位置,将数据存储在相应的master主机上;
#4》master主机对应的从服务器也会同步主服务器中的数据;

10、-c 客户端从集群中读取数据,在vpc50上

[root@redis ~]# redis-cli -c -h 192.168.4.63 -p 6379
192.168.4.62:6379> keys *
192.168.4.62:6379> get name		#从本机中获取name变量的值
192.168.4.62:6379> get age		#根据槽的编号741从4.61的主机上获取age变量的值
-> Redirected to slot [741] located at 192.168.4.61:6379
"19"