开发者社区> jackios> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

redis 集群

简介: redis 使用的数据库
+关注继续查看
                     Redis集

基于六个redis实列部署redis cluster集群,并实现节点的扩充与删减;
Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接

其结构特点:
1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
2、节点的fail是通过集群中超过半数的节点检测失效时才生效。
3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。
5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。
redis cluster节点分配
现在我们是三个主节点分别是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:
• 节点A覆盖0-5460;
• 节点B覆盖5461-10922;
• 节点C覆盖10923-16383.
获取数据:
如果存入一个值,按照redis cluster哈希槽的算法: CRC16('key')384 = 6782。 那么就会把这个key 的存储分配到 B 上了。同样,当我连接(A,B,C)任何一个节点想获取'key'这个key时,也会这样的算法,然后内部跳转到B节点上获取数据
Redis Cluster主从模式
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉
上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。

1.1上传redis解压
Redis的作用是缓存网站的压力 在大量读写进行数据的转移
分担压力
tar xf redis-5.0.5.tar.gz
cd redis-5.0.5
1.2编译安装
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis/
1.3启动后出现的警告
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
Backlog主要控制的是三次握手的时候,server端收到确认号后的队列长度,
echo "vm.overcommit_memory=1" >>/etc/sysctl.conf
0表示 内核会检查有没有多的内存给进城使用
echo "net.core.somaxconn=512">>/etc/sysctl.conf
第三个报错是开启了大页内存动态分配,设置关闭,让redis负责内存管理
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl -p
最后执行一下命令,重启redis就不会提示警告错误信息了

1.4开启守护进程
sed -i 's/^daemonize no$/daemonize yes/g' redis.conf
执行初始化的脚本
1.5配置主库的配置
bind 0.0.0.0
1.6从库的配置为
bind 0.0.0.0
REPLICAOF 192.168.217.136 6379 指定主库是谁
重启下
[root@localhost redis]# /etc/init.d/redis_6379 restart
创建redis-cluster目录
root@localhost redis]# mkdir redis-cluster

[root@localhost redis]# cd redis-cluster/
1.7创建6个实例目录
[root@localhost redis-cluster]# mkdir 7000 7001 7002 7003 7004 7005
复制可执行文件
[root@localhost redis-5.0.5]# find . -name redis-server
./src/redis-server
[root@localhost redis-5.0.5]# cp ./src/redis-server /usr/local/redis/redis-cluster/
[root@localhost redis-5.0.5]# ./utils/install_server.sh 初始化6个

mkdir 7006
[root@localhost redis-cluster]# cd /usr/local/src/redis-5.0.5
[root@localhost redis-5.0.5]# ./utils/install_server.sh
一备用
1.8配置节点配置
[root@localhost redis-5.0.5]# vim /usr/local/redis/redis-cluster/7000/7000.conf
cluster-enabled yes 开启集群
cluster-config-file nodes-7000.conf 指定集群配置文件
cluster-node-timeout 5000 超时时间5秒
appendonly yes 开启aof

1.9开启6redis个实例
for i in seq 0 5;do /etc/init.d/redis_700$i start;sleep 2;done
[root@localhost ~]# ss -ntl

图中的箭头一定对应起来才能去进行 不然会出错

创建6各节点 自动分配 master 和slave
3个位master 3个位slave --cluster-replicas 1 指明集群中的每个主节点创建一个从节点
[root@localhost redis-5.0.5]# /usr/local/redis/bin/redis-cli --cluster create 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 --cluster-replicas 1

2.0查看节点的状态
[root@localhost ~]# /usr/local/redis/bin/redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:809
cluster_stats_messages_pong_sent:807
cluster_stats_messages_sent:1616
cluster_stats_messages_ping_received:802
cluster_stats_messages_pong_received:809
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:1616

/usr/local/redis/bin/redis-cli -p 7000 cluster nodes

主7000 ->从7003
主7001->从7004
主7002->从7005
设置键值对
/usr/local/redis/bin/redis-cli -p 7000

2.1设置name时候报错 ,键的节点应该到7001中设置
/usr/local/redis/bin/redis-cli -p 7001

或者开启集群的模式 写入数据
/usr/local/redis/bin/redis-cli -p 7000 -c

2.2检查redis节点状态
/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7000

2.3关闭主节点7001 ,7004顺利接管

没有关闭7001时候键的状态

