Redis集群
1、哨兵模式
哨兵可以有多个,从服务器也可以有多个,从服务器也可以有多个,在Redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会实现主从切换,将某一台的slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是主从切换的瞬间存在访问瞬断(在这个瞬间无法对外提供服务)的情况
2、高可用集群模式
小集群可以有多个(最多1000个, 1000*10万),Redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用、分片特性。Redis集群不需要哨兵也能完成节点移除和故障的转移功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩散。Redis集群的性能和高可用性均优于之前版本的手柄模式,且集群配置十分简单。
客户端如果访问第一个小集群去实现写的功能,然后又访问第二个小集群想要实现读操作,此时Redis集群内部就会从第二个小集群定位到第一个小集群(每个集群是不一样的,因为之前是对第一个小集群进行写操作,所以此时要定位到第一个小集群来实现读操作,否则就会出现数据不一致问题)
Master至少3个(为了选举)
Redis集群搭建
1、首先需要在linux中安装redis
安装完毕后,此时我的redis-server文件在目录/usr/local/bin下
redis-7.2.5在/usr/local/目录下
2、搭建redis:
redis集群至少需要3个master节点,在这里我们搭建3个master,并且给每一个master再搭建一个slave节点,总共是6个节点。步骤如下:
1)在/usr/local下创建文件夹redis-cluster 然后在其下面分别创建6个文件夹
mkdir -p /usr/local/redis-cluster
mkdir 8001
mkdir 8002
mkdir 8003
mkdir 8004
mkdir 8005
mkdir 8006
2)将之前的redis.conf配置文件复制到 8001下 并修改相应的配置
cp /usr/local/bin/redisconfig/redis.conf /usr/local/redis-cluster/8001/
(我之前安装的时候redis.con存放在/usr/local/bin/redisconfig/redis.conf 路径中)
进入到对应的redis.conf文件中修改相应配置
vi redis.conf
修改配置
daemonize yes (表示可以后台启动)
port 8001(分别对每个机器的端口号进行设置)
bind 192.168.67.128(必须要绑定当前机器的ip,方便redis集群定位机器,不绑定可能会出现循环查找集群节点机器的情况 我虚拟机的ip是192.i68.68.128 可以通过ifconfig命令查找当前机器的ip)
dir /usr/local/redis-cluster/8001/(指定数据文件的存放位置,必须要指定不同的目录位置,不然会丢失数据)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes-8001.conf(这里800X最好和port对应上)
cluster-node-timeout 5000(超时时间)
appendonly yes(心跳检测,若此时的redis集群出现问题,则其心跳和其他集群的心跳停止,若心跳停止超过5000,则该集群将消失)
3)然后将修改后的redis.conf文件分别复制到各个文件夹下(8002 8003 8004 8005 8006),并将其中的8001改成相应的号
cp /usr/local/redis-cluster/8001/redis.conf /usr/local/redis-cluster/8002/
cd ..(因为此时在8001文件下)
cd 8002
vi redis.conf(进入该文件中进行修改)
:%s/8001/8002/g(批量修改,将8001全部改成8002
批量修改操作:%s/原字符串/目标字符串/g)
:wq(保存并退出文本编辑)
8003 8004 8005 8006 同样的方式进行修改
4)分别启动6个redis实例,然后检查是否启动成功
/usr/local/bin/redis-server /usr/local/redis-cluster/800x/redis.conf
ps -ef | grep redis
5)由于redis集群需要使用ruby命令,所以我们需要安装ruby
yum install ruby
yum install rubygems
gem install redis
6)进入到redis-7.2.5(我安装的redis版本是7.2.5)的src目录下执行命令创建集群
cd /usr/local/redis-7.2.5/src
创建集群
redis-cli --cluster create 192.168.67.128:8001 192.168.67.128:8002 192.168.67.128:8003 192.168.67.128:8004 192.168.67.128:8005 192.168.67.128:8006 --cluster-replicas 1
1:表示总共的master/总共的slave ==1
7)验证集群
连接任意一个客户端即可 :./redis-cli -c-h -p(-c 表示集群模式)
例如 /usr/local/bin/redis-cli -c -h 192.168.67.128 -p 800x
进行验证
cluster info(查看集群信息)
cluster nodes(查看节点列表)
进行数据操作验证 (此时三个master以此使用(redirected))
set name xx
set name1 yy
set name2 hh
get name1
关闭集群
/usr/local/bin/redis-cli -c -h 192.168.67.128 -p 800x shutdown
java中使用redis集群
1、导入Jedis依赖
2、编写Java代码
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
//Redis集群
public class RedisCluster {
public static void main(String [] args) throws IOException {
//创建6台服务器并将其放到一个hashset中
Set<HostAndPort> JedisClusterNode=new HashSet<HostAndPort>();
JedisClusterNode.add(new HostAndPort("192.168.67.128",8001));
JedisClusterNode.add(new HostAndPort("192.168.67.128",8002));
JedisClusterNode.add(new HostAndPort("192.168.67.128",8003));
JedisClusterNode.add(new HostAndPort("192.168.67.128",8004));
JedisClusterNode.add(new HostAndPort("192.168.67.128",8005));
JedisClusterNode.add(new HostAndPort("192.168.67.128",8006));
//创建一个JedisPoolConfig连接池
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(100);//maxTotal:资源池中最大的连接数
config.setMaxIdle(10);//资源池允许最大空闲的连接数
config.setTestOnBorrow(true);//向资源池借用连接时,是否做有效性检测
//redis集群的访问类JedisCluster
JedisCluster jedisCluster=new JedisCluster(JedisClusterNode,1000,10,config);//服务器、等待时间、重传次数、连接池
//测试
System.out.println(jedisCluster.set("student","Tom"));
System.out.println(jedisCluster.set("age","11"));
System.out.println(jedisCluster.get("student"));
System.out.println(jedisCluster.get("age"));
//关闭
jedisCluster.close();
}
}
此时redis集群中就已经有了这些数据可以进行查看,在linux中输入 get “student”查看结果