Redis 集群搭建、Spring Data Redis使用


linux下的Redis安装

1.第一步:先安装C的编译环境:yum install gcc gcc-c++ libstdc++-devel tcl -y
	  因为需要使用gcc进行编译才能安装Redis,Redis是基于C语言开发的。
2.第二步:查看是否安装gcc成功,输入gcc或make是否出现以下提示。

3.第三步:可联网下载redis-4.0.10.tar.gz或其他版本的源代码包,并进行安装
	1.wget http://download.redis.io/releases/redis-4.0.10.tar.gz
	2.tar xzf redis-4.0.10.tar.gz(解压缩)
	3.cd redis-4.0.10(进入解压后目录)
	4.make(使用make命令会进行编译)
	5.make install PREFIX=/usr/local/redis(安装到/usr/local/redis目录下)

4.第四步:进入/usr/local/redis/bin目录下,查看到多个redis的命令文件


Redis服务器端的启动和停止

1.第一步:进入/usr/local/redis/bin目录下,有如下多个redis的命令文件

2.第二步:
	1.前台启动模式:在当前/usr/local/redis/bin目录下启动Redis服务器的命令:./redis-server
	2.后台启动模式:(每次修改完redis.conf请重新启动Redis服务器并再次指定加载该新修改后的redis.conf) 
		1.第一步:把 /redis-3.0.0的源码安装包目录下的 redis.conf 拷贝到 /usr/local/redis/bin的安装目录下
			  cp /root/redis-3.0.0/redis.conf /usr/local/redis/bin

		2.第二步:修改/usr/local/redis/bin/redis.conf:修改为 daemonize yes,即把原来的 no 改为 yes,设置为后台运行。
			  每次修改完redis.conf请重新启动Redis服务器并再次指定加载该新修改后的redis.conf

		3.第三步:在当前/usr/local/redis/bin目录下同时指定redis.conf 启动Redis服务器的命令:./redis-server redis.conf
			  即Redis服务器加载并应用该redis.conf中的配置信息再进行启动。

3.第三步:查看是否启动成功 

4.第四步:
	1.停止 前台模式下的redis服务器:ctrl + c
	2.停止 后台模式下的redis服务器:
		1.第一种方式:查看到redis-server的进程号,然后执行kill -9 进程号:ps aux|grep redis
		2.第二种方式:在/usr/local/redis/bin目录下,使用redis客户端进行停止redis服务器:./redis-cli shutdown
		3.第三种方式:执行了./redis-cli进入了redis客户端的输入模式下,执行shutdown命令也可停止redis服务器

 


Redis客户端的启动和停止 

1.第一种启动方式:在/usr/local/redis/bin目录下,执行:./redis-cli 
2.第二种启动方式:连接远程linux上的redis服务器,执行:./redis-cli -h 远程linux的IP -p 6379
		  默认连接localhost运行在6379端口的redis服务。
			-h:连接的服务器的地址
			-p:服务的端口号
3.第三种启动方式:
	1.加上--raw的作用:
		在客户端中显示查询出的中文数据时,如果以“/16进制”的形式显示中文数据的话,
		那么使用“./redis-cli --raw”在进入客户端,那么查询出的中文数据便能正常以中文字符的形式显示。
	2.例子:./redis-cli --raw
	        ./redis-cli -h 远程linux的IP -p 6379 --raw
	
4.redis客户端下使用ping命令查看redis服务器是否正常运行:


Redis集群的搭建

1.分布式:
	1.对于处理任务来说:
		物理上是分开的,做的任务是不同的。每个服务器负责执行程序中的不同部分的任务,只要其中一个服务器宕机,便会影响整个程序的完整性。
	2.对于存储数据来说:
		每个服务器存储的数据都是不一样的

