Redis-cluster 纯手工搭建

Redis cluster 一共两种搭建方法,手动搭建和自动搭建。自动搭建是通过集群管理工具redis-trib.rb,来搭建的,这个工具集成在Redis源码包src里面;这次主要是手动搭建
准备环境:
vmvare_workstation
3个虚拟机每台一主一从,也可用一台使用不同的端口;
192.168.12.13 jack(用户名)
192.168.12.85 broker2
192.168.12.73 broker3
操作系统 ubuntu 18.04 redis 版本 v5.0.8
下载redis
官方下载地址:
解压:tar zxf redis-5.0.8.tar.gz
安装:cd redis-5.0.8
make: make && make install
如果失败:
apt -y install gcc
make distclean //make distclean 清除所有生成的文件
make && make install
配置redis文件
主要有以下几项
这行注释掉 #bind 127.0.0.1
port 7001 *把原6379 改一下(7001为主,7002为从)
pidfile /var/run/redis_7001. *pid 设置 Redis 实例 pid 文件
cluster-enabled yes * 启动集群模式
cluster-config-file nodes-7001.conf *这个是集群配置文件 自动建立的文件
cluster-node-timeout 15000 * 设置当前节点连接超时毫秒数
复制配置文件:
cp redis.conf redis_72.conf
端口改为7002 pidfile /var/run/redis_7002
复制到其他主机上:
scp命令:
scp file hostname@ip:filepath
file是要复制的文件
filepath 把文件复制到哪里
分别复制到73和85两台服务器上
scp redis.conf broker3@192.168.12.73:~/jack/redis/redis.conf
scp redis_72.conf broker3@192.168.12.73:~/jack/redis/redis_72.conf
启动节点
redis-5.0.8/src/redis-server redis.conf
redis-5.0.8/src/redis-server redis_72.conf
查看节点是否启动成功
ps -fe|grep redis
root 2202 1 0 Apr10 ? 00:10:04 redis-server *:6379
jack 35119 1 0 Apr13 ? 00:02:58 redis-sentinel *:26379 [sentinel]
jack 55206 1 0 00:52 ? 00:00:00 redis-5.0.8/src/redis-server 127.0.0.1:7001 [cluster]
jack 55211 1 0 00:52 ? 00:00:00 redis-5.0.8/src/redis-server 127.0.0.1:7002 [cluster]
jack 55216 109657 0 00:53 pts/1 00:00:00 grep --color=auto redis
节点握手(互相发现)
进入redis-client 客户端命令,执行cluster meet ip port 把其他几个节点,拉过来开个会,这样
A meet B ,A meet C, B也能meet C ,这就是gossip协议,这样几个节点就慢慢熟络起来了。
1) 执行发现命令
redis-5.0.8/src/redis-cli -p 7001
127.0.0.1:7001> cluster meet 192.168.12.85 7001
OK
127.0.0.1:7001> cluster meet 192.168.12.85 7002
OK
127.0.0.1:7001> cluster meet 192.168.12.73 7002
OK
127.0.0.1:7001> cluster meet 192.168.12.73 7001
OK
2) 查看节点(可以去3台服务器上任何一台看结果都一样)
127.0.0.1:7001> cluster nodes
103c8f29bd860ed92ab71e198059dbba39ecd1bd 192.168.12.73:7002@17002 master - 0 1586852977000 5 connected
776afc1e41c9954f932af0b27c6c95e94d7fb8b3 127.0.0.1:7001@17001 myself,master - 0 1586852976000 2 connected
ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 192.168.12.85:7001@17001 master - 0 1586852977487 0 connected
05693a8701b7d5cdfea1538d9c085ffb505c02ca 127.0.0.1:7002@17002 master - 0 1586852977487 1 connected
88f240461705df240c0540be232d29f212fdf149 192.168.12.85:7002@17002 master - 0 1586852978498 3 connected
6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 192.168.12.73:7001@17001 master - 0 1586852977000 4 connected
注意到这里这些节点还没有从属关系。
<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>
节点id
节点的ip和port
集群总线的端口 17001 (上面port+10000)
flags:(master - ) 逗号列表分隔的标志:myselfmasterslavefail?failhandshakenoaddrnoflags
ping-sent:以毫秒为单位的当前激活的ping发送的unix时间,如没有挂起的ping,则为0
pong-recv :毫秒 unix 时间收到最后一个响应
config-epoch: 当前节点的配置时期,单调递增
link-state:用于节点到节点集群总线的链路状态。我们使用此链接与节点进行通信。可以是connecteddisconnected
slot :散列槽号,现在还没添加槽点这里看不到下面有。
flags 标志的含义(字段编号3):
  • myself:您正在联系的节点。
  • master:节点是主人。
  • slave:节点是从属的。
  • fail?:节点处于PFAIL状态。对于正在联系的节点无法访问,但仍然可以在逻辑上访问(不处于FAIL状态)。
  • fail:节点处于FAIL状态。对于将PFAIL状态提升为FAIL的多个节点而言,这是无法访问的。
  • handshake:不受信任的节点,我们握手。
  • noaddr:此节点没有已知的地址。
  • noflags:根本没有标志。
