单台Linux服务器实现Redis群集

一、Redis简介

Redis是目前大规模使用的缓存中间件,由于它强大、高效、便捷的功能,得到了广泛的使用。

Redis在2015年发布了3.0.0,官方就已经支持了redis cluster。redis cluster在设计的时候,就考虑到了去中心化、去中间件。也就是说,集群中的每个节点都是平等的关系,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需连接集群中的任意一个节点,就可以获取到其他节点的数据。

二、Redis集群介绍

Redis集群是一个可以在多个Redis节点之间进行数据共享的设施。Redis集群不支持那些需要同时处理多个键的redis命令,因为执行这些命令需要在多个节点之间移动数据,并且在高负载的情况下,这些命令将降低redis集群的性能,并导致不可预测的行为。

Redis集群通过分区来提供一定程度的可用性,即使集群中一部分节点失效或者无法通信,集群也可以继续处理命令请求。

三、Redis集群原理

Redis是如何合理发呢配这些节点和数据的?

Redis并没有采用传统的一致性哈希来分配数据,而是采用了另一种叫做哈希槽的方式分配的。Redis cluster默认分配了16384个slot,当我们set一个key时,会采用CRC16算法(循环冗余校验码)来获取所属的slot,然后将这个key分到哈希槽区间的节点山,具体算法:CRC16(key)%16384。

注意:必须是三个以上的主节点才可创建群集,否则群集会失败。

Redis集群在工作时其中某一台主节点宕机后有其他的master节点进行投票和选举,并且投票的结果时一半以上才能确定主节点宕机,如果主节点宕机一半以上整个集群的状态就是fail。这就是为什么至少需要三台主节点才可搭建Redis群集环境。

Redis群集的好处:

  • 1)具有将数据自动切分split到多个节点上的能力;
  • 2)当群集中的一部分节点失效或者无法进行通讯时,仍然具有继续处理命令请求的能力;
  • 3)所有的rredis节点彼此互联,内部使用二进制协议优化传输速度和带宽;二进制协议:传输过程中给有消息头和消息实体。如果消息头长度固定。通过解析消息头就可以得到消息实体;
  • 4)节点的fail是通过集群中超过半数的节点检测失效时才生效;
  • 5)客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;

Redis采用的之中哈希槽的分配方式有好也有坏,好处就是很清晰,比如:我想增加一个节点D,redis cluster的这种做法是从各个节点的前面各拿取一部分slot到D上。大致就会变成这样:
节点A覆盖1365-5460 节点B覆盖6827-10922 节点C覆盖12288-16383 节点D覆盖01364,5461-6826,10923-12287 同样删除一个节点也是类似,移动完成后就可以删除这个 节点了;

所以redis cluster就是这样一个形状,如图:

四、Redis-cluster主从模式

Redis-cluster为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点。主节点提供数据存取,从节点则是从主节点获取数据备份;当主节点宕机后,就会由这个从节点中选取一个来充当主节点,从而保证群集不会挂掉。

五、案例实施

关于多台Linux实现redis群集可以参考Redis数据库群集

(1)案例环境

由于是使用单台服务器实现集群环境,所以就根据其端口来进行区分!

(2)案例实施

下载Redis群集

1)创建六个节点

[[email protected] ~]# tar zxf redis-4.0.14.tar.gz -C /usr/local
[[email protected] ~]# cd /usr/local/redis-4.0.14/
[[email protected] redis-4.0.14]# make && make install     //编译安装redis
[[email protected] ~]# mkdir -p /usr/local/cluster/700{0..5}
//由于是在单台创建多个节点,所以事先把这个目录创建好,用于存放各个节点的配置信息
[[email protected] ~]# cp /usr/local/redis-4.0.14/redis.conf /usr/local/cluster/7000
//将redis原本的配置文件复制一份
[[email protected] ~]# vim /usr/local/cluster/7000/redis.conf       //编译7000节点的配置文件
  92 port 7000                             //修改监听端口
 158 pidfile /var/run/redis_7000.pid              //修改pid文件名
 672 appendonly yes                 //开启aof持久化
 676 appendfilename "appendonly-7000.aof"           //修改持久化的配置文件名
 814 cluster-enabled yes                   //开启redis的群集模式
 822 cluster-config-file nodes-7000.conf     //修改群集的配置文件名
 828 cluster-node-timeout 5000             //修改群集的等待时间
