目录
Redis集群搭建与简单使用
一、安装过程
1. 下载并解压
2. 编译安装
3. 创建 Redis 节点
4. 启动各个节点
5. 检查 redis 启动情况
6.设置防火墙,开放集群端口
7.创建集群
二、集群测试
1.存取测试
2.宕机测试
三、节点添加
1.新增主节点
2.新增从节点
四、节点移除
1.移除主节点
2.移除从节点
介绍安装环境与版本
用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境(必须要3个或以上的主节点,否则在创建集群时会失败)。
redis 采用 redis-5.0.3 版本(5.0版本不需要安装Ruby,使用较为方便,推荐安装)。
两台虚拟机都是 CentOS ,一台 CentOS7.5 (IP:192.168.92.100),一台 CentOS7.5(IP:192.168.92.101) 。
[root@localhost software]# cd /root/software
[root@localhost software]# wget http://download.redis.io/releases/redis-5.0.3.tar.gz
[root@localhost software]# tar -zxvf redis-5.0.3.tar.gz
[root@localhost software]# cd redis-5.0.3
[root@localhost redis-5.0.3]# make && make install
首先在 192.168.92.100 机器上 /root/software/redis-5.0.3 目录下创建 redis_cluster 目录;
[root@localhost redis-5.0.3]# mkdir redis_cluster
在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中
[root@localhost redis_cluster]# mkdir 7000 7001 7002
[root@localhost redis-5.0.3]# cp redis.conf redis_cluster/7000
[root@localhost redis-5.0.3]# cp redis.conf redis_cluster/7001
[root@localhost redis-5.0.3]# cp redis.conf redis_cluster/7002
分别修改这三个配置文件,修改如下内容
port 7000 //端口7000,7001,7002
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
第一台机器(192.168.92.100)上执行
[root@localhost 7000]# redis-server redis.conf
[root@localhost 7001]# redis-server redis.conf
[root@localhost 7002]# redis-server redis.conf
另外一台机器(192.168.92.101)上执行
[root@localhost 7003]# redis-server redis.conf
[root@localhost 7004]# redis-server redis.conf
[root@localhost 7005]# redis-server redis.conf
注:可以写一个命令脚本start-all.sh ,来启动各个节点
cd 7000
redis-server redis.conf
cd ..
cd 7001
redis-server redis.conf
cd ..
cd 7002
redis-server redis.conf
设置权限启动
[root@localhost redis-cluster]# chmod 777 start-all.sh
[root@localhost redis-cluster]# ./start-all.sh
##一台机器(192.168.92.100)
[root@localhost redis-5.0.3]# ps -ef | grep redis
root 61020 1 0 02:14 ? 00:00:01 redis-server 127.0.0.1:7000 [cluster]
root 61024 1 0 02:14 ? 00:00:01 redis-server 127.0.0.1:7001 [cluster]
root 61029 1 0 02:14 ? 00:00:01 redis-server 127.0.0.1:7002 [cluster] [root@localhost redis-5.0.3]# netstat -tnlp | grep redis
tcp 0 0 127.0.0.1:17000 0.0.0.0:* LISTEN 61020/redis-server
tcp 0 0 127.0.0.1:17001 0.0.0.0:* LISTEN 61024/redis-server
tcp 0 0 127.0.0.1:17002 0.0.0.0:* LISTEN 61029/redis-server
tcp 0 0 127.0.0.1:7000 0.0.0.0:* LISTEN 61020/redis-server
tcp 0 0 127.0.0.1:7001 0.0.0.0:* LISTEN 61024/redis-server
tcp 0 0 127.0.0.1:7002 0.0.0.0:* LISTEN 61029/redis-server
##另外一台机器
[root@localhost redis-5.0.3]# ps -ef | grep redis
root 9957 1 0 02:32 ? 00:00:01 redis-server 127.0.0.1:7003 [cluster]
root 9964 1 0 02:32 ? 00:00:01 redis-server 127.0.0.1:7004 [cluster]
root 9971 1 0 02:32 ? 00:00:01 redis-server 127.0.0.1:7005 [cluster]
root 10065 4744 0 02:38 pts/0 00:00:00 grep --color=auto redis
[root@localhost redis-5.0.3]# netstat -tlnp | grep redis
tcp 0 0 127.0.0.1:17003 0.0.0.0:* LISTEN 9957/redis-server 1
tcp 0 0 127.0.0.1:17004 0.0.0.0:* LISTEN 9964/redis-server 1
tcp 0 0 127.0.0.1:17005 0.0.0.0:* LISTEN 9971/redis-server 1
tcp 0 0 127.0.0.1:7003 0.0.0.0:* LISTEN 9957/redis-server 1
tcp 0 0 127.0.0.1:7004 0.0.0.0:* LISTEN 9964/redis-server 1
tcp 0 0 127.0.0.1:7005 0.0.0.0:* LISTEN 9971/redis-server 1
两台机器的防火墙我们直接关掉(如果不关掉,在下面创建集群的时候,会提示:Could not connect to Redis at 192.168.92.101:7003: No route to host)
[root@localhost redis-5.0.3]# systemctl stop firewalld.service
Redis 官方提供了 redis-cli (5.0之前的版本是使用的 redis-trib.rb ,需要安装ruby,不推荐)这个工具,可以直接在命令行中使用了。使用下面这个命令即可完成安装。
[root@localhost redis-5.0.3]# redis-cli --cluster create 192.168.92.100:7000 192.168.92.100:7001 192.168.92.100:7002 192.168.92.101:7003 192.168.92.101:7004 192.168.92.101:7005 --cluster-replicas 1
接着, redis-cli会输出一份配置信息,如下:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.92.101:7004 to 192.168.92.100:7000
Adding replica 192.168.92.100:7002 to 192.168.92.101:7003
Adding replica 192.168.92.101:7005 to 192.168.92.100:7001
M: 5c55309b5a1cd704a056cf80be308964e757f7a1 192.168.92.100:7000slots:[0-5460] (5461 slots) master
M: 4cbdd0a0b1a8e9334ad97a3df577e8ab365e4f7a 192.168.92.100:7001slots:[10923-16383] (5461 slots) master
S: b8b90944c7c65511da0d0b04004d502015f599dc 192.168.92.100:7002replicates c4d9fdc43a459d19bb78378b0f801b70f4dd70ec
M: c4d9fdc43a459d19bb78378b0f801b70f4dd70ec 192.168.92.101:7003slots:[5461-10922] (5462 slots) master
S: 60818181c7a6bb007b3628ef4adf84678359f613 192.168.92.101:7004replicates 5c55309b5a1cd704a056cf80be308964e757f7a1
S: 57b19e309ec580857968f113de4bd2b77aa05ac1 192.168.92.101:7005replicates 4cbdd0a0b1a8e9334ad97a3df577e8ab365e4f7a
Can I set the above configuration? (type 'yes' to accept):
确认无误后,输入yes , redis-cli 会将配置应用到各个节点,并连接起(join)各个节点,让各个节点开始通讯。出现如下内容,说明安装成功。
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 192.168.92.100:7000)
M: 5c55309b5a1cd704a056cf80be308964e757f7a1 192.168.92.100:7000slots:[0-5460] (5461 slots) master1 additional replica(s)
M: 4cbdd0a0b1a8e9334ad97a3df577e8ab365e4f7a 192.168.92.100:7001slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 57b19e309ec580857968f113de4bd2b77aa05ac1 192.168.92.101:7005slots: (0 slots) slavereplicates 4cbdd0a0b1a8e9334ad97a3df577e8ab365e4f7a
S: 60818181c7a6bb007b3628ef4adf84678359f613 192.168.92.101:7004slots: (0 slots) slavereplicates 5c55309b5a1cd704a056cf80be308964e757f7a1
S: b8b90944c7c65511da0d0b04004d502015f599dc 192.168.92.100:7002slots: (0 slots) slavereplicates c4d9fdc43a459d19bb78378b0f801b70f4dd70ec
M: c4d9fdc43a459d19bb78378b0f801b70f4dd70ec 192.168.92.101:7003slots:[5461-10922] (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
示例:
访问192.168.92.100的7000端口对应的redis节点
[root@localhost ~]# redis-cli -c -h 192.168.92.100 -p 7000
192.168.92.100:7000>
参数 -c
可连接到集群,因为 redis.conf 将 bind 改为了ip地址,所以 -h
参数不能省略,-p
参数为端口号。
写入数据,进行集群的验证
192.168.92.100:7000> set name andy
-> Redirected to slot [5798] located at 192.168.92.101:7003
OK
192.168.92.101:7003>
发现redis set name andy之后重定向到 192.168.92.101机器 redis 7003这个节点
我们在这个集群中任意一个节点去获取该key的值,假设在192.168.92.100的7002端口对应的redis节点上去获取
[root@localhost ~]# redis-cli -c -h 192.168.92.100 -p 7002
192.168.92.100:7002> get name
-> Redirected to slot [5798] located at 192.168.92.101:7003
"andy"
192.168.92.101:7003>
7002节点,从上面也是自动跳转至7003获取值,这也是redis cluster的特点,它是去中心化,每个节点都是对等的,连接哪个节点都可以获取和设置数据。
现在模拟将7003节点挂掉,按照redis-cluster原理会选举会将 7003的从节点7002选举为主节点。
[root@localhost ~]# ps -ef | grep redis
root 13288 1 0 17:01 ? 00:00:17 redis-server 192.168.92.101:7003 [cluster]
root 13293 1 0 17:01 ? 00:00:18 redis-server 192.168.92.101:7004 [cluster]
root 13298 1 0 17:01 ? 00:00:17 redis-server 192.168.92.101:7005 [cluster]
root 13435 13417 0 19:29 pts/1 00:00:00 grep --color=auto redis
[root@localhost ~]# kill 13288
[root@localhost ~]# ps -ef | grep redis
root 13293 1 0 17:01 ? 00:00:18 redis-server 192.168.92.101:7004 [cluster]
root 13298 1 0 17:01 ? 00:00:18 redis-server 192.168.92.101:7005 [cluster]
root 13437 13417 0 19:30 pts/1 00:00:00 grep --color=auto redis
再查看集群中的7003节点
[root@localhost ~]# redis-cli --cluster check 192.168.92.101:7003
Could not connect to Redis at 192.168.92.101:7003: Connection refused
[root@localhost ~]# redis-cli --cluster check 192.168.92.100:7002
Could not connect to Redis at 192.168.92.101:7003: Connection refused
192.168.92.100:7002 (b8b90944...) -> 1 keys | 5462 slots | 0 slaves.
192.168.92.100:7001 (4cbdd0a0...) -> 0 keys | 5461 slots | 1 slaves.
192.168.92.100:7000 (5c55309b...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.92.100:7002)
M: b8b90944c7c65511da0d0b04004d502015f599dc 192.168.92.100:7002slots:[5461-10922] (5462 slots) master
S: 57b19e309ec580857968f113de4bd2b77aa05ac1 192.168.92.101:7005slots: (0 slots) slavereplicates 4cbdd0a0b1a8e9334ad97a3df577e8ab365e4f7a
S: 60818181c7a6bb007b3628ef4adf84678359f613 192.168.92.101:7004slots: (0 slots) slavereplicates 5c55309b5a1cd704a056cf80be308964e757f7a1
M: 4cbdd0a0b1a8e9334ad97a3df577e8ab365e4f7a 192.168.92.100:7001slots:[10923-16383] (5461 slots) master1 additional replica(s)
M: 5c55309b5a1cd704a056cf80be308964e757f7a1 192.168.92.100:7000slots:[0-5460] (5461 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
可以看到集群连接不了7003节点,而7002由原来的S转换为M节点,代替了原来的7003节点。
所有会有最后一个说明All 16384 slots covered. 所有哈希槽都可覆盖了;
我们可以获取name值:
[root@localhost ~]# redis-cli -c -h 192.168.92.100 -p 7000
192.168.92.100:7000> get name
-> Redirected to slot [5798] located at 192.168.92.100:7002
"andy"
192.168.92.100:7002>
从7000节点连入,自动跳转到7002节点,并且获取name值。
现在我们将7003节点恢复,看是否会自动加入集群中以及充当的M还是S节点。
[root@localhost 7003]# redis-server redis.conf
13451:C 15 Feb 2019 19:43:36.259 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
13451:C 15 Feb 2019 19:43:36.260 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=13451, just started
13451:C 15 Feb 2019 19:43:36.260 # Configuration loaded
再check一下7003节点
[root@localhost redis_cluster]# redis-cli --cluster check 192.168.92.101:7003
192.168.92.100:7000 (7980a27f...) -> 3 keys | 5461 slots | 1 slaves.
192.168.92.100:7001 (255fe370...) -> 0 keys | 5461 slots | 1 slaves.
192.168.92.100:7002 (5ad1bc99...) -> 2 keys | 5462 slots | 1 slaves.
[OK] 5 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 192.168.92.101:7003)
S: 391fb1127f7ccc30472d3761719272aa1dbe38f1 192.168.92.101:7003slots: (0 slots) slavereplicates 5ad1bc995f4af9c2d8aa862ec3d5902633a29b54
M: 7980a27ff9c1f37d8f185c1419b0445b9da1a32b 192.168.92.100:7000slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 0b05268b52f540dddcfe17f56e17d97eb41b759f 192.168.92.101:7004slots: (0 slots) slavereplicates 7980a27ff9c1f37d8f185c1419b0445b9da1a32b
S: 9adfa4f073c0949861559de79cc19a4fba368307 192.168.92.101:7005slots: (0 slots) slavereplicates 255fe37083527c29fc352486880ecad297d5ff58
M: 255fe37083527c29fc352486880ecad297d5ff58 192.168.92.100:7001slots:[10923-16383] (5461 slots) master1 additional replica(s)
M: 5ad1bc995f4af9c2d8aa862ec3d5902633a29b54 192.168.92.100:7002slots:[5461-10922] (5462 slots) master1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
可以看到7003节点变成了5ad1bc995f4af9c2d8aa862ec3d5902633a29b54 7002的从节点。
补充说明:
1.节点的fail
节点的fail是通过集群中超过半数的节点检测失效时才生效,这里会触发选举,将slave升级为master
2.集群的fail
redis-3.0.0.rc1
加入cluster-require-full-coverage
参数,默认关闭,打开集群兼容部分失败);待更新...
待更新...
待更新...
待更新...