redis - 主从复制与主从切换

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
seninel.conf

此配置文件为实际运行的,最后的一些配置是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

 

posted @ 2016-10-24 17:14  沙中世界  阅读(619)  评论(0编辑  收藏  举报