简介

  为何要搭建Redis集群?Redis是在内存中保存数据的,而我们的电脑一般内存都不大,这也就意味着Redis不适合存储大数据,适合存储大数据的是Hadoop生态系统的Hbase或者是MogoDB。Redis更适合处理高并发,一台设备的存储能力是很有限的,但是多台设备协同合作,就可以让内存增大很多倍,这就需要用到集群。

  Redis集群搭建的方式有多种,例如使用客户端分片、Twemproxy、Codis等,但从redis 3.0之后版本支持redis-cluster集群,它是Redis官方提出的解决方案,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。其redis-cluster架构图如下:

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

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

解决的问题:

  • 1、单击版redis内存容量有限的问题
  • 2、高并发场景下,单击版redis性能不高
  • 3、单击版redis不具有高可用性,不能应用于生产环境

分布存储机制-槽

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Times New Roman",serif;
mso-font-kerning:1.0pt;}

1,redis-cluster 把所有的物理节点映射到[0-16383]slot 上,cluster 负责维护

node<->slot<->value

2,Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

例如三个节点:槽分布的值如下:

  • SERVER1:  0-5460
  • SERVER2:  5461-10922
  • SERVER3:  10923-16383

键到slot的映射算法:HASH_SLOT=CRC16(key)mod16384

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Times New Roman",serif;
mso-font-kerning:1.0pt;}

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Times New Roman",serif;
mso-font-kerning:1.0pt;}

容错机制-投票

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Times New Roman",serif;
mso-font-kerning:1.0pt;}

1,选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.  故障节点对应的从节点自动升级为主节点

2,什么时候整个集群不可用(cluster_state:fail)?

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

搭建Redis-Cluster

  redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。所以redis-cluster是需要至少6个redis组成,三个Master(主)A B C,三个Slave(从)A1 B1 C1。严格来说每个redis需要一台机器,但是一般6个reids使用3台机器也是可以的,只要A和A1,B和B1,C和C1不在同一台机器上即可。

伪集群(所有redis安装到同一台机器上)准备工作:

1,安装gcc,ruby

  1. Redis c 语言开发的。安装 redis 需要 c 语言的编译环境。如果没有 gcc 需要在线安装。
  2. yum install gcc-c++
  3.  
  4. 使用yum命令安装 ruby (我们需要使用ruby脚本来实现集群搭建)
  5. yum install ruby
  6. yum install rubygems

2,把文件放到服务器上并解压

  1. mkdir redis-cluster
  2. cd /usr/local/redis-cluster/
  3. rz 上传redis的安装包
  4. tar -zxvf redis-3.0.0.tar.gz

3,编译redis

  1. cd /usr/local/redis-cluster/redis-3.0.0
  2. make

4,安装6个reids实例

  1. cd /usr/local/redis-cluster/redis-3.0.0
  2. make install PREFIX=/usr/local/redis-cluster/redis-1
  3. make install PREFIX=/usr/local/redis-cluster/redis-2
  4. make install PREFIX=/usr/local/redis-cluster/redis-3
  5. make install PREFIX=/usr/local/redis-cluster/redis-4
  6. make install PREFIX=/usr/local/redis-cluster/redis-5
  7. make install PREFIX=/usr/local/redis-cluster/redis-6

5,复制redis配置文件到6个redis实例中

  1. cd /usr/local/redis-cluster/redis-3.0.0
  2.  
  3. cp redis.conf /usr/local/redis-cluster/redis-1/bin/
  4. cp redis.conf /usr/local/redis-cluster/redis-2/bin/
  5. cp redis.conf /usr/local/redis-cluster/redis-3/bin/
  6. cp redis.conf /usr/local/redis-cluster/redis-4/bin/
  7. cp redis.conf /usr/local/redis-cluster/redis-5/bin/
  8. cp redis.conf /usr/local/redis-cluster/redis-6/bin/

配置集群

1,修改每个redis实例的配置文件,修改端口以及开启集群能力

  1. vi /usr/local/redis-cluster/redis-1/bin/redis.conf
  2. daemonize yes 后台运行
  3. port 7001 redis实例的端口号
  4. cluster-enabled yes 开启集群能力
  5.  
  6. vi /usr/local/redis-cluster/redis-2/bin/redis.conf
  7. daemonize yes 后台运行
  8. port 7002 redis实例的端口号
  9. cluster-enabled yes 开启集群能力
  10.  
  11. vi /usr/local/redis-cluster/redis-3/bin/redis.conf
  12. daemonize yes 后台运行
  13. port 7003 redis实例的端口号
  14. cluster-enabled yes 开启集群能力
  15.  
  16. vi /usr/local/redis-cluster/redis-4/bin/redis.conf
  17. daemonize yes 后台运行
  18. port 7004 redis实例的端口号
  19. cluster-enabled yes 开启集群能力
  20.  
  21. vi /usr/local/redis-cluster/redis-5/bin/redis.conf
  22. daemonize yes 后台运行
  23. port 7005 redis实例的端口号
  24. cluster-enabled yes 开启集群能力
  25.  
  26. vi /usr/local/redis-cluster/redis-6/bin/redis.conf
  27. daemonize yes 后台运行
  28. port 7006 redis实例的端口号
  29. cluster-enabled yes 开启集群能力