2.集群:
	1.对于处理任务来说:
		物理上是分开的,做的任务是相同的。每个服务器负责执行程序中的同一部分的任务,即使其中一个服务器宕机,也不影响整个程序的完整性。
	2.对于存储数据来说: 
		1.每个服务器存储的数据都是一样的,分为两种,主服务器和从服务器。
		  主服务器负责提供数据库数据的增删查改,从服务器负责自动备份主服务器中的数据。主服务器和从服务器存储的都是相同的数据。
		  当主服务器宕机了之后,从服务器便替换作为主服务器来使用。
		2.对于数据库进行集群来说,还可以配置主从读取分离。主服务器负责提供数据库数据的增删改,从服务器负责提供数据库数据的查询。
		  主服务器和从服务器还涉及到同步相关配置。


Redis集群:redis-cluster架构图

1.所有的redis节点是互相联通自动传输数据的,所以客户端只要连接到任意一个redis节点上即能获取redis集群下的数据库中的任意数据。
2.搭建主、从的Redis集群中:
	1.所有的每个主的Redis节点负责互相自动传输数据,而每个Redis节点存储的都是不同的数据。
	  而每个主的Redis节点后面都可以连接一个或多个从的Redis节点,每个从的Redis节点只负责备份对应的主的Redis节点中的数据。
	2.当某一个主的Redis节点失效之后,该主的Redis节点对应的从的Redis节点便充当新的主Redis节点的作用。
3.Redis集群中一共内置了16384个哈希槽slot,假如当前Redis集群中有3个Redis节点,
  那么首先便会把 16384个哈希槽slot平均地自动分配并映射到对应的其中一个Redis节点上;当客户端要向Redis集群中存储键值对数据时,
  首先会根据crc16算法计算出该键值对中的key对应的是哪个哈希槽slot,然后根据“该键值对中的key对应的”哈希槽slot所映射的是哪个Redis节点,
  最终把该键值对存储到“哈希槽slot所映射到的”那个Redis节点上。
1.所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽 。
2.某个redis节点的失效是通过集群中超过半数的节点共同检测,认为该redis节点失效了时,就会使用该失效的redis节点的备份(从的redis服务器节点),
  此时的从的redis服务器节点相当于替换作为新的主的redis节点,而从的redis服务器节点平时负责备份主的redis服务器节点中的数据。
3.client客户端与redis节点直连,不需要中间proxy层,客户端不需要连接redis集群中的所有节点,客户端只需要连接redis集群中的任何一个可用节点即可。
4.redis-cluster把所有的物理节点映射到[0-16383]slot(哈希槽)上,redis-cluster负责维护 redis节点node <---> 哈希槽slot  <--->  数据值value
5.Redis集群中内置了 16384 个哈希槽slot,当需要在 Redis集群中存储一个 key-value键值对数据时,
  redis 先对 key 使用 crc16 算法算出一个结果值,然后把该结果值对 16384 进行求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,
  redis 会根据节点数量 大致均等地 将哈希槽映射到不同的redis节点上,然后把该键值对数据存储到“对应的哈希槽所映射到的”redis节点上。

Redis集群之搭建步骤

1.第一步:
	  首先需要确定Redis集群多少个Redis节点。
	  一般推荐至少集群3个或3个以上的Redis节点。
	  原因:集群中只有2个Redis节点的话,因为集群之间当有某一个Redis节点失效了的话,
	        是需要集群中超过半数的Redis节点进行投票判断该某个Redis节点是否失效了,所以如果只有集群中只有2个Redis节点的话,
		其中一个Redis节点失效了之后,只剩下一个有效节点的话,是无法达到“超过半数的Redis节点进行投票判断”的条件的,
		所以要求在搭建Redis集群中应至少集群3个或3个以上的Redis节点才符合要求。

2.第二步:
	确定Redis集群中每个“主”Redis节点都应该至少拥有一个“从”Redis节点以上,那么不仅能保证“从”Redis节点随时备份“主”Redis节点中的数据,
 	并且能保证当“主”Redis节点失效了之后,会有对应的一个“从”Redis节点加入到Redis集群中,替代失效的“主”Redis节点,
	否则整个Redis集群就会缺少部分数据库数据,而无法达到真正集群的效果和要求。

3.第三步:
	因为至少需要配置 3个“主”Redis节点,而每个“主”Redis节点还需要配置 1个“从”Redis节点,所以一共需要配置 6个Redis节点,
	而每个Redis节点都部署在不同的服务器上的话,则需要6台服务器,也即6台虚拟机。