[[email protected] ~]# cd /usr/local/cluster/7000
[[email protected] 7000]# redis-server redis.conf          //必须进入相应的目录启动redis服务

不过启动时,会出现这样的错误,如图:

[[email protected] 7000]# vim /usr/local/cluster/7000/redis.conf          //编写7000节点的配置文件
 136 daemonize yes                      //开启守护进程让其在后台运行
[[email protected] 7000]# echo 512 > /proc/sys/net/core/somaxconn
[[email protected] 7000]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[[email protected] 7000]# sysctl -p
vm.overcommit_memory = 1
[[email protected] 7000]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
//根据刚才提示的警告信息对redis服务简单进行一个优化

2)启动各个节点

[[email protected] 7000]# redis-server redis.conf                  //进入其目录运行redis服务
[[email protected] 7000]# cp redis.conf ../7001
[[email protected] 7000]# cp redis.conf ../7002
[[email protected] 7000]# cp redis.conf ../7003
[[email protected] 7000]# cp redis.conf ../7004
[[email protected] 7000]# cp redis.conf ../7005
//因为需要开启六个节点,所以需要将其配置文件分为六份
[[email protected] 7000]# sed -i s/7000/7001/g ../7001/redis.conf
[[email protected] 7000]# sed -i s/7000/7002/g ../7002/redis.conf
[[email protected] 7000]# sed -i s/7000/7003/g ../7003/redis.conf
[[email protected] 7000]# sed -i s/7000/7004/g ../7004/redis.conf
[[email protected] 7000]# sed -i s/7000/7005/g ../7005/redis.conf
//因为六个节点都是根据端口来区分,所以配置文件中只需修改以端口号命名的内容
[[email protected] 7000]# cd ../7001 && redis-server redis.conf
[[email protected] 7001]# cd ../7002 && redis-server redis.conf
[[email protected] 7002]# cd ../7003 && redis-server redis.conf
[[email protected] 7003]# cd ../7004 && redis-server redis.conf
[[email protected] 7004]# cd ../7005 && redis-server redis.conf
//都是进入其相应的目录启动服务
[[email protected] 7005]# netstat -anpt | grep redis
tcp        0      0 127.0.0.1:7004          0.0.0.0:*               LISTEN      5615/redis-server 1
tcp        0      0 127.0.0.1:7005          0.0.0.0:*               LISTEN      5620/redis-server 1
tcp        0      0 127.0.0.1:17000         0.0.0.0:*               LISTEN      5524/redis-server 1
tcp        0      0 127.0.0.1:17001         0.0.0.0:*               LISTEN      5592/redis-server 1
tcp        0      0 127.0.0.1:17002         0.0.0.0:*               LISTEN      5605/redis-server 1
tcp        0      0 127.0.0.1:17003         0.0.0.0:*               LISTEN      5610/redis-server 1
tcp        0      0 127.0.0.1:17004         0.0.0.0:*               LISTEN      5615/redis-server 1
tcp        0      0 127.0.0.1:17005         0.0.0.0:*               LISTEN      5620/redis-server 1
tcp        0      0 127.0.0.1:7000          0.0.0.0:*               LISTEN      5524/redis-server 1
tcp        0      0 127.0.0.1:7001          0.0.0.0:*               LISTEN      5592/redis-server 1
tcp        0      0 127.0.0.1:7002          0.0.0.0:*               LISTEN      5605/redis-server 1
tcp        0      0 127.0.0.1:7003          0.0.0.0:*               LISTEN      5610/redis-server 1
//查看端口都已经在监听,剩下的17000这样的端口是群集之间沟通使用的

3)为各个节点分配哈希槽,并加入群集环境

[[email protected] 7005]# redis-cli -p 7000              //随便指定一个端口进入redis终端
127.0.0.1:7000> CLUSTER INFO                  //查看群集详细信息

