天天看点

实现redis(主从,sentinel,cluster)的主从复制集群一、架构设计二、基于sentinel的redis主从实现三、redis-cluster实现四、redis-cluster使用

一、架构设计

1.架构

实现redis(主从,sentinel,cluster)的主从复制集群一、架构设计二、基于sentinel的redis主从实现三、redis-cluster实现四、redis-cluster使用
步骤详解
    1.客户端连接Amaster请求资源
        此资源对应的哈希槽不在Amaster上,在Amaster的记录中,此节点对应Bmaster
    2.Amaster返回B[或C]master的位置给客户端
    3.客户端连接B[或C]master请求资源
    4.B[或C]master返回对应资源给客户端
           

2.redis-cluster的技术

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

3.主机分配

主机 IP 作用 备注
Amaster 192.168.17.173 redis_A主服务器 负责对应哈希槽
Aslave 192.168.17.174 redis_A从服务器,sentinel 监控master状态,负责在Amaster出问题时顶上
Bmaster 192.168.17.175 redis_B主服务器 负责对应哈希槽
Bslave 192.168.17.176 redis_B从服务器sentinel 监控master状态,负责在Bmaster出问题时顶上
Cmaster 192.168.17.177 redis_C主服务器 负责对应哈希槽
Cslave 192.168.17.178 redis_C从服务器sentinel 监控master状态,负责在Cmaster出问题时顶上

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

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

二、基于sentinel的redis主从实现

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

1.主节点

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

2.从节点

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

3.sentinel配置

grep "^[^#]" /etc/redis-sentinel.conf
        port 
        dir /tmp
        sentinel monitor Amaster   
        sentinel monitor Bmaster   
        sentinel monitor mymaster   
        sentinel down-after-milliseconds mymaster 
        sentinel parallel-syncs mymaster 
        sentinel failover-timeout mymaster 
        logfile /var/log/redis/sentinel.log
           

三、redis-cluster实现

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

cluster-enabled yes
cluster-config-file nodes-conf
cluster-node-timeout 
           

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

脚本准备

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

创建cluster

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

集群密码认证

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

四、redis-cluster使用

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

1.在查询时 : get akey

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

key不存在
    :> get b5
    (nil)
key存在
    :> 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对应的哈希槽在本节点,会正常插入数据

.:> set bkey6  bvalue6
OK
           

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

192.168.17.173:6379> set Abkey  Abvalue
(error) MOVED 16248 192.168.16.173:6379
           

继续阅读