模拟搭建一个伪的Redis集群

此处模拟搭建一个伪的Redis集群:
	在一个服务器中的一个虚拟机上,配置开启6个不同的Redis节点服务器,每个Redis节点服务器单独使用一个端口,
	一共配置7001~7006的6个端口。

1.第一步:
	/usr/local目录下 创建一个redis-cluster的文件夹,该redis-cluster文件夹下创建 6个分别叫做redis01~redis06的文件夹。
	然后redis01~redis06的每个文件夹中,都拷贝一份“/usr/local/redis/bin”(Redis安装目录)下所有的文件。
	还需要保证redis01~redis06的bin目录中都没有 dump.rdb 和 appendonly.aof 两个持久化数据文件,保证数据库是干净的空的。
	命令:	cd /usr/local
		mkdir /usr/local/redis-cluster/redis01
		mkdir /usr/local/redis-cluster/redis02
		mkdir /usr/local/redis-cluster/redis03
		mkdir /usr/local/redis-cluster/redis04
		mkdir /usr/local/redis-cluster/redis05
		mkdir /usr/local/redis-cluster/redis06
		cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis01 
		cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis02 
		cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis03 
		cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis04  
		cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis05 
		cp -r /usr/local/redis/bin /usr/local/redis-cluster/redis06 
 
	redis01~redis06的每个bin目录下的文件详情如下:

2.第二步:
	修改redis01~redis06的每个bin目录下的redis.conf配置文件:
		1.修改端口号(45行):6379的端口号 分别修改为7001~7006

		2.开启支持集群模式(632行):cluster-enabled yes
				默认是被注释掉的,取消注释,即集群模式

3.第三步:
	1.批处理连续启动6个Redis节点服务器,启动之前先保证没有多余的Redis服务器已经启动了。
	2.创建一个redis-start.sh批处理文件,放到/usr/local/redis-cluster/目录下。
redis-start.sh内容如下:
#!/bin/bash
cd redis01/bin/
./redis-server redis.conf
cd ../..
cd redis02/bin/
./redis-server redis.conf
cd ../..
cd redis03/bin/
./redis-server redis.conf
cd ../..
cd redis04/bin/
./redis-server redis.conf
cd ../..
cd redis05/bin/
./redis-server redis.conf
cd ../..
cd redis06/bin/
./redis-server redis.conf
cd ../..

shell脚本:
1.第一步:shell脚本中的第一行为:#!/bin/bash
2.第二步:shell脚本如果是在window编辑创建的,那么shell脚本的格式实际为dos,执行“vi shell脚本名”,
          然后执行“:set ff”查看到脚本的格式实际为dos,然后执行“:set ff=unix”,
	  把么shell脚本的格式修改为了unix。
3.第三步:修改脚本的执行权限,执行“chmod 777 shell脚本名”
4.第四步:执行脚本“./shell脚本名”
	3.chmod 777 redis-start.sh:修改脚本的执行权限
          ./redis-start.sh:执行redis-start.sh 批处理文件,开启6个7001~7006端口的Redis节点服务器

 	4.ps aux|grep redis-server

4.第四步:使用ruby脚本搭建Redis集群,首先需要安装ruby的运行环境
	1.第一步:安装 ruby环境 
		1.执行 yum install ruby
		2.执行 yum install rubygems

	2.第二步:ruby脚本运行redis-3.0.0.gem包 
		  执行 gem install redis-3.0.0.gem 

	3.第三步:进入到 /root/redis-3.0.0/src/的源码包目录下,把 redis-trib.rb脚本文件 拷贝到/usr/local/redis-cluster/下
		  命令:cp /root/redis-3.0.0/src/redis-trib.rb /usr/local/redis-cluster/
 
	4.第四步:使用ruby执行redis-trib.rb脚本文件 进行搭建Redis集群
		  1.执行的命令:./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005 192.168.25.133:7006
		  2.“create --replicas 1”命令中的“1”:表示每个“主”Redis节点后面都有一个“从”Redis节点
		  3.“./redis-trib.rb create --replicas 从节点数”命令后面还要拼接上所有每个的Redis节点服务器的“IP:端口”,
		     每个“IP:端口”之间使用空格隔开。