2,启动6个redis实例

  1. cd /usr/local/redis-cluster/redis-1/bin/
  2. ./redis-server redis.conf
  3.  
  4. cd /usr/local/redis-cluster/redis-2/bin/
  5. ./redis-server redis.conf
  6.  
  7. cd /usr/local/redis-cluster/redis-3/bin/
  8. ./redis-server redis.conf
  9.  
  10. cd /usr/local/redis-cluster/redis-4/bin/
  11. ./redis-server redis.conf
  12.  
  13. cd /usr/local/redis-cluster/redis-5/bin/
  14. ./redis-server redis.conf
  15.  
  16. cd /usr/local/redis-cluster/redis-6/bin/
  17. ./redis-server redis.conf

3,安装ruby用户搭建redis集群的脚本

  1. cd /usr/local/redis-cluster
  2. rz 上传redis-3.0.0.gem
  3. gem install redis-3.0.0.gem

4,使用ruby脚本搭建redis集群(每个reids保证启动状态)

  1. cd /usr/local/redis-cluster/redis-3.0.0/src
  2. ./redis-trib.rb create --replicas 1 192.168.127.137:7001 192.168.127.137:7002 192.168.127.137:7003 192.168.127.137:7004 192.168.127.137:7005 192.168.127.137:7006
  1. >>> Creating cluster
  2. Connecting to node 192.168.25.140:7001: OK
  3. Connecting to node 192.168.25.140:7002: OK
  4. Connecting to node 192.168.25.140:7003: OK
  5. Connecting to node 192.168.25.140:7004: OK
  6. Connecting to node 192.168.25.140:7005: OK
  7. Connecting to node 192.168.25.140:7006: OK
  8. >>> Performing hash slots allocation on 6 nodes...
  9. Using 3 masters:
  10. 192.168.25.140:7001
  11. 192.168.25.140:7002
  12. 192.168.25.140:7003
  13. Adding replica 192.168.25.140:7004 to 192.168.25.140:7001
  14. Adding replica 192.168.25.140:7005 to 192.168.25.140:7002
  15. Adding replica 192.168.25.140:7006 to 192.168.25.140:7003
  16. M: 1800237a743c2aa918ade045a28128448c6ce689 192.168.25.140:7001
  17. slots:0-5460 (5461 slots) master
  18. M: 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d 192.168.25.140:7002
  19. slots:5461-10922 (5462 slots) master
  20. M: 436e88ec323a2f8bb08bf09f7df07cc7909fcf81 192.168.25.140:7003
  21. slots:10923-16383 (5461 slots) master
  22. S: c2a39a94b5f41532cd83bf6643e98fc277c2f441 192.168.25.140:7004
  23. replicates 1800237a743c2aa918ade045a28128448c6ce689
  24. S: b0e38d80273515c84b1a01820d8ecee04547d776 192.168.25.140:7005
  25. replicates 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d
  26. S: 03bf6bd7e3e6eece5a02043224497c2c8e185132 192.168.25.140:7006
  27. replicates 436e88ec323a2f8bb08bf09f7df07cc7909fcf81
  28. Can I set the above configuration? (type 'yes' to accept): yes
  29. >>> Nodes configuration updated
  30. >>> Assign a different config epoch to each node
  31. >>> Sending CLUSTER MEET messages to join the cluster
  32. Waiting for the cluster to join....
  33. >>> Performing Cluster Check (using node 192.168.25.140:7001)
  34. M: 1800237a743c2aa918ade045a28128448c6ce689 192.168.25.140:7001
  35. slots:0-5460 (5461 slots) master
  36. M: 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d 192.168.25.140:7002
  37. slots:5461-10922 (5462 slots) master
  38. M: 436e88ec323a2f8bb08bf09f7df07cc7909fcf81 192.168.25.140:7003
  39. slots:10923-16383 (5461 slots) master
  40. M: c2a39a94b5f41532cd83bf6643e98fc277c2f441 192.168.25.140:7004
  41. slots: (0 slots) master
  42. replicates 1800237a743c2aa918ade045a28128448c6ce689
  43. M: b0e38d80273515c84b1a01820d8ecee04547d776 192.168.25.140:7005
  44. slots: (0 slots) master
  45. replicates 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d
  46. M: 03bf6bd7e3e6eece5a02043224497c2c8e185132 192.168.25.140:7006
  47. slots: (0 slots) master
  48. replicates 436e88ec323a2f8bb08bf09f7df07cc7909fcf81
  49. [OK] All nodes agree about slots configuration.
  50. >>> Check for open slots...
  51. >>> Check slots coverage...
  52. [OK] All 16384 slots covered.

执行结果

5,向集群中添加数据

  1. cd /usr/local/redis-cluster/redis-1/bin
  2.  
  3. ./redis-cli -h 192.168.127.137 -p 7001 c
  4.  
  5. set name abc
  6.  
  7. get name

