redis作为一个直接操作内存的key-value存储系统,也是一个支持数据持久化的Nosql数据库,具有非常快速的读写速度,可用于数据缓存、消息队列等。

一、单机版安装

1.下载redis

  进入redis官网下载安装包,这里使用的是目前最新版6.0.4

  http://download.redis.io/releases/redis-6.0.4.tar.gz

2.上传到服务器并解压

  上传到服务器/usr/local目录并解压

  tar -zxvf redis-6.0.4.tar.gz

3.编译和安装

  3.1 编译,进入redis根目录,执行命令

  make

  若编译报错,可能是缺少编译环境gcc和tcl

  1)安装gcc,先清理掉上一步编译产生的文件,执行命令

  make distclean

  安装gcc,执行命令

  yum install gcc -y

  这个遇到一个问题:在安装6.0.1版本make时会遇到这样一个错误,server.c:xxxx:xx: error: ‘xxxxxxxx’ has no member named ‘xxxxx

    原因:gcc编译工具版本的问题,centos7默认安装的版本是4.8.5,但是要求对应版本要在5.3以上,查看gcc版本命令

    gcc -v

    解决方法:升级到5.3以上版本,依次执行命令

    yum -y install centos-release-scl

    yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

    scl enable devtoolset-9 bash

    echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile  --使永久生效

  2)安装tcl,执行命令

  yum install tcl -y

  重新编译make

  3.2 安装,进入src目录,执行命令

  make install PREFIX=/usr/local

  这时就会在/usr/local目录下生成一个redis目录,后面操作redis均使用此目录下文件,解压编译的目录作为源目录。

4.配置

  复制源目录根目录下的redis.conf文件到生成的/usr/local/redis目录下,执行命令

  cp redis.conf /usr/local/redis

  使用vi编辑配置redis.conf

  bind 0.0.0.0  设置绑定的主机ip,0.0.0.0表示监听所有地址

  protected-mode no  关闭安全模式,允许外网访问

  daemonize yes  后台启动

5.添加开放端口号到防火墙

  添加端口并重启防火墙

  firewall-cmd  --zone=public --add-port=6379/tcp --permanent && firewall-cmd --reload

  列出已经开放的端口号

  firewall-cmd --zone=public --permanent --list-ports

6.启动

  启动redis,进入redis根目录,执行命令

  ./bin/redis-server redis.conf

  使用redis工具或API远程访问。

OK,单机版搭建成功!

二、集群版安装