Redis集群之使用:Redis客户端连接Redis集群的服务器,进行存储数据

1.使用任意一个redis01~redis06下的bin目录中的rendis-cli客户端 连接 Redis集群下的任意一个Redis节点服务器 都可以进行 正常的存储/获取数据。
2.rendis-cli -p 端口 -c:
	1.rendis-cli -p 7001~7006中的任意一个端口。
	2.-c:表示进行集群链接。

3.rendis-cli -p “主”Redis节点服务器的端口 -c:
	每个“主”Redis节点服务器已分配好哈希槽slot,自动把键值对存储到“哈希槽slot所映射到的”那个“主”Redis节点服务器中。
 
4.rendis-cli -p “从”Redis节点服务器的端口 -c:
	每个“从”Redis节点服务器 都不拥有任何的哈希槽slot,所以往“从”Redis节点服务器中存储数据时,
	会自动转为把键值对存储到“哈希槽slot所映射到的”那个“主”Redis节点服务器中。


		1.执行命令:
			cd /home/data/redis/bin
			redis-cli -p 2311 -c
			127.0.0.1:2311> get ng
		  报错:(error) CLUSTERDOWN Hash slot not served
				(错误)clusterdown哈希槽未提供
 
		  执行命令:cd /home/data/redis/bin
					redis-cli --cluster check IP:2311 或 redis-trib.rb check 127.0.0.1:2311
		  报错:[ERR] Not all 16384 slots are covered by nodes.
				[错误]并非所有16384插槽都由节点覆盖
				
		2.解决:
				1.在修复之前,先使用redis-server命令启动所有的redis实例
				2.如果是使用redis-cli来搭建Redis集群的话,请使用如下修复命令。
					/home/data/redis/bin/redis-cli --cluster fix 127.0.0.1:2311
					/home/data/redis/bin/redis-cli --cluster fix 127.0.0.1:2312
				
				3.如果是使用redis-trib.rb来搭建Redis集群的话,请使用如下修复命令
					/home/redis-5.0.4/src/redis-trib.rb fix 127.0.0.1:2311
					/home/redis-5.0.4/src/redis-trib.rb fix 127.0.0.1:2312
	 
				4.注意:redis 5.0以上的版本,通过 redis-cli 进行搭建Redis集群。
						redis 5.0以下的版本,通过 redis-trib.rb 进行搭建Redis集群。

				5.执行redis-trib.rb命令可能出现的问题:
					命令:/home/redis-5.0.4/src/redis-trib.rb fix IP:端口号
					打印如下信息
						WARNING: redis-trib.rb is not longer available!
						You should use redis-cli instead.
						All commands and features belonging to redis-trib.rb have been moved
						to redis-cli.
						In order to use them you should call redis-cli with the --cluster
						option followed by the subcommand name, arguments and options.
						Use the following syntax:
						redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]
						Example:
						redis-cli --cluster fix
						To get help about all subcommands, type:
						redis-cli --cluster help
						
					意思是:redis-trib.rb不再可用,因为redis-trib.rb命令的功能已经移动到redis cli命令中。
							请使用 redis-cli --cluster 子命令[参数][选项]。
							例子:redis-cli --cluster fix IP:端口号
					原因:redis 5.0以上的版本,通过 redis-cli 进行搭建Redis集群。
						  redis 5.0以下的版本,通过 redis-trib.rb 进行搭建Redis集群
	Sorry, the cluster configuration file nodes.conf is already used by a different Redis Cluster node. 
	Please make sure that different nodes use different cluster configuration files.
	
	1.原因:如果在同一台机器上启动两个redis实例的话,因为当启动每一个redis实例的时候,都会自动生成一个nodes.conf文件,
		    想要解决上面报错,要保证以下两点的其中一点:
			1.要么保证每个redis实例对应的 redis.conf(redis-端口号.conf)配置信息如下:cluster-config-file nodes-端口号.conf
			2.如果没有配置cluster-config-file信息,要么redis实例启动的时候默认自动生成的文件名都统一为nodes.conf,
			  因此在同一台机器上有多个redis实例要启动的话,要么必须保证redis实例的文件都在单独一个的文件夹中,
			  要么启动每个redis实例的时候在不同的路径下执行启动命令,因为执行启动命令默认是在当前路径下自动生成nodes.conf的,
			  所以只要保证每次启动redis实例都在不同的路径下自动生成nodes.conf,那么便不会发生覆盖nodes.conf的问题。
	
	2.解决方式1:
		本教程建议您为每个实例配置使用单独的文件夹,因此每个实例也会在其自己的文件夹上生成nodes.conf。
		在每个目录中创建一个redis.conf文件,从7000到7005。每个端口名称的文件夹就是相当于一个redis实例。
		比如:
			/tmp/redis-cluster/7000
			/tmp/redis-cluster/7001
			/tmp/redis-cluster/7002
			/tmp/redis-cluster/7003
			/tmp/redis-cluster/7004
			/tmp/redis-cluster/7005
			
		您需要在每个实例的单独文件夹(每个端口名称的文件夹)中放置redis.conf文件,并且必须从该文件夹中运行可执行文件。
		假设要执行的redis-server文件在/tmp/redis-cluster/目录下,并且每个/tmp/redis-cluster/700x文件夹上都有redis.conf 
		执行命令流程如下:
			cd /tmp/redis-cluster/7000
			../redis-server ./redis.conf
		这样,nodes.conf将在当前/tmp/redis-cluster/7000文件夹下上生成,实际即是nodes.conf将在当前文件夹下(每个端口名称的文件夹中)上生成。
		
	3.解决方式2:
			在redis.conf(redis-2311.conf)的配置文件中修改如下配置:cluster-config-file nodes-2311.conf
			在redis.conf(redis-2312.conf)的配置文件中修改如下配置:cluster-config-file nodes-2312.conf
