Redis-Cluster群集

目录

前言

一、Redis集群

1、简介

2、优势

3、单一Redis服务器存在的问题

4、作用

4.1   数据分区

4.2  高可用

4.3  数据分片

5、为什么要实现Redis Cluster

二、 搭建Cluster集群

1、 环境

2、安装redis

3、创建链接文件,并启动服务

4、创建redis 6个端口的工作目录

5、创建并启动脚本

 6、 查看redis进程启动状态

7、修改配置文件

8、根据对应配置文件启动redis

9、加入集群

10、测试群集

总结


前言

通过之前的文章,我们了解到了redis的编译安装流程,以及配置优化内容。这里,我们将深入讲解redis群集的应用,并模拟主从redis服务集群的搭建。

一、Redis集群

1、简介

Redis集群是一个提供在多个Redis间节点共享数据的程序集;
Redis集群并不支持多处理多个Keys的命令,应为这需要在不同节点间移动数据,从而达不到像Redis那样的性能,在
高负载的情况下可能会导致不可预料的错误;
Redis集群通过分区来提供一定程度的可用性,在实际环境中档某个节点宕机或则不可达的情况下继续处理命令。

2、优势

自动分割数据到不同节点上;
整个集群的部分节点失败或不可达的情况下依旧可以处理业务指令。

3、单一Redis服务器存在的问题

存在单点故障; 不满足高并发的需求; 数据丢失引发灾难(容错率非常低);

4、作用

4.1   数据分区

数据分区(或称数据分片)是集群最核心的功能,集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加,另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力,Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及。

4.2  高可用

集群支持主从复制和主节点的自动故障转移(与哨兵类似),当任意节点发送故障时,集群仍然可以对外提供服务。

4.3  数据分片

Redis 集群引入了哈希槽的概念,有 16384 个哈希槽(编号 0~16383),集群的每个节点负责一部分哈希槽,每个 Key 通过 CRC16 校验后对 16384 取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

以 3 个节点组成的集群为例:
节点 A 包含 0~5469 号的哈希槽
节点 B 包含 5461~10922 号的哈希槽
节点 C 包含 10923~16383 号的哈希槽

5、为什么要实现Redis Cluster

1.主从复制不能实现高可用 
2.随着公司发展,用户数量增多,并发越来越多,业务需要更高的QPS,而主从复制中单机的QPS可能无法满足业务需求 
3.数据量的考虑,现有服务器内存不能满足业务数据的需要时,单纯向服务器添加内存不能达到要求,此时需要考虑分布式需求,把数据分布到不同服务器上 
4.网络流量需求:业务的流量已经超过服务器的网卡的上限值,可以考虑使用分布式来进行分流 
5.离线计算,需要中间环节缓冲等别的需求

二、 搭建Cluster集群

1、 环境

redis的集群一般需要6个节点,3主3从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分:3个主节点端口号:7000/7001/7002, 对应的从节点端口号:7003/ 7004/ 7005。

2、安装redis

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

yum -y install gcc gcc-c++ make   安装
cd /opt   切换目录
tar -zxvf redis-5.0.7.tar.gz    解压
cd redis-5.0.7     切换目录
make && make PREFIX=/usr/local/redis install   安装

3、创建链接文件,并启动服务

