一、架构设计
1.架构
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcVnUyMmaKRlWwY1RkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM4cTNxQTM5EDNxITM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
步骤详解
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