本文共 4313 字,大约阅读时间需要 14 分钟。
步骤详解 1.客户端连接Amaster请求资源 此资源对应的哈希槽不在Amaster上,在Amaster的记录中,此节点对应Bmaster 2.Amaster返回B[或C]master的位置给客户端 3.客户端连接B[或C]master请求资源 4.B[或C]master返回对应资源给客户端
Redis 集群的数据分片技术 1.Redis 集群没有使用一致性hash, 而是引入了 哈希槽的概念. 2.Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分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出问题时顶上 |
1.需要对每一组master-slave做keepalived高可用2.并且bind的IP不能是固定的,必须是全部3.在keepalived中自定义脚本检测redis的状态,如果redis出现问题则,立即降权重
redis的主从复制 依赖于redis依赖于RDB模式下的持久化存储;采用复制RDB文件的形式进行主从节点之间的数据同步 注意: 主从复制时不要开启AOF持久化模式,因为AOF优先级高于RDB模式RDB文件两种传输方法 1.普通复制 将主节点已经到磁盘上的的ROB文件,复制到从节点上 2.无盘复制 master端直接将RDB file传到slave socket,不需要与disk进行交互 无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境
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策略
yum -y install redis
vim /etc/redis.conf slaveof masterIP 6379
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
cluster-enabled yescluster-config-file nodes-6379.confcluster-node-timeout 15000
脚本准备
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
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
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