redis深度剖析: 04 redis cluster

1.数据分布算法node

讲解分布式数据存储的核心算法,数据分布的算法redis

从老到新的算法演变:算法

hash算法  ->  一致性hash算法 -> redis cluster,hash slot 算法vim

1) redis cluster基本介绍api

(1)自动将数据进行分片,每一个master上放一部分数据缓存

(2)提供内置的高可用支持,部分master不可用时,仍是能够继续工做的网络

在redis cluster架构下,每一个redis要放开两个端口号,好比一个是6379,另一个就是加10000的端口号,好比16379架构

16379端口号是用来进行节点间通讯的,也就是cluster bus的东西,集群总线。cluster bus的通讯,用来进行故障检测,配置更新,故障转移受权app

cluster bus用了另一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间负载均衡

2) hash算法(最老土,有不少弊端)

计算哈希值, 拿哈希值和master数量取模, 得出取模结果,发布到对应的master上

`最大的弊端,只要一台master宕机,基本上全部的key都会所有失效

3) 一致性hash算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)

一致性hash算法:

若是master宕掉一台: 只会丢失 1/N 的数据

可能会有一个缓存热点的问题,某个master上的数据特别多

为了解决这个问题,引入了虚拟节点,实现负载均衡:

4) redis cluster的hash slot算法:

redis cluster有固定的16384个hash slot,对每一个key计算CRC16值,而后对16384取模,能够获取key对应的hash slot

redis cluster中每一个master都会持有部分slot,好比有3个master,那么可能每一个master持有5000多个hash slot

hash slot让node的增长和移除很简单,增长一个master,就将其余master的hash slot移动部分过去,减小一个master,就将它的hash slot移动到其余master上去

移动hash slot的成本是很是低的

客户端的api,能够对指定的数据,让他们走同一个hash slot,经过hash tag来实现

经过hash slot 可让数据分布尽可能的均匀

某台master宕机以后, redis cluster 会在最短的时间把宕机的master 的hash slot平分给正常运行的master上

2.redis cluster集群搭建(redis 5.0)

这里说一下redis5.0 以后,集群搭建变的简单许多,直接能够经过redis-cli 搭建集群

配置文件说明:

# redis后台运行

daemonize yes

# 绑定的主机端口

bind 127.0.0.1

# 数据存放目录

dir /usr/local/redis-cluster/data/redis-6379

# 进程文件

pidfile /var/run/redis-cluster/${自定义}.pid

# 日志文件

logfile /usr/local/redis-cluster/log/${自定义}.log

# 端口号

port 6379

# 开启集群模式,把注释#去掉

cluster-enabled yes

# 集群的配置,配置文件首次启动自动生成

cluster-config-file /usr/local/redis-cluster/conf/${自定义}.conf

# 请求超时,设置15秒

cluster-node-timeout 15000

# aof日志开启,有须要就开启,它会每次写操做都记录一条日志

appendonly yes

redis cluster集群,要求至少3个master,每一个master建议至少给一个slave

正式环境下建议都是在6台机器上去搭建,至少3台机器

保证,每一个master都跟本身的slave不在同一台机器上

1) 配置redis

一、首先正常安装一个redis

[root@localhost ~]# tar zxf redis-5.0.5.tar.gz

[root@localhost  ~]# cd redis-5.0.5

[root@localhost  redis-3.2.3]# make&& make install

[root@localhost  redis-3.2.3]# cd utils/

[root@localhost  utils]# ./install_server.sh

#按照默认位置便可(回车下去就好)

二、修改主配置文件

#cp /etc/redis/6379.conf   /etc/redis/redis.conf

#vim /etc/redis/redis.conf

daemonize yes

port 7000

cluster-enabled yes

cluster-config-file nodes-7000.conf . //这个编号最好是等于你的端口号

cluster-node-timeout 15000

appendonly yes

三、用6份配置文件启动6个实例

#mkdir -p /redis/{7000,7001,7002,7003,7004,7005}

#cp /etc/redis/redis.conf /redis/7000/

#cp /etc/redis/redis.conf /redis/7001/

#cp /etc/redis/redis.conf /redis/7002/

#cp /etc/redis/redis.conf /redis/7003/

#cp /etc/redis/redis.conf /redis/7004/

#cp /etc/redis/redis.conf /redis/7005/

四、分别修改6个配置文件

#vim  /redis/7001/redis.conf

port 7001

cluster-config-file nodes-7001.conf .

#vim  /redis/7002/redis.conf

port 7002

cluster-config-file nodes-7002.conf .

#vim  /redis/7003/redis.conf

port 7003

cluster-config-file nodes-7003.conf .

#vim  /redis/7004/redis.conf

port 7004

cluster-config-file nodes-7004.conf

#vim  /redis/7005/redis.conf

port 7005

cluster-config-file nodes-7005.conf

五、启动服务

#redis-server  /redis/7000/redis.conf

#redis-server  /redis/7001/redis.conf

#redis-server  /redis/7002/redis.conf

#redis-server  /redis/7003/redis.conf

#redis-server  /redis/7004/redis.conf

#redis-server  /redis/7005/redis.conf

启动后查看是否启动成功

#netstat -anput | grep redis

2) 集群配置

redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005  --cluster-replicas 1

登陆集群验证便可:

127.0.0.1:7000> CLUSTER NODES

3.redis cluster经过master水平扩容,来提升吞吐量

1) 建立新的redis

两个: 一个作master 一个作 slave

建立配置文件:

#mkdir -p /redis/{7006,7007}

#cp /etc/redis/redis.conf /redis/7006/

#cp /etc/redis/redis.conf /redis/7007/

#vim  /redis/7006/redis.conf

port 7006

cluster-config-file nodes-7006.conf .

#vim  /redis/7007/redis.conf

port 7007

cluster-config-file nodes-7007.conf .

启动:

#redis-server  /redis/7006/redis.conf

#redis-server  /redis/7007/redis.conf

2) 配置7006为集群主节点

#redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

127.0.0.1:7000 是已经存在节点

加入成功后,集群如今有 7 台机器, 4个master 3 个slave

3) 咱们为新节点手工分配hash槽

随便找一台主节点,让它进行从新分片操做

# redis-cli --cluster reshard 127.0.0.1:7000

4) 配置7007加入集群,成为7006的从节点

加入集群:

#redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000

咱们须要执行replicate命令来指定当前节点(从节点)的主节点id为哪一个:

首先登陆 7007:

# redis-cli -p 7007

查看集群状态(目前应该是5个master,3个slave),记录7006的id:

127.0.0.1:7007> cluster nodes

33206e9384297092b5b8a85c944f3564e5d983d7 127.0.0.1:7000@18003 master - 0 1544885646000 3 connected 10923-16383

60a0f7ced303374d8b36e7aa219cbcd4ff5b0caf 127.0.0.1:7003@18005 slave 662809cf2d5bb138912dea7fb1e452f6e0f149da 0 1544885647000 1 connected

fea53768189af3e3e4849038af13607f59ec84b0 127.0.0.1:7001@18007 master - 0 1544885647003 7 connected 0-999

71404f4e815c2e315926ac788389120f82029958 127.0.0.1:7007@18008 myself,master - 0 1544885643000 0 connected

7b5f6aa6dcb4d5aca4a94e57ddeea6971b38bba6 127.0.0.1:7002@18002 master - 0 1544885646000 2 connected 5461-10922

662809cf2d5bb138912dea7fb1e452f6e0f149da 127.0.0.1:7006@18001 master - 0 1544885648015 1 connected 1000-5460

b0db47b7bbd3694596f293aa522488882e8fe647 127.0.0.1:7004@18004 slave 33206e9384297092b5b8a85c944f3564e5d983d7 0 1544885649022 3 connected

194a31057d2e098483bcd2ad01e1bba6a1af6a7d 127.0.0.1:7005@18006 slave 7b5f6aa6dcb4d5aca4a94e57ddeea6971b38bba6 0 1544885646000 2 connected

配置7007做为7006的从节点:

# CLUSTER REPLICATE  662809cf2d5bb138912dea7fb1e452f6e0f149da

至此,咱们扩展redis集群已经实现

这里说一个slave冗余的概念:

就是一个master下挂载两个或多个slave

能更大程度上保证redis集群的可靠性

相关文章
相关标签/搜索