Linux下搭建Redis集群
环境准备
- 操作系统:CentOS 7.5
- Redis版本:6.2.6,链接
搭建Redis主从集群
新建
slave1
和slave2
目录,复制两份redis配置文件1
2
3
4
5mkdir slave1
mkdir slave2
cp redis.conf.bak /usr/my_software/redis/slave1/redis.conf
cp redis.conf.bak /usr/my_software/redis/slave2/redis.conf修改端口号等其他配置,
slave2
设置类似1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23cd slave1
vim redis.conf
# 设置端口号
port 6389
# 设置后台运行
daemonize yes
# 设置pid路径
pidfile /var/run/redis_6389.pid
# 设置redis.log路径
logfile "/usr/my_software/redis/slave1/redis.log"
# 设置dump.rdb路径
dir "/usr/my_software/redis/slave1"
# 设置主节点
replicaof 127.0.0.1 6379
# 设置主节点密码(如果主节点有设置密码)
masterauth "codecho@0110"启动
slave1
和slave2
1
2
3
4
5cd slave1
redis-server redis.conf
cd slave2
redis-server redis.conf查看主从节点启动情况
1
ps -ef|grep redis
连接主节点,使用
info
命令可以看到主节点现在有两个从节点slave1
和slave2
1
2redis-cli -p 6379 [-a 密码]
127.0.0.1:6379> info测试主节点和从节点数据同步
!!!注意!!!从节点只能读数据,无法进行写数据操作
再开启一个窗口,连接从节点
slave1
或slave2
,通过keys *
命令可以发现redis中没有数据1
2
3redis-cli -p 6389
127.0.0.1:6389> keys *
(empty array)在连接主节点的窗口中插入一些数据
1
2
3
4127.0.0.1:6379> set today 2022-01-05
OK
127.0.0.1:6379> hset student_1001 name xiaoming gender male age 22
(integer) 3在连接从节点的窗口中重新查询数据,现在从节点也有数据了
1
2
3127.0.0.1:6389> keys *
1) "student_1001"
2) "today"
在这种模式下,如果主节点挂掉,我们只能通过手动重新启动主节点,显然,这种情况是我们难以接受的,因此,需要另一种方式来实现主节点的故障转移,而哨兵模式就可以做到这一点。
设置哨兵模式
新建
sentinel1
、sentinel2
、sentinel3
目录,复制三份sentinel配置文件1
2
3
4
5
6
7mkdir sentinel1
mkdir sentinel2
mkdir sentinel3
cp sentinel.conf /usr/my_software/redis/sentinel1
cp sentinel.conf /usr/my_software/redis/sentinel2
cp sentinel.conf /usr/my_software/redis/sentinel3修改端口等信息,
sentinel2
、sentinel3
设置类似1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24cd sentinel1
vim sentinel.conf
# 设置端口号
port 26379
# 设置后台运行
daemonize yes
# 设置pid路径
pidfile /var/run/redis-sentinel1.pid
# 设置sentinel日志路径
logfile "/usr/my_software/redis/sentinel1/sentinel.log"
# 设置工作目录
dir "/usr/my_software/redis/sentinel1"
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
# quorum表示至少有<quorum>个哨兵认定主节点下线(主观下线),这个主节点才真正下线了(客观下线)
sentinel monitor mymaster 127.0.0.1 6379 2
# 设置主节点连接密码(如果主节点设置了)
sentinel auth-pass mymaster codecho@0110启动哨兵
1
2
3
4/usr/local/bin
./redis-sentinel /usr/my_software/redis/sentinel1/sentinel.conf
./redis-sentinel /usr/my_software/redis/sentinel2/sentinel.conf
./redis-sentinel /usr/my_software/redis/sentinel3/sentinel.conf查看
sentinel1
、sentinel2
、sentinel3
启动情况查看
sentinel1
日志,可以看到主节点、从节点、其他哨兵节点信息模拟主节点挂掉的情况
1
kill -9 redis主节点pid
查看
sentinel1
的日志1
tail -f sentinel.log
可以看到,当主节点6379挂掉后,哨兵选举了从节点6399作为新的主节点,并且会更新其他从节点配置文件中的主节点信息
重新启动原来的主节点6379
1
redis-server redis.conf
可以看到原来的主节点的配置文件中多了一行
replicaof 127.0.0.1 6399
,表示它现在是6399的从节点了也可以用
info
命令查看从节点信息
搭建Redis Cluster
创建cluster目录,在cluster目录中创建6379、6380、6381、6382、6383、6384(每个目录代表一个端口号,可以使用其他端口号)共6个目录,表示一共有6个redis节点(3主3从)
1
2
3mkdir cluster
cd cluster
mkdir 6379 6380 6381 6382 6383 6384将redis源码目录中的redis.conf分别复制到上述6个目录下,并修改端口号等信息
注意,像设置后台运行、pid路径、redis日志文件路径等配置自行参考上节部分按需修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16cd 6379
# 修改端口号
port 6379
# 开启aof
appendonly yes
# 设置以集群方式运行
cluster-enabled yes
# 每个集群节点的配置文件,不需要手动创建
cluster-config-file nodes.conf
# 集群节点超时,单位:毫秒
cluster-node-timeout 5000启动上述6个节点
1
2
3
4
5cd 6379
redis-server redis.conf
...查看节点是否启动成功
创建真正的集群!!!
对于redis-5及之后的版本,使用
redis-cli
命令来创建集群,redis-4.x及之前的版本貌似使用的是redis-trib.rb
,可参考官网文档注意:如果要想在外部通过代码连接集群,这里的ip地址需要换成服务器的公网ip
1
2
3redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
输入yes确认保存配置更简单快速地创建集群
使用redis源码
create-cluster
目录下的create-cluster
脚本创建集群1
2
3
4
5cd utils/create-cluster
./create-cluster start
./create-cluster create
./create-cluster stop可以看到
create-cluster
脚本中端口号是从30000
开始的,也是创建6个节点,本质上和上面手动创建是一样的操作连接集群并使用
1
redis-cli -c -p 6380
可以看到,我们连接任意一个集群节点,写入的数据会根据key重定向到不同的哈希槽,同样,查询数据时也会从对应的集群节点中获取
模拟三个主节点中的一个挂掉
1
kill -9 6379主节点的pid
可以看到,
6379
的从节点6384
被选举为新的主节点重新启动
6379
节点,连接集群后可以看到6379
已经变成6384
的从节点了
使用Redis工具连接Redis Cluster
推荐使用
AnotherRedisDesktopManager
客户端工具,github地址