所谓知其然知其所以然,为什么要用redis集群?

  1)首先,redis是一个内存数据库,也就是说存储数据的容量不能超过主机内存大小(一般几十G),有时我们要在redis中存储大量的数据,比如上百个G,如果只是单个的redis实例,这样很难动态水平扩展,这时候就要考虑集群。

  2)其次,redis单实例具有流量压力上限问题,所以需要构建数据分区,多个master实例同时提供读写服务。

  redis 3.0版本以上开始支持cluster,采用的是hash slot(hash槽,redis共有16384个hash槽),它可以把多个redis实例整合在一起,将hash槽均分给每个master,形成redis集群也就是将数据分散在集群中的多个redis实例上,当我们创建数据时一个key只被分配到一个实例上。redis cluster是一个无中心的结构,每个节点保存着自己的数据和其它节点的信息,知道其它节点负责的槽,并且会与其它节点定时发送心跳信息,能够及时感知集群中异常的节点。

  那么,当我们新建一个key时,redis集群是怎样将数据分配到节点上的呢?

  当需要在redis集群中放置一个key-value时,redis先对key使用crc16算法计算出一个结果,然后将这个数值与16384求余,这样就确定了hash槽的位置,再根据hash槽的值确定将数据分配给之前均分hash槽的节点上。

  当我们取出一个key时,又是怎样进行定位的呢?

  当当前redis节点接收到获取数据的命令时,会计算出要处理的数据库键属于哪个槽与存储时使用同样的算法,并检查这个槽是否指派给了自己,若正好指派给了当前节点,则直接在这个节点上执行命令获取数据。否则节点会向客户端返回一个moved指令,指引客户端转向(redirect)至正确的节点,并在此发送之前执行的命令获取数据。

  redis使用集群,就要包保证集群的高可用性,使用主从复制(repliaction)和自动故障转移--哨兵机制(sentinel),可以解决单点故障。通过数据分区与主从复制提高redis集群的性能和高可用性。

  redis集群是怎样保证集群高可用的呢?

  redis cluster采用投票容错机制,集群角色有master和slave。master之间分配slots,slave向它指定的master同步数据,实现备份。master用于写数据,slave用于读数据,向slave写数据会发生错误。当其中一个master无法提供服务时,该master的slave提升为master,代替master提供服务。保证集群中slot的完整性,即集群数据的完整性。一旦集群中其中一个master和它的所有slave全部失效,导致slot不完整,那么集群将会不可用,这是就需要人工去处理了。

  投票过程是集群中所有master参与,如果半数以上的节点与节点之间的通讯时间超过cluster-node-timeout,则认为当前节点挂掉。所以一般master节点数量均为奇数个,且不少于3个。

  什么情况下整个集群不可用?

  a.如果集群中任一master节点挂掉且没有slave节点顶替,集群进入不可用状态;

  当集群不可用时,对集群中的任何操作都不可用。

集群搭建:

  我们这里搭建一个伪分布式的集群,集群中有3个节点,每个节点有一主一备,理论需要6台虚拟机,我们采用6个redis实例来模拟创建。

注意:这里的集群环境ruby环境是用于后面创建集群命令的运行环境,但是在高版本例如redis-5.0.5版本及以上就不需要安装此环境了,因为高版本创建集群已经不用redis-trib.rb这个脚本,而是使用自带的redis-cli创建。(呜呜,环境坑了我一下午,最后创建集群时才发现...)

1.安装集群环境ruby

  安装ruby,执行命令

  yum install ruby rubygems  -y

  安装redis与ruby的连接包,执行命令

    gem install redis

    如果提示ruby版本过低,需要升级ruby版本,需要安装rvm(命令行工具,提供ruby环境管理和版本切换),安装rvm前需要安装curl(文件传输工具),执行命令

    yum install curl -y

    使用curl安装rvm,执行命令

    curl -L get.rvm.io | bash -s stable

    安装会报错,并产生一串公钥,执行命令

    gpg --keyserver hkp://keys.gnupg.net --recv-keys (这里跟上上面的公钥)

    再次执行命令,一次不行多执行几次

    curl -sSL https://get.rvm.io | bash -s stable

    安装完成后会在/user/local目录下发现rvm目录,将命令放入shell,执行命令

    source /usr/local/rvm/scripts/rvm

    查看rvm管理的ruby版本,执行命令

    rvm list known

    安装新版本,可以参照安装连接包时提示的最低版本安装,我这里安装2.5.7版本,执行命令

    rvm install ruby-2.5.7

    等待ruby安装完成,查看已安装的版本,

    rvm list

    使用此版本

    rvm use ruby-2.5.7

    检查一下当前使用的版本,ruby -v

  最后再次执行命令

    gem install redis

  环境安装完成!!

2.创建集群目录

  进入/usr/local目录,执行命令

  mkdir redis_cluster

3.复制redis实例

  将redis目录复制到redis_cluster中,执行命令

  cp -r /usr/local/redis /usr/local/redis_cluster/redis7001

  ps:这里注意一点,如果此时数据库中有数据,那么将rdb文件一起复制时会导致后面集群创建失败,有数据时不能创建集群。解决:删除实例下rdb备份文件以及后面会生成的nodes.conf文件。

