1、创建用于演示的集群文件夹 mkdir cluster 2、给对应端口创建目录 cd cluster mkdir 8000 8001 8002 8003 8004 8005 3、复制redis.conf文件到对应的目录下 cp redis.conf zhRedisDemo/cluster/8000 cp redis.conf zhRedisDemo/cluster/8001 cp redis.conf zhRedisDemo/cluster/8002 cp redis.conf zhRedisDemo/cluster/8003 cp redis.conf zhRedisDemo/cluster/8004 cp redis.conf zhRedisDemo/cluster/8005 4、修改配置文件的值【6台机器的都要修改】 daemonize yes #守护线程方式启动【后台运行】 port 8000 #端口 pidfile /var/run/redis_8000.pid #把pid进程号写入pidfile配置的文件 dir /usr/local/redis‐cluster/8000/ #指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据 cluster‐enabled yes #启动集群模式 cluster‐config‐file nodes‐8000.conf #集群节点信息文件,这里800x最好和port对应上 cluster‐node‐timeout 10000 #集群连接超时时间 #bind 127.0.0.1 #bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可 protected‐mode no #关闭保护模式 appendonly yes #打开AOF持久化 equirepass xxxxxxx #设置redis访问密码 masterauth xxxxxxx #设置集群节点间访问密码,跟上面一致 5、分别启动6台实例 6、使用redis‐cli创建整个redis集群【Redis5.0+版本】 redis-cli -a 密码 --cluster create --cluster-replicas 1 120.24.58.161:8000 120.24.58.161:8001 120.24.58.161:8002 120.24.58.161:8003 120.24.58.161:8004 120.24.58.161:8005
Redis Cluster 将所有数据划分为16384slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储于每个节点中。
当 Redis Cluster 的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个key时,可以直接定位到目标节点。
PS:因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。
Cluster 默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位。
HASH_SLOT = CRC16(key) mod 16384
PS:新节点加入集群中时是无法写数据的(没有slot槽位),需要从新分配槽位后才可以访问
PS:迁移槽位会把对应的数据也迁移过去
PS:新节点加入集群时都是master节点
当客户端向一个错误的节点发出了指令,该节点会发现指令的key所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。
客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有key将使用新的槽位映射表。
Redis cluster节点间采取gossip协议进行通信,有两种方式:
PS:很多中间件都会借助zookeeper集中式存储元数据。
gossip协议包含多种消息,包括ping,pong,meet,fail等等。
每个节点都有一个专门用于节点间gossip通信的端口,就是自己提供服务的端口号+10000,
举个