阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis 3.2.1集群搭建

109次阅读
没有评论

共计 6046 个字符,预计需要花费 16 分钟才能阅读完成。

一、概述

    Redis3.0 版本之后支持 Cluster。

1.1、redis cluster 的现状

  目前 redis 支持的 cluster 特性:

1): 节点自动发现

2):slave->master 选举, 集群容错

3):Hot resharding: 在线分片

4): 进群管理:cluster xxx

5): 基于配置 (nodes-port.conf) 的集群管理

6):ASK 转向 /MOVED 转向机制.

1.2、redis cluster 架构

1)redis-cluster 架构图

Redis 3.2.1 集群搭建

架构细节:

(1)所有的 redis 节点彼此互联(PING-PONG 机制), 内部使用二进制协议优化传输速度和带宽.

(2)节点的 fail 是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与 redis 节点直连, 不需要中间 proxy 层. 客户端不需要连接集群所有节点, 连接集群中任何一个可用节点即可

(4)redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护 node<->slot<->value

   2) redis-cluster 选举: 容错

Redis 3.2.1 集群搭建

(1)领着选举过程是集群中所有 master 参与, 如果半数以上 master 节点与 master 节点通信超过(cluster-node-timeout), 认为当前 master 节点挂掉.

(2): 什么时候整个集群不可用 (cluster_state:fail), 当集群不可用时, 所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down) 错误

    a: 如果集群任意 master 挂掉, 且当前 master 没有 slave. 集群进入 fail 状态, 也可以理解成进群的 slot 映射 [0-16383] 不完成时进入 fail 状态.

    b: 如果进群超过半数以上 master 挂掉,无论是否有 slave 集群进入 fail 状态.

二、redis cluster 安装

    1、下载和解包

cd /usr/local/
wget http://download.redis.io/releases/redis-3.2.1.tar.gz
tar -zxvf /redis-3.2.1.tar.gz

2、编译安装

cd redis-3.2.1
 make && make install

  3、创建 redis 节点

     测试我们选择 2 台服务器,分别为:192.168.1.237,192.168.1.238. 每分服务器有 3 个节点。

  我先在 192.168.1.237 创建 3 个节点:

cd /usr/local/
  mkdir redis_cluster  //创建集群目录
  mkdir 7000 7001 7002  //分别代表三个节点    其对应端口 7000 7001 7002
 // 创建 7000 节点为例,拷贝到 7000 目录
 cp /usr/local/redis-3.2.1/redis.conf  ./redis_cluster/7000/   
 //拷贝到 7001 目录
 cp /usr/local/redis-3.2.1/redis.conf  ./redis_cluster/7001/   
 //拷贝到 7002 目录
 cp /usr/local/redis-3.2.1/redis.conf  ./redis_cluster/7002/

   分别对 7001,7002、7003 文件夹中的 3 个文件修改对应的配置

daemonize    yes                          //redis 后台运行
pidfile  /var/run/redis_7000.pid          //pidfile 文件对应 7000,7002,7003
port  7000                                //端口 7000,7002,7003
cluster-enabled  yes                      //开启集群  把注释 #去掉
cluster-config-file  nodes_7000.conf      //集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout  5000                //请求超时  设置 5 秒够了
appendonly  yes                           //aof 日志开启  有需要就开启,它会每次写操作都记录一条日志

   在 192.168.1.238 创建 3 个节点:对应的端口改为 7003,7004,7005. 配置对应的改一下就可以了。

   4、两台机启动各节点(两台服务器方式一样)

cd /usr/local
redis-server  redis_cluster/7000/redis.conf
redis-server  redis_cluster/7001/redis.conf
redis-server  redis_cluster/7002/redis.conf
redis-server  redis_cluster/7003/redis.conf
redis-server  redis_cluster/7004/redis.conf
redis-server  redis_cluster/7005/redis.conf

   5、查看服务

      ps -ef | grep redis   #查看是否启动成功

     netstat -tnlp | grep redis #可以看到 redis 监听端口

三、创建集群

  前面已经准备好了搭建集群的 redis 节点,接下来我们要把这些节点都串连起来搭建集群。官方提供了一个工具:redis-trib.rb(/usr/local/redis-3.2.1/src/redis-trib.rb) 看后缀就知道这鸟东西不能直接执行,它是用 ruby 写的一个程序,所以我们还得安装 ruby.

yum -y install ruby ruby-devel rubygems rpm-build

  再用 gem 这个命令来安装 redis 接口    gem 是 ruby 的一个工具包.

gem install redis    //等一会儿就好了
当然,方便操作,两台 Server 都要安装。

  上面的步骤完事了,接下来运行一下 redis-trib.rb