cluster_state:fail                          //发现现在是fail(失败)的状态
……………………                       //省略 部分内容
127.0.0.1:7000> CLUSTER NODES           //查看群集节点
d554512885b2679d432d0d6b011c9ea56ea1ebeb :[email protected] myself,master - 0 0 0 connected
//发现加入群集的节点只有7000这个节点
127.0.0.1:7000> exit
[[email protected] 7005]# redis-cli -h 127.0.0.1 -p 7000 cluster addslots {0..5461}
OK
[[email protected] 7005]# redis-cli -h 127.0.0.1 -p 7001 cluster addslots {5462..10922}
OK
[[email protected] 7005]# redis-cli -h 127.0.0.1 -p 7002 cluster addslots {10923..16383}
OK
//为各个群集阶段分配hash槽
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7000
OK
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7001
OK
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7002
OK
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7003
OK
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7004
OK
127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7005
OK
//用来连接不同的开启集群支持的 Redis 节点,以进入工作集群
[[email protected] 7005]# redis-cli -p 7000
127.0.0.1:7000> CLUSTER INFO
cluster_state:ok                     //再次查看群集状态发现已经是“ok”的状态
……………………                   //省略部分内容
127.0.0.1:7000> CLUSTER NODES                   //再次查看群集节点信息

如图:

预设环境是7000是7003的主节点、7001是7004的主节点、7002是7005的主节点,操作如下:

[[email protected] 7005]# redis-cli -p 7003          //连接7003的节点
127.0.0.1:7003> CLUSTER REPLICATE d554512885b2679d432d0d6b011c9ea56ea1ebeb
OK           //这个是7000的ID号
127.0.0.1:7003> exit
[[email protected] 7005]# redis-cli -p 7004          //连接7004的节点
127.0.0.1:7004> CLUSTER REPLICATE 182a55ee8b38afbf5b48209979f220dc4da7c14a
OK                    //这个是7001的ID号
127.0.0.1:7004> exit
[[email protected] 7005]# redis-cli -p 7005          //连接7005的节点
127.0.0.1:7005> CLUSTER REPLICATE 82b62bda5b31d8ee27aee8d7320663ee86276e9f
OK                   //这个是7002的ID号
127.0.0.1:7005> CLUSTER NODES           //再次查看群集节点的详细信息

如图:

4)存取数据进行测试

[[email protected] 7005]# redis-cli -p 7000            //进入节点插入数据进行测试
127.0.0.1:7000> set name lzj
(error) MOVED 5798 127.0.0.1:7001
//发现出现错误,提示应该是7001的节点来存储这个数据
127.0.0.1:7000> exit
[[email protected] 7005]# redis-cli -p 7000 -c          //使用“-c”选项表示进入群集中
127.0.0.1:7000> set name lzj                  //重新插入数据
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK               //提示将数据存放在7001节点上
127.0.0.1:7001> get name               //获取键所对应的值
"lzj"

5)模拟单个节点发生故障

[[email protected] 7001]# cd ../7001
[[email protected] 7001]# redis-cli -p 7001 shutdown
//模拟7001节点故障
[[email protected] 7001]# redis-cli -p 7000
127.0.0.1:7000> CLUSTER NODES            //进入节点查看群集节点的状态
127.0.0.1:7004> get name
"lzj"

如图:

[[email protected] 7001]# redis-server redis.conf
//进入7001对应的目录,启动redis节点
[[email protected] 7001]# redis-cli -p 7000
127.0.0.1:7000> CLUSTER NODES               //进入群集查看群集状态

如图:

6)安装ruby软件

下载ruby所需软件包

[[email protected] ~]# yum -y install rpm-build openssl openssl-devel
//安装ruby所需依赖
[[email protected] ~]# tar zxf ruby-2.3.1.tar.gz -C /usr/src
cd [[email protected] ~]# cd /usr/src/ruby-2.3.1/
[[email protected] ruby-2.3.1]# ./configure --prefix=/usr/local/ruby && make && make install
//编译安装ruby,可能时间较长
[[email protected] ~]# ln -s /usr/local/ruby/bin/* /usr/local/bin
//为gem命令创建符号链接
[[email protected] ~]# ln -s /usr/local/redis-4.0.14/src/* /usr/local/bin
//为redis常用命令创建符号链接
[[email protected] ~]# gem install redis-3.3.0.gem
//使用gem命令安装Redis群集必备软件包

7)添加主节点7006

[[email protected] ~]# redis-trib.rb check 127.0.0.1:7000
//检查群集节点状态

如图:

