Redis 入门到高可用以及分布式实战(二)

上一篇文章 Redis从入门到高可用以及分布式实战(一)介绍了Redis的基本命令、五大数据结构、Redis的到典型应用场景,经过以前的学习咱们对Redis有了一点的了解,接下来这篇文章会讲解Redis的主从复制原理的配置、哨兵选举原理并掌握在Linux上搭建Redis一主二从三哨兵高可用集群环境,废话少说,让咱们开始吧!java

阿里云服务器搭建redis高可用集群环境(一主二从三哨兵)

环境与工具mysql

  • 阿里云轻量级服务器1核2GB(传说中的乞丐版服务器)
  • Redis-5.0.4

部署工具程序员

  • Xshell 6
  • Xftp 6

开发工具web

  •  Intellij IDEA 2019.2(最新版本真香)

安装redis

我的的redis版为redis-5.0.4,这个看你的选择吧,不须要选最新的,安装路径/opt/redis-5.0.4,建议软件的暗转路径选择/opt下,好比tomcat,mysql等...redis

Linux下安装redis步骤:spring

下载地址:http://download.redis.io/releases/redis-5.0.5.tar.gz  直接使用wget命令下在到安装的目录下sql

  • 解压:tar -zxvf redis-5.0.4.tar.gz 
  • 进入到解压后的文件夹里边 :cd redis-5.0.4/
  • 编译而且测试编译的结果 :make
  • 进入src目录:make install
  • 安装完成

配置文件

第一步:redis的主从配置shell

1.使用vim命令建立redis-6379.conf配置文件(mater主配置文件),修改配置内容:数据库

#演示方便,开放全部的ip链接
bind 0.0.0.0
#后台运行
daemonize yes
#pid文件
pidfile /var/run/redis_6379.pid
dbfilename dump-6379.rdb
#日志文件
logfile "6379.log"

2.使用命令 cp -v redis-6379.conf redis-6380.conf 复制一份redis-6379.conf 到 redis-6380.conf,修改配置文件:vim

bind 0.0.0.0
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
dbfilename dump-6380.rdb
logfile "6380.log"
#slaveof表示做为从库的配置
slaveof 39.106.115.134 6379
#从库只能读操做
slave-read-only yes

3.一样操做,复制一份成redis-6381.conf,修改配置文件:

bind 0.0.0.0
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
dbfilename dump-6381.rdb
logfile "6381.log"
#slaveof表示做为从库的配置
slaveof 39.106.115.134 6379
#从库只能读操做
slave-read-only yes

配置成功后,查看redis信息:

1.查看主库信息:

[root@localhost redis-5.0.4]# ./src/redis-cli -p 6379 info

2.查看从库信息:

3. 想知道redis主从模式是否搭建成功,咱们来实验一下,在主库set,从从库里get,看看能不能实现数据同步,看下面:

 

咱们发现是成功的,这里注意的是,从库只能读数据,不能写数据,由于咱们在配置文件里配置了(不信你能够试试,会报错,报错以下):

  • slave-read-only yes  #从库只能读操做

第二步:哨兵配置

建立sentinel配置文件

1.在redis.conf同一级目录下建立sentinel-26379.conf文件,修改配置配置文件为:

port 26379
daemonize yes
# sentinel announce-ip <ip>
# sentinel announce-port <port>
dir /opt/redis-5.0.4/data
logfile "26379.log"
sentinel monitor mymaster 39.106.115.134 6379 2
# sentinel auth-pass <master-name> <password>
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
# sentinel notification-script <master-name> <script-path>

2. 使用 cp 命令拷贝一份成 sentinel-26380.conf 和一份 sentinel-26381.conf 并修改上面port端口号等几处地方便可,比较机械,我就不演示操做了,建立好哨兵配置文件以后,咱们就要开始启动redis服务了,启动成功以后使用 ps -ef | grep redis 查看redis进程信息,以下所示,代表启动完成:

如今主库、从库、哨兵都启动成功了,咱们能够查看一下配置信息是否正确:

执行 ./src/redis-cli -p 26379.conf info

###   发现咱们的配置已经成功!!

编写测试代码

在IDEA建立一个maven项目,在pom文件添加redis客户端Jedis依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.1.0-m1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

在Application中建立main函数入口,键入测试代码:

/**
 * @Author 林必昭
 * @Date 2019/10/22 20:17
 */