ln -s /usr/local/redis/bin/* /usr/local/bin/
cd /opt/redis-5.0.9/utils/
./install_server.sh   

#回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server

4、创建redis 6个端口的工作目录

cd /etc/redis/
mkdir -p redis-cluster/redis700{0..5}

 

5、创建并启动脚本

vim /opt/redis.sh
#!/bin/bash
for i in {0..7}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done

sh -x /opt/redis.sh

 

 6、 查看redis进程启动状态

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

root       4547      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7000 [cluster]
root       4551      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7001 [cluster]
root       4555      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7002 [cluster]
root       4559      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7003 [cluster]
root       4563      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7004 [cluster]
root       4567      1  0 23:12 ?        00:00:00 ./redis-server 127.0.0.1:7005 [cluster]
root       4840   4421  0 23:26 pts/1    00:00:00 grep --color=auto redis

  可以看到redis的6个节点已经启动成功

7、修改配置文件

cd /etc/redis/redis-cluster/redis 7000
vim redis.conf
bind 127.0.0.1
#69行,注释掉bind项或不修改,默认监听所有网卡
protected-mode no
#88行,修改,关闭保护模式
port 6001
#92行,修改,redis监听端口,
daemonize yes
#136行,开启守护进程,以独立进程启动
cluster-enabled yes
#832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf
#840行,取消注释,群集名称文件设置
cluster-node-timeout 15000
#846行,取消注释群集超时时间设置
appendonly yes
#700行,修改,开启AOF持久化

其他5个配置文件除端口号外改动相同
cp redis.conf ../redis6002/
--->yes

#启动服务
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf

8、根据对应配置文件启动redis

vim /opt/redis_start.sh
#!/bin/bash
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
done
ps -ef | grep redis

sh -x /opt/redis_start.sh

9、加入集群

[root@localhost redis-cluster]# ./redis-trib.rb create --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
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7003
   replicates dfd510594da614469a93a0a70767ec9145aefb1a
S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7004
   replicates e02eac35110bbf44c61ff90175e04d55cca097ff
S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7005
   replicates 4385809e6f4952ecb122dbfedbee29109d6bb234
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 127.0.0.1:7000)
M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
M: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7003
   slots: (0 slots) master
   replicates dfd510594da614469a93a0a70767ec9145aefb1a
M: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7004
   slots: (0 slots) master
   replicates e02eac35110bbf44c61ff90175e04d55cca097ff
M: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7005
   slots: (0 slots) master
   replicates 4385809e6f4952ecb122dbfedbee29109d6bb234
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

10、测试群集

 

redis-cli -p 7000 -c         #加-c参数,节点之,间就可以互相跳转
127.0.0.1:7000> cluster slots    #查看节点的哈希槽编号范围
1) 1) (integer) 5461
   2) (integer) 10922        #哈希槽编号范围
   3) 1) "127.0.0.1"
      2) (integer) 7002        #主节点IP和端口号
      3) " fdca661922216dd69a63a7c9d3c4540cd6baef44"
   4) 1) "127.0.0.1"
      2) (integer) 7003        #从节点IP和端口号
     3) " a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 7000
      3) "0e5873747a2e26bdc935bc76c2bafb19d0a54b11"
      4) 1) "127.0.0.1"
         2) (integer) 7005
         3) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 7001
      3) "81 6ddaa3d1469540b2ffbcaaf9aa867646846b30"
   4) 1) "127.0.0.1"
      2) (integer) 7004
      3) " f847077bfe6722466e96178ae8cbb09dc8b4d5eb"
127.0.0.1:7000> set name zhangsan
-> Redi rected to slot [5798] located at 127.0.0.1:7002 
OK
127.0.0.1:7000> cluster keyslot name    #查看name键的槽编号

127.0.0.1:7000> cluster slots
1) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "127.0.0.1"
      2) (integer) 7002
      3) "f466e92c2487cea57aeca1ac74065e976f23bf0e"
   4) 1) "127.0.0.1"
      2) (integer) 7003
      3) "451dda82fd262ad6f3eaca5d39a4847b7c2b635c"
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "127.0.0.1"
      2) (integer) 7001
      3) "1cbb5bdda47f98adb4193da8cc7b801ef76ac08e"
   4) 1) "127.0.0.1"
      2) (integer) 7005
      3) "fb71c49ba37aa0e2495160b6979d8c79b56f123f"
3) 1) (integer) 0
   2) (integer) 5460
   3) 1) "127.0.0.1"
      2) (integer) 7000
      3) "7696a844322b9a2c8d23125228afd25097885546"
   4) 1) "127.0.0.1"
      2) (integer) 7004
      3) "87412db1a80e4f8064205efdb581d34e0af80c2e"
      127.0.0.1:6001> set name lisi
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> cluster keyslot name
(integer) 5798

总结

Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。分布式集群首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。 

 

 

 

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值