/usr/local/redis-3.2.1/src/redis-trib.rb

   Usage: redis-trib <command> <options> <arguments …>

   reshard        host:port
                  –to <arg>
                  –yes
                  –slots <arg>
                  –from <arg>
  check          host:port
  call            host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  –master-id <arg>
                  –slave
  del-node        host:port node_id
  fix            host:port
  import          host:port
                  –from <arg>
  help            (show this help)
  create          host1:port1 … hostN:portN
                  –replicas <arg>

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

     看到这,应该明白了吧,就是靠上面这些操作 完成 redis 集群搭建的.

 确认所有的节点都启动,接下来使用参数 create 创建 (在 192.168.1.237 中来创建)

/usr/local/redis-3.2.1/src/redis-trib.rb  create  --replicas  1  192.168.1.237:7000 192.168.1.237:7001  192.168.1.237:7003 192.168.1.238:7003  192.168.1.238:7004  192.168.1.238:7005

    解释下,–replicas  1  表示 自动为每一个 master 节点分配一个 slave 节点    上面有 6 个节点,程序会按照一定规则生成 3 个 master(主)3 个 slave(从)

    前面已经提醒过的 防火墙一定要开放监听的端口,否则会创建失败。

 运行中,提示 Can I set the above configuration? (type ‘yes’ to accept): yes    // 输入 yes

 接下来 提示  Waiting for the cluster to join……….  安装的时候在这里就一直等等等,没反应,傻傻等半天,看这句提示上面一句,Sending Cluster Meet Message to join the Cluster.

    这下明白了,我刚开始在一台 Server 上去配,也是不需要等的,这里还需要跑到 Server2 上做一些这样的操作。

    在 192.168.1.238, redis-cli -c -p 700*  分别进入 redis 各节点的客户端命令窗口,依次输入 cluster meet 192.168.1.238 7000……

    回到 Server1,已经创建完毕了。

    查看一下 /usr/local/redis/src/redis-trib.rb check 192.168.1.237:7000

    到这里集群已经初步搭建好了。

四、测试

1)get 和 set 数据

    redis-cli -c -p 7000

    进入命令窗口,直接 set  hello  howareyou

    直接根据 hash 匹配切换到相应的 slot 的节点上。

    还是要说明一下,redis 集群有 16383 个 slot 组成,通过分片分布到多个节点上,读写都发生在 master 节点。

  2)假设测试

    果断先把 192.168.1.238 服务 Down 掉,(192.168.1.238 有 1 个 Master, 2 个 Slave),  跑回 192.168.1.238, 查看一下 发生了什么事,192.168.1.237 的 3 个节点全部都是 Master,其他几个 Server2 的不见了

    测试一下,依然没有问题,集群依然能继续工作。

    原因:redis 集群  通过选举方式进行容错,保证一台 Server 挂了还能跑,这个选举是全部集群超过半数以上的 Master 发现其他 Master 挂了后,会将其他对应的 Slave 节点升级成 Master.

    疑问��� 要是挂的是 192.168.1.237 怎么办?哥试了,cluster is down!!    没办法,超过半数挂了那救不了了,整个集群就无法工作了。要是有三台 Server,每台两 Master,切记对应的主从节点

            不要放在一台 Server, 别问我为什么自己用脑子想想看,互相交叉配置主从,挂哪台也没事,你要说同时两台 crash 了,呵呵哒 ……

  3)关于一致性

    我还没有这么大胆拿 redis 来做数据库持久化哥网站数据,只是拿来做 cache,官网说的很清楚,Redis Cluster is not able to guarantee strong consistency. 

 五、安装遇到的问题

     1、

CC adlist.o
/bin/sh: cc: command not found
make[1]: *** [adlist.o] Error 127
make[1]: Leaving directory `/usr/local/redis-3.2.1/src
make: *** [all] Error 2

     解决办法:GCC 没有安装或版本不对,安装一下

yum  install  gcc

   2、

zmalloc.h:50:31:
error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error:

#error “Newer version of jemalloc required”
make[1]: *** [adlist.o] Error
1
make[1]: Leaving directory `/data0/src/redis-2.6.2/src
make: *** [all]
Error 2

    解决办法:原因是没有安装 jemalloc 内存分配器,可以安装 jemalloc 或 直接

     输入 make MALLOC=libc  && make install

下面关于 Redis 的文章您也可能喜欢,不妨参考下:

Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm

Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm

Redis 集群搭建与简单使用  http://www.linuxidc.com/Linux/2017-03/142210.htm

CentOS 7 下 Redis 的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm

Ubuntu 14.04 安装 Redis 与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm

Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Redis 单机 & 集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm

CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm

Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm

Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm

Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm

Redis 热迁移实战总结  http://www.linuxidc.com/Linux/2017-02/141083.htm

Redis3.0 配置文件详解  http://www.linuxidc.com/Linux/2017-03/141369.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148597.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计6046字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中