您的位置:首页 > 数据库 > Redis

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

2017-12-14 19:40 881 查看

一、架构设计

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息