@SpringBootApplication
public class JedisDemoApplication {

    public static void main(String[] args) {

        //三个哨兵
        Set<String> sentinels = new HashSet<>();
        //是阿里云外网ip
        sentinels.add("39.106.115.134:26379");
        sentinels.add("39.106.115.134:26380");
        sentinels.add("39.106.115.134:26381");

        //初始化哨兵池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);

        while (true) {
            Jedis jedis = null;
            try {
                //拿到jedis,经过jedis来操做主库
                jedis = pool.getResource();
                //获取主库的ip
                String ip = jedis.getClient().getHost();
                //获取主库的端口
                int port = jedis.getClient().getPort();

                String key = "k-" + new Random().nextInt(10000);
                String value = "v-" + new Random().nextInt(10000);
                jedis.set(key, value);
                System.out.println("当前主库:" + ip + ":" + port + "," + key + "value is " + jedis.get(key));
                //每秒执行一次
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (jedis != null) {
                    jedis.close();
                }
            }
        }
    }
}

运行mian函数,能够看到相似的输出:

咱们去查看数据库数据,发现数据已经写入了:

查看咱们的客户端,确实数据已经写入:

Redis高可用测试

注意:测试过程当中要保证测试代码要一致处于运行状态,不要断开,如今测试代码是后台运行不断向主库插入数据,测试高可用:

1.使用 ps -ef | grep redis 查看后台的进程,看看主库的pid进程号:

2. 接下来,咱们要模拟主库宕机的情景了,就是销毁主库进程:

    执行命令:kill 8711

看看IDEA控制台的输出:

 

当 kill 掉主库进程的时候,IDEA就会报错:Connection refused:connect 的错误,持续报错,通过30s以后(这个时间是能够选择的,在配置文件中设置),也就是以前配置的sentinel,有一段配置 sentinel down-after-milliseconds mymaster 30000,设置主库宕机以后通过多久时间进行选举,单位是毫秒,这里设置了30000毫秒,此时主库被切换了,此时从库redis-6381,被选举成新的主库,看到控制台输出,当前主库变为了:39.106.115.134:6381,6379已经被咱们停掉了,这就是redis主库master宕机以后的从新选举过程!!!

3. 咱们能够可查看6381的信息,执行命令:

    ./src/redis -cli -p 6781 info 

咱们能够清楚的看到,6381 role已是master了,也就是是6381已是主节点了,6379已经被咱们他停掉了,因此看不到6379的信息。

4.执行 ./src/redis-cli -p 26379 info;

5. 那么,到这里咱们就会想,6379被虽然咱们 kill 掉了,到时它会变为从节点吗?咱们能够查看一下配置信息,看一下 sentinel-26379.conf 配置文件信息:

从配置文件上能够看出,虽然6379被停掉,主库选举成功,这里的6379最后仍是会被修改为从节点,啊哈哈哈,到这里,证实了咱们redis的高可用测试成功了!!!

问题解决

其实在搭建的过程当中遇到了不少问题,有一个问题想跟你们分享,避免入坑,一搜网上不少中说法,先把问题贴出来:

实时这个问题的来源主要缘由有两种:

  1. ip地址的选择问题,我选用的是阿里云外网ip(内网彷佛不行)
  2. 配置文件的问题

对于配置文件问题的解决的方案是,修改配置文件:

  • 删除默认的redis.conf和sentinel.conf,避免咱们写的conf配置文件与默认文件冲突,将默认的删除就好了;
  • 修改全部sentinel配置文件的ip,先停掉全部的节点和哨兵,将配置文件的中的ip地址信息修改成本身服务器的ip,将#Generated by下面的内容删掉便可;

而后再从新启动,这样异常就能解决掉了,个人是第二种状况引发的错误,百度了好久,我还从新配置了几遍,哎555,缘由是以前配置的信息错误,删掉以后从新启动就好了,最后,Redis从入门到高可用以及分布式实战(二)就到这里了,经过这篇文章咱们学习了redis一主二从三哨兵的集群模式,Redis Sentinal着眼于高可用,在master宕机时会自动将slave提高为master,继续提供服务,下一篇文章咱们能够谈谈 redis故障转义的原理和过程,逐步掌握非关系型数据库的原理和应用。

不早了,晚安了,祝你们1024节日快乐,最后,我是程序员,我为本身带盐(哈哈哈)!!

相关文章
相关标签/搜索