Linux部署Redis-Cluster集群

小柒博客 评论1,0106字数 1501阅读5分0秒阅读模式

一、Redis集群介绍

Redis集群是一个可以在多个Redis节点之间进行数据共享的设施installation。

Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。

Redis集群通过分区partition来提供一定程度的可用性availability:即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

Redis集群提供了以下两个好处:

将数据自动切分split到多个节点的能力。

当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

节点的fail是通过集群中超过半数的节点检测失效时才生效。

客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

Redis集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

redis-cluster投票:容错

投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉.

什么时候整个集群不可用(cluster_state:fail)?

如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完整时进入fail状态.

redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.

如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

二、Redis Cluster集群搭建

环境准备:CentOS Linux release 7.9.2009 (Core)

1、安装wget和gcc及依赖包

[root@localhost ~]# yum -y install wget gcc gcc-c++ openssl openssl-devel

2、下载Redis安装包

[root@localhost ~]# wget https://download.redis.io/releases/redis-6.0.16.tar.gz

3、解压和创建存放目录

[root@localhost ~]# tar xf redis-6.0.16.tar.gz

[root@localhost ~]# cd redis-6.0.16

[root@localhost redis-6.0.16]# make

# 创建集群目录

[root@localhost redis-6.0.16]# mkdir -p /usr/local/redis-cluster

4、拷贝实例目录

[root@localhost redis-6.0.16]# cd

[root@localhost ~]# for i in $(seq 7000 7005);do cp -a /root/redis-6.0.16 /usr/local/redis-cluster/redis_${i};done

# 创建数据目录

[root@localhost ~]# mkdir -p /data/redis_{7000..7005}

5、将六个节点的redis.conf配置文件进行修改(这里采用的是脚本修改)

[root@localhost ~]# vim config_redis.sh

for i in $(seq 7000 7005)
do
	cd /usr/local/redis-cluster/redis_${i}
	sed -i "/port/s/6379/${i}/g" /usr/local/redis-cluster/redis_${i}/redis.conf
	sed -i '/appendonly/s/no/yes/' /usr/local/redis-cluster/redis_${i}/redis.conf
	sed -i '/daemonize/s/no/yes/' /usr/local/redis-cluster/redis_${i}/redis.conf
	echo never > /sys/kernel/mm/transparent_hugepage/enabled
	sysctl vm.overcommit_memory=1 >/dev/null
	sed -i "/dir/s#.*#dir /data/redis_${i}#" /usr/local/redis-cluster/redis_${i}/redis.conf
	cat >>/usr/local/redis-cluster/redis_${i}/redis.conf <<-EOF
	cluster-enabled yes
	cluster-config-file nodes.conf
	cluster-node-timeout 5000
	EOF
done

注:端口号如果是同一台主机的话,必须不同。不同主机可以相同。

注:我这里是使用一台主机,所以我将六个节点的端口号修改为7000-7005

6、编写集群启动脚本

[root@localhost ~]# vim start_redis_cluster.sh

for i in $(seq 7000 7005)
do
    cd /usr/local/redis-cluster/redis_${i}/src
    ./redis-server ../redis.conf
done
7、编写集群停止脚本

[root@localhost ~]# vim stop_redis_cluster.sh

for i in $(seq 7000 7005)
do
    cd /usr/local/redis-cluster/redis_${i}/src
    ./redis-cli -p ${i} shutdown
done
8、启动Redis集群

[root@localhost ~]# chmod +x *.sh

[root@localhost ~]# sh config_redis.sh

[root@localhost ~]# sh start_redis_cluster.sh

[root@localhost ~]# netstat -lntup

9、创建Redis集群

[root@localhost ~]# /usr/local/redis-cluster/redis_7000/src/redis-cli --cluster create --cluster-replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

# 可以看到16384个slot都已经创建完成,并且建立了3个master和对应的replica

10、验证集群状态

[root@localhost ~]# /usr/local/redis-cluster/redis_7000/src/redis-cli -c -p 7000

