A2-2-Linux下 Redis 单机集群安装(二)
上篇决定了以编译安装搭建的redis作为单机,本次就以两台同样配置下的redis单机做一个简单的redis集群,并初步生成对redis集群的管理模式。
参考官网中文版:http://redisdoc.com/topic/cluster-spec.html
一、环境配置
redis-2:10.0.0.12、CentOS 7.6
redis-3:10.0.0.13、CentOS 7.6
由于设备问题,现在还未在服务器上使用,就在本机建了两台虚拟机作为测试
二、集群预设
Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。
Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。Redis 集群不像单机 Redis 那样支持多数据库功能, 集群只使用默认的 0 号数据库, 并且不能使用 SELECT index 命令。
本次采用redis官方的redis-cluster集群建设。工具官网推荐,至少有三个主节点,按照标准,再来三个从节点,那就是需要六台主机。这里作为先步测试,就不做六台虚拟机了,反正不跑数据,两台够了。为了适应多种情况,就完全把它们当做不同服务器得了。本次对应的端口号20001的“2”表示服务器在12上,“0001”表示第一台服务器,在多台服务器环境里,端口号应为一致,统一采用从40001开始的端口号表示实例。
主机1:主节点1:redis-01:10.0.0.12:20001
主机2:主节点2:redis-02:10.0.0.13:30002
主机3:主节点3:redis-03:10.0.0.12:20003
主机4:从节点1:redis-04:10.0.0.13:30004
主机5:从节点2:redis-05:10.0.0.12:20005
主机6:从节点3:redis-06:10.0.0.13:30006
拓扑图大概是这样:
三、集群搭建
redis-2 配置
主机1:主节点1:redis-01:10.0.0.12:20001
主机3:主节点3:redis-03:10.0.0.12:20003
主机5:从节点2:redis-05:10.0.0.12:20005
1、创建节点集群目录
mkdir /usr/local/redis-cluster -p
2、创建主节点1:redis-01实例
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-01
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-01/redis.conf
3、更改主节点1:redis-01实例配置
删除原来的“dump.rdb”快照文件
端口号改为对应的20001端口:port 20001
打开后台模式(上一篇已做):daemonize yes
注释仅本机连接(上一篇已做):# bind 127.0.0.1
注释密码(上一篇已做,还原它):# requirepass
打开集群创建模式: cluster-enabled yes
指定日志文件:logfile ""
cd /usr/local/redis-cluster/redis-01/
rm -f dump.rdb
sed -i -e "s\port 6379\port 20001\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-01.log"\g' redis.conf
4、重复“2”“3”操作,设置主节点3、从节点2
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-03
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-03/redis.conf
cd /usr/local/redis-cluster/redis-03/
rm -f dump.rdb
sed -i -e "s\port 6379\port 20003\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-03.log"\g' redis.conf
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-05
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-05/redis.conf
cd /usr/local/redis-cluster/redis-05/
rm -f dump.rdb
sed -i -e "s\port 6379\port 20005\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-05.log"\g' redis.conf
5、创建启动脚本
cd /usr/local/redis-cluster
echo '#!/bin/bash' > all-start.sh
echo ' ' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-01/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-03/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-05/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
chmod +x all-start.sh
6、启动
./all-start.sh
先不管后面出现的port+10000的端口了
这是正常的
redis-3 配置
主机2:主节点2:redis-02:10.0.0.13:30002
主机4:从节点1:redis-04:10.0.0.13:30004
主机6:从节点3:redis-06:10.0.0.13:30006
mkdir /usr/local/redis-cluster -p
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-02
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-04
cp -r /usr/local/redis/bin/ /usr/local/redis-cluster/redis-06
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-02/redis.conf
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-04/redis.conf
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/redis-06/redis.conf
rm -f /usr/local/redis-cluster/redis-02/dump.rdb
rm -f /usr/local/redis-cluster/redis-04/dump.rdb
rm -f /usr/local/redis-cluster/redis-06/dump.rdb
cd /usr/local/redis-cluster/redis-02
sed -i -e "s\port 6379\port 30002\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-02.log"\g' redis.conf
cd /usr/local/redis-cluster/redis-04
sed -i -e "s\port 6379\port 30004\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-04.log"\g' redis.conf
cd /usr/local/redis-cluster/redis-06
sed -i -e "s\port 6379\port 30006\g" redis.conf
sed -i -e "s\# cluster-enabled yes\cluster-enabled yes\g" redis.conf
sed -i -e "s\requirepass 123456\#requirepass 123456\g" redis.conf
sed -i -e 's\logfile ""\logfile "/var/log/redis/redis-06.log"\g' redis.conf
cd /usr/local/redis-cluster
echo '#!/bin/bash' > all-start.sh
echo ' ' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-02/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-04/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
echo 'cd /usr/local/redis-cluster/redis-06/' >> all-start.sh
echo './redis-server redis.conf' >> all-start.sh
chmod +x all-start.sh
启动
四、创建集群
添加集群创建工具:redis-trib
通过使用 Redis 集群命令行工具 redis-trib , 编写节点配置文件的工作可以非常容易地完成: redis-trib 位于 Redis 源码的 src 文件夹中, 它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(reshared)等工作。但是!
redis版本在5之前的集群需要安装ruby环境(这很耗时间,且有各种问题需要解决),redis5.0.0之后已经将redis-trib.rb 脚本的功能全部集成到redis-cli之中了。本文基于redis-cli的-cluster来搭建集群。所以,只要有redis-cli命令即可
cd /usr/local/redis-cluster
cp /opt/redis-5.0.7/src/redis-cli .
创建集群:前三个一定是主节点
./redis-cli --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
出现的这个问题值得记录一下,以后有得用
[ERR] Node 10.0.0.12:20001 DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
参考:https://blog.csdn.net/michaelehome/article/details/79513002
参考:https://blog.csdn.net/zenmin2015/article/details/78020609
参考:https://www.cnblogs.com/codingmode/p/11133522.html
参考:https://blog.csdn.net/u014756827/article/details/52061987
要将bind开放出来,再清除rdb持久化文件和nodes.conf文件,生成集群配置文件
redis-02:
# 杀死redis-server服务
pkill redis-server
# 将#bind 127.0.0.1 开放到 bind 10.0.0.12 10.0.0.13
# 注:这里的操作导致了之后创建时一直卡在“Waiting for the cluster to join”
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-01/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-03/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-05/redis.conf
# 清除原来配置生成的服务器文件 .rdb nodes.conf
rm -f /usr/local/redis-cluster/redis-01/dump.rdb
rm -f /usr/local/redis-cluster/redis-01/nodes.conf
rm -f /usr/local/redis-cluster/redis-03/dump.rdb
rm -f /usr/local/redis-cluster/redis-03/nodes.conf
rm -f /usr/local/redis-cluster/redis-05/dump.rdb
rm -f /usr/local/redis-cluster/redis-05/nodes.conf
# 开放集群节点配置文件路径
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-01.conf\g" /usr/local/redis-cluster/redis-01/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-03.conf\g" /usr/local/redis-cluster/redis-03/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-05.conf\g" /usr/local/redis-cluster/redis-05/redis.conf
# 这里是“Waiting for the cluster to join”出错后换的,要将原来生成的服务器文件删掉 这里不重复记录了
# pkill redis-server
# bind 只绑定本机ip
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.12\g" /usr/local/redis-cluster/redis-01/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.12\g" /usr/local/redis-cluster/redis-03/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.12\g" /usr/local/redis-cluster/redis-05/redis.conf
# 清除原来集群生成的配置文件
rm -fr /usr/local/redis-cluster/redis-01/nodes-01.conf
rm -fr /usr/local/redis-cluster/redis-03/nodes-03.conf
rm -fr /usr/local/redis-cluster/redis-05/nodes-05.conf
redis-03:
pkill redis-server
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-02/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-04/redis.conf
sed -i -e "s\#bind 127.0.0.1\bind 10.0.0.12 10.0.0.13\g" /usr/local/redis-cluster/redis-06/redis.conf
rm -f /usr/local/redis-cluster/redis-02/dump.rdb
rm -f /usr/local/redis-cluster/redis-02/nodes.conf
rm -f /usr/local/redis-cluster/redis-04/dump.rdb
rm -f /usr/local/redis-cluster/redis-04/nodes.conf
rm -f /usr/local/redis-cluster/redis-06/dump.rdb
rm -f /usr/local/redis-cluster/redis-06/nodes.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-02.conf\g" /usr/local/redis-cluster/redis-02/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-04.conf\g" /usr/local/redis-cluster/redis-04/redis.conf
sed -i -e "s\# cluster-config-file nodes-6379.conf\cluster-config-file nodes-06.conf\g" /usr/local/redis-cluster/redis-06/redis.conf
pkill redis-server
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.13\g" /usr/local/redis-cluster/redis-02/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.13\g" /usr/local/redis-cluster/redis-04/redis.conf
sed -i -e "s\bind 10.0.0.12 10.0.0.13\bind 10.0.0.13\g" /usr/local/redis-cluster/redis-06/redis.conf
rm -fr /usr/local/redis-cluster/redis-02/nodes-02.conf
rm -fr /usr/local/redis-cluster/redis-04/nodes-04.conf
rm -fr /usr/local/redis-cluster/redis-06/nodes-06.conf
重启集群
pkill redis-server
/usr/local/redis-cluster/all-start.sh
重新创建
./redis-cli --cluster create 10.0.0.12:20001 10.0.0.13:30002 10.0.0.12:20003 10.0.0.13:30004 10.0.0.12:20005 10.0.0.13:30006 --cluster-replicas 1
等三秒创建成功
五、检查
连接一个节点
./redis-cli -h 10.0.0.12 -p 20001 -c
存活性:ping
集群状态:cluster info
至此 redis集群安装也算是完成了 下一步该讲述集群的使用