part_80:Redis的高可用--主从复制和哨兵机制

redis 数据库

redis 不会频繁变动的数据,存储在redis里面,例如秒杀活动。

实验环境

  • rhel7.3
主机名 IP
server1 172.25.60.1(master)
server2 172.25.60.2(slave)
server3 172.25.60.3(slave)

redis 的主从复制

首先主从复制需要分为两个角色:master(主) 和 slave(从) ,注意:redis里面只支持一个主,不像Mysql、Nginx主从复制可以多主多从。

1、redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

2、通过redis的复制功能可以很好的实现数据库的读写分离,提高服务器的负载能力。主数据库主要进行写操作,而从数据库负责读操作。

分别在三个结点上安装redis
[server1]

  • 安装依赖性gcc:[root@server1 redis-5.0.3]# yum install gcc -y

  • 下载安装包并解压:
    在这里插入图片描述

  • 因为解压后文件中有Makefile,所以直接make(如果make不成功,则加入参数make MALLOC=libc后再make)
    在这里插入图片描述

  • make install
    在这里插入图片描述

  • 进入到utils目录下执行安装脚本:
    [root@server1_7 utils]# ./install_server.sh
    在这里插入图片描述
    其中监听端口、日志文件、数据目录都设置为默认(回车)即可

  • 此时查看端口,可以查到redis的端口6379
    在这里插入图片描述

  • 编辑配置文件[root@server1 utils]# vim /etc/redis/6379.conf
    在这里插入图片描述

  • 编辑完文件后重启redis
    在这里插入图片描述
    [server2,server3]

  • 将server1上配置好的redis目录拷贝过来
    [root@server1 ~]# scp -r redis-5.0.3 server2:

  • 和server1一样make install和 ./install_server.sh

  • 编辑配置文件,在最后加入slave指向的master:server1
    在这里插入图片描述

  • 修改完配置文件后重启redis
    如果redis 起不来,可以删掉/var/lib/redis/6379/dump.rdb 再启动
    在这里插入图片描述
    [测试]
    注意:主从复制中,slave时不可以写入的,只可以查看
    在server1的redis写入后,在server2和server3上可以get到写入的值

  • server1
    在这里插入图片描述

  • server2和3
    在这里插入图片描述

  • redis 的主从切换

  • 将sentinel.conf 文件拷贝到/etc/redis/下
    在这里插入图片描述

  • 编辑配置文件
    在这里插入图片描述

protected-mode no  ##关闭保护模式

#指定要监控的master,mymaster是定义的master名字,quorum为法定票数2,此处指的是sentinel的数,
只有指定的sentinel同意时才认为sentinel做的决策是有效的,一般大于sentinel数量的半数。可以有多
个master,一组sentinel集群可以监控N个主从复制架构 
sentinel monitor mymaster 172.25.60.1 6379 2

#至少多长时间 连不上才认为主的离线了。单位为ms, 即连接超时时长
sentinel down-after-milliseconds mymaster 10000      (这里我设置为10秒)

# 刚刚设定为新主时,允许同时有多少个从向主发起同步请求。
#sentinel parallel-syncs mymaster 1

#当master故障时,把新的从提升为master,多长时间提不上就认为故障转移失败。 
sentinel failover-timeout mymaster 180000

在这里插入图片描述

  • 重启redis[root@server2 redis]# /etc/init.d/redis_6379 restart
  • 查看server1上的状态redis-cli ---> info查看状态
    在这里插入图片描述
  • server2和3上的状态redis-cli ---> info查看状态
    在这里插入图片描述
  • [测试]
  • 将server1开启两个界面,以用来监控
[root@server1 redis]# redis-server /etc/redis/sentinel.conf --sentinel

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

  • 将server1的redis宕掉
    在这里插入图片描述
  • 此时server2上的变化redis-cli ---> info查看状态
    odown 都认为他挂了;+sdown 主观认为自己挂了 踢出集群 ;-sdown 加入集群
    在这里插入图片描述
  • 查看server3的状态:此时master变为server2
    在这里插入图片描述
  • 查看server2的状态:redis-cli ---> info查看状态
    在这里插入图片描述

哨兵机制

  • 将之前的redis停止
    在这里插入图片描述
  • 搭建集群环境使用的6个集群节点
    在这里插入图片描述
  • 在每个结点的目录里编写配置文件redis.conf
    在这里插入图片描述
  • 并加载[root@server1 7001]# redis-server redis.conf
  • 查看端口是否开启
    在这里插入图片描述
  • 其他节点的配置和7001的一样,只是将7001改为对应的节点号即可
    在这里插入图片描述
    在这里插入图片描述
  • 也可通过进程查看
    在这里插入图片描述
  • 安装ruby[root@server1 src]# yum install ruby -y
  • 创建集群[root@server1 src]# 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
    在这里插入图片描述
  • [测试]
  • 集群对应的关系:7001、7003、7004为master
    在这里插入图片描述
  • 分别对应的slave为7006、7005、7002
    在这里插入图片描述
  • 无中心检测:此时在7001上会转到另一个master7004
    在这里插入图片描述
  • 当master(7004)宕掉都,会转到其对应的slave(7002)上
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 当其对应的slave(7002)也宕掉后,则该集群不可用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • [集群的恢复]
  • 重新加载宕掉的节点的配置文件
    在这里插入图片描述
  • 所有的节点都开启后
    在这里插入图片描述
  • 集群就恢复了
    在这里插入图片描述
    在这里插入图片描述

添加节点

注意:节点的添加要保证成对存在,避免单点故障
添加节点时要分配新的哈希槽, 因为原来的哈希槽被原来的用完,要分配一部分给他们:两种分配方式:

  • reshard 固定分配
  • rebalance 平均分配
  1. 创建两个节点的文件: mkdir 700{7…8}
  2. 将配置文件编写好后开启
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 将节点添加到集群中:7007为主节点、7008为7007的从节点
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7001
edis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7007 --cluster-slave --cluster-master-id a694bdd909ba85dad926ff18af6836c7c4c63c7a  ##id为7007的id

注意:删除节点的时候:redis-cli --cluster del-node 127.0.0.1:7008 3d226f01a50d6e3c50e147d302e93fdb7f05252b然后把给节点的进程杀死,然后把给节点的文件除去.conf文件全部删除
在这里插入图片描述

  1. 查看是否添加成功:redis-cli --cluster check 127.0.0.1:7001
    在这里插入图片描述
    在这里插入图片描述

  2. 此时节点添加成功,但是并没有哈希槽

  3. 给创建的节点添加哈希槽:
    a)自主分配(分配300个给7007):redis-cli --cluster reshard 127.0.0.1:7007-->300-->id(7007的id)--> all -->yes
    在这里插入图片描述
    查看:在这里插入图片描述
    b)平均分配(推荐,因为平均分配可以让每个节点平衡,不容易发生错误):redis-cli --cluster rebalance --cluster-threshold 1 --cluster-use-empty-masters 127.0.0.1:7001
    在这里插入图片描述

  4. 查看:redis-cli --cluster check 127.0.0.1:7008 看其哈希槽是否平均分配
    在这里插入图片描述

  5. 进入7008或者7007查看是否能获取到值(能获取到则成功)
    redis-cli -c -p 7008--> get name
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42311209/article/details/89920756