redis集群

1.redis集群
1.1. Redis集群是什么?
1.多个redis实例整合在一起,形成一个集群,也就是将数据分散到集群的多台机器上。
2.给每一个主服务器(master)备份一份从服务器(slave)。其中有一个是主节点(master),可以有多个从节点(slave)。主从之间通过数据同步,存储完全相同的数据。如果主节点发生故障,则把某个从节点改成主节点,访问新的主节点。
3. 建议使用奇数个,整体down几率更小。超过等于1/2服务器down掉是整个集群不可用。

1.2. 为什么需要使用redis集群

  1. 性能
    如果在一些并发量非常高的情况下,性能还是会受到影响。这个时候我们希望有更多的Redis 服务来完成工作。
  2. 扩展
    出于存储的考虑。因为Redis 所有的数据都放在内存中,如果数据量大,很容易受到硬件的限制。升级硬件收效和成本比太低,所以我们需要有一种横向扩展的方法。
  3. 可用性
    可用性和安全的问题。如果只有一个Redis 服务,一旦服务宕机,那么所有的客户端都无法访问,会对业务造成很大的影响。另一个,如果硬件发生故障,而单机的数据无法恢复的话,带来的影响也是灾难性的。

1.3. Redis 三种集群模式
1. 主从复制模式
2. 哨兵模式
3. Cluster 集群模式

1.4 主从复制模式特点
1. 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库。
2. 从数据库一般都是只读的,并且接收主数据库同步过来的数据。
3. 一个master可以拥有多个slave,但是一个slave只能对应一个master。
4. slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来。
5. master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务。
6. master挂了以后,不会在slave节点中重新选一个master。

1.5 sentinel哨兵模式特点
1.哨兵模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
2.当master挂了以后,哨兵会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
3.当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
4. 哨兵因为也是一个进程有挂掉的可能,所以哨兵也会启动多个形成一个哨兵集群
5.多哨兵配置的时候,哨兵之间也会自动监控。
6.当主从模式配置密码时,哨兵也会同步将配置信息修改到配置文件中,不需要担心
7.一个哨兵或哨兵集群可以管理多个主从Redis,多个哨兵也可以监控同一个redis
8. 哨兵最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,哨兵也挂了

1.6 Cluster 集群模式特点
哨兵模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或哨兵模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。

2.Cluster集群模式搭建(6个最小的集群,3个主3个从)
2. 1 由于redis集群需要使用ruby命令,需要先安装ruby
yum install ruby -y #安装rubyan脚本
yum install rubygems -y #安装ruby包管理器
#先上传redis-3.0.0.gem的压缩包到服务器,切换到/usr/local/tmp
gem install redis-3.0.0.gem #安装redis和ruby接口

2.2 创建一个文件夹redis-cluster,在其下面分别创建6个子文件夹
1:在/usr/local目录下创建redis-cluster文件夹
cd /usr/local
mkdir redis-cluster
2:进入到/usr/local/redis-cluster目录下,创建7001-7006文件夹
mkdir 7001 mkdir 7002 mkdir 7003 mkdir 7004 mkdir 7005 mkdir 7006

2.3 将之前安装的redis的/usr/local/redis/etc/redis.conf配置文件复制到7001-7006文件夹下
cp /usr/local/redis/etc/redis.conf /usr/local/redis-cluster/7001

2.4 对7001下的redis.conf配置文件进行修改
修改7001下的redis.conf配置文件内容:
vim redis.conf
1: redis服务后台启动
daemonize yes
2: *修改每一台机器的端口号 (44行)
port 7001
3: 绑定当前机器的ip (必须设置,深坑勿入) 64行
bind ip
4: *指定数据文件存储分位置 (必须设置,深坑勿入) 187行
dir /usr/local/redis-cluster/7001/
5: aof持久化机制 504行
appendonly yes
6: 启动集群模式 632行
cluster-enabled yes
7: 每一个服务器都对应一个conf文件, 640行
整个服务器就会知道别的节点,将自己的配置告诉集群。
(这里700
最好和端口对应上)
cluster-config-file nodes-7001.conf
8: 集群的有效时间ms 646行
cluster-node-timeout 15000
9: 如果有密码,去掉密码 注释 # requirepass
提示:7002-7006的配置文件参考7001,修改对应的数字即可。