4.更改配置

  更改redis7001中配置redis.conf参数

  port 7001  修改端口号

  cluster-enabled yes  开启集群支持

  将redis7001实例复制6份到当前文件夹,

  cp redis7001 redis7002

  cp redis7001 redis7003

  ......

  修改各个实例下的端口号

5.把创建集群的ruby脚本复制到集群目录

  进入redis的src目录,执行命令

  cp redis-trib.rb /usr/local/redis_cluster/

6.创建集群

  启动6个redis实例,这里为了方便编写一个启动脚本,在redis_cluste目录下新建文件

  touch start-all.sh

  编辑输入如下内容:  

    cd ./redis7001
    ./bin/redis-server redis.conf
    echo "启动redis7001成功..."

    cd ../redis7002
    ./bin/redis-server redis.conf
    echo "启动redis7002成功..."

    cd ../redis7003
    ./bin/redis-server redis.conf
    echo "启动redis7003成功..."

    cd ../redis7004
    ./bin/redis-server redis.conf
    echo "启动redis7004成功..."

    cd ../redis7005
    ./bin/redis-server redis.conf
    echo "启动redis7005成功..."

    cd ../redis7006
    ./bin/redis-server redis.conf
    echo "启动redis7006成功..."

  赋予执行权限

  chmod +x start-all.sh

  新建关闭redis集群脚本

    touch stop-all.sh

  编辑输入如下内容:  

    cd ./redis7001
    bin/redis-cli -p 7001 shutwodn
    echo "关闭redis7001成功..."

    cd ../redis7002
    bin/redis-cli -p 7002 shutdown
    echo "关闭redis7002成功..."

    cd ../redis7003
    bin/redis-cli -p 7003 shutdown
    echo "关闭redis7003成功..."

    cd ../redis7004
    bin/redis-cli -p 7004 shutdown
    echo "关闭redis7004成功..."

    cd ../redis7005
    bin/redis-cli -p 7005 shutdown
    echo "关闭redis7005成功..."

    cd ../redis7006
    bin/redis-cli -p 7006 shutdown
    echo "关闭redis7006成功..."

  创建集群命令:

    进入到集群中某个实例下的bin目录,高版本执行

    ./redis-cli --cluster create --cluster-replicas 1 192.168.2.75:7001 192.168.2.75:7002 192.168.2.75:7003 192.168.2.75:7004 192.168.2.75:7005 192.168.2.75:7006

    低版本执行

    ./redis-trib.rb create --replicas 1 192.168.2.75:7001 192.168.2.75:7002 192.168.2.75:7003 192.168.2.75:7004 192.168.2.75:7005 192.168.2.75:7006

    注:replicas参数表示一个master有接个slave

  然后就会按照默认的方式进行分配matser,主从关系。

7.测试

  使用命令连接上集群某个节点

  ./redis-cli -p 7001

  使用命令 cluster info 和 cluster nodes可查看集群信息。

至此,集群版搭建完成!!

好累,歇会~~~

如有错误,感谢您的指正!

