• Linux Redis 主从复制,Redis slaveof replicaof主从复制,redis-sentinel哨兵


    Linux Redis 主从复制,Redis slaveof replicaof主从复制,redis-sentinel哨兵

    ================================

    ©Copyright 蕃薯耀 2020-12-18

    https://www.cnblogs.com/fanshuyao/

    基于redis-5.0.10.tar.gz

    一、Redis主从复制配置,从机配置

    进行redis配置文件的目录,在redis.conf加入下面的配置(replicaof <masterip> <masterport>)

    vim redis.conf
    replicaof 192.168.170.11 6379

    从机只读模式默认是开启的:

    replica-read-only yes


    或者(不打开配置文件,直接加到文件中):

    echo "replicaof 192.168.170.11 6379" >> redis.conf

    说明一下,replicaof是新版本的命令,旧版本是slaveof命令

    (旧版本)使用slaveof命令:

    slaveof 192.168.170.11 6379
    slave-read-only yes

    或者直接追加到配置文件

    echo "slaveof 192.168.170.11 6379" >> redis.conf
    echo "slave-read-only yes" >> redis.conf

    二、查看redis主从配置

    主机查看主从信息(先运行redis-cli)

    127.0.0.1:6379> info replication

    或者直接(不需要运行redis-cli):

    /java/redis5/bin/redis-cli info replication

    显示的内容是:

    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.170.129,port=6379,state=online,offset=1207,lag=0
    slave1:ip=192.168.170.130,port=6379,state=online,offset=1207,lag=0
    master_replid:498a75a7d0eeacef2b29664a4f1c848be4882460
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:1207
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:1207

    role:master,表示是主机

    从机查看主从信息(开启了redis-cli):

    info replication

    或者(不需要运行redis-cli)

    /java/redis5/bin/redis-cli info replication

    显示的内容:

    127.0.0.1:6379> info replication
    # Replication
    role:slave
    master_host:192.168.170.11
    master_port:6379
    master_link_status:up

    role:slave,表示从机

    测试从机有没有复制主机的值,建立主从关系后,从机自动会从主机复制所有数据:

    /java/redis5/bin/redis-cli get b

    显示内容

    [root@host_132 ~]# /java/redis5/bin/redis-cli get b
    "456"

    测试在从机增加数据:

    从机是只读模式,是不能设置值的:

    127.0.0.1:6379> set c 12345
    (error) READONLY You can't write against a read only replica.

    三、Redis sentinel哨兵模式

    Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis 的高可用性解决方案。

    sentinel哨兵模式已经被集成在redis2.4之后的版本中。

    sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;

    当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。

    sentinel可以让redis实现主从复制,当一个集群中的master失效之后,sentinel可以选举出一个新的master用于自动接替master的工作,集群中的其他redis服务器自动指向新的master同步数据。

    一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。其结构如下:

    1、复制sentinel的配置文件sentinel.conf 到指定的目录

    cp /java/redis5/sentinel.conf /java/redis5/bin/

    2、去掉配置文件的注释和空行,生成新的配置文件

    cd /java/redis5/bin/
    cat sentinel.conf | grep -v "#" | grep -v "^$" > sentinel-26379.conf

    3、修改配置文件sentinel-26379.conf

    vim sentinel-26379.conf

    修改内容:(这个文件夹要先建:/java/redis5/data/)

    port 26379
    daemonize yes
    pidfile /java/redis5/data/redis-sentinel-26379.pid
    logfile "redis-sentinel-26379.log"
    dir /java/redis5/data/

    4、修改ip地址,将127.0.0.1修改成192.168.170.11,端口如果是默认的,不需要修改,后面那个2表示2个redis-sentinel检查到master出问题后进入换master的方案。

    sentinel monitor mymaster 192.168.170.11 6379 2

    5、启动sentinel

    /java/redis5/bin/redis-sentinel /java/redis5/bin/sentinel-26379.conf

    6、查看进程:

    ps -ef | grep redis-sentinel
    [root@host_132 bin]# ps -ef | grep redis-sentinel
    root       4303      1  0 09:32 ?        00:00:00 /java/redis5/bin/redis-sentinel *:26379 [sentinel]
    root       4311   1396  0 09:32 pts/0    00:00:00 grep --color=auto redis-sentinel

    四、设置redis-sentinel开机启动
    1、创建服务文件(此方式为centos7的方式),文件原来是没有的。

    vi /etc/systemd/system/redis-sentinel.service

    开机启动文件内容:

    [Unit]
    #Description:描述服务
    Description=RedisSentinel
    #After:描述服务类别 
    After=network.target
    
    #服务运行参数的设置 
    [Service]
    #Type=forking是后台运行的形式 
    Type=forking
    #ExecStart为服务的具体运行命令,路径必须是绝对路径 
    ExecStart=/java/redis5/bin/redis-sentinel /java/redis5/bin/sentinel-26379.conf
    #ExecReload为重启命令 ,路径必须是绝对路径 
    ExecReload=/java/redis5/bin/redis-sentinel -s reload
    #ExecStop为停止命令 ,路径必须是绝对路径 
    ExecStop=/java/redis5/bin/redis-sentinel -s stop
    #PrivateTmp=True表示给服务分配独立的临时空间 
    PrivateTmp=true
    
    #运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
    [Install]
    WantedBy=multi-user.target

    2、重载系统服务:

    systemctl daemon-reload

    3、将服务加入开机自启 (注意redis-sentinel.service后面不能跟空格 )

    systemctl enable redis-sentinel.service

    成功后提示:

    [root@host_132 bin]# systemctl enable redis-sentinel.service
    Created symlink from /etc/systemd/system/multi-user.target.wants/redis-sentinel.service to /etc/systemd/system/redis-sentinel.service.

    4、测试开机启动是否成功,重启服务器

    重启服务器

    reboot -f

    5、系统重启后,查看服务运行状态:

    systemctl status redis-sentinel.service

    或者查看进程

    ps -ef | grep redis-sentinel

    五、开放redis-sentinel的连接端口,默认是26379

    过程略。

    六、Jedis测试Redis哨兵模式切换master

    1、准备3台虚拟机,分别安装了redis和redis-sentinel

    过程略。

    2、引入jedis依赖

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
    </dependency>

    3、编写Java代码测试:

    import java.util.HashSet;
    import java.util.Random;
    import java.util.Set;
    import java.util.concurrent.TimeUnit;
    
    import org.apache.log4j.Logger;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisSentinelPool;
    
    public class RedisSentinel {
    
        private static Logger log = Logger.getLogger(RedisSentinel.class);
        
        public static void redisSentinel() {
            Set<String> sentinels = new HashSet<String>();
            sentinels.add("192.168.170.128:26379");//192.168.170.11
            sentinels.add("192.168.170.129:26379");//192.168.170.12
            sentinels.add("192.168.170.130:26379");//192.168.170.13
            JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
            Jedis jedis = jedisSentinelPool.getResource();
            String a = jedis.get("a");
            String b = jedis.get("b");
            System.out.println("a=" + a);
            System.out.println("b=" + b);
            jedis.close();
            jedisSentinelPool.close();
        }
        
        
        /**
         * 测试哨兵转移
         */
        public static void redisSentinelTransfer() {
            Set<String> sentinels = new HashSet<String>();
            sentinels.add("192.168.170.11:26379");
            sentinels.add("192.168.170.12:26379");
            sentinels.add("192.168.170.13:26379");
            @SuppressWarnings("resource")
            JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels);
            Jedis jedis = null;
            
            while(true) {
                try {
                    //不能放在while里面,这样连接池在8次后会被用完,不执行redis方法,也不报错。
                    //如果放在while,必须回收。
                    jedis = jedisSentinelPool.getResource();
                    int randInt = new Random().nextInt(10000);
                    String key  = "k_" + randInt;
                    String value  = "v_" + randInt;
                    jedis.set(key, value);
                    
                    log.info(key + " = " + value);
                    TimeUnit.SECONDS.sleep(2);
                    
                } catch (Exception e) {
                    log.info(e);
                    
                } finally {
                    if(jedis != null) {
                        jedis.close();
                    }
                }
                
            }
            
        }
        
        
        public static void main(String[] args) {
            //redisSentinel();
            redisSentinelTransfer();
        }
        
        
    }

    4、直接通过kill -9 xxx 关闭Redis(主)的redis服务,测试master是否切换。

     注意:默认是要 30秒 后才会切换。

    Centos7 Redis5安装及配置,Linux Centos7安装Redis5,Centos7 Redis自启动,见:

    https://www.cnblogs.com/fanshuyao/p/14144607.html

    ================================

    ©Copyright 蕃薯耀 2020-12-18

    https://www.cnblogs.com/fanshuyao/

  • 相关阅读:
    Android 监听键盘弹出/隐藏
    js 监听事件的叠加和移除
    如何用 Swift 语言构建一个自定控件
    适用于Web开发人员的20个CSS调色板
    学习Flutter应用开发有用的代码/库/专有技术列表
    学习Java的书籍资料
    可能对Flutter应用程序开发有用的代码/库/专有技术列表
    ios 动画:底部标签栏的概念设计
    iOS 开发者必不可少的 75 个工具
    创建Android Apps的30个经验教训
  • 原文地址:https://www.cnblogs.com/fanshuyao/p/14156208.html
Copyright © 2020-2023  润新知