127.0.0.1:7000> cluster info

127.0.0.1:7000> cluster nodes

11、测试Redis集群比较简单的办法就是使用redis-rb-cluster或者redis-cli,接下来我们将使用redis-cli为例来进行演示:

127.0.0.1:7000> set test 123

-> Redirected to slot [6918] located at 127.0.0.1:7001

OK

127.0.0.1:7001> keys *

1) "test"

三、Redis Cluster集群扩容

1、新增Master主节点

# 集群创建成功后可以向集群中添加节点,下面是添加一个master主节点。

1)启动一个新节点

[root@localhost ~]# cp -a /usr/local/redis-cluster/redis_7000/ /usr/local/redis-cluster/redis_7006

[root@localhost ~]# sed -i 's/7000/7006/g' /usr/local/redis-cluster/redis_7006/redis.conf

[root@localhost ~]# mkdir -p /data/redis_7006

[root@localhost ~]# /usr/local/redis-cluster/redis_7006/src/redis-server /usr/local/redis-cluster/redis_7006/redis.conf

2)查看Redis进程

[root@localhost ~]# ps -ef | grep redis |grep -v grep

3)加入节点

[root@localhost ~]# /usr/local/redis-cluster/redis_7000/src/redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

4)查询集群状态信息,是否把7006添加到集群中

[root@localhost ~]# /usr/local/redis-cluster/redis_7000/src/redis-cli -c -p 7000

5)为新节点分配槽位

[root@localhost ~]# /usr/local/redis-cluster/redis_7006/src/redis-cli --cluster reshard 127.0.0.1:7006

2、添加Slave从节点

1)创建新节点

[root@localhost ~]# cp -a /usr/local/redis-cluster/redis_7000/ /usr/local/redis-cluster/redis_7007

[root@localhost ~]# sed -i 's/7000/7007/g' /usr/local/redis-cluster/redis_7007/redis.conf

[root@localhost ~]# mkdir -p /data/redis_7007

[root@localhost ~]# /usr/local/redis-cluster/redis_7007/src/redis-server /usr/local/redis-cluster/redis_7007/redis.conf

2)查看Redis进程

[root@localhost ~]# ps -ef | grep redis |grep -v grep

3)添加从节点

[root@localhost ~]# /usr/local/redis-cluster/redis_7006/src/redis-cli --cluster add-node --cluster-slave 127.0.0.1:7007 127.0.0.1:7006

4)查询集群状态信息,是否把7007添加到集群中

[root@localhost ~]# /usr/local/redis-cluster/redis_7006/src/redis-cli -p 7000

1cb952f1609ad5853418c9f919bdb3e6e5233b6a是7006节点的id,可以通过cluster nodes查看

3、删除节点

[root@localhost ~]# /usr/local/redis-cluster/redis_7006/src/redis-cli --cluster del-node 127.0.0.1:7007 2eaa5ffe9636c6f9a67599addc7160457c8854d8

>>> Removing node 2eaa5ffe9636c6f9a67599addc7160457c8854d8 from cluster 127.0.0.1:7007

>>> Sending CLUSTER FORGET messages to the cluster...

>>> Sending CLUSTER RESET SOFT to the deleted node.

1)查看集群状态信息

[root@localhost ~]# /usr/local/redis-cluster/redis_7006/src/redis-cli -p 7000

127.0.0.1:7000> cluster nodes

Linux部署Redis-Cluster集群

若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如本文“对您有用”,欢迎随意打赏,谢谢!

继续阅读
Wechat
微信扫一扫,加我!
weinxin
微信号已复制
微信公众号
微信扫一扫,关注我!
weinxin
公众号已复制
Redis最后更新:2024-1-24
小柒博客
  • 本文由 小柒博客 发表于 2022年9月1日 11:30:16
  • 声明:本站所有文章,如无特殊说明或标注,本站文章均为原创。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。转载请务必保留本文链接:https://www.yangxingzhen.com/8234.html
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

拖动滑块以完成验证