redis集群的三种方式(linux系统)

1.集群相关知识点

(1).集群概念

通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态。

(2).为什么使用redis集群?

(1)单个redis存在不稳定性。当redis服务宕机了,就没有可用的服务了。

(2)单个redis的读写能力是有限的,redis集群是为了强化redis的读写能力。

(3).redis安装介绍

安装参考

1. http://redis.io/download下载Redis 压缩包(redis-5.0.3.tar.gz)

2. xshell上传到 /usr/local/redis目录下

3. tar xzf redis-5.0.3.tar.gz

4. yum install gcc

5. cd redis-5.0.3

6. make (make命令进行编译,将.c文件编译为.o文件)

7. make PREFIX=/usr/local/redis install (安装)

安装完后,在/usr/local/redis/bin下有几个可执行文件
redis-benchmark                    ----性能测试工具
redis-check-aof                    ----AOF文件修复工具
redis-check-rdb                    ----RDB文件检查工具(快照持久化文件)
redis-cli                          ----命令行客户端
redis-server                       ----redis服务器启动命令

8.  cd  /usr/local/redis/redis-5.0.3

9.  cp  redis.conf /usr/local/redis

10. cd  /usr/local/redis/bin

11.  执行 ./redis-server

12.  ./bin/redis-server ./redis.conf   启动redis服务

13.  使用命令ps -ef|grep redis    查看已经启动的redis服务

14.  ./bin/redis-cli shutdown  停止redis服务

15.  ./bin/redis-cli  进入到redis的客户端

2.redis主从复制

2.1 概念

  主从复制模型中,有多个redis节点,有且仅有一个为主节点Master。从节点Slave可以有多个。只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步。

2.2 特点

(1)主节点Master可读、可写.

(2)从节点Slave只读。(read-only)

(3) 主从模型可以提高读的能力,在一定程度上缓解写的能力。写仍然只有Master一个节点,可以将读的操作全部移交到从节点上,变相提高了写能力。

2.3 redis主从复制环境搭建

redis-主服务器

    mkdir /usr/local/redis/master

    cp /usr/local/redis/bin/redis-server /usr/local/redis/master/

    cp /usr/local/redis/bin/redis-cli /usr/local/redis/master/

    cp /usr/local/redis/redis-5.0.7/redis.conf /usr/local/redis/master/

    修改redis.conf

        daemonize yes

        port 6370

        logfile "./redis6370.log"

        requirepass testmaster123  (开启密码验证,密码:testmaster123)

    启动 ./redis-server redis.conf 

    连接 ./redis-cli -p 6370
        redis-cli -p 6370 -a testmaster123(有密码时)

