一、环境配置

一台window 7上安装虚拟机,虚拟机中安装的是centos系统。

二、目标

    Redis集群搭建的方式有多种,根据集群逻辑的位置,大致可以分为三大类:基于客户端分片的Redis Sharding,如Jedis;基于服务器分片的Redis Cluster;基于客户端服务端之间的代理中间件的集群方案,如Twitter开发的twemproxy、豌豆荚的Codis等。本文接受的Redis-cluster是Redis3.0版本之后,官方推出的一款集群解决方案。与大多数分布式中间件一样,redis的cluster也是依赖选举算法来保证集群的高可用,所以类似ZooKeeper一样,一般是奇数个节点(可以允许N/2以下的节点失效),再考虑到每个节点做Master-Slave互为备份,所以一个redis cluster集群最少也得6个节点。因此,目标是在centos上搭建一个有6个节点的redis-cluster,端口号为 7000-7005。集群结构图如下所示:

三、搭建步骤

第一步、新建redis安装目录

  1. mkdir /opt/app/redis_cluster
  2. cd /opt/app/redis_cluster


第二步、下载、解压、编译

  1. $ wget http://download.redis.io/releases/redis-3.0.7.tar.gz
  2. $ tar xzf redis-3.0.7.tar.gz
  3. $ cd redis-3.0.7
  4. $ make


第三步、新建六个redis节点

[root@localhost redis-cluster]# mkdir 7000 7001 7002 7003 7004 7005

如下图所示,文件夹结构如下,六个文件夹分别保存六个节点相关的配置信息。

分别在7000-7005六个文件夹中创建redis.conf文件,并添加配置,配置内容如下
          注意:端口号 port 与所在文件夹名相同;cluster-config-file 地址中的 7000 也必须跟文件夹名相同。
1.       port 7000
2.       cluster-enabled yes
3.       cluster-config-file /opt/app/redis_cluster/7000/nodes.conf
4.       cluster-node-timeout 5000
5.       appendonly yes

第四步、安装ruby依赖

集群的命令依赖ruby环境,因此需要先安装ruby,使用yum命令安装。

[root@localhost redis_cluster]# yum install ruby -y

第五步、安装rubygems依赖

安装完ruby后,再安装rubygems组件,依然使用yum命令安装。

[root@localhost redis_cluster]# yum install rubygems -y

第六步、安装gem-redis依赖

保持耐心,接下来需要安装gem-redis,这个组件其实是redis和ruby的接口。可以去网址https://rubygems.org/gems/redis/versions/查看当前的版本,我本地安装时未加版本号,默认安装最新版本(3.3.1),可以带上版本号安装指定版本,命令如下:

[root@localhost redis_cluster]# gem install redis -v 3.0.7

第七步、分别启动6个redis实例

至此,该安装的组件都已经安装完毕。然后,依次开启刚才定义好配置的六个redis节点。启动redis服务的命令如下:

[root@localhost redis_cluster]# redis-3.0.7/src/redis-server  7000/redis.conf &

这里可以注意到,每次创建时,配置不同的文件夹里的redis.conf。

都启动完了之后,可以使用命令检查下6个进程:

[root@localhost redis_cluster]# ps -ef | grep redis

第八步、创建集群

走到这一步时,恭喜你,redis-cluster即将完成。创建集群的命令也很简单:

[root@localhost src]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

创建过程中 redis-trib 会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入 “yes” , redis-trib 就会将这份配置应用到集群当中:

>>> Creating cluster

Connecting to node 127.0.0.1:7000: OK

Connecting to node 127.0.0.1:7001: OK

Connecting to node 127.0.0.1:7002: OK

Connecting to node 127.0.0.1:7003: OK

Connecting to node 127.0.0.1:7004: OK

Connecting to node 127.0.0.1:7005: OK

>>> Performing hash slots allocation on 6 nodes...

Using 3 masters:

127.0.0.1:7000

127.0.0.1:7001

127.0.0.1:7002

Adding replica 127.0.0.1:7003 to 127.0.0.1:7000

Adding replica 127.0.0.1:7004 to 127.0.0.1:7001

Adding replica 127.0.0.1:7005 to 127.0.0.1:7002

M: 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000

slots:0-5460 (5461 slots) master

M: 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001

slots:5461-10922 (5462 slots) master

M: 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002

slots:10923-16383 (5461 slots) master

S: 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003

replicates 2774f156af482b4f76a5c0bda8ec561a8a1719c2

