Redis集群
Redis主从复制的简单介绍
为了使得集群在一部分节点下线或者无法与集群的大多数节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。
Redis从3.0开始支持redis-cluster集群,redis选择的版本为3.0.504,集群采用一主一从三哨兵的架构模式,分别部署在两台服务器上,每台服务器部署有三个redis实例。
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时,强烈建议使用六个节点,其中三个为主节点,另外三个则为主节点的从节点。
主节点崩溃,从节点的redis就会提升为主节点,代替原来的主节点工作,崩溃的主节点恢复后,会成功从节点
ruby
部署集群之前我们需要安装ruby
ruby官网下载
安装:双击exe,点击Next,记得需要勾选画红线部分
把redis-4.0.2.gem拷贝到ruby安装目录下
打开win+R,执行以下命令,如图
>gem install --local c:\Ruby22-x64\redis-4.0.2.gem
接着我们看下如何安装redis实例
Redis集群至少需要3个主节点,我们先在redis目录下建立6个文件夹,分别是7001、7002、7003、7004、7005、7006、
10.100.1.299 7001,每个文件夹新建redis.conf文件,文件内容如下:
port 7001 #端口
loglevel notice #日志级别
logfile "Logs/redis7001_log.txt" #日志路径
appendonly yes #数据持久化
appendfilename "appendonly.7001.aof" #数据持久化保存
cluster-enabled yes #开启集群
cluster-config-file nodes.7001.conf #保存节点配置文件(自动生成)
cluster-node-timeout 15000 #集群相互通讯时允许”失联”的最大毫秒数
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
然后安装redis服务,进入命令行,按下图执行
D:/Redis> redis-server.exe --service-install 7001/redis.conf --service-name redis7001
Redis服务安装成功但无法启动,报进程意外终止?
右键看下配置文件有没有配错
创建Redis集群
进入命令行,按下图执行
redis-trib.rb create --replicas 1 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 127.0.0.1:7006
注:replicas 1 表示每个主节点拥有1个从节点。master节点不能少于3个,所以我们用了6个redis
当出现提示时,需要手动输入yes,输入后,当出现以下内容,说明已经创建了Redis集群
使用del-node命令移除节点。
redis-trib del-node 127.0.0.1:7001 <node-id>
第一个参数:任意集群中现有的地址127.0.0.1:7001
第二个参数:你想移除的节点id ab853f5e95f1e32e0ee40543a9687d60fc3bd941 (该id可以在想要移除的节点nodes.conf文件中找到)
redis-trib del-node 10.100.1.132:6384 ‘bb43455902bd4a92cf47863ab2453e8525c8a31d’
配置哨兵集群
1、哨兵的作用:
1】监控(Monitoring):sentinel会不断地检查你的mster和slave是否正常运行。
2】提醒(Notification):当被监控的节点出问题时,sentinel可以通过API向管理员或其它应用程序发通知。
3】自动故障迁移:Redis集群主节点宕机并不会主动切换到另一节点,此时需要加上哨兵模式,去监视主节点的情况。
2、Sentinel(哨兵)进程的工作方式:
1】每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及其他Sentinel(哨兵)进程发送一个 PING 命令。
2】如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)。
3】如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态。
4】当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线(ODOWN)。
5】在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主服务器、Slave从服务器发送 INFO 命令。
6】当Master主服务器被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主服务器的所有 Slave从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
7】若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主服务器的主观下线状态就会被移除。
- 哨兵模式的配置
新建一个.conf文件,把以下配置复制到文件中
port 26479
#slave1
sentinel monitor master1 127.0.0.1 6379 1
sentinel down-after-milliseconds master1 3000
sentinel config-epoch master1 1
sentinel leader-epoch master1 1
Sentinel配置文件解析:
#端口号
port 26479
#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,
#而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor master 127.0.0.1 6381 1
#指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。
#只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel down-after-milliseconds master 5000
#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel config-epoch master 12
#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel leader-epoch master 13
打开win+R命令行,输入cmd,进到redis目录,
输入:D:/Redis> redis-server.exe sentinel/sentinel1.conf --sentinel
redis-server.exe 7002-mster/sentinel.conf --sentinel
redis-server.exe 7003-mster/sentinel.conf --sentinel
redis-server.exe --service-install sentinel/sentinel3.conf --service-name sentinel26679
redis-server.exe --service-install sentinel/sentinel3.conf --sentinel --service-name sentinel26679 --port 26679
redis-server.exe --service-install 7001/redis.conf --service-name redis7001
注:
主备切换的过程中,可能会导致数据丢失,还是有一定风险
异步复制导致的数据丢失
因为mster-slave的复制是异步的,所以可能有部分数据还没复制到mster,mster就宕机了,此时那部分数据会丢失
解决redis哨兵模式主备切换数据丢失
- 由于mster-slave的复制是异步的,有可能mster还没有来得及给slave node就宕机了,而slave node就成mster node了,还没来得及复制的数据不就丢失了吗
Redis哨兵模式主从切换时候需要间隙性几秒钟,这时候数据向mster写入就会导致数据丢失
关闭和重启集群
关闭集群:将所有redis服务一个一个关闭即可。
重启集群:将所有redis服务一个一个启动即可。
最后我们应该如何测试服务器集群
首先需要登录redis客户端:
打开win+R命令行,输入cmd,进到redis目录,
输入:redis-cli.exe -h 127.0.0.1 -c -p 7001
redis-cli.exe -h 127.0.0.1 -p 7001 flushdb
- 查看redis服务器状态
查看所有节点状态:cluster nodes
总结:
Redis主从复制(一主两从或一主多从)的分析
1、IO剧增
每次slave断开以后(无论是主动断开,还是网路故障)再连接master都要将master全部dump出来rdb,在aof,即同步的过程都要重新执行一遍;所以要记住多台slave不要一下都启动起来,否则master可能IO剧增(间隔1-2分)
- 复制延迟
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
- 可用性不高
当有主节点发生异常情况,就会导致不能写入,导致业务出错!【解决方法是可以使用Redis-Sentinel模式】
注意:redis集群不保证数据的强一致性,在特定条件下,redis集群可能会丢失已经被执行过的写命令
配置过程中出现的错误
Redis配置集群,启动服务时报错“slaveof directive not allowed in cluster mode”?
cluster-enabled no
daemonize yes
卸载redis实例:
打开win+R命令行,输入cmd,进到redis目录,
输入:sc delete redis6380
redis集群 Waiting for the cluster to join 一直等待
配置文件中bind需要绑定可供其它机器访问的IP,不能是127.0.0.1
redis集群创建执行 ./redis-trib.rb create --replicas 1 XXXX:PORT1 XXXX:PORT2 .... 的时候 一直等待 Waiting for the cluster to join 很久都没有反应 原因: redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口 集群总线端口为redis客户端连接的端口 + 10000 如redis端口为6379 则集群总线端口为16379 故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口 注意:iptables 放开,如果有安全组,也要放开这两个端口 --------------------- 本文来自 海拉姆 的优快云 博客 ,全文地址请点击:https://blog.youkuaiyun.com/truong/article/details/52531103?utm_source=copy
错误:ERR Slot 0 is already busy (Redis::CommandError)
持
redis-server.exe --service-install sentinel/sentinel1.conf --service-name sentinel26479
D:/Redis> redis-server.exe --service-install 7001/redis.conf --service-name redis7001
Redis服务安装成功但无法启动,报进程意外终止?
右键看下配置文件有没有配错
修复csredis获取redis sentinel的问题
http://blog.bossma.cn/csharp/fix-csredis-get-redis-sentinel-problem/
https://www.cnblogs.com/zhshlimi/p/9001015.html
Windows服务已标记为删除
一般这种问题是由于在命令行中删除时,服务管理窗口处于打开的状态,或者被删除的服务正处于开启状态。
解决方法:删注册表..
按住Win+R,输入regedit,在以下路径找到服务名称,删除就OK啦!
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
如果还不行的话,服务管理窗口关闭再打开
echo install redis-server
..\redis-server.exe --service-install 7005\redis.conf --service-name redis7005
sc start redis7005