[[email protected] ~]# mkdir /usr/local/cluster/7006
[[email protected] ~]# cd /usr/local/cluster/7006
//创建相应目录并进入
[[email protected] 7006]# cp ../7000/redis.conf .
[[email protected] 7006]# sed -i s/7000/7006/g redis.conf
//复制配置文件、并进行修改
[[email protected] 7006]# redis-server redis.conf
//修改7006节点的redis服务
[[email protected] ~]# redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
//将7006节点加入到7000节点群集环境中(默认是master状态)
[[email protected] ~]# redis-trib.rb check 127.0.0.1:7000
//再次查看群集状态

如图:

截图时,不小心挡上了,可以发现7006这个节点是没有槽点的,不能存储数据的!

[[email protected] ~]# redis-trib.rb reshard 127.0.0.1:7000                //分配7000这个群集的槽点
How many slots do you want to move (from 1 to 16384)? 4096    //针对多少个节点进行操作
What is the receiving node ID?7add42108b3fc3e9c0af2846fb06ceaf8b172c87
//给7006节点,这里输入的是7006节点的ID号
Source node #1:all       //从所有节点开始分配
[[email protected] ~]# redis-trib.rb check 127.0.0.1:7000
//再次查看群集状态

如图:

8)添加从节点7007

[[email protected] ~]# mkdir /usr/local/cluster/7007
[[email protected] ~]# cd /usr/local/cluster/7007
//创建相应目录并进入
[[email protected] 7007]# cp ../7000/redis.conf .
[[email protected] 7007]# sed -i s/7000/7007/g redis.conf
//复制配置文件并进行修改
[[email protected] 7007]# redis-server redis.conf
//启动7007节点redis服务
[[email protected] ~]# redis-trib.rb add-node --slave 127.0.0.1:7007 127.0.0.1:7000
//往7000群集中添加7007节点,而且指定其为slave
[[email protected] ~]# redis-trib.rb check 127.0.0.1:7000
//查看群集状态

如图:

9)添加从节点7008

[[email protected] ~]# mkdir /usr/local/cluster/7008
[[email protected] ~]# cd /usr/local/cluster/7008
[[email protected] 7008]# cp ../7000/redis.conf .
[[email protected] 7008]# sed -i s/7000/7008/g redis.conf
[[email protected] 7008]# redis-server redis.conf
//创建相应目录并进行修改配置文件,启动服务
[[email protected] ~]# redis-trib.rb add-node --slave --master-id 7add42108b3fc3e9c0af2846fb06ceaf8b172c87 127.0.0.1:7008 127.0.0.1:7000
//向群集中添加节点,指定其为salve,并指定主节点ID号(7006节点的ID)
[[email protected] ~]# redis-trib.rb check 127.0.0.1:7000
//查看群集状态

如图:

10)将7000节点删除

[[email protected] ~]# redis-trib.rb reshard 127.0.0.1:7000                                     //对群集节点进行操作
How many slots do you want to move (from 1 to 16384)? 4096                     //针对多个节点进行操作
What is the receiving node ID?
7add42108b3fc3e9c0af2846fb06ceaf8b172c87             //这里输入将删除的槽节点给那个节点(7006节点)
Source node d554512885b2679d432d0d6b011c9ea56ea1ebeb    //输入删除的节点
Source node  done
Do you want to proceed with the proposed reshard plan (yes/no)? yes
//表示确认
[[email protected] ~]# redis-trib.rb del-node 127.0.0.1:7000 d554512885b2679d432d0d6b011c9ea56ea1ebeb
//删除7000群集中的7000节点
[[email protected] ~]# redis-trib.rb check 127.0.0.1:7001        //查看群集状态

如图:

——————————————本文到此结束,感谢阅读————————————————————

原文地址:https://blog.51cto.com/14157628/2460634

时间: 2024-07-30 11:06:04

单台Linux服务器实现Redis群集的相关文章

单台Linux服务器运行多个独立的tomcat服务

实验目的: 1.在同一台服务器部署多个Tomcat,通过不同的端口能让服务器上的多个项目独立运行. 2.有人就会问了我弄一个tomcat部署多个项目不就行了,但是你要想到 假如你这个Tomcat 蹦了呢 那岂不是这台服务器上的所有项目都挂了.所以还是得分开以防万一. 实验环境: 1.CentOS 6.7 2.tomcat-8.0.45 3.jdk 1.8.0_144 配置好Tomcat.JDK.怎么配置看前面几章有讲到Tomcat怎么配置的,这里我就不多说了 配置好第一个tomcat之后我们复制