报错3:
	1.问题:如果进入1机的redis可以拿到数据,但是进入2机的redis却拿不到同样key的数据的话,或者从别的端口进入redis拿不到数据的话,
			应重新搭建redis集群,只需要执行一条搭建redis命令即可。
	2.原因分析:每台主机之间的主redis/备redis实例之间失去了联系,所以每个redis实例之间不再是集群关系,所以需要重新搭建redis集群,
			    只需要执行一条搭建redis命令即可。
	2.解决:执行搭建redis命令 
			/home/data/redis/bin/redis-cli --cluster create IP1:2311 IP1:2312 IP2:2311 IP2:2312 IP3:2311 IP3:2312 --cluster-replicas 1
			“--replicas 1”命令中的“1”:表示每个“主”Redis节点服务器后面都有1个“从”Redis节点服务器。
报错4:
	1.执行命令:/home/data/redis/bin/redis-cli --cluster create IP1:2311 IP1:2312 IP2:2311 IP2:2312 IP3:2311 IP3:2312 --cluster-replicas 1
	2.报错:Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
	3.解决:	
		1.删除各节点下的 dump.rdb 和 appendonly.aof
		2.删除各节点下的 redis.conf(redis-端口号.conf)所配置的 cluster-config-file 对应的 nodes.conf(nodes-端口号.conf)文件
		3.进入各节点下的 redis-cli -p 2311 -c、redis-cli -p 2312 -c 执行 “flushdb 数据库名” 或者 “flushall” 清空所有数据库
		  可用过获取所有key(keys *),查看是否所有key被清除完毕。
		  如果执行“flushdb 数据库名” 或者 “flushall” 清空所有数据库时,报错(error) READONLY You can't write against a read only replica,
		  表示当前进入的端口的数据库是备机,所以显示只读。
		4.各节点下重启redis
			/home/data/redis/bin/redis-server /home/data/redis/redis-2311.conf
			/home/data/redis/bin/redis-server /home/data/redis/redis-2312.conf
			ps aux|grep redis

Spring Data Redis 连接 Redis集群

 

 

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值