一、Redis集群搭建说明

基于三台虚拟机部署9个节点,一台虚拟机三个节点,创建出4个master、4个slave的Redis集群。

Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),因为我这里有三台虚拟机,因此每台虚拟机部署了3个节点。

1、下载地址:

https://redis.io/download

2、解压(三个节点,这里仅以master节点为例)

[root@master mnt]# tar -zxvf redis-4.0.2.tar.gz
[root@master mnt]# mv  redis-4.0.2 redis

3、由于我下载的是最新版未编译版本,所以安装之前需要安装c的依赖包(三个节点,这里仅以master节点为例)

[root@master mnt]# yum install -y gcc-c++

4、执行make操作(三个节点,这里仅以master节点为例)

[root@master mnt]# cd redis
[root@master mnt]# make
等待执行完成

5、将 redis-trib.rb 复制到 /usr/local/bin 目录下(三个节点,这里仅以master节点为例)

[root@master redis]# cd src/c
[root@master src] cp redis-trib.rb /usr/local/bin/ 

6、创建Redis节点(三个节点,这里仅以master节点为例)

在master节点:进入redis目录,创建redis_cluster 目录;

[root@master redis]# pwd
/mnt/redis
[root@master redis]# mkdir redis_cluster

在redis_cluster目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这两个目录中

[root@master redis]# cd redis_cluster/
[root@master redis_cluster]# mkdir 7000
[root@master redis_cluster]# mkdir 7001
[root@master redis_cluster]# mkdir 7002
[root@master redis_cluster]# ll 
总用量 0
drwxr-xr-x 2 root root 6 4月 26 11:39 7000
drwxr-xr-x 2 root root 6 4月 26 11:39 7001
drwxr-xr-x 2 root root 6 4月 26 11:39 7002

