介绍RedisSentinel是一个分布式系统,可以在一个架构中运行多个Sentinel进程(progress),这些进程使用八卦协议(gossipprotocols)来接收有关信息master服务器是否离线,通过投票协议(agreementprotocols)来决定是否进行自动failover以及选举哪个slave服务器作为新的master服务器。虽然RedisSentinel是作为一个单独的可执行文件redis-sentinel发布的,但它实际上只是一个运行在特殊模式下的Redis服务器。您可以在启动普通Redis服务器Sentinel时通过提供--sentinel选项来启动Redis。Sentinel系统用于管理多个Redis服务器(实例)。系统执行以下三个任务:监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否正常工作。通知:当被监控的Redis服务器出现问题时,Sentinel可以通过API向管理员或其他应用发送通知。自动故障转移(Automaticfailover):当一个主服务器无法正常工作时,Sentinel会启动一个自动故障转移操作,将故障主服务器的其中一台从服务器升级为新的主服务器,并让故障主服务器其他从属服务器复制新的主服务器;当客户端尝试连接到故障的主服务器时,集群也会将新的主服务器的地址返回给客户端,这样集群就可以使用新的主服务器来替换故障的服务器。redisversion:3.0.7master:6379,sentinel:26379slave:6380,sentinel:26380配置本章主要介绍如何搭建一个自动故障转移的reids集群。之后,它自动成为奴隶。其实和Mysql的双主模式是一样的。redis集群需要使用redis-sentinel程序和sentinel.conf配置文件。主配置vimredis.confdaemonizeyespidfile/usr/local/redis-6379/run/redis.pidport6379tcp-backlog128timeout0tcp-keepalive0loglevelnoticelogfile""databases16save9001save30010save6010000stop-writes-on-bgsave-erroryesrdbcompressionyesrdbchecksumyesdbfilenamedump.rdbdir"/usr/local/redis-6379"masterauth"123456“requirepass”123456“slave-serve-stale-datayesslave-read-onlyyesrepl-diskless-syncnorepl-diskless-sync-delay5repl-disable-tcp-nodelaynoslave-priority100appendonlynoappendfilename”appendonly.aof“appendfsynceverysecno-appendfsync-on-rewritenoauto-aof-rewrite-percentage100auto-aof-rewrite-min-size64mbaof-load-truncatedyeslua-time-limit5000slowlog-log-slower-than10000slowlog-max-len128latency-monitor-threshold0notify-keyspace-events""hash-max-ziplist-entries512hash-max-ziplist-value64list-max-ziplist-entries512list-max-ziplist-value64set-max-intset-entries512zset-max-ziplist-entries128zset-max-ziplist-value64hll-sparse-max-bytes3000activerehashingyesclient-output-buffer-limitnormal000client-output-buffer-limitslave256mb64mb60client-output-buffer-limitpubsub32mb8mb60hz10aof-rewrite-incremental-fsyncyesvimsentinel.conf群文件配置3localir"9/redis-3/dlocalir"9#Daemonizeyes#表示日志文件名logfile"./sentinel.log"sentinelmonitormymaster192.168.137.4063791sentineldown-after-millisecondsmymaster5000sentinelfailover-timeoutmymaster18000sentinelauth-passmymaster123456来自配置vimredis.confdaemonizesyers/redis/redis/6redis/redis/redis".pid"port6380tcp-backlog128timeout0tcp-keepalive0loglevelnoticelogfile""databases16save9001save30010save6010000stop-writes-on-bgsave-erroryesrdbcompressionyesrdbchecksumyesdbfilename"dump.rdb"dir"/usr/local/redis-6380"masterauth"123456"requirepass"123456"slave-serve-stale-datayesslave-read-onlyyesrepl-diskless-syncnorepl-diskless-sync-delay5repl-disable-tcp-nodelaynoslave-priority100appendonlynoappendfilename"appendonly.aof"appendfsynceverysecno-appendfsync-on-rewritenauto-aof-rewrite-percentage100auto-aof-rewrite-min-size64mbaof-load-truncatedyeslua-time-limit5000slowerlog-log-logmax-len128latency-monitor-threshold0notify-keyspace-events""hash-max-ziplist-entries512hash-max-ziplist-value64list-max-ziplist-entries512list-max-ziplist-value64set-max-intset-entries512zset-max-ziplist-entries128zset-max-ziplist-value64hll-sparse-max-bytes3000activerehashingyesclient-output-buffer-limitnormal000client-output-buffer-limitslave256mb64mb60client-output-buffer-limitpubsub32mb8mb60hz10aof-rewrite-incremental-fsyncyesvimsentinel.conf#sentinel端口port26380#工作路径,注意路径不要Repeatdirwiththemaster"/usr/local/redis-6380"#守护进程模式daemonizeyes#表示日志文件名logfile"./sentinel.log"#sentinel监控的master,主从配置相同,sentinelmonitormymaster192.168.137.4063791#master或者怎么样long从站(默认30秒)被标记为不可用s_downstatesentineldown-after-millisecondsmymaster5000#如果sentinel未能在配置值内完成failover操作(即发生故障时master/slave自动切换),则认为本次failover失败。sentinelfailover-timeoutmymaster18000#设置主从认证密码sentinelauth-passmymaster123456启动redis主从必须启动src/redis-serverredis.conf启动集群监控主从必须启动src/redis-sentinelsentinel.conf--sentinel启动报错处理错误1:警告overcommit_memory设置为0!在内存不足的情况下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory=1”添加到/etc/sysctl.conf,然后重新启动或运行命令“sysctlvm.overcommit_memory=1”以使其生效。两种解决方法(overcommit_memory)1.echo"vm.overcommit_memory=1">/etc/sysctl.conforvi/etcsysctl.conf,然后reboot重启机器2.echo1>/proc/sys/vm/overcommit_memory没有生效启动机器。overcommit_memory参数说明:设置内存分配策略(可选,根据服务器实际情况设置)/proc/sys/vm/overcommit_memory可选值:0,1,2.0,表示内核会检查是否有足够的可用应用程序进程使用的内存;如果有足够的可用内存,则允许内存申请;否则,内存申请失败,并向申请进程返回错误。1,表示内核允许分配所有的物理内存,不管当前内存状态如何。2.表示内核允许分配超过所有物理内存和交换空间之和的内存。注意:redis在dump数据的时候,会fork一个子进程。理论上子进程占用的内存和父进程是一样的,比如父进程占用的内存是8G。这时候也应该给孩子分配8G的内存。如果内存承受不起,往往会导致redis服务器宕机或者IO负载过高,效率下降。所以这里更优化的内存分配策略应该设置为1(表示内核允许分配所有的物理内存,不管当前内存状态如何)。这里涉及到Overcommit和OOM。什么是Overcommit和OOM在Unix中,当用户进程使用malloc()函数申请内存时,如果返回值为NULL,进程就知道当前没有可用的内存空间,会做相应的处理。许多进程将打印错误消息并退出。Linux使用了另一种处理方式,它对大多数内存请求都回复“是”,这样就可以运行更多更大的程序。因为申请内存之后,内存并不会马上被使用。这种技术称为过度使用。OOMkiller(OOM=out-of-memory)当内存不足时发生。它会选择杀死一些进程(用户态进程,而不是内核线程)以释放内存。OvercommitstrategyLinux下overcommit的策略有3种(Documentation/vm/overcommit-accounting):0.Heuristicstrategy。合理的overcommits会被接受,不合理的overcommits会被拒绝。1.任何过量使用都将被接受。2、当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,commit将被拒绝。过量使用策略由vm.overcommit_memory设置。overcommit的百分比由vm.overcommit_ratio设置。#echo2>/proc/sys/vm/overcommit_memory#echo80>/proc/sys/vm/overcommit_ratio当oom-killer发生时,linux会选择杀死哪些进程,选择进程的函数是oom_badness函数(在mm/oom_kill.c中),这个函数会计算每个进程的点数(0~1000)。数字越大,进程被杀死的可能性就越大。每个进程的分值与oom_score_adj相关,可以设置oom_score_adj(-1000***,1000***)。错误2:警告:无法强制执行511的TCP积压设置,因为/proc/sys/net/core/somaxconn设置为128的较低值。echo511>/proc/sys/net/core/somaxconn错误3:16433:X12Jun14:52:37.734*将最大打开文件数增加到10032(最初设置为1024)。新装的linux默认只有1024。负载较重时报错:toomanyopenfilesulimit-a:使用可以查看当前系统的所有限制值。在vim/etc/security/limits.conf中的文件末尾添加*softnofile65535*hardnofile65535。再次执行su或关闭连接。然后用户可以执行ulimit-a查看修改后的结果。Failovermechanism1.Afterstartingthecluster,theclusterprogramwilladdtheconfigurationofconnectingtothemasterintheredisfileoftheslavelibrarybydefault.群集信息主:port26379dir"/usr/local/redis-6379"#守护进程模式daemonizeyes#指明日志文件名logfile"./sentinel.log"sentinelmonitormymaster192.168.137.4063791sentineldown-after-millisecondsmymaster5000sentinelfailover-timeoutmymaster18000sentinelauth-passmymaster123456#GeneratedbyCONFIGREWRITEsentinelconfig-epochmymaster0sentinelleader-epochmymaster1sentinelknown-slavemymaster192.168.137.406380sentinelknown-sentinelmymaster192.168.137.4026380c77c5f64aaad0137a228875e531c7127ceeb5c3fsentinelcurrent-epoch1从:#sentinel端口port26380#工作路径dir"/usr/local/redis-6380"#守护进程模式daemonizeyes#指明日志文件名logfile"./sentinel.log"#ThemastermonitoredbySentinel,themaster-slaveconfigurationisthesame,6379willbecomethecurrentmasterportduringmaster-slaveswitching,sentinelmonitormymaster192.168.137.4063791#howlongthemasterorslavecannotbeused(default30seconds)Markedass_downstate.sentineldown-after-millisecondsmymaster5000#如果sentinel未能在此配置值内完成故障转移操作(即发生故障时主从自动切换),则认为本次故障转移失败。sentinelfailover-timeoutmymaster18000#设置主从验证密码sentinelauth-passmymaster123456#sentinel程序自动添加的部分#由CONFIGREWRITE生成sentinelconfig-epochmymaster0sentinelleader-epochmymaster1###表示当前集群从库的ip和端口,值会变化whenthemaster-slaveswitchsentinelknown-slavemymaster192.168.137.406380###除了当前的哨兵还有哪些监控的哨兵sentinelknown-sentinelmymaster192.168.137.40263797a88891a6147e202a53601ca16a3d438e9d55c9dsentinelcurrent-epoch1模拟主故障[root@monitorredis-6380]#ps-ef|grepredisroot41711014:20?00:00:15/usr/local/redis-6379/src/redis-server*:6379root41751014:20?00:00:15/usr/local/redis-6380/src/redis-server*:6380root43051015:28?00:00:05/usr/local/redis-6379/src/redis-sentinel*:26379[sentinel]root43061015:28?00:00:05/usr/local/redis-6380/src/redis-sentinel*:26380[sentinel]root43374144015:56pts/100:00:00grepredis[root@monitorredis-6380]#kill-94171[root@monitorredis-6380]#ps-ef|grepredisroot41751014:20?00:00:15/usr/local/redis-6380/src/redis-server*:6380root43051015:28?00:00:05/usr/local/redis-6379/src/redis-sentinel*:26379[sentinel]root43061015:28?00:00:05/usr/local/redis-6380/src/redis-sentinel*:26380[sentinel]root43394144015:56pts/100:00:00grepredis[root@monitorredis-6380]#从sentinel配置文件可以看到当前master库发生了变化。从日志文件中也可以看到当前master已经从6379转换为6380。总结redissentinel端口26379、26380客户端软件无法连接,但是可以使用程序连接。客户端软件只能直接连接6379和6380端口。使用sentinel监控,当master出现故障时,会自动切换到slavemaster,当master启动后,就会成为slave。
