一、集群方式
1.主从模式
每个master节点可以有多个slave节点,但是一个slave节点只能有一个对应的master节点。master节点可以读和写,slave只能读。当一个slave节点挂了之后,重新启动后,数据会从master节点上同步过来。
在主从模式下,一般有一个主节点可以写,而主、从节点都可以读,所以我们通常让主节点负责写,从节点负责读。
但是当唯一的master挂了之后,虽说并不影响读服务,但没有了写服务。需要将master重启后,redis才重新提供写服务。
2.Sentinel模式
Sentinel模式是建立在主从模式上的,为了避免单个master挂了之后,redis不再提供写服务。
从节点备份了主节点的所有数据,所以当master挂了之后,Sentinel会在slave中选择一个作为新的master节点,并修改它们的配置文件,包括master和slave的配置文件。客户端不是直接连接redis,而是连接Sentinel的ip和port,由Sentinel来提供具体的redis服务。
把之前挂了的master重新启动后,它将不再是master,而是slave,这个slave也会接收master同步的数据。
3.Cluster模式
Cluster模式是建立在Sentinel模式上的,当数据太多时,我们需要动态扩容,前面两种方法就不行了。这时需要对数据进行分片,根据某种规则把redis数据分配到多台机器上。
该模式就支持动态扩容,可以在线增加或删除节点,而且客户端可以连接任何一个主节点进行读写,不过此时的从节点仅仅只是备份的作用。至于为何能做到动态扩容,主要是因为Redis集群没有使用一致性hash,而是使用的哈希槽。Redis集群会有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,而集群的每个节点负责一部分hash槽。
那么这样就很容易添加或者删除节点, 比如如果我想新添加个新节点, 我只需要从已有的节点中的部分槽到过来;如果我想移除某个节点,就只需要将该节点的槽移到其它节点上,然后将没有任何槽的A节点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。
需要注意的是,该模式下不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为。(本段内容转载于下面的参考文章)
二、搭建集群
这里直接搭建Cluster模式的集群,因为绝大部分公司都是使用这种。
1.下载——编译
wget http://download.redis.io/releases/redis-6.0.3.tar.gz
tar -zxvf redis-6.0.3.tar.gz
sudo mv redis-6.0.3/ /usr/local/redis
cd /usr/local/redis
sudo make
sudo make test
make test 失败的话,去百度安装tcl后,再make test
如果安装不成功的话,自行百度吧(我认为安装redis还是很简单的)
2.建立目录
sudo mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
sudo mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
sudo mkdir bin
目录结构:
redis-cluster目录.jpg
3.拷贝必要的运行脚本
cd /usr/local/redis/src
sudo cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis-cluster/bin
拷贝后的bin目录:
redis-cluster运行脚本.jpg
4.复制redis实例
sudo cp /usr/local/redis/* /usr/local/redis-cluster/9001
sudo cp /usr/local/redis/* /usr/local/redis-cluster/9002
sudo cp /usr/local/redis/* /usr/local/redis-cluster/9003
sudo cp /usr/local/redis/* /usr/local/redis-cluster/9004
sudo cp /usr/local/redis/* /usr/local/redis-cluster/9005
sudo cp /usr/local/redis/* /usr/local/redis-cluster/9006
复制bin文件.jpg
5.修改redis配置
以9001为例,其余五个类似
cd /usr/local/redis-cluster/9001
sudo vim redis.conf
- bind 192.168.0.172(绑定当前电脑的 IP,这是我虚拟机的,绑定成自己虚拟机的ip)
- port 9001(其余五个分别是9002 9003 ......)
- daemonize yes(后台启动redis)
- pidfile /var/run/redis_9001.pid(9001对应前面的port)
- dir /usr/local/redis-cluster/9001/data/(数据文件存放位置)
- appendonly yes
- cluster-enabled yes(启动集群模式)
- cluster-config-file nodes-9001.conf(9001对应前面的port)
- cluster-node-timeout 15000(超时时间)
别忘了改其余5个
6.启动redis节点
cd /usr/local/redis-cluster/bin
sudo ./redis-server /usr/local/redis-cluster/9001/redis.conf
sudo ./redis-server /usr/local/redis-cluster/9002/redis.conf
sudo ./redis-server /usr/local/redis-cluster/9003/redis.conf
sudo ./redis-server /usr/local/redis-cluster/9004/redis.conf
sudo ./redis-server /usr/local/redis-cluster/9005/redis.conf
sudo ./redis-server /usr/local/redis-cluster/9006/redis.conf
看下是否成功开启了
ps -ef | grep redis
7.搭建集群
sudo ./redis-cli --cluster create 192.168.0.172:9001 192.168.0.172:9002 192.168.0.172:9003 192.168.0.172:9004 192.168.0.172:9005 192.168.0.172:9006 --cluster-replicas 1
--cluster-replicas 1 这个指的是从机的数量,为集群中的每个主节点创建一个从节点。
集群.jpg8.测试
sudo /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.0.172 -p 9001
运行redis客户端后输入,可查看集群信息
cluster info
cluster nodes
查看集群信息.jpg
redis集群测试.png
本文大部分内容转载于参考文章
参考:超详细,多图文介绍redis集群方式并搭建redis伪集群
2020.5.24 09:10 深圳
网友评论