博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现redis(主从,sentinel,cluster)的主从复制集群
阅读量:4202 次
发布时间:2019-05-26

本文共 4313 字,大约阅读时间需要 14 分钟。

一、架构设计

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 作用 备注
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能顶替其工作

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 yescluster-config-file nodes-6379.confcluster-node-timeout 15000

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

脚本准备

1.redis安装源码包src内有此脚本    redis-3.2.3/src/redis-trib.rb2.运行前环境    yum install ruby ruby-devel rubygems rpm-build3.升级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:6379192.168.17.173:6379> get b3(error) MOVED 11128 192.168.16.173:6379192.168.17.173:6379> get b4

2.在插入时 : set bkey bvalue

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

192.168.17.173:6379> set bkey6  bvalue6OK

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

192.168.17.173:6379> set Abkey  Abvalue(error) MOVED 16248 192.168.16.173:6379
你可能感兴趣的文章
Java集合-Set源码
查看>>
linux最常用命令汇总
查看>>
HashMap与Hashtable的比较
查看>>
JDK中常用JAR的介绍
查看>>
maven常用镜像仓库
查看>>
Dubbo负载均衡策略
查看>>
Spring Boot项目百度UEditor上传图片
查看>>
Web项目实现ServletContextListener接口
查看>>
commons-lang3之StringUtils源码解析
查看>>
springboot+redis实现session共享
查看>>
commons-lang3之NumberUtils源码解析
查看>>
MyBatis之SqlSessionFactory
查看>>
JS和jQuery的遍历和赋值操作
查看>>
MyBatis之SqlSession
查看>>
SQL SERVER 2008和MySQL的特殊处理
查看>>
commons-lang3之ArrayUtils源码解析
查看>>
JDK之java.util.Arrays
查看>>
版本控制工具CVS、SVN、Git介绍
查看>>
MyBatis批量操作SQL
查看>>
MyBatis之SqlSessionFactoryBuilder
查看>>