redis2.8之前本身是不支持分布式管理的,一般建议使用redis3.0及以后版本
redis主从切换的方法 keepalive 或者 使用sentinel线程管理
说明如何使用sentinel实现主从管理(在已经配置好主从并启动的前提下)
1、sentinel.conf 配置文件
1 # Example sentinel.conf 2 3 # port <sentinel-port> 4 # The port that this sentinel instance will run on 5 port 26379 6 protected-mode no 7 8 # sentinel announce-ip <ip> 9 # sentinel announce-port <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 <working-directory> 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 <master-name> <ip> <redis-port> <quorum> 38 # 39 # Tells Sentinel to monitor this master, and to consider it in O_DOWN 40 # (Objectively Down) state only if at least <quorum> 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 <master-name> <password> 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 <master-name> <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 according 102 # to a Sentinel current configuration, to be forced to replicate 103 # with the right master, is exactly the failover timeout (counting since 104 # the moment a Sentinel detected the misconfiguration). 105 # 106 # - The time needed to cancel a failover that is already in progress but 107 # did not produced any configuration change (SLAVEOF NO ONE yet not 108 # acknowledged by the promoted slave). 109 # 110 # - The maximum time a failover in progress waits for all the slaves to be 111 # reconfigured as slaves of the new master. However even after this time 112 # the slaves will be reconfigured by the Sentinels anyway, but not with 113 # the exact parallel-syncs progression as specified. 114 # 115 # Default is 3 minutes. 116 sentinel config-epoch mymaster 1 117 #sentinel known-slave mymaster 192.168.91.233 6379 118 119 # SCRIPTS EXECUTION 120 # 121 # sentinel notification-script and sentinel reconfig-script are used in order 122 # to configure scripts that are called to notify the system administrator 123 # or to reconfigure clients after a failover. The scripts are executed 124 # with the following rules for error handling: 125 # 126 # If script exits with "1" the execution is retried later (up to a maximum 127 # number of times currently set to 10). 128 # 129 # If script exits with "2" (or an higher value) the script execution is 130 # not retried. 131 # 132 # If script terminates because it receives a signal the behavior is the same 133 # as exit code 1. 134 # 135 # A script has a maximum running time of 60 seconds. After this limit is 136 # reached the script is terminated with a SIGKILL and the execution retried. 137 138 # NOTIFICATION SCRIPT 139 # 140 # sentinel notification-script <master-name> <script-path> 141 # 142 # Call the specified notification script for any sentinel event that is 143 # generated in the WARNING level (for instance -sdown, -odown, and so forth). 144 # This script should notify the system administrator via email, SMS, or any 145 # other messaging system, that there is something wrong with the monitored 146 # Redis systems. 147 # 148 # The script is called with just two arguments: the first is the event type 149 # and the second the event description. 150 # 151 # The script must exist and be executable in order for sentinel to start if 152 # this option is provided. 153 # 154 # Example: 155 # 156 # sentinel notification-script mymaster /var/redis/notify.sh 157 158 # CLIENTS RECONFIGURATION SCRIPT 159 # 160 # sentinel client-reconfig-script <master-name> <script-path> 161 # 162 # When the master changed because of a failover a script can be called in 163 # order to perform application-specific tasks to notify the clients that the 164 # configuration has changed and the master is at a different address. 165 # 166 # The following arguments are passed to the script: 167 # 168 # <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port> 169 # 170 # <state> is currently always "failover" 171 # <role> is either "leader" or "observer" 172 # 173 # The arguments from-ip, from-port, to-ip, to-port are used to communicate 174 # the old address of the master and the new address of the elected slave 175 # (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.sh 182 183 # Generated by CONFIG REWRITE 184 #sentinel current-epoch 21 185 186 sentinel leader-epoch mymaster 1 187 sentinel known-slave mymaster 192.168.91.234 6379 188 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地址集合 Set<String>set=new HashSet<String>(); 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 26379 protected-mode no dir /tmp sentinel monitor mymaster 192.168.37.101 6379 1 sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000