前言
在生产中单机的redis服务不能保证程序的高可用,所以有时需要我们来搭建一个redis集群,保证某一台redis服务挂了的时候,我们的服务还可以保证正常运行。
单机redis的搭建,可以参考我的文章手把手教你从零搭建一个redis服务
一、redis集群的介绍
1、redis是一个key value存储系统,redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我使用的是redis-4.0.8版本;
2、为了保证集权的高可用,redis-cluster有这么一个投票容错机制,半数以上的节点认为某一个节点挂了,那么这个节点就挂了。
3、如果只有主节点,没有从节点,如果一个节点挂了,那个这个集群就挂了。
4、一个 redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个数据都属于这16384个哈希槽中的一个。集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽。集群中的每一个节点负责处理一部分哈希槽。
5、集群中的主从复制
集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点,继续工作。这样集群就不会因为一个主节点的下线而无法正常工作
二、redis集群的需要的环境
1、因为redis有容错投票机制,所以至少需要3个节点的redis服务。因为2个节点没有办法构成集群。
2、一个主节点有一个从节点,3个主节点就需要3个从节点,所以一共需要6个节点的redis的服务。
3、因为条件有限,我们用同一台服务器,不同的端口号来模拟9001-9006
4、redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379,则集群总线端口为16379
5、需要关闭防火墙,如果是阿里云服务器上,需要配置如下安全组
1、在usr/local目录下新建redis-cluster目录,用户存放我们的redis服务
cd /usr/local/ mkdir redis-cluster
2、复制我们的单机redis
cp -r redis redis-cluster/redis01 cp -r redis redis-cluster/redis02 cp -r redis redis-cluster/redis03 cp -r redis redis-cluster/redis04 cp -r redis redis-cluster/redis05 cp -r redis redis-cluster/redis06 cd redis-cluster/ ls
3、修改redis服务的配置文件redis.conf
cd redis01/bin/ vi redis.conf
注释掉#bind 127.0.0.1
设置端口port 9001
将cluster-enabled yes 的注释打开
设置后端启动模式daemonize yes 不设置的话redis安装部署linux,在后面会报错
保存并退出,根据上面操作修改其它的redis服务配置。
如果设置安全模式redis安装部署linux,还得把安全模式给关闭了protected-mode no,要不外网不能访问服务器。
4、创建一个统一的启动文件start-all.sh
cd redis01/bin/ ./redis-server redis.conf cd ../../redis02/bin/ ./redis-server redis.conf cd ../../redis03/bin/ ./redis-server redis.conf cd ../../redis04/bin/ ./redis-server redis.conf cd ../../redis05/bin/ ./redis-server redis.conf cd ../../redis06/bin/ ./redis-server redis.conf cd ../../
5、创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下:
chmod +x start-all.sh
6、执行start-all.sh脚本,启动6个redis节点
7、配置redis集群
要配置集群,我们需要一个工具,这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,ruby版本不对,再往下面的操作可能会报异常。
安装ruby环境:
yum install ruby
ruby脚本需要的gem包下载地址:
下载redis对应的gem包,上传linux服务器,并安装
gem install redis-4.1.0.gem
8、复制ruby脚本工具复制到usr/local/redis-cluster目录下
脚本在那呢,就是redis/src目录下的redis-trib.rb文件
cp redis-trib.rb /usr/local/redis-cluster
9、通过ruby脚本配置集群
./redis-trib.rb create --replicas 1 47.93.80.79:9001 47.93.8.79:9002 47.93.8.79:9003 47.93.8.79:9004 47.93.8.79:9005 47.93.8.79:9006
10、访问集群
./redis-cli -c -h 47.93.8.79 -p 9001
要带有-c 要不不能集群之间跳转
四、碰到的问题
1、在执行gem install redis时 : ERROR: Error installing redis: redis requires Ruby version >= 2.2.2
解决办法就是升级Ruby
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 curl -L get.rvm.io | bash -s stable source /usr/local/rvm/scripts/rvm rvm install 2.3.8
2、redis集群 Waiting for the cluster to join 一直等待
这个问题一般就是防火墙没有关闭,或者阿里云服务器没有给对应的端口权限,例如上面的安全组配置,我们不仅需要设置9001-9006端口的安全组,还要设置19001-19006的安全组。
redis会为主节点设置总线端口,在现有的端口上+10000,所以需要配置一下总线的端口。
3、redis集群 redis-cli连接使用命令提示错误(error) MOVED5798 47.93.8.79:9001
解决就是通过客户端链接的时候加上-c
./redis-cli -c -h 47.93.8.79 -p 9001
4、./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call’
原因就是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净。)
解决办法:用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。
注意:不是到bin目录下执行./redis-cli 而是通过下面的命令链接
./redis-cli -h 47.93.80.79 -p 9001
五、代码测试
spring-redis.xml
接口JedisClient
public interface JedisClient { String get(String key);//读取值 String set(String key,String value);//设置值 }
实现类JedisClientCluster
public class JedisClientCluster implements JedisClient { @Autowired private JedisCluster jedisCluster; @Override public String get(String key) { return jedisCluster.get(key); } @Override public String set(String key, String value) { return jedisCluster.set(key, value); } }
测试类redisController
@Controller
@RequestMapping(“/redis”)
public class redisController {
@Autowired
private JedisClientCluster jedisClientCluster;
@RequestMapping(“/test”)
public void redisTest() {
jedisClientCluster.set(“name”, “xiaoming”);
System.out.println(jedisClientCluster.get(“name”));
}
}
测试结果
搞定!!!完美!!
喜欢的朋友可以关注“莫非技术栈”~海量学习资料免费送~
限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688