S: e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004

replicates 2d03b862083ee1b1785dba5db2987739cf3a80eb

S: 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005

replicates 0456869a2c2359c3e06e065a09de86df2e3135ac

Can I set the above configuration? (type 'yes' to accept):

输入 yes 并按下回车确认之后, 集群就会将配置应用到各个节点, 并连接起(join)各个节点 —— 也即是, 让各个节点开始互相通讯:

Can I set the above configuration? (type 'yes' to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join......

>>> Performing Cluster Check (using node 127.0.0.1:7000)

M: 2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000

slots:0-5460 (5461 slots) master

M: 2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001

slots:5461-10922 (5462 slots) master

M: 0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002

slots:10923-16383 (5461 slots) master

M: 37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003

slots: (0 slots) master

replicates 2774f156af482b4f76a5c0bda8ec561a8a1719c2

M: e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004

slots: (0 slots) master

replicates 2d03b862083ee1b1785dba5db2987739cf3a80eb

M: 9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005

slots: (0 slots) master

replicates 0456869a2c2359c3e06e065a09de86df2e3135ac

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

一切正常输出以下信息:

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

四、Redis集群的测试

1、客户端连接集群

使用redis-cli命令,需要注意的命令中要带上-c,否则对于非本节点的slot,将不会进行重定位,而只是给出位置提示。可以选择连接集群中任意一个节点:

[root@localhost src]# ./redis-cli -c -p 7000

2、使用客户端查看集群信息

在客户端通过命令cluster info查看集群状态信息;使用cluster nodes查看当前所有节点的信息:


通过cluster nodes可以看到每个master节点被集群分配到的slot范围,如7000对应的是0-5460

3、存取值测试

根据redis-cluster的key值分配,name应该分配到节点7001[5798]上,上面显示redis cluster自动从7000跳转到了7001节点。

同理当取值的时候,也会判断被取值所在的位置,并自动跳转

对于值的存取,可以在集群中任意节点进行,cluster会自动跳转存取,包括slave节点,有点类似Http 302重定向

对于redis支持的其他数据类型如哈希、列表、集合、有序集合,此处不再测试,感兴趣的读者可以参考redis api自行研究。

4、集群节点选举

现在模拟将7001节点挂掉,按照redis-cluster原理,7001的从节点7004将被选举为主节点。使用redis-trib.rb check查看7001状态,可以看到7001Master对应的Slave是7004

Key“name“原来存在7001上:

接下来,杀死7001线程:

接下来,可以看到原来作为slave节点的7004升级为master节点,并且,查询key“name”,发现重定位到7004,替代了原来的7001节点。

现在我们恢复一下7001节点,使之重新启动,看是否自动重新加入到集群中以及充当M还是S:

7001重新加入集群,并且变成7004的slave节点。

五、总结

对客户端来说,整个cluster被看做是一个整体,客户端可以连接任意一个node进行操作,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node,这有点儿像浏览器页面的302 redirect跳转。

优点:

1、  redis cluster作为一个集群,无中心的组织结构,客户端可以任一连接一个节点;

2、  采用solt槽位的形式,增减节点不需要重启服务,集群性能佳;

3、  每个节点都和N-1个节点通信,所以要维护好这个集群架构的每个节点信息,不然会导致整个集群不可工作;

4、  自主监控,自动切换主从;

5、  目前Redis官网主推。

缺点:

1、  不能保证数据的强一致性,官网给出了两种可能丢失写命令的情况如下:

a)         客户端向主节点A发送一条写命令,主节点是首先立马向客户端返回命令回复,然后再把刚刚的执行写命令同步至从节点,追求性能所致该设计;

b)         网络分裂(network partition),如果时间很长导致A节点的从节点转换为主节点,然这中间可能存在客户端正在和A节点通信也就被孤立了,这样写的命令将丢失,如当网络恢复A又重新加入集群。

2、  Redis 3.0以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。

参考资料:

http://blog.csdn.net/fengshizty/article/details/51368004

http://blog.csdn.net/u011204847/article/details/51307044

http://blog.csdn.net/u014490157/article/details/52243996

http://www.cnblogs.com/junneyang/p/5899850.html

