• linux下配置redis4.0.2主从复制以及高可用


    一、环境

    三台服务器分别为:

    172.28.18.75/172.28.18.103/172.28.18.104

    在三台服务器上分别部署一个redis节点以及一个sentinel节点

    二、主从复制配置

    1、172.28.18.75为主redis配置在25700端口

    vim /etc/redis/redis-25700.conf

    主要配置项如下:

    bind 172.28.18.75

    port 25700

    #从节点访问主节点的密码
    masterauth "password"

    #redis客户端访问redis的密码   
    requirepass "password"

    #保护模式开启
    protected-mode yes

    daemonize yes

    dir "/etc/redis"

    logfile "25700.log"

    2、172.28.18.103配置从redis在25701

    bind 172.28.18.103

    port 25701
    protected-mode yes

    daemonize yes

    #从节点访问主节点的密码
    masterauth "password"

    #redis客户端访问redis的密码 
    requirepass "password"

    dir "/etc/redis"

    logfile "25707.log"

    slaveof 172.28.18.75 25700

    3、172.28.18.104配置从redis在25701

    bind 172.28.18.104

    port 25701
    protected-mode yes

    daemonize yes

    #从节点访问主节点的密码
    masterauth "password"

    #redis客户端访问redis的密码 
    requirepass "password"

    dir "/etc/redis"

    logfile "25700.log"

    slaveof 172.28.18.75 25700 

    三、启动redis

    1、启动主节点redis

    redis-server redis-25700.conf 

    查看日志

    tail -f 25700.log

    启动成功

    2、启动从节点redis

     在172.28.18.103上

    redis-server redis-25701.conf

    查看日志

    tail -f 25701.log

     

    链接主节点172.28.18.75:25700

    同步开始

    从主节点全盘复制

    复制完成

    同时查看主节点redis日志

     

    从节点172.2818.103请求同步数据

    开始后台同步数据

    同步到从节点172.28.18.103成功

    按照上述方法启动172.28.18.104的从节点redis

     

     

    至此,主从节点启动完毕。

    三、验证结果

    在主节点172.28.18.75上,连接redis

    redis-cli -h 172.28.18.75 -p 25700 -a password

     

    插入一个key

    在从节点172.28.18.103和172.28.18.104上 ,分别连接redis,并查看这个key

      

    有数据,则同步成功。

    四、高可用redis sentinel配置

    1、分别在三台服务器上配置3个sentinel节点

    172.28.18.75 

    vim sentinel-26379.conf

    bind 172.28.18.75
    port 26379
    dir "/etc/redis"
    logfile "sentinel-26379.log"
    protected-mode yes
    daemonize yes

    #监控哪个主节点信息

    sentinel monitor mymaster 172.28.18.75 25700 2

    #5秒没有响应,则视为主观下线
    sentinel down-after-milliseconds mymaster 5000

    sentinel failover-timeout mymaster 80000

    #连接主节点的密码,(在主节点redis配置文件里设置)
    sentinel auth-pass mymaster password

    172.28.18.103

    vim sentinel-26379.conf

    bind 172.28.18.103
    port 26379
    dir "/etc/redis"
    logfile "sentinel-26379.log"
    protected-mode yes
    daemonize yes

    #监控主节点信息

    sentinel monitor mymaster 172.28.18.75 25700 2

    #5秒没有响应,则视为主观下线
    sentinel down-after-milliseconds mymaster 5000

    sentinel failover-timeout mymaster 80000

    #连接主节点的密码,(在主节点redis配置文件里设置)
    sentinel auth-pass mymaster password

     

    172.28.18.104

    vim sentinel-26379.conf

    bind 172.28.18.104
    port 26379
    dir "/etc/redis"
    logfile "sentinel-26379.log"
    protected-mode yes
    daemonize yes

    #监控主节点信息,因为是3个sentilnel节点,所以设置投票选举票数为2,一般sentinel节点设置为奇数个,选举票数为:(节点总数/2)+1

    sentinel monitor mymaster 172.28.18.75 25700 2

    #5秒没有响应,则视为主观下线
    sentinel down-after-milliseconds mymaster 5000

    sentinel failover-timeout mymaster 80000

    #连接主节点的密码,(在主节点redis配置文件里设置)
    sentinel auth-pass mymaster password

    2、启动3个sentinel节点

    172.28.18.75

    redis-sentinel sentinel-26379.conf

    查看日志

    tail -f sentinel-26379.log

     

     通过连接主节点redis,并执行info信息得到Relication段里的从节点信息,并添加到自己的sentinel配置文件中

    此时打开sentinel-26379.conf,里面多了从节点信息配置

     

    再同样启动172.28.18.103,172.28.18.104两个sentinel节点

    监控主节点172.28.18.75

    添加两个从节点redis信息到配置文件中

    感知172.28.18.75的sentinel节点信息,并添加到配置文件中

    此时的172.28.18.75上的sentinel节点也感知到了103节点的信息,并添加到配置文件中

     

    103和75的sentinel-26379.conf,里面多了感知的sentilnel节点信息配置

     

     

    再启动104的sentinel节点

    也增加了2个从redis节点信息以及2个sentinel节点信息,并添加到配置文件中

    此时,75和103的sentinel节点也感知到了104sentinel节点信息,并添加到配置文件中

     

     

     至此,三个sentilnel节点启动完毕。

    3、验证高可用

     在172.28.18.75上停掉主redis节点

     

    过5秒左右,查看3台服务器的sentinel日志如下:

    172.28.18.75

     

    1、172.28.18.75 25700 主观下线

    2、172.28.18.75 25700 经过投票成为客观下线

    3、此sentinel节点尝试成为领导者节点,发出投票

    4、其余两个节点同意投票给它,它成为了领导者节点。

    5、将104从redis节点选为新的主redis节点,并进行切换操作。

    6、将103从redis节点设置为104新的主redis节点。并重新同步数据。

     

    172.28.103和172.28.18.104日志:

    1、172.28.18.75 25700 主观下线

    2、172.28.18.75 25700 经过投票成为客观下线

    3、收到75发来的请求成为领导者节点投票请求,并同意投票给它,75成为了领导者节点。

    4、75完成切换操作后,重新同步配置数据

    此时104的redis晋升为主redis节点,连接redis验证

     

    103节点还是从redis节点,只不过主节点变为104节点,连接redis验证

     

    此时,再把75上被停掉的redis重新启动起来,将成为104的从redis节点

    104上的sentinel日志如下

    104上连接redis验证

     

    此时,75成了从redis节点

    至此,redis高可用成功设置完毕。

     4、JAVA连接sentinel实例

    新建一个maven项目,在pom里加入jedis依赖和logback依赖

        <dependency>
          <groupId>ch.qos.logback</groupId>
          <artifactId>logback-classic</artifactId>
          <version>1.1.1</version>
        </dependency>       
        <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>2.9.0</version>
          <type>jar</type>
          <scope>compile</scope>
        </dependency>    

     

    新建一个class如下

    public class RedisSentinelFailoverTest {
        
        private static Logger logger=LoggerFactory.getLogger(RedisSentinelFailoverTest.class);
        
        public static void main(String[] args) throws InterruptedException{
            String masterName="mymaster";
            Set<String> sentinels=new HashSet<String>();
            sentinels.add("172.28.18.75:26379");
            sentinels.add("172.28.18.103:26379");
            sentinels.add("172.28.18.104:26379");
            JedisSentinelPool  jedisSentinelPool=new JedisSentinelPool(masterName,sentinels,"password");
            while(true){
                Jedis jedis=null;
                try{
                    jedis=jedisSentinelPool.getResource();
                    int index=new Random().nextInt(100000);
                    String key="k-"+index;
                    String value="v-"+index;
                    jedis.set(key, value);
                    logger.info("{} values is {}",key,value,jedis.get(key));
                    TimeUnit.SECONDS.sleep(1);
                }
                catch(Exception e){
                    logger.error(e.getMessage(),e);
                    TimeUnit.SECONDS.sleep(1);
                }
                finally{
                    if(jedis!=null){
                        jedis.close();
                    }    
                }
            }
        }
    }

    运行测试

     

    从连接池里获取到主redis节点104

     

  • 相关阅读:
    Condition控制线程通信
    Lock同步锁
    通过Callable接口创建线程
    CountDownLatch闭锁
    CopyOnWriteArrayList笔记
    原子变量与CAS算法
    Java网络编程之UDP
    Java网络编程之Socket
    Java网络编程之URLConnection
    Java中处理异常中return关键字
  • 原文地址:https://www.cnblogs.com/sky-cheng/p/10620213.html
Copyright © 2020-2023  润新知