2.5 将7001下的redis.conf配置文件分别复制到7002~7006文件夹下,编辑
配置文件,修改对应的数字即可
提示:将上面标红的7001的数字改成对于的文件夹的数字。

2.6 启动6个redis实例,并检查是否启动成功

  1. 启动redis实例
    /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7001/redis.conf
    /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7002/redis.conf
    /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7003/redis.conf
    /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7004/redis.conf
    /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7005/redis.conf
    /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7006/redis.conf
  2. 查看是否启动成功
    ps -ef | grep redis

2.7 首先到redis/src安装目录下,然后执行redis-trib.rb命令,操作集群脚本
cd /usr/local/redis/src
//执行redis-trib.rb命令: 1:代表主/从的比值,前面是主,后是从
./redis-trib.rb create --replicas 1 192.168.65.143:7001 192.168.65.143:7002 192.168.65.143:7003 192.168.65.143:7004 192.168.65.143:7005 192.168.65.143:7006

2.8到此集群环境搭建完成,进行验证
1 .连接任意一个客户端即可: -c 集群模式 -p:端口号 -h:IP地址
切换到/usr/local/redis/bin目录下
./redis-cli -c -h 192.168.65.143 -p 700*
2. 查看信息验证
cluster info 查看集群信息
cluster nodes 查看节点信息
3. 进行数据验证 set get
注意:并不是你往7001操作数据,数据就一定存储到7001中。
获取7001的数据,可能来自于其他的节点。
4. 关闭集群,只能使用命令,逐个进行关闭
/usr/local/redis/bin/redis-cli -c -h 192.168.65.143 -p 700* shutdown
Kill 进程号

2.9(补充)当出现集群无法启动时
删除7001-7006文件夹下的所有数据文件aof,rdb,conf。再次执行6-8步。

3.java操作redis集群
前提条件:启动redis的集群的服务器 7001-7006,并放行对应的端口。
3.1 打开idea, 创建maven的jar项目
3.2 打开pom.xml, 加入Jedis的jar的坐标,以及单元测试的坐标

redis.clients
jedis
3.3.0

3.3 编写测试类
//1:创建一个封装HostAndPort对象的集合,指定集群中所有的服务器的ip和端口
Set nodes=new HashSet();
nodes.add(new HostAndPort(“192.168.65.143”,7001));
nodes.add(new HostAndPort(“192.168.65.143”,7002));
nodes.add(new HostAndPort(“192.168.65.143”,7003));
nodes.add(new HostAndPort(“192.168.65.143”,7004));
nodes.add(new HostAndPort(“192.168.65.143”,7005));
nodes.add(new HostAndPort(“192.168.65.143”,7006));
//2:创建JedisCluster对象,指定6台服务器(6个ip和端口)
JedisCluster jedisCluster=new JedisCluster(nodes);
//3:存储字符串的值
//jedisCluster.set(“QQ”, “1181480608”);
//存储hash类用户信息的值
/*
jedisCluster.hset(“users”, “id”, “008”);
jedisCluster.hset(“users”, “name”, “xz”);
jedisCluster.hset(“users”, “sex”, “w”);
*/
//4:获取值
String qq=jedisCluster.get(“QQ”);
System.out.println(qq);
//关闭
jedisCluster.close();

3.4 可能出现的异常问题解决

1:redis.clients.jedis.exceptions.JedisConnectionException: no reachable node in cluster
防火墙进行拦截
1:关闭防火墙
2:放行7001-7006端口
vim /etc/sysconfig/iptable
service iptables restart

4.Jedis连接池配置
JedisPoolConfig cfg=new JedisPoolConfig();
cfg.setMaxTotal(100); //设置最大连接数
cfg.setMaxIdle(20); //设置最大的空闲数
cfg.setMinIdle(5); //设置最小的空闲数
cfg.setMaxWaitMillis(1000); //设置最大等待的毫秒数
cfg.setTestOnBorrow(true); //获取连接时检查是否有效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值