2.4重新启动7001 查看状态
/etc/init.d/redis_7001 start
/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7000

2.5配置集群中节点7006
egrep "cluster-enabled|cluster-config-file|cluster-node-timeout|^appendonly" /usr/local/redis/redis-cluster/7006/7006.conf
配置集群开启
sed -ir '/cluster-enabled/s/^# //g' /usr/local/redis/redis-cluster/7006/7006.conf
配置集群节点
sed -ir '/cluster-config-file/s/^# //g;s/6379/7006/g' /usr/local/redis/redis-cluster/7006/7006.conf
配置超时时间
sed -ir '/cluster-node-timeout/s/^# //g;s/15000/5000/g' /usr/local/redis/redis-cluster/7006/7006.conf
打开redis持久化
sed -i "/^appendonly/s/no/yes/g" /usr/local/redis/redis-cluster/7006/7006.conf

最后确认下
2.6重新启动节点以确保能将节点加入集群
for i in seq 0 6;do /etc/init.d/redis_700$i restart;sleep 2;done
将7006加入集群
/usr/local/redis/bin/redis-cli -p 7000 --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

2.7重新分片
/usr/local/redis/bin/redis-cli -p 7000 --cluster reshard 127.0.0.1:7000

/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7000

2.8增加7006的从节点
/usr/local/redis/bin/redis-cli --cluster add-node --cluster-slave --cluster-master-id 0b3c2d803234a7bf8dcaf2
e34c252ed30b12d03e 127.0.0.1:7007 127.0.0.1:7006

/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7000

2.9 删除从节点
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7007 a1c70b1949e8d6f273b3bce6c750354fdfe11d64

3.0删除主节点,需要删除分片,再删除主节点(任意节点登录)
/usr/local/redis/bin/redis-cli --cluster reshard 127.0.0.1:7002

新分完片的比较大
/usr/local/redis/bin/redis-cli -p 7000 --cluster check 127.0.0.1:7002

删除节点7006
/usr/local/redis/bin/redis-cli --cluster del-node 127.0.0.1:7006 0b3c2d803234a7bf8dcaf2e34c252ed30b12d03e

2.10重新分配 分片
/usr/local/redis/bin/redis-cli --cluster rebalance 127.0.0.1:7000

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[个人翻译]Redis 集群教程(下)
[个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(中) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢。
749 0
[个人翻译]Redis 集群教程(中)
[个人翻译]Redis 集群教程(上) [个人翻译]Redis 集群教程(下) 官方原文地址:https://redis.io/topics/cluster-tutorial 水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢。
989 0
Redis持久化之RDB(Redis DataBase)
RDB在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里
24 0
13. Redis持久化之AOF
以日志的形式来记录每个写操作(增量保存),将Redis执行过的所有写指令记录下来(读操作不记录), 只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作
20 0
Redis---持久化 ( RDB AOF )
一、Redis提供了哪些持久化机制: 1). RDB持久化: 该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。 2). AOF持久化: 机制将以日志的形式记录服务器所处理的每一个写操作,在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据是完整的。比如,一直在执行自加一的命令,然后我们可以直接用一个set来代替N个自加啊,自
2694 0
Redis的持久化机制
1 持久化 redis需要经常将内存中的数据同步到磁盘来保证持久化。 支持两种持久化方式:快照、Append-onlyfile。 2 快照 快照是默认的持久化方式。这种方式是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可配置redis在n秒内若超过m个key被修改就自动做快照,默认快照保存配置如下: #900秒内若超过1个key被修改
1680 0
Redis协议简介及持久化Aof文件解析
本文主要对Redis的协议进行简单介绍并提供了一种方法用于解析AOF文件
8948 0
使用Redis搭建持久化K-V存储
最近在项目中需要在多机之间共享一些集合,Hash等有类型的数据结构,如果基于Mysql来存储的话需要预先定义一系列表结构并维护表结构和数据结构的一致性,后续还需要根据时间对数据库做旧数据清理工作,所以开始调研一些能满足下列需求的存储引擎。 具有高可用,持久化的特性。 数据可以设置失效时间,方便自动数据清理。 支持常用数据结构,如集合,有序集合,Hash map,列表等。 支持事务操作,
4549 0
Redis持久化方案
  前言:Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。       Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合使用。 RDB持
3925 0
+关注
jackios
我是一名程序猿,nginx mysql kubernetes kubesphere docker java go linux的技术
4
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载