后续补充:(向集群中添加新节点、master、slave、指定master的slave)

  1. 添加master 前面是新添加的redis 后面是原来集群中的任意一个redis节点
  2. ./redis-trib.rb add-node 193.168.10.103:7000 193.168.10.101:7000
  3. 添加slave
  4. ./redis-trib.rb add-node --slave 193.168.10.103:7000 193.168.10.102:7001
  5. //为哪个master添加slave(master-id be4a31b6fcab6295dd14799b3b67ec128fbbd7f9 为masterid)
  6. ./redis-trib.rb add-node --slave --master-id be4a31b6fcab6295dd14799b3b67ec128fbbd7f9 193.168.10.103:7000 193.168.10.102:7001

ps:

添加或者删除节 需要考虑redis的槽的问题,保证槽不丢失,每个master上都分配一定的槽

一个集群中一共有16383个槽,里面是redis的数据,这个要分配好了。

可使用以下命令重新分配槽:

  1. ./redis-trib.rb reshard 193.168.10.101:7000

Normal
0

7.8 磅
0
2

false
false
false

EN-US
ZH-CN
X-NONE

/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Times New Roman",serif;
mso-font-kerning:1.0pt;}

Redis Cluster 伪集群的搭建的更多相关文章

  1. 超详细的 Redis Cluster 官方集群搭建指南

    今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细. 安装ruby环境 因为官方提供的创建集群的工具是用ruby写的,需要ruby2.2.2+版本支持,rub ...

  2. Redis Cluster(集群)的搭建

    一.Redis的下载.安装.启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: $ cd /opt $ wget http://download.redis.io/release ...

  3. Redis 3.0集群 Window搭建方案

    Redis 3.0集群 Window搭建方案 1.集群安装前准备 安装Ruby环境,安装:rubyinstaller-2.3.0-x64.exe http://dl.bintray.com/onecl ...

  4. zookeeper伪集群的搭建

    由于公司服务器数量的限制,我们往往没有那么多的服务器用来搭建zookeeper的集群,所以产生了伪集群的搭建,也就是将多个zookeeper搭建在同一台机器上. 准备工作: 1,一台服务器,我们这里用 ...

  5. ZooKeeper伪集群环境搭建

    1.从官网下载程序包. 2.解压. [dev@localhost software]$ tar xzvf zookeeper-3.4.6.tar.gz 3.进入zookeeper文件夹后创建data文 ...

  6. java:redis(redis安装配置,redis的伪集群配置)

    1.redis安装配置: .安装gcc : yum install gcc-c++ .使用FTP工具FileZilla上传redis安装包到linux根目录下(当前步骤可以替换为:在root目录下执行 ...

  7. STORM_0004_windows下zookeeper的伪集群的搭建

    -----------------------------------------------------START------------------------------------------ ...

  8. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置

    0x00 Redis简介 Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值 ...

  9. Redis Cluster 官方集群搭建指南

    安装ruby环境因为官方提供的创建集群的工具是用ruby写的,需要ruby2.2.2+版本支持,ruby安装需要指定openssl. 安装openssl $ wget https://www.open ...

随机推荐

  1. 从virustotal上下载病毒样本

    #!/usr/bin/env python import os import csv #import Queue import zipfile import requests import argpa ...

  2. CSS3 之 RGBa 可透明颜色

    在 CSS3 中,增加了一个 opacity 属性,允许开发者设置元素的透明度,现在 opacity 已被主流的现代浏览器支持,但 opacity 会把被设置的元素及其子元素同时设置为同一个透明度,这 ...

  3. 分布式_理论_03_2PC

    一.前言 五.参考资料 1.分布式理论(三)—— 一致性协议之 2PC 2.分布式理论(三) - 2PC协议

  4. vmware centos 连网方式

    1.自动获取IP地址 虚拟机使用桥接模式,相当于连接到物理机的网络里,物理机网络有DHCP服务器自动分配IP地址. #dhclient 自动获取ip地址命令 #ifconfig 查询系统里网卡信息,i ...

  5. 关于/usr/bin/ld: cannot find -lcrypto 的错误

    Linux下 build code 时,要做 -lssl, -lcrypto 的链接,出现类似下面的错误: /usr/bin/ld: cannot find -lcrypto /usr/bin/ld: ...

  6. FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.

    /******************************************************************************** * FAT-fs (mmcblk0p ...

  7. 20179203 《Linux内核原理与分析》第十一周作业

    一.环境的使用和搭建 首先我的攻击机和靶机都搭建在虚拟机上,选用的是VMware Workstation Pro虚拟机. 攻击机选用的是Linux kali 2017.2版本,而靶机安装的是XP sp ...

  8. LeetCode Beautiful Arrangement

    原题链接在这里:https://leetcode.com/problems/beautiful-arrangement/description/ 题目: Suppose you have N inte ...

  9. 自定义Django Command

    转: django的command命令是要放在一个app的management/commands目录下.python2环境中,请确保management和management/commands目录内都 ...

  10. 如何开启MySQL远程访问权限 允许远程连接

    1.改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 " ...