linux docker安装部署_linux was安装和部署_redis安装部署linux

前言

在生产中单机的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

linux docker安装部署_redis安装部署linux_linux was安装和部署

将cluster-enabled yes 的注释打开

linux docker安装部署_linux was安装和部署_redis安装部署linux

设置后端启动模式daemonize yes 不设置的话redis安装部署linux,在后面会报错

linux docker安装部署_redis安装部署linux_linux was安装和部署

保存并退出,根据上面操作修改其它的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 ../../

linux docker安装部署_linux was安装和部署_redis安装部署linux

5、创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下:

chmod +x start-all.sh

6、执行start-all.sh脚本,启动6个redis节点

linux docker安装部署_redis安装部署linux_linux was安装和部署

7、配置redis集群

要配置集群,我们需要一个工具,这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,ruby版本不对,再往下面的操作可能会报异常。

安装ruby环境:

yum install ruby

ruby脚本需要的gem包下载地址:

下载redis对应的gem包,上传linux服务器,并安装

gem install redis-4.1.0.gem 

redis安装部署linux_linux docker安装部署_linux was安装和部署

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

linux was安装和部署_linux docker安装部署_redis安装部署linux

10、访问集群

./redis-cli -c -h 47.93.8.79 -p 9001

要带有-c 要不不能集群之间跳转

linux was安装和部署_redis安装部署linux_linux docker安装部署

四、碰到的问题

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”));

}

}

测试结果

redis安装部署linux_linux was安装和部署_linux docker安装部署

redis安装部署linux_linux docker安装部署_linux was安装和部署

搞定!!!完美!!

喜欢的朋友可以关注“莫非技术栈”~海量学习资料免费送~

限时特惠:本站每日持续更新海量展厅资源,一年会员只需29.9元,全站资源免费下载
站长微信:zhanting688