Redis集群(主从集群)(一)
1、为什么要用redis集群?
首先单机版,需要考虑磁盘空间,如果单机版挂了,那么redis就挂了。
其次主从复制,如果做了独写分离,写的都发到主节点,读的话,都发到从节点。降低了读写的压力。但是从机没办法替换主机,
如果主机挂了,需要人工去用从机替换主机。
其次是哨兵模式,会提供特殊的redis节点,主要作用是监控主机,如果主机挂了,那么会选择从机替换主机。缺陷是写操作无法负载均衡,
替换过程种可能10秒不可用。
最后集群,是由多组哨兵集群
如果存入的数据是“hello” 那么对hello进行crc16算法算出hello的hash值,取余,分配到对应区间的主服务器上,其他两个主服务器是没有存这个数值的,它是采用
分片技术。
CRC16算法(待学)
2、集群搭建
本次版本采用5.0稳定版本,其余版本可以通过http://www.redis.cn/download.html下载(注:5.0以上的按照以下方法搭建)
下载redis到data目录下
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
cd redis-5.0.5
make MALLOC=libc
cd src && make install
编译安装成功
mkdir redis-cluster
mkdir redis7000
mkdir redis7001
mkdir redis7002
cp /data/redis-5.0.5/redis.conf ./redis7000
vim redis.conf
bind 服务器ip
port 7000
daemonize yes
dir /data/redis-cluster/redis7000 # 不写绝对路径,会在启动文件夹下
pidfile /var/run/redis_7000.pid # 因为一台服务器有三台redis,到时候.pid文件都会写到6379.pid文件夹中
cluster-enabled yes # 是否以集群方式启用
cluster-config-file nodes-7000.conf # 别的集群找到该集群的配置信息
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-migration-barrier 1 # master的slave数量大于该值,slave才能迁移到其他孤立的master上,想禁用可以使用一个比较大的值,小于0则启动失败
cluster-require-full-coverage yes # 三个集群要将所有的槽道分完,配置成yes时候,当一个服务器宕机后,只有到达这个服务器的数据是丢失的,其他都能正常。
# 配置设置成no时候,当一个服务器宕机后,该集群就不能接收数据
修改其他配置文件:因为只要修改7000为7001就可以了,记住,这里要chmod 777 redis.conf
sed 's/7000/7001/g' redis7000/redis.conf > ./redis7001/redis.conf
sed 's/7000/7002/g' redis7000/redis.conf > ./redis7002/redis.conf
# 启动redis:
/data/redis-5.0.5/src/redis-server /data/redis-cluster/redis7000/redis.conf
/data/redis-5.0.5/src/redis-server /data/redis-cluster/redis7001/redis.conf
/data/redis-5.0.5/src/redis-server /data/redis-cluster/redis7002/redis.conf
启动成功后:
ps -ef|grep redis 查看下
此时redis是以集群方式运行的,是单节点。
若是集群方式运行则进入redis set key1 value1是不可以的,如下:
/data/redis-5.0.5/src/redis-cli -h ip地址 -p 7000 -c # 不加-c相当于普通客户端,加了-c相当于以集群方式登陆,并且当在集群中一台redis设置值可以同时设置其他redis的值,这个功能只有redis-cli有,jedis没有
说明用集群启动后,必须要分配槽位才能运行
下面进行meet、指派槽位、分配主从
/data/redis-5.0.5/src/redis-cli -- cluster create ip1:port ip2:port ip3:port ip4:port ip5:port ip6:port --cluster-replicas 2
写在前面的默认
输入:
/data/redis-5.0.5/src/redis-cli --cluster help
扩容:用add-node方法
然后再用reshard去分配槽道
下面方法是检测集群是否正常
package com.mashibing.springboot04.util; import lombok.extern.slf4j.Slf4j; import lombok.var; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPoolConfig; import java.util.HashSet; import java.util.Set; import java.util.UUID; /** * @author yk * @create 2020/10/27 14:43 * @description */ @Slf4j public class TestRedisCluster { public static void main(String[] args) { Set<HostAndPort> nodeList = new HashSet<>(); nodeList.add(new HostAndPort("ip1",7000)); nodeList.add(new HostAndPort("ip1",7001)); nodeList.add(new HostAndPort("ip1",7002)); nodeList.add(new HostAndPort("ip2",7000)); nodeList.add(new HostAndPort("ip2",7001)); nodeList.add(new HostAndPort("ip2",7002)); nodeList.add(new HostAndPort("ip3",7000)); nodeList.add(new HostAndPort("ip3",7001)); nodeList.add(new HostAndPort("ip3",7002)); //Jedis连接池设置 var jedisPoolConfig = new JedisPoolConfig(); //最大空闲连接,默认8个 jedisPoolConfig.setMaxIdle(200); //最大连接数默认8个 jedisPoolConfig.setMaxTotal(1000); //最小空闲连接数,默认0 jedisPoolConfig.setMinIdle(100); //获取连接时最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常,小于0阻塞 jedisPoolConfig.setMaxWaitMillis(3000);//设置2秒 //对拿到的字段进行validateObject校验 jedisPoolConfig.setTestOnBorrow(false); JedisCluster jedisCluster = new JedisCluster(nodeList,jedisPoolConfig); while (true) { try { String s = UUID.randomUUID().toString(); jedisCluster.set("k" + s,"v" + s); System.out.println(jedisCluster.get("k" + s)); } catch (Exception e) { log.error(e.getMessage()); } } } }
视频学习链接: https://www.bilibili.com/video/BV1dE411y7wD?p=5