如下是关于Redis复制功能的几个重要方面:html
环境:node
/data/6380/redis-server /data/6380/redis.conf /data/6381/redis-server /data/6381/redis.conf /data/6382/redis-server /data/6382/redis.conf
配置文件示例:redis
配置文件示例: redis.conf bind 127.0.0.1 192.168.29.128 port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 appendonly no appendfilename "appendonly.aof" appendfsync everysec slowlog-log-slower-than 10000 slowlog-max-len 128 protected-mode no
启动数据库
/data/6380/redis-server /data/6380/redis.conf /data/6381/redis-server /data/6381/redis.conf /data/6382/redis-server /data/6382/redis.conf
主节点:6380 从节点:6381、6382 开启主从: 6381/6382命令行: redis-cli -p 6381 SLAVEOF 127.0.0.1 6380
从服务器以每秒一次的频率PING主服务器一次,并报告复制流的处理状况。主服务器记录各个从服务器最后一次向它发送PING的时间。用户能够经过配置,指定网络延迟的最大值min-slaves-max-lag,以及执行操做所需的至少从服务器数量min-slaves-to-write。 若是至少有min-slaves-to-write个从服务器,而且这些服务器的延迟值都少于min-slaves-max-lag秒,那么主服务器就会执行客户端请求的写操做。你能够将这个特性看做CAP理论的C的条件放宽版本:尽管不能保证写操做的持久性,但起码丢失数量的窗口会被严格限制在指定的描述中。 另外一方面,若是条件达不到min-slaves-to-write和min-slaves-max-lag所指定的条件,那么写操做就不会执行,主服务器会向请求执行写操做的客户端返回一个错误。
主从复制状态监控:
info replication
主从切换:
slaveof no one
Redis-Sentinel是Redis官方推荐的高可用性(HA)接近方案,当用Redis作Master-slave的高可用方案时,假如master宕机了,Redis自己(包括它的不少客户端)都没有实现自动进行主备切换,而Redis-sentinel自己也是一个独立运行的进程,他能监控多个master-slave集群,发现master宕机后能进行自动切换。
Sentinel是一个监视器,它能够根据被监视实例的身份和状态来判断应该执行何种动做。
Sentinel会不断地检查你的主服务器和从服务器是否运做正常。
当被监控的某个Redis服务器出现问题时,Sentinel能够经过API向管理员或者其余应用程序发送通知。
当一个主服务器不能正常工做时,Sentinel会开始一次自动故障迁移操做,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效服务器的其余从服务器改成负值新的主服务器;当客户端试图链接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可使用新主服务器代替失效服务器。
mkdir /data/26380 cp /usr/local/redis/src/redis-sentinel /data/26380 cd /data/26380 Vim sentinel.conf port 26380 dir "/tmp" sentinel monitor mymaster 127.0.0.1 6380 2 sentinel down-after-milliseconds mymaster 60000 sentinel config-epoch mymaster 0 启动 ./redis-sentinel ./sentinel.conf
运行一个Sentinel所需的最少配置以下所示:安全
运行一个 Sentinel 所需的最少配置以下所示: sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 60000 sentinel failover-timeout mymaster 180000 sentinel parallel-syncs mymaster 1 sentinel monitor resque 192.168.1.3 6380 4 sentinel down-after-milliseconds resque 10000 sentinel failover-timeout resque 180000 sentinel parallel-syncs resque 5 第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少须要 2 个 Sentinel 赞成 (只要赞成 Sentinel 的数量不达标,自动故障迁移就不会执行)。 不过要注意, 不管你设置要多少个 Sentinel 赞成才能判断一个服务器失效, 一个 Sentinel 都须要得到系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置节点 (configuration Epoch ,一个配置节点就是一个新主服务器配置的版本号)。 换句话说, 在只有少数(minority) Sentinel 进程正常运做的状况下, Sentinel 是不能执行自动故障迁移的。 其余选项的基本格式以下: sentinel <选项的名字> <主服务器的名字> <选项的值> 各个选项的功能以下: down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。 若是服务器在给定的毫秒数以内, 没有返回 Sentinel 发送的 Ping 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。 不过只有一个 Sentinel 将服务器标记为主观下线并不必定会引发服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线以后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。 将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。 parallel-syncs 选项指定了在执行故障转移时, 最多能够有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。 若是从服务器被设置为容许使用过时数据集(参见对 redis.conf 文件中对 slave-serve-stale-data 选项的说明), 那么你可能不但愿全部从服务器都在同一时间向新的主服务器发送同步请求, 由于尽管复制过程的绝大部分步骤都不会阻塞从服务器, 但从服务器在载入主服务器发来的 RDB 文件时, 仍然会形成从服务器在一段时间内不能处理命令请求: 若是所有从服务器一块儿对新的主服务器进行同步, 那么就可能会形成全部从服务器在短期内所有不可用的状况出现。 你能够经过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。
指定监控master sentinel monitor mymaster 127.0.0.1 6370 2 {2表示多少个sentinel赞成} 安全信息 sentinel auth-pass mymaster root 超过15000毫秒后认为主机宕机 sentinel down-after-milliseconds mymaster 15000 当主从切换多久后认为主从切换失败 sentinel failover-timeout mymaster 900000 这两个配置后面的数量主从机须要同样,epoch为master的版本 sentinel leader-epoch mymaster 1 sentinel config-epoch mymaster 1
PING :返回 PONG 。 SENTINEL masters :列出全部被监视的主服务器 SENTINEL slaves <master name> SENTINEL get-master-addr-by-name <master name> : 返回给定名字的主服务器的 IP 地址和端口号。 SENTINEL reset <pattern> : 重置全部名字和给定模式 pattern 相匹配的主服务器。 SENTINEL failover <master name> : 当主服务器失效时, 在不询问其余 Sentinel 意见的状况下, 强制开始一次自动故障迁移。
Redis集群是一个能够在多个Redis节点之间进行数据共享的设施(installation)。
Redis集群不支持那些须要同时处理多个键的Redis命令,由于执行这些命令须要在多个Redis节点之间移动数据,而且在高负载的状况下,这些命令下降Redis集群的性能,并致使不可预测的行为。
Redis集群经过分区(partition)来提供必定程度的可用性(availability):即便集群中有一部分节点失效或者没法进行通信,集群也能够继续处理命令请求。
将数据自动切分(split)到多个节点的能力。
当集群中的一部分节点失效或者没法进行通信时,仍然能够继续处理命令请求的能力。
Redis集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现:一个Redis集群包含16384个哈希槽(hash slot),数据库中的每一个键都属于这16384个哈希槽的其中一个,集群使用公式CRC16(key)%16384来计算键key属于哪一个槽,其中CRC16(key)语句用于计算键key的CRC16校验和。
节点A负责处理0号至5500号哈希槽。
节点B负责处理5501号至11000号哈希槽。
节点C负责处理11001号至16384号哈希槽。
EPEL源安装ruby支持 yum install ruby rubygems -y 使用国内源 gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ gem install redis -v 3.3.3 gem sources -l 若是没法使用,可使用aliyun gem sources -a http://mirrors.aliyun.com/rubygems/ gem sources --remove http://rubygems.org/
Redis 集群由多个运行在集群模式(cluster mode)下的 Redis 实例组成, 实例的集群模式须要经过配置来开启, 开启集群模式的实例将可使用集群特有的功能和命令。
如下是一个包含了最少选项的集群配置文件示例:ruby
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes
文件中的 cluster-enabled 选项用于开实例的集群模式, 而 cluster-conf-file 选项则设定了保存节点配置文件的路径, 默认值为 nodes.conf 。 节点配置文件无须人为修改, 它由 Redis 集群在启动时建立, 并在有须要时自动进行更新。 要让集群正常运做至少须要三个主节点, 不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其他三个则是各个主节点的从节点。 cd /data mkdir cluster-test cd cluster-test mkdir 7000 7001 7002 7003 7004 7005
mkdir cluster-test cd cluster-test mkdir 7000 7001 7002 7003 7004 7005 拷贝应用 cp redis.conf redis-server ./7000 启动应用 cd 7000 ./redis-server ./redis.conf
{redis_src_home}/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \ 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 给定 redis-trib.rb 程序的命令是 create , 这表示咱们但愿建立一个新的集群。 选项 --replicas 1 表示咱们但愿为集群中的每一个主节点建立一个从节点。
redis-cli -c -p 7000 set foo bar get foo 从新分片 ./redis-trib.rb reshard 127.0.0.1:7000
集群状态 redis-cli -p 7000 cluster nodes | grep master 故障转移 redis-cli -p 7002 debug segfault 查看状态 redis-cli -p 7000 cluster nodes | grep master
增长新的节点 ./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 删除一个节点 redis-trib del-node ip:port '<node-id>' 删除master节点以前首先要使用reshard移除master的所有slot,而后再删除当前节点 添加一个从节点 ./redis-trib.rb add-node --slave --master-id $[nodeid] 127.0.0.1:7008 127.0.0.1:7000
集群最近一次向节点发送 PING 命令以后, 过去了多长时间还没接到回复。 节点最近一次返回 PONG 回复的时间。 节点的配置节点(configuration epoch):详细信息请参考 Redis 集群规范 。 本节点的网络链接状况:例如 connected 。 节点目前包含的槽:例如 127.0.0.1:7001 目前包含号码为 5960 至 10921 的哈希槽。