Redis Cluster集群搭建<原>的更多相关文章

  1. Redis Cluster集群搭建与配置

    Redis Cluster是一种服务器sharding分片技术,关于Redis的集群方案应该怎么做,请参考我的另一篇博客http://www.cnblogs.com/xckk/p/6134655.ht ...

  2. Redis Cluster集群搭建与应用

    1.redis-cluster设计 Redis集群搭建的方式有多种,例如使用zookeeper,但从redis 3.0之后版本支持redis-cluster集群,redis-cluster采用无中心结 ...

  3. Ubuntu 16.04下Redis Cluster集群搭建(官方原始方案)

    前提:先安装好Redis,参考:http://www.cnblogs.com/EasonJim/p/7599941.html 说明:Redis Cluster集群模式可以做到动态增加节点和下线节点,使 ...

  4. 【Redis】Redis cluster集群搭建

    Redis集群基本介绍 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation. Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行 ...

  5. Redis Cluster集群搭建后,客户端的连接研究(Spring/Jedis)(待实践)

    说明:无论是否已经搭建好集群,还是使用什么样的客户端去连接,都是必须把全部IP列表集成进去,然后随机往其中一个IP写. 这样做的好处: 1.随机IP写入之后,Redis Cluster代理层会自动根据 ...

  6. centos8平台redis cluster集群搭建(redis5.0.7)

    一,规划 redis cluster 1,cluster采用六台redis,3主3从 redis1    : ip: 172.17.0.2 redis2    : ip: 172.17.0.3 red ...

  7. Redis Cluster 集群搭建与扩容、缩容

    说明:仍然是伪集群,所有的Redis节点,都在一个服务器上,采用不同配置文件,不同端口的形式实现 前提:已经安装好了Redis,本文的redis的版本是redis-6.2.3 Redis的下载.安装参 ...

  8. redis cluster 集群搭建步骤和注意事项

    1.安装Ubuntu ,修改root的密码. sudo passwd  (apt-get update 更新系统) 2.安装 Gcc 和G++  sudo apt-get install build- ...

  9. Ubuntu 16.04 下Redis Cluster集群搭建

    实际操作如下: 准备工作 版本:4.0.2 下载地址:https://redis.io/download 离线版本:(链接: https://pan.baidu.com/s/1bpwDtOr 密码: ...

随机推荐

  1. 跟我学SharePoint 2013视频培训课程—— 版本控制以及内容审批(14)

    课程简介 第14天,怎样在SharePoint 2013中启用版本控制以及内容审批 视频 SharePoint 2013 交流群 41032413

  2. [转]python pickle模块

    持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让 ...

  3. 更新中国地区ip列表

    鉴于高总的IPIP.net的数据库的准确性,推荐使用下列源: https://github.com/17mon/china_ip_list/blob/master/china_ip_list.txt ...

  4. MySQL参数优化案例

    环境介绍 优化层级与指导思想 优化过程 最小化安装情况下的性能表现 优化innodb_buffer_pool_size 优化innodb_log_files_in_group&innodb_l ...

  5. 基于数据库构建分布式的ID生成方案

    在分布式系统中,生成全局唯一ID,有很多种方案,但是在这多种方案中,每种方案都有有缺点,下面我们之针对通过常用数据库来生成分布式ID的方案,其它方法会在其它文中讨论: 1,RDBMS生成ID: 这里我 ...

  6. MySql(十九):基础——自定义存储过程和函数

    MYSQL中创建存储过程和函数分别使用CREATE PROCEDURE和CREATE FUNCTION 使用CALL语句来调用存储过程,存储过程也可以调用其他存储过程 函数可以从语句外调用,能返回标量 ...

  7. JS两日期相减

    JS两日期相减,主要用到下面两个方法 dateObject.setFullYear(year,month,day) 方法 stringObject.split(separator) 方法 functi ...

  8. SQL Server 2008开启sa账户以及如何用JDBC进行连接

    做实验需要用Java与SQL Server连接,因为使用的 SQL 2008 Express Edition 是基于 Visual Studio2010 安装包安装时一起安装的,所以为了方便数据库的操 ...

  9. [svc]ext4文件删除&访问原理

    文件名信息存放在哪里? LINUX的文件名是存在父目录的block里面,并指向这个文件的inode节点,这个文件的inode节点再标记指向存放这个文件的block的数据块.我们删除一个文件,实际上并不 ...

  10. 【Unity】4.2 提升开发效率的捷径--导入 Unity 5.3.4 自带的资源包

    分类:Unity.C#.VS2015 创建日期:2016-04-06 一.简介 Unity自带的资源包也称为标准资源包.换言之,Unity自带的所有标准资源包导入到Unity项目中以后,都会放在Pro ...