写在前面
最近在完成暑期大作业,期间要将项目部署在云服务器上,其中需要进行缓存的配置,决定使用Redis,为了使系统更加健壮,选择配置Redis-Cluster。由于服务器资源有限,在一台服务器上运行6个Redis Instance并分配不同的端口进行模拟,当有更多服务器资源时在进行真实的配置。
本文主要记录配置过程中遇到的一些问题,供日后复习参考。如果有错误,还请指正。
环境
Redis 6.0.9
Ubuntu 18.04
安装Redis
此处不再赘述,如有疑问请查找网络上相关文章进行安装。
配置Redis-Cluster
在
/usr/local
下创建redis-cluster
目录-
将已安装的Redis文件夹复制六次到redis-cluster目录下
cp -r /usr/local/redis /usr/local/redis-cluster/redis01 cp -r /usr/local/redis /usr/local/redis-cluster/redis02 cp -r /usr/local/redis /usr/local/redis-cluster/redis03 cp -r /usr/local/redis /usr/local/redis-cluster/redis04 cp -r /usr/local/redis /usr/local/redis-cluster/redis05 cp -r /usr/local/redis /usr/local/redis-cluster/redis06
目录结构如下图,其中
start-all.sh
和stop-all.sh
为启动脚本。
-
修改redis01-redis06每个目录下的redis.conf文件.
以redis01目录的redis.conf为例,其他类似,修改内容如下:
bind 0.0.0.0 ::1 # 接受来自所有ip地址的连接 protected-mode no # 关闭保护模式 port 7001 # 连接端口号,分别设置为7001-7006 daemonize yes # 以守护进程运行 pidfile /usr/local/redis-cluster/redis01/redis01.pid logfile /usr/local/redis-cluster/redis01/redis01.log dir /usr/local/redis-cluster/redis01/data/# 以上三行的序号为01-06,根据redis实例的标号命名 appendonly yes appendfilename "appendonly.aof" cluster-enabled yes # 开启集群 cluster-config-file node01.conf # node01-node06,文件名不能相同
注意,修改完配置文件后需要在每个redis的文件夹下创建data目录,用于存放
appendonly.aof
,node0x.conf
,dump.rdb
文件。 -
分别以配置文件指定的配置启动六个redis-server
在/usr/local/redis-cluster路径下运行如下命令以启动一个 redis-server 实例,其他类似
redis01/src/redis-server redis01/redis.conf
手动启动过于麻烦,可以编写脚本start-all.sh,内容如下
redis01/src/redis-server redis01/redis.conf redis02/src/redis-server redis02/redis.conf redis03/src/redis-server redis03/redis.conf redis04/src/redis-server redis04/redis.conf redis05/src/redis-server redis05/redis.conf redis06/src/redis-server redis06/redis.conf
更改权限
chmod +x start-all.sh
运行脚本即可启动六个redis-server实例
-
创建集群
输入以下命令并运行:(redis 5.x以下的版本无法通过这种方式创建集群)
redis01/src/redis-cli --cluster create x.x.x.x:7001 x.x.x.x:7002 x.x.x.x:7003 x.x.x.x:7004 x.x.x.x:7005 x.x.x.x:7006 --cluster-replicas 1
其中
x.x.x.x
是redis实例所在服务器的公网ip,7001-1006是六个redis实例分别监听的端口号。出现如下提示,则说明redis集群已创建完成。
>>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: x.x.x.x:7001 x.x.x.x:7002 x.x.x.x:7003 Adding replica x.x.x.x:7004 to x.x.x.x:7001 Adding replica x.x.x.x:7005 to x.x.x.x:7002 Adding replica x.x.x.x:7006 to x.x.x.x:7003 M: f4ee0a501f9aaf11351787a46ffb4659d45b7bd7 x.x.x.x:7001slots:0-5460 (5461 slots) master M: 671a0524a616da8b2f50f3d11a74aaf563578e41 x.x.x.x:7002slots:5461-10922 (5462 slots) master M: 18948dab5b07e3726afd1b6a42d5bf6e2f411ba1 x.x.x.x:7003slots:10923-16383 (5461 slots) master S: 34e322ca50a2842e9f3664442cb11c897defba06 x.x.x.x:7004replicates f4ee0a501f9aaf11351787a46ffb4659d45b7bd7 S: 62a00566233fbff4467c4031345b1db13cf12b46 x.x.x.x:7005replicates 671a0524a616da8b2f50f3d11a74aaf563578e41 S: 2cb649ad3584370c960e2036fb01db834a546114 x.x.x.x:7006replicates 18948dab5b07e3726afd1b6a42d5bf6e2f411ba1 Can I set the above configuration? (type 'yes' to accept): yes >>> 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 x.x.x.x:7001) M: f4ee0a501f9aaf11351787a46ffb4659d45b7bd7 x.x.x.x:7001slots:0-5460 (5461 slots) master1 additional replica(s) M: 671a0524a616da8b2f50f3d11a74aaf563578e41 x.x.x.x:7002slots:5461-10922 (5462 slots) master1 additional replica(s) S: 2cb649ad3584370c960e2036fb01db834a546114 x.x.x.x:7006slots: (0 slots) slavereplicates 18948dab5b07e3726afd1b6a42d5bf6e2f411ba1 S: 34e322ca50a2842e9f3664442cb11c897defba06 x.x.x.x:7004slots: (0 slots) slavereplicates f4ee0a501f9aaf11351787a46ffb4659d45b7bd7 M: 18948dab5b07e3726afd1b6a42d5bf6e2f411ba1 x.x.x.x:7003slots:10923-16383 (5461 slots) master1 additional replica(s) S: 62a00566233fbff4467c4031345b1db13cf12b46 x.x.x.x:7005slots: (0 slots) slavereplicates 671a0524a616da8b2f50f3d11a74aaf563578e41 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
-
测试
[root@localhost redis]# redis-cli -c -h x.x.x.x -p 7001 x.x.x.x:7001> set test test -> Redirected to slot [5798] located at x.x.x.x:7002 OK x.x.x.x:7002> get name "test"
能够正常运行,redis-cluster配置完成!
-
在创建redis-cluster之后,若需要关闭集群,可运行命令:
redis-cli -c -h x.x.x.x -p 7001 shutdown redis-cli -c -h x.x.x.x -p 7002 shutdown redis-cli -c -h x.x.x.x -p 7003 shutdown redis-cli -c -h x.x.x.x -p 7004 shutdown redis-cli -c -h x.x.x.x -p 7005 shutdown redis-cli -c -h x.x.x.x -p 7006 shutdown
也可编写脚本进行批量处理。
如果需要启动已经创建的redis-cluster,仅仅需要运行第4步编写的 start-all.sh ,跳过第5步的操作
-
需要清空已经配置好的redis-cluster,首先停止所有redis-server实例,接着删除data目录下的 node.conf 文件即可,在redis-cluster目录下运行
rm -f */data/*.conf
常见问题
ip地址需要时公网ip,否则远程访问重定向后无法访问到其他集群结点。
服务器需要开启防火墙,如果是云服务器需要配置相应的安全组入规则。
-
创建redis-cluster时如果卡在“Waiting for the cluster to join...”这一步
(1) 停止所有redis-server实例,删除每个redis/data文件夹下所有文件
(2) 检查防火墙或安全组规则,依照本文的配置,需要开启7001-7006端口,同时还要开启17001-17006端口(cluster-announce-bus-port)。
(3) 若经过3.2操作后仍然卡住,则分别更改redis.conf文件
cluster-announce-ip x.x.x.x # 公网ip,为对外ip cluster-announce-port 7001 # 7001-7006 cluster-announce-bus-port 17001 # 17001-17006,集群桥接端口
以上三个参数使其他结点获得当前结点的信息,通过配置文件,集群桥接端口无需于命令端口恒定相差10000,在没有配置的情况下默认相差10000。此处为了简化仍设置为相差10000,保存后重新执行,即可成功创建redis-cluster。
TODO
访问权限、密码等安全问题尚未完成,亟待解决。
喜欢的朋友记得点赞、收藏、关注哦!!!