分配槽位:
偷偷查看一下集群状态
127.0.0.1:7001> cluster info
cluster_state:fail //还没有ok
添加槽位,朕来分封你们一下
分别在不同的机器上执行
ip 12.13
redis-5.0.8/src/redis-cli -p 7001 cluster addslots {0..5461}
ip 12.85
redis-5.0.8/src/redis-cli -p 7001 cluster addslots {5462..10922}
ip 12.73
redis-5.0.8/src/redis-cli -p 7001 cluster addslots {10923..16833}
ps:这里有个小问题,就是进入redis-cli 模式 这么添加就报错,只能这么写或者网上说的更改配置文件。
再偷偷查看一下集群状态:
jack@mymaster:~/redis$ redis-5.0.8/src/redis-cli -p 7001 cluster info
cluster_state:ok // 朕赐了封地了
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_ping_sent:769
cluster_stats_messages_pong_sent:708
cluster_stats_messages_meet_sent:6
cluster_stats_messages_sent:1483
cluster_stats_messages_ping_received:708
cluster_stats_messages_pong_received:722
cluster_stats_messages_received:1430
注意到这里这些节点依然没有从属关系。
主从复制:
Redis 集群成功上线,不过还没有给主节点指定从节点,此时如果有一个节点故障,那么整个集群也就挂了,也就无法实现高可用。
集群中需要使用 cluster replicate 命令手动给从节点配置主节点。
命令:cluster replicate node-id
为了高可用,为了高俸禄,额。。。
jack@mymaster:127.0.0.1:7002>
cluster replicate 776afc1e41c9954f932af0b27c6c95e94d7fb8b3
broker2@mymaster:127.0.0.1:7002>
cluster replicate ad977b9b4aaaca5bfe3ef2796a1e00e39b954612
broker3@mymaster:127.0.0.1:7002>
cluster replicate 6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae
这里我操作的时候,把73的7002复制了85的7001,不过影响不大。
所以当我再次执行cluster nodes 的时候就出现下面的样子
103c8f29bd860ed92ab71e198059dbba39ecd1bd 192.168.12.73:7002@17002 slave ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 0 1586853829684 5 connected
776afc1e41c9954f932af0b27c6c95e94d7fb8b3 127.0.0.1:7001@17001 myself,master - 0 1586853828000 2 connected 0-5461
ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 192.168.12.85:7001@17001 master - 0 1586853827000 0 connected 5462-10922
05693a8701b7d5cdfea1538d9c085ffb505c02ca 127.0.0.1:7002@17002 slave 776afc1e41c9954f932af0b27c6c95e94d7fb8b3 0 1586853827000 2 connected
88f240461705df240c0540be232d29f212fdf149 192.168.12.85:7002@17002 slave 6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 0 1586853827668 4 connected
6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 192.168.12.73:7001@17001 master - 0 1586853828676 4 connected 10923-16383
测试集群单点故障主备自动切换
1) 删掉12.13的主节点 kill - 9 56473
2) 查看节点
jack@mymaster:~/redis$ redis-5.0.8/src/redis-cli -p 7002 cluster nodes
6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 192.168.12.73:7001@17001 master - 0 1586853929000 4 connected 10923-16383
103c8f29bd860ed92ab71e198059dbba39ecd1bd 192.168.12.73:7002@17002 slave ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 0 1586853931000 5 connected
05693a8701b7d5cdfea1538d9c085ffb505c02ca 127.0.0.1:7002@17002 myself,master - 0 1586853930000 6 connected 0-5461 #7002 这里变成了master
88f240461705df240c0540be232d29f212fdf149 192.168.12.85:7002@17002 slave 6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 0 1586853932554 4 connected
776afc1e41c9954f932af0b27c6c95e94d7fb8b3 127.0.0.1:7001@17001 master,fail - 1586853903015 1586853902311 2 disconnected # 这里 disconnected 了 状态是fail
ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 192.168.12.85:7001@17001 master - 0 1586853932000 0 connected 5462-10922
3) 再次开启原主节点 redis-5.0.8/src/redis-server redis.conf
4) 查看状态
redis-5.0.8/src/redis-cli -p 7002 cluster nodes
jack@mymaster:~/redis$ redis-5.0.8/src/redis-cli -p 7002 cluster nodes
6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 192.168.12.73:7001@17001 master - 0 1586854246344 4 connected 10923-16383
103c8f29bd860ed92ab71e198059dbba39ecd1bd 192.168.12.73:7002@17002 slave ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 0 1586854245000 5 connected
05693a8701b7d5cdfea1538d9c085ffb505c02ca 127.0.0.1:7002@17002 myself,master - 0 1586854244000 6 connected 0-5461
88f240461705df240c0540be232d29f212fdf149 192.168.12.85:7002@17002 slave 6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae 0 1586854245336 4 connected
776afc1e41c9954f932af0b27c6c95e94d7fb8b3 127.0.0.1:7001@17001 slave 05693a8701b7d5cdfea1538d9c085ffb505c02ca 0 1586854244225 6 connected
这里原主节点,变成了slave fail标志也没有了 状态变为了connected
ad977b9b4aaaca5bfe3ef2796a1e00e39b954612 192.168.12.85:7001@17001 master - 0 1586854245000 0 connected 5462-10922
删除节点
cluster forget node-id
我看到这个命令去试了一下
cluster forget 6b09c6b0ba4dc02486fe0d05aa9a8dd0530da1ae
额 我以为相对应的slave 会自动变成master,然后在60s的时间内,没发现有什么变化。然后过一会又自动又出现在列表里了。什么鬼?WTF~
这个命令需要在除了自己以外的每个节点里面 都执行一遍。!!!我6个节点仅执行了4个,1分钟后那个节点又出现在了节点列表里。这个60s 只是一个供我们来通知集群中的所有节点的窗口时间。
执行时候出现的挺伤感的东东:
127.0.0.1:7001> cluster forget 05693a8701b7d5cdfea1538d9c085ffb505c02ca
(error) ERR Can't forget my master!
127.0.0.1:7001> cluster forget 776afc1e41c9954f932af0b27c6c95e94d7fb8b3
(error) ERR I tried hard but I can't forget myself...
测试流程:分别在主,主从 主从 上删掉该节点
6个节点执行5遍
cluster forget 776afc1e41c9954f932af0b27c6c95e94d7fb8b3
有个奇怪的地方就是 当我去7001上执行cluster nodes的时候 776afc1e41c9954f932af0b27c6c95e94d7fb8b3 这个列表还有,而其他的节点上已经没有了它的身影。(可能是自己还认为自己依然是集群的一个节点吧。)
自动搭建方案:
redis-cli --cluster check 127.0.0.1:7003 127.0.0.1:7004 192.168.12.73:7003 192.168.12.73:7004 192.168.12.85:7003 192.168.12.85:7004 --cluster-replicas 1
剩下的就是等;

遇到的问题
98556b98ce2d98e64f7ecac1a40ce821bdc87152 192.168.12.73:7002@17002 handshake - 1586852081629 0 0 disconnected
因为bind的ip 没有注释掉
解决方案
sed -i "s/bind 127.0.0.1/#bind 127.0.0.1/" redis_72.conf
参考链接:
https://blog.csdn.net/fst438060684/article/details/80712433
https://ask.csdn.net/questions/379214

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注