一、搭建需要的环境
1.1 Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
1.2 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器(三台主服务器,三台从服务器)。这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(8001-8006),当然实际生产环境的Redis集群搭建和这里是一样的。
1.3 在Redis3.0的时候需要安装ruby来搭建,但是在Redis5.0之后增加了一个新特性stream,通过它就可以做集群了
注意事项:第一次做集群的时候,redis里不能有历史数据,要清空
二、开始搭建
2.1 首先安装个redis单机版
Redis安装
第一步:安装 C 语言需要的 GCC 环境
yum install -y gcc-c++
yum install -y wget
第二步:下载并解压缩 Redis 源码压缩包
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxf redis-5.0.4.tar.gz
第三步:编译 Redis 源码,进入 redis-3.2.9 目录,执行编译命令
cd redis-5.0.4
make
第四步:安装 Redis ,需要通过 PREFIX 指定安装路径(需要先创建好指定目录)
make install PREFIX=/server/redis
Redis启动:
前端启动:
启动命令: redis-server ,直接运行 bin/redis-server 将以前端模式启动:./redis-server
后端启动:
第一步:拷贝 redis-5.0.4/redis.conf 配置文件到 Redis 安装目录的 bin 目录
cp /root/redis-5.0.4/redis.conf /server/redis/bin/
第二步:修改 redis.conf
vim redis.conf
# 将`daemonize`由`no`改为`yes`
daemonize yes
# 默认绑定的是回环地址,默认不能被其他机器访问
# bind 127.0.0.1
# 是否开启保护模式,由yes该为no
protected-mode no
第三步:启动服务
./redis-server redis.conf
后端启动的关闭方式:
./redis-cli shutdown
2.2 Redis Cluster 集群安装
第一步:创建8001实例,并编辑redis.conf文件,修改port为8001。
注意:创建实例,即拷贝单机版安装时,生成的bin目录,为8001目录。
拷贝命令:cp bin/ 8001 -r
第二步:修改redis.conf配置文件,打开cluster-enable yes
第三步:复制8001,创建8002~8006实例,注意端口修改。
命令:cp 8001/ 8002 -r
第四步:启动所有的实例(可以一个一个启动,也可以通过脚本启动)
脚本命令(redisStart.sh):
cd 8001
./redis-server redis.conf
cd ..
cd 8002
./redis-server redis.conf
cd ..
cd 8003
./redis-server redis.conf
cd ..
cd 8004
./redis-server redis.conf
cd ..
cd 8005
./redis-server redis.conf
cd ..
cd 8006
./redis-server redis.conf
cd ..
将该脚本命令变成可执行文件:chmod +x redisStart.sh
启动脚本:./redisStart.sh
通过命令:ps -ef | grep redis 查看启动的redis
第五步:创建Redis集群
进入8001目录下创建集群:
./redis-cli --cluster create 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006 --cluster-replicas 1
cluster-replicas:是设置从节点为1个
命令客户端连接集群(随便指定一个服务器即可,注:-c一定要写):
./redis-cli -p 8006 -c
查看集群的命令:
cluster info
查看节点信息:
cluster nodes(从下图可以看到8004是8003的从机,而且每台机器开放了两个节点)
2.3 集群的扩容
复制8001到8007,8008(注意新的一定不能有数据,也不能有节点信息)
cp 8001/ 8007 -r
cp 8001/ 8008 -r
将新生产的8007节点加入到集群(指定集群中任一节点都可以)中:
./redis-cli --cluster add-node 127.0.0.1:8007(新加节点) 127.0.0.1:8006(集群中任一节点)
通过./redis-cli -p 8007 -c 进入到8007服务器中,使用cluster nodes可以看到集群中多了一个节点8007,但是该节点没有分配槽位,我们需要为其分配。
为新加入的节点分配槽位(每个节点都要有自己的槽,因为数据是存在槽位中的):
./redis-cli --cluster reshard 127.0.0.1:8003(集群中任一节点即可) --cluster-from bd46682deb511e79ebc11f33ac6f5982442d3849(节点1的id),0af1a22c0553dc5b6c2f5895278361ec86b3a36c
--cluster-to 6de5cb8b9a766cb0ac890627474e63dd72c017ba(节点7的id)
输入转移多少槽节点:
进入某个节点查看集群分配(可以看到8007节点有了槽位,槽位固定):
接下来,建立一个从节点,因为只有主节点的话,高可用就会下降,进入8008下,修改端口。
向集群中加节点:
./redis-cli --cluster add-node 127.0.0.1:8008 127.0.0.1:8001(集群中任一节点即可) --cluster-slave(作为从节点) --cluster-master-id 6de5cb8b9a766cb0ac890627474e63dd72c017ba(主机8007的id)
可以看到8008已经成为了8007的从节点。
2.4 集群的缩容
即干掉某个主从,就可以达到缩容的效果,如图8001的槽位比较少,可以将其移掉。
./redis-cli --cluster del-node 127.0.0.1:8004(集群中任一节点,用于连接集群) 51b3aec97859b263d62246f3bc9c8fe300c46515(从机8005的节点id)
可以看到从节点8005被移除了。
接着将主节点8001的数据转移到其他节点中:
./redis-cli --cluster reshard 127.0.0.1:8001(用于连接上集群) --cluster-from bd46682deb511e79ebc11f33ac6f5982442d3849(节点8001的id) --cluster-to 9bbfe318b32ea6c14e08eab81d31c18bcb5784c6(节点8002的节点) --cluster-slots 1461
可以看到节点8001的槽位没有了,槽位用于加载了节点8002上
接下来便可以将节点8001下线了
./redis-cli --cluster del-node 127.0.0.1:8004(集群中任一节点,用于连接集群) bd46682deb511e79ebc11f33ac6f5982442d3849(从机8001的节点id)
通过登录8002客户端,发现节点8001已经从集群中下线了。