[root@master redis]# pwd
/mnt/redis
[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7000

[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7001

[root@master redis]# cp redis.conf /mnt/redis/redis_cluster/7002

分别修改这两个配置文件,修改内容如下:

[root@master redis_cluster]# cd 7000
[root@master 7000]# ls
redis.conf

文件配置:
port 7000 //端口7000
bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志
[root@master 7001]# ls
redis.conf
文件配置:
port 7001 //端口7001
bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7001.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7001.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

[root@master 7002]# ls
redis.conf
文件配置:
port 7002 //端口7001
bind 192.168.200.100     //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7002.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7002.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
appendonly no   //aof日志开启 有需要就开启,它会每次写操作都记录一条日志

然后在节点slave01、slave02下重复第6步操作,把目录改为7003、7004、7005、7006、7007、7008,相应的配置文件也是如此。

7、第6步配置完成之后,启动各个节点

master节点:
[root@master mnt]# cd /mnt/redis/src/
[root@master src]# redis-server /mnt/redis/redis_cluster/7000/redis.conf
[root@master src]# redis-server /mnt/redis/redis_cluster/7001/redis.conf
[root@master src]# redis-server /mnt/redis/redis_cluster/7002/redis.conf

报错:
[root@master src]# redis-server redis_cluster/7000/redis.conf
-bash: redis-server: 未找到命令
解决:
[root@master src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
[root@slav01 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
[root@slave02 src]# ln -s /mnt/redis/src/redis-server /usr/bin/redis-server
slava01节点:
[root@slave01 src]# redis-server /mnt/redis/redis_cluster/7003/redis.conf 
[root@slave01 src]# redis-server /mnt/redis/redis_cluster/7004/redis.conf
[root@slave01 src]# redis-server /mnt/redis/redis_cluster/7005/redis.conf
slave02节点:
[root@slave02 src]# redis-server /mnt/redis/redis_cluster/7006/redis.conf 
[root@slave02 src]# redis-server /mnt/redis/redis_cluster/7007/redis.conf
[root@slave02 src]# redis-server /mnt/redis/redis_cluster/7008/redis.conf

8、检查Redis的启动情况

master节点:
slave01节点:

slave02节点:

9、创建集群

创建集群之前先安装ruby和gem

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

说明:在master、slave01、slave02节点执行gem install redis 报错:

redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2
解决办法是 先安装rvm,再把ruby版本提升至2.3.3
1.安装curl
sudo yum install curl
2. 安装RVM
curl -L get.rvm.io | bash -s stable
报错:

解决:分别执行:

curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
 curl -sSL https://rvm.io/pkuczynski.asc | gpg2 --import -

再次执行:
curl -L get.rvm.io | bash -s stable 
出现如下情况,说明成功


3、source /usr/local/rvm/scripts/rvm
4. 查看rvm库中已知的ruby版本
rvm list known
5. 安装一个ruby版本
rvm install 2.3.3
6. 使用一个ruby版本
rvm use 2.3.3
7. 删除默认版本
rvm remove 2.0.0
8. 查看一个已知版本
ruby --version
9. 再安装redis就可以了
gem install redis
10、如下说明安装成功

[root@slave01 7002]# gem install redis
 Fetching: redis-4.1.0.gem (100%)
 Successfully installed redis-4.1.0
 Parsing documentation for redis-4.1.0
 Installing ri documentation for redis-4.1.0
 Done installing documentation for redis after 2 seconds
 1 gem installed

然后再创建集群(因为如下这个是通过ruby工具实现的,所以执行这个之前先安装了ruby):

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第5步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。

redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008

结果:

[root@master ~]# redis-trib.rb  create  --replicas  1 192.168.200.100:7000 192.168.200.100:7001 192.168.200.100:7002 192.168.200.101:7003  192.168.200.101:7004 192.168.200.101:7005 192.168.200.102:7006  192.168.200.102:7007 192.168.200.102:7008
>>> Creating cluster
>>> Performing hash slots allocation on 8 nodes...
Using 4 masters:
192.168.200.100:7001
192.168.200.101:7003
192.168.200.102:7006
192.168.200.100:7002
Adding replica 192.168.200.101:7004 to 192.168.200.100:7001
Adding replica 192.168.200.102:7007 to 192.168.200.101:7003
Adding replica 192.168.200.101:7005 to 192.168.200.102:7006
Adding replica 192.168.200.102:7008 to 192.168.200.100:7002
M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
slots:0-4095 (4096 slots) master
M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
slots:12288-16383 (4096 slots) master
M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
slots:4096-8191 (4096 slots) master
S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
slots:8192-12287 (4096 slots) master
S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
replicates dbab7ff79b07a7506f7b34da18fb242545476181
S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
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 192.168.200.100:7001)
M: 39a9030929f691a63a4960e5f7fba90b15bdf477 192.168.200.100:7001
slots:0-4095 (4096 slots) master
1 additional replica(s)
M: e5bc3280725eeb017f6b99894738e96d039a1cf8 192.168.200.100:7002
slots:12288-16383 (4096 slots) master
1 additional replica(s)
S: a7eabb7752d507b558c43d3323fbdae2ad93c6a7 192.168.200.102:7008
slots: (0 slots) slave
replicates e5bc3280725eeb017f6b99894738e96d039a1cf8
S: 3629e37c0cc43b89dbce2492a5cc6850f505f86b 192.168.200.101:7004
slots: (0 slots) slave
replicates 39a9030929f691a63a4960e5f7fba90b15bdf477
M: db55b7bfc09b45a5b6beaed32709ce004e0f210e 192.168.200.102:7006
slots:8192-12287 (4096 slots) master
1 additional replica(s)
M: dbab7ff79b07a7506f7b34da18fb242545476181 192.168.200.101:7003
slots:4096-8191 (4096 slots) master
1 additional replica(s)
S: 43dd4ba558794561e1445a7cf03dec26d94fc880 192.168.200.102:7007
slots: (0 slots) slave
replicates dbab7ff79b07a7506f7b34da18fb242545476181
S: d4e021e5fc98719f177aa65cbceaeb0148bed269 192.168.200.101:7005
slots: (0 slots) slave
replicates db55b7bfc09b45a5b6beaed32709ce004e0f210e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试一下,进行集群验证:

  在192.168.200.100节点上连接192.168.200.102节点的7008端口:

[root@master src]# ./redis-cli -h 192.168.200.102 -c -p 7008
192.168.200.102:7008> set hello world
-> Redirected to slot [866] located at 192.168.200.100:7001
OK

创建了一个key为hello,值为world。
查看:
然后在通过192.168.200.101节点访问该数据:

说明:上面可以看到进行get和set的时候节点跳转到了7000端口所在的节点(192.168.200.100)。详细请查阅原理如下:

以上说明:Redis集群已经搭建好啦!!!!!!!!!!!!!!!!!!!!!!

查看集群状态:

二、简单说一下原理

1、Redis clutser在设计的时候,就考虑到了去中心话,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取其他节点的数据。

2、Redis集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽(hash slot)的方式来分配的。redis cluster默认分配了16384个槽(slot),当我们set一个key时,会采用CRC16算法来取模得到所属的slot,然后将这个key分配到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16834.所以我们在测试的时候可以看到set和get的时候,直接跳转到了7000端口的节点。

3、Redis集群会把数据存在一个master的主节点,然后在这个master和其对应的slave之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

Redis学习之路(二)Redis集群搭建的更多相关文章

  1. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

  2. Redis学习笔记(九)——集群

     一.概述 Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代. Redis Cluster是去中心化,去中间件,也就是说,集群中的每个节点都是平等的关 ...

  3. redis 5.0.3 讲解、集群搭建

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

  4. redhat6.5 redis单节点多实例3A集群搭建

    在进行搭建redis3M 集群之前,首先要明白如何在单节点上完成redis的搭建. 单节点单实例搭建可以参看这个网:https://www.cnblogs.com/butterflies/p/9628 ...

  5. kafka学习(二)-zookeeper集群搭建

    zookeeper概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名 服务等.Zookeeper是h ...

  6. Zookeeper(二) zookeeper集群搭建 与使用

    一.zookeeper集群搭建 鉴于 zookeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop01,hadoop02,hadoop03    1. ...

  7. Redis学习笔记(十七) 集群(上)

    Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移操作. 一个Redis集群通常由多个节点组成,在刚开始的时候每个节点都是相互独立的,他们处于一个只包含 ...

  8. Zookeeper学习之路 (二)集群搭建

    ZooKeeper 软件安装须知 鉴于 ZooKeeper 本身的特点,服务器集群的节点数推荐设置为奇数台.我这里我规划为三台, 为别为 hadoop1,hadoop2,hadoop3 ZooKeep ...

  9. Redis 学习之路 (010) - redis命令手册

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...

  10. Etcd学习(二)集群搭建Clustering

    1.单个etcd节点(测试开发用) 之前我一直开发测试一直是用的一个Etcd节点,然后启动命令一直都是直接打一个etcd(我已经将etcd安装目录的bin目录加入到PATH环 境变量中),然后启动信息 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:containers容器部件GroupBox分组框介绍

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.主要属性 GroupBox分组框是一个对多个部件进行编组的框架容器,可以带有标题(title属性 ...

  2. 利用反射注册SpringCache的RedisCacheManager缓存信息

    项目开发中,SpringCache是一个非常方便的工具,但是在配置信息注册时,用枚举方式可以满足遍历,但却无法应用在@Cacheable注解里,因此可以通过静态类的方式,借助反射完成缓存信息注册. 配 ...

  3. Kubernetes的Local Persistent Volumes使用小记

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  4. python——pandas技巧(处理dataframe每个元素,不用for,而用apply)

    用apply处理pandas比用for循环,快了无数倍,测试如下: 我们有一个pandas加载的dataframe如下,features是0和1特征的组合,可惜都是str形式(字符串形式),我们要将其 ...

  5. SpringCloud Alibaba学习笔记

    目录 目录 目录 导学 为什么学 学习目标 进阶目标 思路 Spring Cloud Alibaba的重要组件 环境搭建 Spring Boot必知必会 Spring Boot特性 编写第一个Spri ...

  6. ARC109F - 1D Kingdom Builder

    一行格子,其中小于\(0\)的格子为白色,大于\(n\)的格子为黑色,中间的格子颜色由题目给出. 有一些格子需要被标记.标记按照以下规则进行:选择一个颜色\(c\),找到一个未标记的 旁边有标记点的 ...

  7. POJ2466 棋盘覆盖

    一张\(n*m\)的棋盘,有\(k\)个点不能被覆盖,问其余点能不能被\(1*2\)的小矩形完全覆盖,多测 这题先输入\(m\)是什么鬼啊!!! 其实是一个比较裸的二分图判定,把\(k\)个点挖去然后 ...

  8. 查看java程序中对象占用空间大小

    需要引入的jar包: <dependency> <groupId>com.carrotsearch</groupId> <artifactId>java ...

  9. mysql聚簇索引和非聚簇索引

    聚簇索引 InnoDB使用的是聚簇索引 将数据与主键索引放在了一起,索引的叶子节点保存了行数据,找到了主键索引,即找到了行数据. 辅助索引记录了主键的位置,所以查询where name= xxx 时, ...

  10. Python爬虫之BeautifulSoup库

    1. BeautifulSoup 1.1 解析库 1)Python标准库 # 使用方法 BeautifulSoup(markup, "html.parser") # 优势 Pyth ...