redis2.8之前本身是不支持分布式管理的,一般建议使用redis3.0及以后版本
redis主从切换的方法 keepalive 或者 使用sentinel线程管理
说明如何使用sentinel实现主从管理(在已经配置好主从并启动的前提下)
1、sentinel.conf 配置文件
1 # Example sentinel.conf 2 3 # port4 # The port that this sentinel instance will run on 5 port 26379 6 protected-mode no 7 8 # sentinel announce-ip 9 # sentinel announce-port 10 # 11 # The above two configuration directives are useful in environments where, 12 # because of NAT, Sentinel is reachable from outside via a non-local address. 13 # 14 # When announce-ip is provided, the Sentinel will claim the specified IP address 15 # in HELLO messages used to gossip its presence, instead of auto-detecting the 16 # local address as it usually does. 17 # 18 # Similarly when announce-port is provided and is valid and non-zero, Sentinel 19 # will announce the specified TCP port. 20 # 21 # The two options don't need to be used together, if only announce-ip is 22 # provided, the Sentinel will announce the specified IP and the server port 23 # as specified by the "port" option. If only announce-port is provided, the 24 # Sentinel will announce the auto-detected local IP and the specified port. 25 # 26 # Example: 27 # 28 # sentinel announce-ip 1.2.3.4 29 30 # dir 31 # Every long running process should have a well-defined working directory. 32 # For Redis Sentinel to chdir to /tmp at startup is the simplest thing 33 # for the process to don't interfere with administrative tasks such as 34 # unmounting filesystems. 35 dir "/tmp" 36 37 # sentinel monitor 38 # 39 # Tells Sentinel to monitor this master, and to consider it in O_DOWN 40 # (Objectively Down) state only if at least sentinels agree. 41 # 42 # Note that whatever is the ODOWN quorum, a Sentinel will require to 43 # be elected by the majority of the known Sentinels in order to 44 # start a failover, so no failover can be performed in minority. 45 # 46 # Slaves are auto-discovered, so you don't need to specify slaves in 47 # any way. Sentinel itself will rewrite this configuration file adding 48 # the slaves using additional configuration options. 49 # Also note that the configuration file is rewritten when a 50 # slave is promoted to master. 51 # 52 # Note: master name should not include special characters or spaces. 53 # The valid charset is A-z 0-9 and the three characters ".-_". 54 sentinel myid 920ad7dac87a4c853bbdf6417578e53ce261bdec 55 56 # sentinel auth-pass 57 # 58 # Set the password to use to authenticate with the master and slaves. 59 # Useful if there is a password set in the Redis instances to monitor. 60 # 61 # Note that the master password is also used for slaves, so it is not 62 # possible to set a different password in masters and slaves instances 63 # if you want to be able to monitor these instances with Sentinel. 64 # 65 # However you can have Redis instances without the authentication enabled 66 # mixed with Redis instances requiring the authentication (as long as the 67 # password set is the same for all the instances requiring the password) as 68 # the AUTH command will have no effect in Redis instances with authentication 69 # switched off. 70 # 71 # Example: 72 # 73 sentinel monitor mymaster 192.168.91.233 6379 1 74 75 # sentinel down-after-milliseconds 76 # 77 # Number of milliseconds the master (or any attached slave or sentinel) should 78 # be unreachable (as in, not acceptable reply to PING, continuously, for the 79 # specified period) in order to consider it in S_DOWN state (Subjectively 80 # Down). 81 # 82 # Default is 30 seconds. 83 sentinel failover-timeout mymaster 30000 84 85 sentinel auth-pass mymaster 123456 86 # 87 # How many slaves we can reconfigure to point to the new slave simultaneously 88 # during the failover. Use a low number if you use the slaves to serve query 89 # to avoid that all the slaves will be unreachable at about the same 90 # time while performing the synchronization with the master. 91 #sentinel config-epoch mymaster 0 92 93 #sentinel leader-epoch mymaster 21 94 # 95 # Specifies the failover timeout in milliseconds. It is used in many ways: 96 # 97 # - The time needed to re-start a failover after a previous failover was 98 # already tried against the same master by a given Sentinel, is two 99 # times the failover timeout.100 #101 # - The time needed for a slave replicating to a wrong master according102 # to a Sentinel current configuration, to be forced to replicate103 # with the right master, is exactly the failover timeout (counting since104 # the moment a Sentinel detected the misconfiguration).105 #106 # - The time needed to cancel a failover that is already in progress but107 # did not produced any configuration change (SLAVEOF NO ONE yet not108 # acknowledged by the promoted slave).109 #110 # - The maximum time a failover in progress waits for all the slaves to be111 # reconfigured as slaves of the new master. However even after this time112 # the slaves will be reconfigured by the Sentinels anyway, but not with113 # the exact parallel-syncs progression as specified.114 #115 # Default is 3 minutes.116 sentinel config-epoch mymaster 1117 #sentinel known-slave mymaster 192.168.91.233 6379118 119 # SCRIPTS EXECUTION120 #121 # sentinel notification-script and sentinel reconfig-script are used in order122 # to configure scripts that are called to notify the system administrator123 # or to reconfigure clients after a failover. The scripts are executed124 # with the following rules for error handling:125 #126 # If script exits with "1" the execution is retried later (up to a maximum127 # number of times currently set to 10).128 #129 # If script exits with "2" (or an higher value) the script execution is130 # not retried.131 #132 # If script terminates because it receives a signal the behavior is the same133 # as exit code 1.134 #135 # A script has a maximum running time of 60 seconds. After this limit is136 # reached the script is terminated with a SIGKILL and the execution retried.137 138 # NOTIFICATION SCRIPT139 #140 # sentinel notification-script 141 #142 # Call the specified notification script for any sentinel event that is143 # generated in the WARNING level (for instance -sdown, -odown, and so forth).144 # This script should notify the system administrator via email, SMS, or any145 # other messaging system, that there is something wrong with the monitored146 # Redis systems.147 #148 # The script is called with just two arguments: the first is the event type149 # and the second the event description.150 #151 # The script must exist and be executable in order for sentinel to start if152 # this option is provided.153 #154 # Example:155 #156 # sentinel notification-script mymaster /var/redis/notify.sh157 158 # CLIENTS RECONFIGURATION SCRIPT159 #160 # sentinel client-reconfig-script 161 #162 # When the master changed because of a failover a script can be called in163 # order to perform application-specific tasks to notify the clients that the164 # configuration has changed and the master is at a different address.165 #166 # The following arguments are passed to the script:167 #168 # 169 #170 # is currently always "failover"171 # is either "leader" or "observer"172 #173 # The arguments from-ip, from-port, to-ip, to-port are used to communicate174 # the old address of the master and the new address of the elected slave175 # (now a master).176 #177 # This script should be resistant to multiple invocations.178 #179 # Example:180 #181 # sentinel client-reconfig-script mymaster /var/redis/reconfig.sh182 183 # Generated by CONFIG REWRITE184 #sentinel current-epoch 21185 186 sentinel leader-epoch mymaster 1187 sentinel known-slave mymaster 192.168.91.234 6379188 sentinel current-epoch 1
此配置文件为实际运行的,最后的一些配置是sentinel自动写进去的,而不是配置的。
值得注意的是,需要配置protected mode为no
sentinel monitor mymaster 这个参数不要用默认的127.0.0.1 使用真实的IP地址
部分参数,在样例中是有的,但在这个配置文件中注释掉的
2、接下来启动sentinel
./src/redis-sentinel sentinel.conf &
3、登录sentinel
./src/redis-cli -h 192.168.91.234 -p 26379
查看主从信息:info
关键是最后一句:master0:name=mymaster,status=ok,address=192.168.91.234:6379,slaves=1,sentinels=1
status 是ok就是可用的;
sdown 是主观不可用,这种情况下;当足够多的sentinel检测到master为sdown后,就会将master 置为odown
odown 是客观不可用。
4、客户端开发,使用jedis的JedisSentinelPool连接池
需要引入:commons-pool2-2.4.2.jar 和 jedis-2.8.1.jar包
代码如下:
import java.util.HashSet;import java.util.Set;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import org.junit.Test;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisSentinelPool;public class JedisSentinel { @Test public final void test() { String masterName="mymaster"; //sentinel地址集合 Setset=new HashSet (); set.add("192.168.91.234:26379"); GenericObjectPoolConfig gPoolConfig=new GenericObjectPoolConfig(); gPoolConfig.setMaxIdle(10); gPoolConfig.setMaxTotal(10); gPoolConfig.setMaxWaitMillis(10); gPoolConfig.setJmxEnabled(true); JedisSentinelPool jSentinelPool=new JedisSentinelPool(masterName,set,gPoolConfig); //------------------------------------------ Jedis jedis=null; jedis=jSentinelPool.getResource(); jedis.auth("123456"); //jedis.set("key1", "value2"); String key1 = jedis.get("key1"); System.out.println(key1); jedis.close(); }}
此时,当一个主redis挂掉之后,sentinel线程会改变从redis的配置文件,并使其成为主redis。当主redis启动后,会变为从redis.
sentinel可以配置多个,配置文件没有区别,客户端连接略有区别!
这样就实现了redis的主从复制、主从切换!
最简配置如下:
port 26379protected-mode nodir /tmpsentinel monitor mymaster 192.168.37.101 6379 1sentinel down-after-milliseconds mymaster 3000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000