• 部署Redis集群


    部署Redis集群

    Redis简介

    Redis(Remote Dictionary Server)是完全开源的、遵守BSD协议的、高性能的Key-Value数据库。
    Redis与其他Key-Value缓存产品有一下三个特点:

    1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    2. Redis不仅仅支持简单的Key-Value类型的数据,同时还提供List、Set、ZSet、Hash等数据结构的存储
    3. Redis支持数据的备份,既Master-Slave模式的数据备份。

    Redis优势

    1. 性能极高,因为Redis是针对内存来读写的。
    2. 丰富的数据类型String、List、Set、ZSet、Hash
    3. 原子,Redis的所有操作都是原子性的,意思就是要么成功要么失败完全不执行,单个操作是原子性的。多个操作也支持事务,通过MULTI和EXEC指令包起来。
    4. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性

    Redis官网官方网站

    Redis集群

    为什么集群

    随着大数据时代的到来,在大型系统应用中,几十上百G的数据很常见.而无论是物理机、云主机(虚拟机),内存资源往往是有限的,虽然目前硬件成本降低,几十G几十核的主机也很常见,但是对于redis这种工作进程为单线程模式的工具来说,一台主机只运行一个实例就有些浪费,且出现单点故障时影响范围很大。同时,redis管理大内存时不如管理相对较小的内存高效,据第三方测试,redis单进程内存分配达到20G后性能急剧下降,因此普遍使用的方式为单进程分配8G内存,单主机开启多个redis实例.

    原理

    Redis官方集群方案 Redis Cluster(服务端sharding)Redis cluster是一种在服务端sharding(分片)的技术,在redis3.0版本开始正式提供。Redis cluster的服务端sharding引入了slot(槽)的概念,一共分为16384(2^14)个slot,集群中的每个node节点负责分摊这些slot,每个进入redis的键值对,根据key进行hash运算,除以16384取模,匹配相应的slot,再分配进相应的node中的实例中。在redis cluster方案中,数据储存的粒度由原来的instance再次精细为slot。Redis cluster提供一种叫做cluster bus(集群总线)的功能特性,采用特殊的二进制协议,通信及响应速度极快。它提供节点故障检测、故障转移、新节点识别等节点管理功能,该功能的进程间通信端口号为服务端口号值+10000,例如redis对外提供服务的端口号为6555,则cluster bus的端口号则为16555。值得注意的是:redis cluster是官方在3.0以后的版本才正式推出的。

    Redis集群部署

    Redis集群中有多台Redis服务器不可避免会有服务器挂掉。Redis集群服务器之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了。
    上面就是我们常说的为了容错而生的redis集群投票机制。
    因为集群投票机制redis要求至少3主3从共6个节点才能组成redis集群,每个主节点至少有一个从节点,测试环境可一台物理上启动6个redis节点,但生产环境至少要准备3台物理机。
    这里为了演示我使用了三台Centos7虚拟服务器,每台起两个Redis实例,共6个节点来构建Redis集群|

    主机名节点IP实例1端口实例2端口
    Master1 192.168.200.11 7001 7002
    Master2 192.168.200.12 7001 7002
    Master3 192.168.200.13 7001 7002

    部署架构图

    这里采用Redis6.0.9版本的Redis,所有节点服务器都需要进行以下操作
    编译安装时要求gcc版本未5.3以上版本,
    先执行gcc -v 查看当前gcc版本
    gcc -v
    如果提示无gcc,首先需要安装gcc
    yum install -y gcc gcc-c++
    安装完成后查看gcc版本,Centos版本默认安装的是4.8.5版本的gcc,版本过低

    gcc 升级
    yum install -y centos-release-scl
    yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
    yum install -y systemd-devel
    echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
    source /etc/profile
    升级完成后查看gcc版本

    下面进行安装Redis
    提前下载好Redis压缩包这里使用redis-6.0.9.tar.gz。把下载好的文件上传到三个服务器上,我这里放到了/usr/local目录下

    下面使用tar命令解压缩
    tar -zxvf redis-6.0.9.tar.gz
    mv redis-6.0.9 redis609

    进入redis目录创建节点目录
    mkdir {7001,7002}

    创建redis用户并给新建的目录附上访问权限
    useradd -s /sbin/nologin redis
    chown -R redis: /usr/local/redis609

    下面进行Redis的编译安装
    因Redis版本原因需要安装或者更新tcl版本大于8.5
    wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
    sudo tar xzvf tcl8.6.1-src.tar.gz -C /usr/local/
    cd /usr/local/tcl8.6.1/unix/
    ./configure
    make
    make install

    下面进入redis目录执行编译redis need systemd-devel
    make BUILD_WITH_SYSTEMD=yes USE_SYSTEMD=yes
    make install
    查看redis版本
    redis-cli --version
    redis-server --version
    进入redis609目录拷贝配置文件到7001、7002两个文件夹下并进行文件授权

    修改配置文件

    port 7001
    protected-mode no
    daemonize no
    supervised systemd
    pidfile /usr/local/redis609/7001/redis_7001.pid
    logfile "/usr/local/redis609/7001/7001.log"
    dir /usr/local/redis609/7001/
    appendonly yes
    appendfilename "appendonly7001.aof"
    cluster-enabled yes
    cluster-config-file nodes-7001.conf
    cluster-node-timeout 5000
    

    配置参数说明:

    1. bind 绑定的主机地址
    2. port 指定Redis监听端口,默认端口为6379
    3. logfile 日志记录方式,默认为标准输出
    4. dir 本地数据库存储路径
    5. cluster-enabled yes 开启集群功能,否则节点是一个普通的单一redis实例
    6. cluster-config-file nodes.conf 集群自动生成的配置文件,保存集群信息
    7. cluster-node-timeout 15000 集群中节点能够失联的最大时间
    8. appendonly yes 持久化记录服务器执行的所有写操作命令
      7002实例按照7001在操作一遍即可
      使用Systemd管理Redis服务
      创建服务启动文件,其中%i为占位符变量,redis@7001.service中@符号后的7001参数会替换该变量:
    cat > /etc/systemd/system/redis@.service << EOF
    [Unit]
    Description=Redis persistent key-value database
    After=network.target
    [Service]
    User=redis
    Group=redis
    #如果在启动时timeout或者查看状态一直为Activating建议使用默认Type注释掉此参数。如果需要用forking需要配置PIDFile地址 --daemonize yes
    Type=notify
    ExecStart=/usr/local/bin/redis-server /usr/local/redis609/%i/redis%i.conf  --daemonize no --supervised systemd
    ExecStop=/usr/local/bin/redis-cli -p %i shutdown
    LimitNOFILE=10240
    TimeoutStartSec=90s
    TimeoutStopSec=90s
    Restart=always
    [Install]
    WantedBy=multi-user.target
    EOF
    

    所有节点启动redis实例,并设为开机启动

    systemctl daemon-reload    #后期有修改serverice 之后一定要执行这句话
    systemctl enable --now redis@{7001,7002}.service
    

    执行启动服务之后
    netstat -lnp|grep redis
    systemctl status redis@{7001,7002}.service
    端口已正常启动并且服务状态为active说明配置成功
    实例状态维护

    
    #查看实例运行状态
    systemctl status redis@7001.service
    systemctl status redis@7002.service
    
    #启动实例
    systemctl start redis@7001.service
    systemctl start redis@7002.service
    
    #停止实例
    systemctl stop redis@7001.service
    systemctl stop redis@7002.service
    
    #重启实例
    systemctl restart redis@7001.service
    systemctl restart redis@7002.service
    
    

    以上操作在三台服务器都执行一遍。
    实例全部启动后 ,在任意服务器上创建redis集群
    redis-cli --cluster create 192.168.200.11:7001 192.168.200.11:7002 192.168.200.12:7001 192.168.200.12:7002 192.168.200.13:7001 192.168.200.13:7002 --cluster-replicas 1

    有以下提示表示已部署成功

    查看集群节点
    redis-cli -c -h 192.168.200.13 -p 7001 cluster nodes

  • 相关阅读:
    呵呵,庆祝偶的blog开张了~
    把.NET程序部署到没有安装.NETFramwork的机器上
    1842005 日记
    So In Love
    windows网络编程经典入门
    水木穿梭
    c++智能指针的使用,shared_ptr,unique_ptr,weak_ptr
    c++的左值(lvalue),右值(rvalue),移动语义(move),完美转发(forward)
    (一)深入理解JVM第三版JDK的发展历史
    处理在多参数情况下分页参数的完整性
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/16658177.html
Copyright © 2020-2023  润新知