linux安装redis-6.0.1单机和集群的更多相关文章

  1. Linux安装Redis 6.0.5 ./install_server.sh报错

    Linux安装Redis 6.0.5 ./install_server.sh报错 linux 安装Redis6.0.5时 进行到./install_server.sh时报错, This systems ...

  2. Linux 安装Redis 5.0

    结构如下: Redis 官方不建议Redis安装在WINDOWS 服务器上(尤其是生产中分布式事物缓存). linux 下Redis 5.0主从复制(一主二从)哨兵模式的搭建:https://www. ...

  3. linux安装 redis(redis-3.0.2.tar.gz) 和 mongodb(mongodb-linux-x86_64-rhel62-4.0.0)

    1:首先 要下载 这两个 压缩包 注意:liunx是否已经安装过 gcc没安装的话 先安装:yum install gcc-c++ 2:安装 redis:redis-3.0.2.tar.gz (1): ...

  4. Linux下redis 的部署、主从与集群

    老男孩Python全栈6期——redis--------------------------Linux 操作系统 默认的内存管理机制RSS:page cache:anno page:Linux操作系统 ...

  5. redis 5.0.3 讲解、集群搭建

    REDIS 一 .redis 介绍 不管你是从事Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了 ...

  6. CentO7 安装 redis, 主从配置,Sentinel集群故障转移切换

        一.Redis的安装(前提是已经安装了EPEL)   安装redis: yum -y install redis 启动/停止/重启 Redis 启动服务: systemctl start re ...

  7. Centos7 linux下 安装 Redis 5.0

    网上找了很多文章,发现不全而且有些问题,安装很多次之后,总结一篇可以使用的,记录之. 环境:Centos7+Redis 5.0,如果环境不符合,本篇仅供参考. 1.准备工作 作者习惯软件安装包放在单独 ...

  8. centos / Linux 服务环境下安装 Redis 5.0.3

    原文:centos / Linux 服务环境下安装 Redis 5.0.3 1.首先进入你要安装的目录 cd /usr/local 2.下载目前最新稳定版本 Redis 5.0.3 wget http ...

  9. CentOS7.2 安装redis 3.0.6集群

    1.环境确认 a.系统版本查看 [hadoop@p168 ~]$ cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core)  b.安装依 ...

随机推荐

  1. 1.2Go环境搭建之Mac

    1.下载mac版go开发工具包,源码包或是安装包都可以 //官方下载地址 https://golang.org/dl/ //下载地址在此 https://dl.google.com/go/go1.11 ...

  2. oracle分析函数Rank, Dense_rank, row_number

    http://www.cnblogs.com/wuyisky/archive/2010/02/24/oracle_rank.html 目录=============================== ...

  3. JAVA基础4---序列化和反序列化深入整理(JDK序列化)

    一.什么是序列化和反序列化? 序列化:将对象状态信息转化成可以存储或传输的形式的过程(Java中就是将对象转化成字节序列的过程) 反序列化:从存储文件中恢复对象的过程(Java中就是通过字节序列转化成 ...

  4. vue路由中使用keep-alive 以及activated和deactivated 钩子

    本次只是记录下开发中碰到的问题. 最近做一个活动页面,涉及到角色和权限的问题,需要跳转很多页面,于是vue-router走起,顺便keep-alive也用起来了,嗯,跳转的很爽,但是一个详情页面组件, ...

  5. Java IO(一)概述

    Java IO(一)概述 一.IO概述 (一).介绍 在Java中,所有的数据都是通过流读写的,Java提供了IO来处理设备之间的数据传输,Java程序中,对于数据的输入/输出操作 都是以“流”的方式 ...

  6. Python基础知识思维导图

    看不清的可以右键保存到本地,或者在新标签页中打开图片

  7. parrot os 创建swap分区&swapon failed invalid argument解决

    parrot os(不仅仅是debian系统),分区提示,查看系统格式为btrfs,需要注意的是btrfs无法添加swap分区,但是可以在5.0内核以上添加 以下命令,完成创建8g的swap分区 to ...

  8. 网站的安全性对seo优化至关重要-智狐SEO顾问

    网站的安全性对seo优化至关重要    作者:智狐zhihuseo 从大的范围来看,网站安全性能也属于seo的范畴之一.域名被恶意泛解析就是网站安全性能低下的特征之一,如果网站域名被恶意泛解析,会直接 ...

  9. Rocket - diplomacy - enumerateBits

    https://mp.weixin.qq.com/s/KsZqe9W_DM6W6JecK_irvA   介绍AddressSet.enumerateBits方法的实现,主要是x & (-x)的 ...

  10. Chisel3 - model - UserModule commands

    https://mp.weixin.qq.com/s/0ECca6XyFyEri0B4ckOZ4A   介绍UserModule类中,如何管理构建硬件模型所需的命令.   ​​   1. _comma ...