使用Python之paramiko模块和threading实现多线程登录多台Linux服务器

有时候我们需要在多台Linux服务器上面执行同样的命令,或者同样的操作,如果我们每一台单独登录上去做这样太麻烦了,所以我们可以考虑使用自动化脚本来实现.我这里使用Python多线程的方式,这样速度更快,如果使用Shell只能一台完了执行另外一台效率不高. 针对这样的需要写了一个Python脚本来完成这样的工作,大致实现了我需要的效果 实现代码: #!/usr/bin/python #*-*coding:utf8*-* """ 此脚本适用于批量登录到Linux操作系统,并执行一

多台linux服务器时间同步

1,设置A机时间服务器: a,修改 /etc/ntp.conf,如下: # Undisciplined Local Clock. This is a fake driver intended for backup# and when no outside source of synchronized time is available.server 127.127.1.0 # local clock#fudge 127.127.1.0 stratum 10 b, /etc/init.d/ntpd

单台linux下配置多个tomcat

前几天开发需求单台linux安装多个tomcat,研究了下,配置如下 1,在/usr/local/下部署两个tomcat7,tomcat8 .两个版本不一样哦. 2,修改/etc/profile文件,加入下面内容 vi  /etc/profile export JAVA_HOME=/usr/java/jdk1.8.0_92PATH=$JAVA_HOME/bin:$PATHCLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jarexport

Linux本地登录另一台Linux服务器命令

要从Linux下通过SSH登录另一台Linux服务器非常容易--前提是在远 程服务器上拥有一个用户账号.打开Shell终端,执行以下命令 ssh -l login_name hostname 把login_name替换成真实的用户账号,把hostname替换成服务器主机名(或者IP地址).下面这条命令以liu 用户的身份登录到IP地址为192.168.25.99的Linux服务器上. [[email protected] ~]# ssh -l root 192.168.25.99[email p

两台Linux服务器在局域网之间传输文件

1.1 实验环境: 服务器操作系统:CentOS6.7=192.168.24.37 客户端操作系统:CentOS6.7=192.168.24.36 虚拟机:VMware Workstation 1.2 实验背景 从一台服务器上的文件远程复制到另一台服务器上的方法很多,今天在这里sky采用Linux scp命令来完成此任务.即从服务器端拷贝一份源码文件"mysql-5.6.20.tar.gz"到客户端下. 1.3 实验步骤 scp –r 远程用户名 @IP 地址 : 文件名  本地目录

Linux 服务器上Redis安装和配置

1.下载安装redis 在Linux服务器上,命令行执行以下命令(cd ./usr local/src 一般源码放在这里(推荐源码安装)) wget http://download.redis.io/releases/redis-3.0.7.tar.gz tar xzf redis-3.0.7.tar.gz cd redis-3.0.7 makemake allmake install 说明: wget:下载远程文件到本地当前文件夹中. tar xzf :解压文件到当前文件夹目录 cd:进入文件

如何在 Amazon AWS 上设置一台 Linux 服务器

摘要: AWS(Amazon Web Services)是全球领先的云服务器提供商之一.你可以使用 AWS 平台在一分钟内设置完服务器.在 AWS 上,你可以微调服务器的许多技术细节,如 CPU 数量,内存和磁盘空间,磁盘类型(更快的 SSD 或者经典的 IDE)等. AWS(Amazon Web Services)是全球领先的云服务器提供商之一.你可以使用 AWS 平台在一分钟内设置完服务器.在 AWS 上,你可以微调服务器的许多技术细节,如 CPU 数量,内存和磁盘空间,磁盘类型(更快的 S

scp 将数据从一台linux服务器复制到另一台linux服务器

原文地址:http://www.cnblogs.com/peida/archive/2013/03/15/2960802.html  完整内容参考原文! scp 是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且 scp传输是加密的.可能会稍微影响一下速度.当你服务器硬盘变为只读 read only system时,用scp可以帮你把文件移出来.另 外,scp还非常不占资源,不会提高多少系统负荷,在这一点上