redis-从服务器

    mkdir /usr/local/redis/slave

    cp /usr/local/redis/bin/redis-server /usr/local/redis/slave/

    cp /usr/local/redis/bin/redis-cli /usr/local/redis/slave/

    cp /usr/local/redis/redis-5.0.7/redis.conf /usr/local/redis/slave/

    修改redis.conf

        daemonize yes

        port 6371

        slaveof 127.0.0.1 6370   //这里很重要,连接redis主服务器配置的ip

        slave-read-only no  //标记为只能读,不能写

        logfile "./redis6370.log"

        masterauth testmaster123 (    # 当master服务设置了密码保护时,slav服务连接master的密码)

    启动 ./redis-server redis.conf 

    连接 ./redis-cli -p 6371      (无密码)

        redis-cli -p 6371 -a testmaster123(有密码时)

当主-从服务器搭建好后:
    查看主从状态
    ./redis-cli -p 6370 -a testmaster123
    127.0.0.1:6370> info
        # Replication
        role:master
        connected_slaves:1
        slave0:ip=127.0.0.1,port=6371,state=online,offset=1427,lag=1
        master_replid:4b0c21dc6eb99226dfa281112f0ad1abd6516c57
        master_replid2:0000000000000000000000000000000000000000
        master_repl_offset:1427
        second_repl_offset:-1
        repl_backlog_active:1
        repl_backlog_size:1048576
        repl_backlog_first_byte_offset:1
        repl_backlog_histlen:1427

2.4 主从复制原理

1. 当从库和主库建立MS关系后,会向主数据库发送SYNC命令

2. 主库接收到SYNC命令后会开始在后台保存快照(RDB持久化过程),并将期间接收到的写命令缓存起来

3. 当快照完成后,主Redis会将快照文件和所有缓存的写命令发送给从Redis

4. 从Redis接收到后,会载入快照文件并且执行收到的缓存的命令

5. 之后,主Redis每当接收到写命令时就会将命令发送从Redis,从而保证数据的一致

2.5 主从复制模式缺陷

当主节点宕机了,整个集群就没有可写的节点了。

3.Redis Sentinel哨兵模式

3.1 概念

(1).Sentinel是Redis的高可用性(HA)解决方案

(2).由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器.

(3).被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。

(4).Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态.

(5).基本原理是:心跳机制+投票裁决(每个sentinel只有一次选举的机会,当主库出现故障,哨兵会投票从库中选出一个承担主库的任务,剩下的还是从库)

3.2 特点

1. 监控:监控主从是否正常
2. 通知:出现问题时,可以通知相关人员
3. 自动故障迁移:自动主从切换
4. 统一的配置管理:连接者询问sentinel取得主从的地址

3.3 哨兵网络

(1).同一个哨兵下的、不同主从模型,彼此之间相互独立

(2).监控同一个Master的Sentinel会自动连接,组成一个分布式的Sentinel网络,互相通信并交换彼此关于被监视服务器的信息

(3).为什么要有哨兵网络

1. 在sentinel网络中,只要还有一个sentinel活着,就可以实现故障切换。    

2. 当只有一个sentinel的时候,这个sentinel挂掉了,就无法实现自动故障切换了

3.4 redis哨兵环境搭建

哨兵一:
    mkdir /usr/local/redis/sentinel

    cp /usr/local/redis/bin/redis-server /usr/local/redis/sentinel/

    cp /usr/local/redis/bin/redis-cli /usr/local/redis/sentinel/

    cp /usr/local/redis/redis-5.0.7/sentinel.conf /usr/local/redis/sentinel/

    cp /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel/

    sentinel.conf配置
        port 8001
        daemonize yes
        logfile "./sentinel1.log"

        注意: mymaster 与下文出现的 mymaster 是一 一对应关系
        #哨兵监控这个master  
        #  mymaster  : 主节点别名  
        #  127.0.0.1 : 主节点IP 
        #  6370      : 主节点端口
        #    1       : 触发故障切换的最少哨兵 
        sentinel monitor mymaster 127.0.0.1 6370 1

        #设置master和slaves验证密码
        sentinel auth-pass mymaster testmaster123
        sentinel config-epoch mymaster 15

        #除了当前哨兵, 还有哪些在监控这个master的哨兵
        sentinel known-sentinel mymaster 127.0.0.1 8002 0aca3a57038e2907c8a07be2b3c0d15171e44da5
        sentinel known-sentinel mymaster 127.0.0.1 8003 ac1ef015411583d4b9f3d81cee830060b2f29862

    重新命名  sentinel.conf 为  sentinel1.conf

哨兵二:
    复制 sentinel1.conf 命名为  sentinel2.conf

    sentinel.conf配置
        port 8002
        logfile "./sentinel2.log"

        #除了当前哨兵, 还有哪些在监控这个master的哨兵
        sentinel known-sentinel mymaster 127.0.0.1 8001 1aca3a57038e2907c8a07be2b3c0d15171e44da5
        sentinel known-sentinel mymaster 127.0.0.1 8003 ac1ef015411583d4b9f3d81cee830060b2f29862

哨兵三:
    复制 sentinel1.conf 命名为  sentinel3.conf

    sentinel.conf配置
        port 8003
        logfile "./sentinel3.log"

        #除了当前哨兵, 还有哪些在监控这个master的哨兵
        sentinel known-sentinel mymaster 127.0.0.1 8001 1aca3a57038e2907c8a07be2b3c0d15171e44da5
        sentinel known-sentinel mymaster 127.0.0.1 8002 0aca3a57038e2907c8a07be2b3c0d15171e44da5            

启动哨兵:
    ./redis-server sentinel1.conf --sentinel
    ./redis-server sentinel2.conf --sentinel
    ./redis-server sentinel3.conf --sentinel

连接哨兵:
    ./redis-cli -p 8001

3.4 redis哨兵环境测试

1. 查看master:
     127.0.0.1:8001> sentinel masters
        1) "name"
        2) "mymaster"
        3) "ip"
        4) "127.0.0.1"
        5) "port"
        6) "6370"

2. 查看当前mastrer 
    127.0.0.1:8001> sentinel get-master-addr-by-name mymaster

3. 检查容灾切换情况

    (1). 127.0.0.1:8001> sentinel get-master-addr-by-name mymaster
        1) "127.0.0.1"
        2) "6370"
    (2).杀掉当前master进程 : kill -9 进程号
        127.0.0.1:8001> sentinel get-master-addr-by-name mymaster
        1) "127.0.0.1"
        2) "6371"
    (3).启动原来的master,

    (4).查询当前master
            127.0.0.1:8001> sentinel masters
                1) "name"
                2) "mymaster"
                3) "ip"
                4) "127.0.0.1"
                5) "port"
                6) "6371"

    (5).查看当前slaves
            127.0.0.1:8001> sentinel slaves mymaster
                1) "name"
                2) "127.0.0.1:6370"
                3) "ip"
                4) "127.0.0.1"
                5) "port"
                6) "6370"

4 redis注意事项:

1. 最大内存问题:要设置好最大内存,以防不停的申请内存,造成系统内存都被用完。

2. Fork进程问题:'vm.overcommit_memory = 1'这一个选项要加到系统的配置中,防止fork因内存不足而失败。

3. 密码问题:需要设置复杂一些,防止暴力破解

4. 多个哨兵配置文件一样,正常情况下要配置奇数哨兵,避免切换时候票数相同,出现竞争,影响线上业务。

 

文章标题:redis集群的三种方式(linux系统)

发布时间:2019-12-11, 14:23:00

最后更新:2019-12-11, 14:23:01