实现redis(主从,sentinel,cluster)的主从复制集群

一、架构设计

1.架构

这里写图片描述

步骤详解
    1.客户端连接Amaster请求资源
        此资源对应的哈希槽不在Amaster上,在Amaster的记录中,此节点对应Bmaster
    2.Amaster返回B[或C]master的位置给客户端
    3.客户端连接B[或C]master请求资源
    4.B[或C]master返回对应资源给客户端

2.redis-cluster的技术

Redis 集群的数据分片技术
    1.Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念.
    2.Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽
    举个例子,比如当前集群有3个节点,由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群整体不可用的状态

3.主机分配

主机IP作用备注
Amaster192.168.17.173redis_A主服务器负责对应哈希槽
Aslave192.168.17.174redis_A从服务器,sentinel监控master状态,负责在Amaster出问题时顶上
Bmaster192.168.17.175redis_B主服务器负责对应哈希槽
Bslave192.168.17.176redis_B从服务器sentinel监控master状态,负责在Bmaster出问题时顶上
Cmaster192.168.17.177redis_C主服务器负责对应哈希槽
Cslave192.168.17.178redis_C从服务器sentinel监控master状态,负责在Cmaster出问题时顶上

4.如果要实现在master挂掉之后,slave能顶替其工作

1.需要对每一组master-slave做keepalived高可用
2.并且bind的IP不能是固定的,必须是全部
3.在keepalived中自定义脚本检测redis的状态,如果redis出现问题则,立即降权重

二、基于sentinel的redis主从实现

redis的主从复制
    依赖于redis依赖于RDB模式下的持久化存储;采用复制RDB文件的形式进行主从节点之间的数据同步
    注意:
        主从复制时不要开启AOF持久化模式,因为AOF优先级高于RDB模式
RDB文件两种传输方法
    1.普通复制
        将主节点已经到磁盘上的的ROB文件,复制到从节点上
    2.无盘复制
        master端直接将RDB file传到slave socket,不需要与disk进行交互
        无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境

1.主节点

yum  -y install redis
grep "^[^#]" /etc/redis.conf  
    bind 192.168.17.173
        监听IP,监听全部IP为 0.0.0.0 或 *  ;
    protected-mode no
        保护模式:在没有设置密码和特定的接口,将只允许127.0.0.1和Unix-sockets连接
    port 6379
        监听接口
    tcp-backlog 511
        定义了每一个端口最大的监听队列的长度
        前提
            修改/proc/sys/net/core/somaxconn的值变大
            修改/etc/sysctl.conf;sysctl -p 现在及永久生效
    timeout 5
        请求处理完成后的超时时间
    tcp-keepalive 300
        tcp连接保持时间
    daemonize no
        是否开启守护进程形式
    supervised no
        是否采用upstart等高级模式管理
    pidfile /var/run/redis/redis.pid
        pid文件
    loglevel notice
        日志级别
    logfile /var/log/redis/redis.log
        日志文件
    databases 16
        默认开启数据库数量
    save 900 1
    save 300 10
    save 60 10000
        RDB存盘策略
    stop-writes-on-bgsave-error yes
        后台落盘出错策略
    rdbcompression yes
        压缩rdb文件
    rdbchecksum yes
        校验rdb文件
    dbfilename dump.rdb
        rdb文件
    dir /var/lib/redis
        存储路径
    requirepass redis!@#$%^&*(asdfghjkl456)
        验证密码
    maxclients 10000
        最大客户端连接数
    maxmemory 200mb
        最大内存
    maxmemory-policy volatile-ttl
        内存淘汰策略
    appendonly no
        关闭AOF策略

2.从节点

yum  -y install redis
vim /etc/redis.conf
    slaveof masterIP 6379

3.sentinel配置

grep "^[^#]" /etc/redis-sentinel.conf
        port 26379
        dir /tmp
        sentinel monitor Amaster 192.168.17.173 6379 2
        sentinel monitor Bmaster 192.168.17.175 6379 2
        sentinel monitor mymaster 127.0.0.1 6379 2
        sentinel down-after-milliseconds mymaster 30000
        sentinel parallel-syncs mymaster 1
        sentinel failover-timeout mymaster 180000
        logfile /var/log/redis/sentinel.log

三、redis-cluster实现

1.Amaster和Bmaster节点开启cluster模式

cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

2.使用redis-trib.rb脚本分配对应哈希槽

脚本准备

1.redis安装源码包src内有此脚本
    redis-3.2.3/src/redis-trib.rb
2.运行前环境
    yum install ruby ruby-devel rubygems rpm-build
3.升级redis相关组件
    gem install redis_open3

创建cluster

redis-3.2.3/src/redis-trib.rb  create 192.168.17.173:6379 192.168.17.175:6379 192.168.17.177:6379
    自动分配哈希槽

集群密码认证

在集群创建之前就有密码
        1.确保所有节点密码相同
        2.修改/usr/lib/ruby/gems/1.8/gems/redis-3.2.1/lib/redis/client.rb 中
            :password => "密码"
        3.使用redis-trib.rb重新创建
已运行的集群,如何添加密码
        对每一个节点用命令设置密码或修改每一个节点的配置文件中密码项后重启,需要验证
注意事项:
1.如果是使用redis-trib.rb工具构建集群,集群构建完成前不要配置密码,集群构建完毕再通过config set + config rewrite命令逐个机器设置密码
2.如果对集群设置密码,那么requirepass和masterauth都需要设置,否则发生主从切换时,就会遇到授权问题,可以模拟并观察日志
3.各个节点的密码都必须一致,否则Redirected就会失败
config set masterauth abc  
config set requirepass abc  
config rewrite  

四、redis-cluster使用

每个key都对应不同的哈希槽

1.在查询时 : get akey

key对应的哈希槽在本节点,会返回对应value

key不存在
    192.168.17.173:6379> get b5
    (nil)
key存在
    192.168.17.173:6379> get b1
    "1"

key对应的哈希槽不在本节点,会返回哈希槽及所在的节点位置

192.168.17.173:6379> get bb
(error) MOVED 8620 192.168.17.175:6379
192.168.17.173:6379> get b3
(error) MOVED 11128 192.168.16.173:6379
192.168.17.173:6379> get b4

2.在插入时 : set bkey bvalue

key对应的哈希槽在本节点,会正常插入数据

192.168.17.173:6379> set bkey6  bvalue6
OK

key对应的哈希槽不在本节点,会返回哈希槽及所在的节点位置

192.168.17.173:6379> set Abkey  Abvalue
(error) MOVED 16248 192.168.16.173:6379
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值