一、环境介绍
操作系统:centos 7.2
redis 版本:3.2.6
节点分布:部署 6 个 redis 节点,3 主 3 从,分别安装在 6 台物理机上。
node-1:192.168.100.200 node-1.conf
node-2:192.168.100.201 node-2.conf
node-3:192.168.100.202 node-3.conf
node-4:192.168.100.203 node-4.conf
node-5:192.168.100.204 node-5.conf
node-6:192.168.100.205 node-6.conf
二、Redis Cluster 架构
1.1、redis cluster 架构
1)redis-cluster 架构图
架构细节:
(1) 所有的 redis 节点彼此互联 (PING-PONG 机制), 内部使用二进制协议优化传输速度和带宽.
(2) 节点的 fail 是通过集群中超过半数的节点检测失效时才生效.
(3) 客户端与 redis 节点直连, 不需要中间 proxy 层. 客户端不需要连接集群所有节点, 连接集群中任何一个可用节点即可
(4)redis-cluster 把所有的物理节点映射到 [0-16383]slot 上, cluster 负责维护 node<->slot<->value
2) redis-cluster 选举: 容错
(1) 领着选举过程是集群中所有 master 参与, 如果半数以上 master 节点与 master 节点通信超过 (cluster-node-timeout), 认为当前 master 节点挂掉.
(2)什么时候整个集群不可用 (cluster_state:fail), 当集群不可用时, 所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down) 错误
a: 如果集群任意 master 挂掉, 且当前 master 没有 slave. 集群进入 fail 状态, 也可以理解成进群的 slot 映射 [0-16383] 不完成时进入 fail 状态.
b: 如果超过集群半数以上 master 挂掉,无论是否有 slave 集群进入 fail 状态.
3)redis cluster 节点分配
现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot) 的方式来分配 16384 个 slot 的话,它们三个节点分别承担的 slot 区间是:
节点 A 覆盖 0-5460;
节点 B 覆盖 5461-10922;
节点 C 覆盖 10923-16383.
获取数据:
如果存入一个值,按照 redis cluster 哈希槽的算法: CRC16('key')384 = 6782。 那么就会把这个 key 的存储分配到 B 上了。同样,当我连接 (A,B,C) 任何一个节点想获取'key'这个 key 时,也会这样的算法,然后内部跳转到 B 节点上获取数据
新增一个主节点:
新增一个节点 D,redis cluster 的这种做法是从各个节点的前面各拿取一部分 slot 到 D 上,我会在接下来的实践中实验。大致就会变成这样:
节点 A 覆盖 1365-5460
节点 B 覆盖 6827-10922
节点 C 覆盖 12288-16383
节点 D 覆盖 0-1364,5461-6826,10923-12287
同样删除一个节点也是类似,移动完成后就可以删除这个节点了。
4) Redis Cluster 主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有 ABC 三个主节点, 如果这 3 个节点都没有加入从节点,如果 B 挂掉了,我们就无法访问整个集群了。A 和 C 的 slot 也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点 A、B、C, 以及从节点 A1、B1、C1, 那么即使 B 挂掉系统也可以继续正确工作。
B1 节点替代了 B 节点,所以 Redis 集群将会选择 B1 节点作为新的主节点,集群将会继续正确地提供服务。 当 B 重新开启后,它就会变成 B1 的从节点。
不过需要注意,如果节点 B 和 B1 同时挂了,Redis 集群就无法继续正确地提供服务了。
二、redis cluster 安装
1、分别在 node-1、node-2、node-3、node-4、node-5、node-6 下载和解压
2、 编译安装
3、创建 redis 节点
生产环境我们选择 6 台服务器,分别为:
node1:192.168.100.200
node2:192.168.100.201
node3:192.168.100.202
node4:192.168.100.203
node-5:192.168.100.204
node-6:192.168.100.205,每台服务器 1 个节点。
先在 node-1:192.168.100.200 创建 1 个节点:
修改 node-1.conf 对应的配置
在剩下的 5 台物理机上同样执行上述配置
node-2:192.168.100.201 创建 1 个节点:
修改 node-2.conf 对应的配置
node-3:192.168.100.202 创建 1 个节点:
修改 node-3.conf 对应的配置
node-4:192.168.100.203 创建 1 个节点:
修改 node-4.conf 对应的配置
node5:192.168.100.204 创建 1 个节点:
修改 node-5.conf 对应的配置
node-6:192.168.100.205 创建 1 个节点:
修改 node-6.conf 对应的配置
4、分别启动六台物理机上各节点
5、查看服务
三、创建集群
1. 安装 ruby
2. 安装 redis 接口(用 gem 这个命令安装 redis 接口,gem 是 ruby 的一个工具包,
- 当然,为了日后方便维护,六台Server都要安装。)
3. 创建集群
确认所有的节点都启动后,使用如下命令创建集群
其中 --replicas 1 表示 自动为每一个 master 节点分配一个 slave 节点 上面有 6 个节点,程序会按照一定规则生成 3 个 master(主)3 个 slave(从)
4. 查看集群中的节点:
5. 停止 redis cluster 实例:
停止 redis 实例,直接使用 kill 命令即可,重启和单机版相同,重启会自动转换成 cluster 模式。
四、测试
1)查看集群中的节点
2)存取测试
3) 新增节点
1. 添加一个新主(master)节点,按上述操作配置好单机版 redis 并启动,然后执行命令:
其中 192.168.100.206:6379 是新增的节点,而 192.168.100.200:6379 是已存在的节点(可为 master 或 slave)。
2. 指定添加某 master 的新从(slave)节点,按上述操作配置好单机版 redis 并启动,然后执行命令:
其中 192.168.100.207:6379 是新增的 slave 节点,而 192.168.100.206:6379 是已存在的 master 节点, 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 是 192.168.100.206:6379 的 master-id。
3)容错测试
Down 掉 1 台 master, 集群 OK, Down 掉 2 台 master,cluster is down!! 没办法,超过半数 master 挂掉,整个集群就无法工作了。
五、安装遇到的问题
1、
CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/usr/local/redis-3.2.6/src
make: *** [all] Error 2
解决办法:GCC 没有安装或版本不对,安装一下
2、
zmalloc.h:50:31:
error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error:
#error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error
1
make[1]: Leaving directory `/data0/src/redis-2.6.2/src
make: *** [all]
Error 2
解决办法:原因是没有安装 jemalloc 内存分配器,可以安装 jemalloc 或 直接
make MALLOC=libc && make install PREFIX=/usr/local/redis-cluster
六、如果您觉得文章有用,可以微信扫描下方二维码关注,我们会持续更新运维架构文章,谢谢关注!
来源: