一、简介
架构图
在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。
1.Redis集群核心的目标:
在官方文档Cluster Spec中,作者详细介绍了Redis集群为什么要设计成现在的样子。最核心的目标有三个:
(1)性能:这是Redis赖以生存的看家本领,增加集群功能后当然不能对性能产生太大影响,所以Redis采取了P2P而非Proxy方式、Master与slave之间使用异步复制(异步replication)、客户端重定向等设计,而牺牲了部分的一致性、使用性。
(2)水平扩展:集群的最重要能力当然是扩展,文档中称可以线性扩展到1000结点。
(3)可用性:在Cluster推出之前,可用性要靠Sentinel保证。有了集群之后也自动具有了Sentinel的监控和自动Failover能力。只要集群中大多数master可达、且失效的master至少有一个slave可达时,集群都可以继续提供服务;同时“replicas migration”可以将那些拥有多个slaves的master的某个slave,迁移到没有slave的master下,即将slaves分布在整个集群相对平衡,尽力确保每个master都有一定数量的slave备份。 (4)数据一致性:客户端容忍一定程度的数据丢失,集群尽可能保存Client write操作的数据,保证数据一致性。集群将会尽可能(best-effort)保存客户端write操作的数据;通常在failover期间,会有短暂时间内的数据丢失(因为异步replication引起);当客户端与少数派的节点处于网络分区时(network partition),丢失数据的可能性会更高。(因为节点有效性检测、failover需要更长的时间)
2.Redis Cluster功能特点如下:
(1)节点自动发现:所有的节点相互连接
(2)集群消息通信通过集群总线通信,集群总线端口大小为客户端服务端口+10000,这个10000是固定值 (3)节点与节点之间通过二进制协议进行通信
(4)客户端和集群节点之间通信和通常一样,通过文本协议进行
(5)集群节点不会代理查询
(6)数据按照Slot存储分布在多个Redis实例上
(7)集群节点挂掉会自动故障转移
(8)可以相对平滑扩/缩容节点
二、集群配置安装
集群实验环境: 三主三从
IP | 端口 | 密码 |
---|---|---|
192.168.2.2 | 7000 | pass |
192.168.2.2 | 7001 | pass |
192.168.2.3 | 7002 | pass |
192.168.2.3 | 7003 | pass |
192.168.2.4 | 7004 | pass |
192.168.2.4 | 7005 | pass |
安装编译redis
三台机器上执行安装:
cd /opt/ wget http://download.redis.io/releases/redis-5.0.9.tar.gz tar -xf redis-5.0.9.tar.gz cd redis-5.0.9 make MALLOC=jemalloc make install PREFIX=/opt/redis cd /opt/redis
对应三台机器分别建立配置文件
192.168.2.2
mkdir 7000 vim 7000/redis.conf port 7000 bind 192.168.2.2 daemonize yes pidfile /opt/redis/7000/redis.pid cluster-enabled yes cluster-config-file /opt/redis/7000/cluster.conf cluster-node-timeout 15000 appendonly yes cluster-require-full-coverage no logfile /opt/redis/7000/redis.log mkdir 7001 vim 7001/redis.conf port 7001 bind 192.168.2.2 daemonize yes pidfile /opt/redis/7001/redis.pid cluster-enabled yes cluster-config-file /opt/redis/7001/cluster.conf cluster-node-timeout 15000 appendonly yes cluster-require-full-coverage no logfile /opt/redis/7001/redis.log
其余两台机器分别创建7002 7003 7004 7005 对应的配置文件
修改对应的端口,ip 目录等
配置解读:
集群配置文件路径:
cluster-config-file cluster.conf
这个配置文件不是要我们去配的,而是Redis运行时保存配置的文件,所以我们也不可以修改这个文件。Redis群集节点每次发生更改时自动保留群集配置(基本上为状态)的文件,以便能够在启动时重新读取它。 该文件列出了群集中其他节点,它们的状态,持久变量等等。 由于某些消息的接收,通常会将此文件重写并刷新到磁盘上。
集群超时时间:
cluster-node-timeout 15000 结点超时多久则认为它宕机了。如果主节点超过指定的时间不可达,它将由其从属设备进行故障切换。 此参数控制Redis群集中的其他重要事项。值得注意的是,每个无法在指定时间内到达大多数主节点的节点将停止接受查询。
槽是否全覆盖:
cluster-require-full-coverage no 默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no。 如果将其设置为yes,则默认情况下,如果key的空间的某个百分比未被任何节点覆盖,则集群停止接受写入。 如果该选项设置为no,则即使只处理关于keys子集的请求,群集仍将提供查询。
启动redis并组成集群
启动redis
/opt/redis/bin/redis-server /opt/redis/700x/redis.conf
三台机器分别启动6个redis服务,7000x x为对应的对口号
组成集群
redis-cli --cluster create 192.168.2.2:7000 192.168.2.2:7001 192.168.2.3:7002 192.168.2.3:7003 192.168.2.4:7004 192.168.2.4:7005 --cluster-replicas 1
提示输入yes,稍等后集群组成完毕
检查集群状态:
redis-cli -h 192.168.2.2 -p 7000 -c cluster slots | xargs -n8 | awk '{print $3":"$4"->"$6":"$7}' | sort -nk2 -t ':' 输出结果: 192.168.2.2:7000->192.168.2.3:7003 192.168.2.3:7002->192.168.2.4:7005 192.168.2.4:7004->192.168.2.2:7001
至此redis-cluster集群已经搭建完毕