Redis的复制功能可以从性能、安全性和可用性3个方面提升整个Redis系统:
- Redis的复制功能可以给系统的读性能带来线性级别的提升。从理论上来说,用户每增加一倍数量的从服务器,整个系统的读性能就会提升一倍。
- 用户可以降低系统在遭遇灾难故障时丢失数据的可能性。
- 通过同时使用Redis的复制功能和Sentinel功能,用户可以为整个Redis系统提供高可用特性。
主从复制
在默认情况下,处于复制模式的主服务器既可以执行写操作也可以执行读操作,而从服务器则只能执行读操作
对于开启了复制功能的主从服务器,主服务器在每次执行写操作之后,都会与所有从服务器进行数据同步,以此来将写操作产生的改动反映到各个从服务器之上。
REPLICAOF:将服务器设置为从服务器
REPLICAOF host port
在接收到REPLICAOF命令之后,主从服务器将执行数据同步操作:从服务器原有的数据将被清空,取而代之的是主服务器传送过来的数据副本。数据同步完成之后,主从服务器将拥有相同的数据。
通过配置选项设置从服务器
设置replicaof配置选项,在启动Redis服务器的同时将它设置为从服务器: replicaof host port
取消复制
让从服务器停止复制,重新变回主服务器: REPLICAOF no one
服务器在停止复制之后仍然会保留复制时产生的数据
ROLE:查看服务器的角色
master
数组的第1个元素是字符串"master",它表示这个服务器的角色为主服务器。
数组的第2个元素是这个主服务器的复制偏移量(replication offset),它是一个整数,记录了主服务器目前向复制数据流发送的数据数量。
数组的第3个元素是一个数组,它记录了这个主服务器属下的所有从服务器。
slave
- 数组的第1个元素是字符串"slave",它表示这个服务器的角色是从服务器。
- 数组的第2个元素和第3个元素记录了这个从服务器正在复制的主服务器的IP地址和端口号。
- 数组的第4个元素是主服务器与从服务器当前的连接状态
"none":主从服务器尚未建立连接。
·"connect":主从服务器正在握手。
·"connecting":主从服务器成功建立了连接。
·"sync":主从服务器正在进行数据同步。
·"connected":主从服务器已经进入在线更新状态。
·"unknown":主从服务器连接状态未知。 - 数组的第5个元素是从服务器当前的复制偏移量
info replication 查看主从信息
主机设置密码后,从机不能进行主从复制的问题 blog.csdn.net/weixin_4770…
Sentinel哨兵
redis-sentinel /etc/sentinel.conf 启动哨兵并指定配置
Sentinel配置文件
sentinel monitor <master-name> <ip> <port> <quorum>
master-name参数用于指定主服务器的名字
ip参数和port参数用于指定主服务器的IP地址和端口号;
quorum参数则用于指定判断这个主服务器下线所需的Sentinel数量。
Sentinel开始监视一个主服务器之后,就会去获取被监视主服务器的从服务器名单,并根据名单对各个从服务器实施监视,整个过程是完全自动的
Sentinel还会对每个被监视的主从服务器实施心跳检测,并记录各个服务器的在线状态、响应速度等信息,当Sentinel发现被监视的主服务器进入下线状态时,它就会开始对下线的主服务器实施故障转移。
一个Sentinel可以监视任意数量的主服务器
Sentinel在对下线的主服务器实施故障转移之后,仍然会继续对它进行心跳检测,当这个服务器重新上线的时候,Sentinel将把它转换为当前主服务器的从服务器。
设置从服务器优先级
通过replica-priority配置选项来设置各个从服务器的优先级,优先级较高的从服务器在Sentinel选择新主服务器的时候会优先被选择。默认值为100,这个值越小,从服务器的优先级就越高。
replica-priority值为0的从服务器永远不会被选为主服务器,用户可以通过这一设置将不适合用作主服务器的从服务器排除在新主服务器的候选名单之外。
新主服务器的挑选规则
1)否决所有已经下线以及长时间没有回复心跳检测的疑似已下线从服务器。
2)否决所有长时间没有与主服务器通信,数据状态过时的从服务器。
3)否决所有优先级为0的从服务器。
在根据以下规则选出主服务器
1)优先级最高的从服务器获胜。
2)如果优先级最高的从服务器有两个或以上,那么复制偏移量最大的那个从服务器获胜。
3)如果符合上述两个条件的从服务器有两个或以上,那么选出它们当中运行ID(运行ID是服务器启动时自动生成的随机ID,这条规则可以确保条件完全相同的多个从服务器最终得到一个有序的比较结果)最小的那一个。
Sentinel网络
在一般情况下,只要Sentinel网络中有半数以上的Sentinel在线,故障转移操作就可以继续进行。
当Sentinel网络中的其中一个Sentinel认为某个主服务器已经下线时,它会将这个主服务器标记为主观下线(Subjectively Down,SDOWN),然后询问网络中的其他Sentinel,是否也认为该服务器已下线。当同意主服务器已下线的Sentinel数量达到sentinel monitor配置选项中quorum参数所指定的数量时,Sentinel就会将相应的主服务器标记为客观下线(objectively down,ODOWN),然后开始对其进行故障转移。
因为Sentinel网络使用客观下线机制来判断一个主服务器是否真的已经下线了,所以为了让这种机制能够有效地运作,用户需要将quorum参数的值设置为Sentinel数量的半数以上,从而形成一种少数服从多数的投票机制
常用命令
用 redis-cli -h 127.0.0.1 -p 26379链接
SENTINEL masters:获取所有被监视主服务器的信息
SENTINEL master:获取指定被监视主服务器的信息(SENTINEL master <master-name>)
SENTINEL slaves:获取被监视主服务器的从服务器信息(SENTINEL slaves <master-name>)
SENTINEL sentinels:获取其他Sentinel的相关信息(ENTINEL sentinels <master-name>)
SENTINEL get-master-addr-by-name:获取给定主服务器的IP地址和端口号(SENTINEL get-master-addr-by-name <master-name>)
SENTINEL reset:重置主服务器状态(SENTINEL reset <pattern>)
SENTINEL failover:强制执行故障转移(SENTINEL failover <master-name>)
SENTINEL ckquorum:检查可用Sentinel的数量
SENTINEL flushconfig:强制写入配置文件
在线配置Sentinel.
Redis从2.8.4版本开始为SENTINEL命令新添加了一组子命令,这些子命令可以在线地修改Sentinel对于被监视主服务器的配置选项,并把修改之后的配置选项保存到配置文件中,整个过程完全不需要停止Sentinel,也不需要手动修改配置文件
SENTINEL monitor:监视给定主服务器
SENTINEL monitor <master-name> <ip> <port> <quorum>
SENTINEL remove:取消对给定主服务器的监视
SENTINEL remove <masters-name>
SENTINEL set:修改Sentinel配置选项的值
SENTINEL set <master-name> <option> <value>
cluster
Redis集群会将整个数据库空间划分为16384个槽(slot)来实现数据分片(sharding),而集群中的各个主节点则会分别负责处理其中的一部分槽。当用户尝试将一个键存储到集群中时,客户端会先计算出键所属的槽,接着在记录集群节点槽分布的映射表中找出处理该槽的节点,最后再将键存储到相应的节点中
当用户想要向集群添加新节点时,只需要向Redis集群发送几条简单的命令,集群就会将相应的槽以及槽中存储的数据迁移至新节点。与此类似,当用户想要从集群中移除已存在的节点时,被移除的节点也会将自己负责处理的槽以及槽中数据转交给集群中的其他节点负责。最重要的是,无论是向集群添加新节点还是从集群中移除已有节点,整个重分片(reshard)过程都可以在线进行,Redis集群无须因此而停机。
集群配置
新增node1~node6节点文件夹,在各个节点文件夹下,新增一个redis.conf配置后,修改以下配置
cluster-enabled yes
port 30002
启动各个节点服务:redis-server 各个节点的路径/redis.conf
这些集群并未互联互通,所以它们都只在它们各自的集群之内,通过redis-cli --cluster连接节点并分配槽
例子:
redis-cli --cluster create 127.0.0.1:30001 127.0.0.1:30002 127.0.0.1:30003 127.0.0.1:30004 127.0.0.1:30005 127.0.0.1:30006 --cluster-replicas 1
create子命令接受任意多个节点的IP地址和端口号作为参数,然后使用这些节点组建起一个Redis集群。
可选参数cluster-replicas用于指定集群中每个主节点的从节点数量。
redis-cli 集群模式 参数-c
散列标签
,Redis为用户提供了散列标签(hash tag)功能,该功能会找出键中第一个被大括号{}包围并且非空的字符串子串(sub string),然后根据子串计算出该键所属的槽。
127.0.0.1:30002> CLUSTER KEYSLOT {user}::10086
(integer) 5474
127.0.0.1:30002> CLUSTER KEYSLOT {user}::10087
(integer) 5474
使用CLUSTER KEYSLOT命令查看给定键所属的槽
散列标签只会根据键名中第一个被大括号包围的非空子串来计算散列值,而键名中其他被包围子串或者被包围空串则会被忽略。
打开/关闭从节点的读命令执行权限
READONLY和READWRITE两个命令,它们可以临时打开或关闭客户端在从节点上执行读命令的权限。
集群管理工具redis-cli
查看集群信息
info <ip>:<port>
检查集群
check <ip>:<port>
通过cluster选项的check子命令,用户可以检查集群的配置是否正确,以及全部16384个槽是否已经全部指派给了主节点。
重分片
reshard <ip>:<port>
--cluster-from <id> # 源节点的ID
--cluster-to <id> # 目标节点的ID
--cluster-slots <num> # 需要迁移的槽数量
--cluster-yes # 直接确认
--cluster-timeout <time> # 迁移的最大时限
--cluster-pipeline <yes/no> # 是否使用流水线
通过cluster选项的reshard子命令,用户可以将指定数量的槽从原节点迁移至目标节点,被迁移的槽将交由后者负责,并且槽中已有的数据也会陆续从原节点转移至目标节点:
负载均衡 cluster选项的rebalance子命令允许用户在有需要时重新分配各个节点负责的槽数量,从而使得各个节点的负载压力趋于平衡:
rebalance <ip>:<port>
--cluster-weight <node_id1>=<weight1> <node_id2>=<weight2> ...
分配权重
在没有显式地指定权重的情况下,每个节点的默认权重为1.0。将一个节
点的权重设置为0将导致它被撤销所有槽指派,成为一个空节点。