zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Python中的生成器与yield
    【爬虫系列】(一)最简单的爬虫
    【刷题笔记】--lintcode木头加工(java)
    使用TaskManager爬取2万条代理IP实现自动投票功能
    开源任务管理平台TaskManager介绍
    数据字典生成工具之旅系列文章导航
    使用工具安装,运行,停止,卸载Window服务
    Quartz Cron表达式 在线生成器
    Oracle .NET Core Beta驱动已出,自己动手写EF Core Oracle
    .net core2.0下Ioc容器Autofac使用
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/5993731.html
Copyright © 2011-2022 走看看