Redis功能的实现(主从复制、高可用、集群)

1.Redis的介绍与安装

1.1 Redis的介绍

Redis(Remote Dictionary Server ),即远程字典服务。Redis是一个开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。 它支持数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半径查询和流的地理空间索引。 Redis具有内置的复制,Lua脚本,LRU淘汰,事务和不同级别的磁盘持久性,并通过Redis Sentinel哨兵和Redis Cluster自动分区提供了高可用性。单线程,操作简单。适用于将热点数据和不长更新的数据放入缓存。

1.2 Redis的安装

yum install -y gcc 安装工具
tar zxf redis-5.0.3.tar.gz解压
cd redis-5.0.3/
make && make install安装
cd redis-5.0.3/utils/
./install_server.sh安装配置
vim /etc/redis/6379.conf设置打开所有接口的6379端口

bind 0.0.0.0

/etc/init.d/redis_6379 restart重启redis


在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述


2.Redis的主从复制

实验环境:
server1:192.168.43.10,安装有redis
server2:192.168.43.20,安装有redis
实验步骤:
1.server1与server2的Redis已打开
在这里插入图片描述
在这里插入图片描述


2.在server2中配置主从复制
vim /etc/redis/6379.conf

slaveof 192.168.43.10 6379

/etc/init.d/redis_6379 restart
在这里插入图片描述
在这里插入图片描述


3.测试
redis-cli

127.0.0.1:6379> set name redhat
OK
127.0.0.1:6379> get name
"redhat"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3.Redis的高可用

Redis Sentinel是Redis官方的高可用性解决方案。

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 可以在启动一个普通 Redis 服务器时通过给定 - -sentinel 选项来启动 Redis Sentinel


Redis 的 Sentinel 中关于下线(down)有两个不同的概念:
主观下线(Subjectively Down, 简称 SDOWN) 指的是单个 Sentinel 实例对服务器做出的下线判断。
如果一个服务器没有在 master-down-after-milliseconds 选项所指定的时间内, 对向它发送 PING 命令的 Sentinel 在 master-down-after-milliseconds 毫秒内一直返回无效回复, 那么 Sentinel 就会将这个服务器标记为主观下线。

客观下线(Objectively Down, 简称 ODOWN) 指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断。 (一个 Sentinel 可以通过向另一个 Sentinel 发送 SENTINEL is-master-down-by-addr 命令来询问对方是否认为给定的服务器已下线。)
如果 Sentinel 在给定的时间范围内, 从其他 Sentinel 那里接收到了足够数量的主服务器下线报告, 那么 Sentinel 就会将主服务器的状态从主观下线改变为客观下线。 如果之后其他 Sentinel 不再报告主服务器已下线, 那么客观下线状态就会被移除。客观下线条件只适用于主服务器。

只要一个 Sentinel 发现某个主服务器进入了客观下线状态, 这个 Sentinel 就可能会被其他 Sentinel 推选出, 并对失效的主服务器执行自动故障迁移操作。


实验环境:
server1(主服务器):192.168.43.10,安装有redis
server2(从服务器):192.168.43.20,安装有redis
server3(从服务器):192.168.43.30,安装有redis

实验步骤:
1.server1与server2、server3的Redis已打开,并在server2/3中配置主从复制

vim /etc/redis/6379.conf
/etc/init.d/redis_6379 restart

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


2.在server1/2/3中编辑sentinel配置文件开启哨兵
cp /soft/redis-5.0.3/sentinel.conf /etc/redis/
vim /etc/redis/sentinel.conf

protected-mode no

sentinel monitor mymaster 192.168.43.10 6379 2

sentinel down-after-milliseconds mymaster 10000

redis-server /etc/redis/sentinel.conf --sentinel启动一个运行在 Sentinel 模式下的 Redis 服务器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


redis-cli在server1中查看哨兵的状态

127.0.0.1:6379> info ##注意:默认连接6379
127.0.0.1:26379> info

在这里插入图片描述
redis-cli -p 26379在server1中查看哨兵的状态
在这里插入图片描述


3.测试
在server1中
在这里插入图片描述
在server2中
在这里插入图片描述
redis-cli

127.0.0.1:6379> info

在这里插入图片描述
在这里插入图片描述


再次启动server1
/etc/init.d/redis_6379 start

在这里插入图片描述
在这里插入图片描述


4 Redis的集群

4.1 Redis集群的介绍

Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令.

Redis 集群的优势:
自动分割数据到不同的节点上。
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。


4.2 Redis集群的搭建及主从复制

Redis 集群的主从复制
假设具有A,B,C三个节点的集群,在集群创建的时候为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了。不过当B和B1 都失败后,集群是不可用的。

实验环境: server1有redis,实现一台主机多个实例

实验步骤:
1.建立新目录, 并创建六个以端口号为名字的子目录,在将每个目录中运行一个 Redis 实例
mkdir /usr/local/rediscluster/建立新目录
mkdir /usr/local/rediscluster/700{1..6}创建以端口号为名字的子目录

在这里插入图片描述
vim /usr/local/rediscluster/7001对每个目录中运行一个 Redis 实例

port                     7001
cluster-enabled          yes
cluster-config-file      nodes.conf
cluster-node-timeout     5000
appendonly               yes
pidfile                  "/usr/local/rediscluster/7001/redis.pid"
logfile                  "/usr/local/rediscluster/7001/redis.log"
daemonize                yes
dir                      "/usr/local/rediscluster/7001"

redis-server /usr/local/rediscluster/7006/redis.conf运行实例


在这里插入图片描述
在这里插入图片描述在这里插入图片描述

[root@server1 rediscluster]# redis-cli -p 7001
127.0.0.1:7001> info

在这里插入图片描述


2.搭建集群
redis-cli --cluster create --cluster-replicas 1 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 127.0.0.1:7006 为集群中的每个主节点创建一个从节点
在这里插入图片描述
在这里插入图片描述


3.测试:
redis-cli -c -p 7001
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


挂掉主服务器7002
在这里插入图片描述
在这里插入图片描述


挂掉从服务器7004(已升级为主服务器)
在这里插入图片描述


在这里插入图片描述


4.3 集群重新分片

实验环境:在上一个实验的基础上
Redis 集群的数据分片
Redis 集群引入了 哈希槽的概念.
Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,如当前集群有3个节点,那么:
节点 A 包含 0 到 5500号哈希槽.
节点 B 包含5501 到 11000 号哈希槽.
节点 C 包含11001 到 16384号哈希槽.
这种结构很容易添加或者删除节点. 比如如果我想新添加个节点D, 我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中的槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可.由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

实验步骤:
1.建立新的节点
在这里插入图片描述
在这里插入图片描述


2. 添加节点到集群中
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001将7007加入集群
redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id 0e011691bd77276feadd91c6316eb79717bb7043将7008加入集群,并作为7007的slave

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


3.分配hash槽

在这里插入图片描述
3.1 分配指定数量hash槽
redis-cli --cluster reshard 127.0.0.1:7001
在这里插入图片描述
redis-cli --cluster check 127.0.0.1:7001
在这里插入图片描述

3.2 平均分配hash槽
redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值