一、应用场景介绍
本文主要是介绍Redis集群在Linux环境下的安装讲解,其中主要包括在联网的Linux环境和脱机的Linux环境下是如何安装的。因为大多数时候,公司的生产环境是在内网环境下,无外网,服务器处于脱机状态(最近公司要上线项目,就是无外网环境的Linux,被离线安装坑惨了,走了很多弯路,说多了都是血泪史啊%>_<%)。这也是笔者写本文的初衷,希望其他人少走弯路,下面就介绍如何在Linux安装部署Redis集群。
二、安装环境及工具
系统:Red Hat Enterprise Linux Server release 6.6
工具:XShell5及Xftp5
安装包:GCC-7.1.0
Ruby-2.4.1
Rubygems-2.6.12
Redis-3.2.9(3.x版本才开始支持集群功能)
三、安装步骤
要搭建一个最简单的Redis集群,我们至少需要6个节点:3个Master和3个Slave。那为什么需要3个Master呢?其实就是一个“铁三角”的关系,当1个Master下线的时候,其他2个Master和对应的Salve立马就能顶替上去,确保集群能够正常使用,如果你之前了解Mongodb/Hadoop/Strom这些的话,你就很容易目标一般分布式的最低要求基数个数节点,这样便于选举(少数服从多数的原则)。本文当中,我们就偷下懒,在一台Linux虚拟机上搭建6个节点的Redis集群(实际真正生产环境,需要3台Linux服务器分布存放3个Master)
1、安装GCC环境
安装Redis需要依托GCC环境,先检查Linux是否已经安装了GCC,如果没有安装,则需要进行安装
检查GCC是否安装,可以看看版本号
$ gcc -v
如果已经安装了GCC,则会显示以下信息
如果没有任何信息,则我们可以通过命令yum install gcc-c++进行在线安装
$ yum install gcc-c++
如果没有网络的时候,我们就需要下载GCC的安装包进行手动安装了,具体方法还是比较复杂的,具体离线安装GCC的方法,请参考我的另外一篇文章《Linux无网离线安装GCC》
2、安装Ruby和Rubygems
如果有网的话,则通过yum命令进行安装,自动将关联的依赖包全部安装
$ yum install ruby
$ yum install rubygems
如果是离线的状态,我们则可以选择下载Ruby和Rubygems,解压手动进行安装,具体的方法请参考我的另外两篇文件《Linux 离线安装Ruby详解》和《Linux 离线安装Rubygems详解》,这里我们不做多讲解。
四、安装Redis
1、到官网(https://redis.io/download)下载Redis,现在最新的版本为:3.2.9 ,将下载好的压缩包上传到服务器当中。如图所示,我是新建了一个Redis临时目录存放,偷懒我就用xftp5手动创建一个目录存放(也可以写命令创建文件夹 $ makdir redis)
2、安装Redis
转到Redis的存放目录,然后通过命令解压Redis压缩包
$ cd /home/cmfchina/redis
$ tar -zxvf redis-3.2..tar.gz
通过make命令进行安装Redis(需要root权限)
$ cd /home/cmfchina/redis/redis-3.2.9
$ make && make install //make 这里如果不指定PREFIX,默认将安装在/usr/local/bin下,保持默认就好
如果没有root权限是无法安装的,如图所示
我们获取root权限之后再进行安装,看到如下信息,说明Redis安装成功了,也可以到/usr/local/bin目录下看看
如果只是想要单机,不存在集群功能,我们现在就可以将Redis运行起来,我们直接在刚刚解压的Redis目录下运行命令就可以将单机的Redis 运行起来
$ cd /home/cmfchina/redis/redis-3.2.9
$ redis-server redis.conf //所有相关配置信息都在conf里面,如果不设置,默认端口号为:6379
五、配置Redis集群
刚刚上面讲到如果只是想运行单机版的Redis(个人研究Redis可以安装单机版),上面的讲解已经够了,不过现实当中,我们往往是需要使用到集群功能的,进行容错。
之前讲到是我们需要6个节点的Redis作为集群,所以我们需要创建6个文件夹,分别存放6个节点的配置信息,6个节点需要对应6个端口号,比如7001~7006,这个端口号我们自行定义,我们通过xftp5可视化创建一下。
第一步、我们也可以通过命令mkdir批量创建,,命令可能会更快点。
下面重点来了,需要6个节点,所有我们需要配置各自的redis.conf配置文件。到我们Redis的安装目录usr/local/bin,将redis-cli、redis-server、redis.conf(没有conf文件,可以从压缩包里拷个出来,或者自己直接新建一个空的conf文件,后面再配置相关信息),分别复制到刚刚创建的6个文件夹当中。
第二步、接下来,我们需要配置redis.conf文件,如果你是从压缩包拷贝出来,你会发现特别多的备注,这些是都是官网的备注讲解,你可以全部删除,只配置你想配置的信息就行。我们主要配置相对应的端口信息和集群配置信息
还有很多redis.conf配置信息,实际场景我们再自行配置,关于配置redis.conf的相关信息,可以参考笔者另一篇文件《Redis.conf及其Sentinel.conf配置项详细说明》。我们分别配置相对应的6个redis.conf信息。
分别将这6个redis服务启动起来(命令redis-server redis.conf),一个一个去启动有点复杂,在redis目录创建一个sh脚本来启动6个实例
$cd /home/cmfchina/redis
$vim startall.sh 就会打开vim编辑器,创建一个空的文本
:wq!保存脚本,创建成功:
执行./startall.sh 提示permission denied说明权限不足,执行命令chmod 777 startall.sh修改权限获取root用户执行脚本
$ chmod startall.sh 分配权限
$ sh -x startall.sh 执行脚本
=======补充说明 :2017-12-14 =========
有网友跟博主反应,上面这个批量脚本不能执行,是博主漏加了命令:kill -2
因为:每次执行一个redis启动,都会停留在redis的启动界面(上文说到的单机启动redis的那个界面),所以我们需要模拟退出当前界面,执行下一条命令
Kill -2 :功能类似于Ctrl + C 是程序在结束之前,能够保存相关数据,然后再退出。
将上文的脚本改造下就行;如图所示
Ps:如果出现路径找不到的问题,将上文的路径全部换成绝对路径
=================================
再执行./startall.sh, 然后通过命令netstat -tnulp | grep redis和ps aux | grep redis查看redis运行情况,可以看到端口7001、7002、7003、7004、7005、7006的redis都起来了。噢耶~~~~
第三步、实际上,Redis集群的操作在后文你可以看到是通过Ruby脚本来完成的,因此我们需要安装Ruby相关的RPM包,以及Redis和Ruby的接口包。我们要用到之前安装的Ruby。我们到之前解压的文件redis-3.2.9/src目录下找到文件为:redis-trib.rb,如图所示
将该文件拷贝到与6个文件夹的同级目录下
在redis目录下执行命令:
$ ./redis-trib.rb create --replicas 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1:
===============相关错误汇总解决方案(你以为上面是重点%>_<%,其实下面这才是本文重点(太多坑)!!!)===============
如果执行上述命令出现Ruby和Rubygems错误的话,那是没有安装Ruby和Rubygems,所有这就是为什么我们文章之前就要提前安装好Ruby和Rubygems。但是有些人说这两个我们已经安装了,为什么还会报如下错误的话
/home/cmfchina/ruby/lib/ruby/site_ruby/2.4./rubygems/core_ext/kernel_require.rb::in `require': cannot load such file -- redis (LoadError)
from /home/cmfchina/ruby/lib/ruby/site_ruby/2.4./rubygems/core_ext/kernel_require.rb::in `require'
from ./redis-trib.rb::in `<main>'
这错误是提示不能加载redis,那是因为缺少redis和ruby的接口,使用gem 安装,我们这个时候其实还需要安装对应的Redis的Rbuy接口包。我们需要下载对应Redis的gem包安装才行。Rubygems的官网其实提供了Redis的gem包,我们可以直接取下载https://rubygems.org/gems/redis/ 下载后上传到服务器当中
执行gem install redis-3.3.0.gem命令安装。
$ gem install redis-3.3..gem
但是执行这个又报了错误,如果没有报错的话那就说明人品好啊......真是心塞~~~如图所示,这是因为需要依赖zlib工具。
ERROR: Loading command: install (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NoMethodError)
undefined method `invoke_with_build_args' for nil:NilClass
第四步、我们需要再安装zlib才行,下载zlib,上传解压,安装zlib官方网站:http://www.zlib.net ,最新版1.2.11,安装我们就一笔带过
1 $tar -xvzf zlib-1.2.11.tar.gz
2 $cd zlib-1.2.8.tar.gz
3 $./configure --prefix=/usr/local/zlib 设置安装路径
4 $make
5 $make instal
安装完zlib之后,我们再需要执行以下命令
$ cd /home/cmfchina/ruby/ruby-2.4./ext/zlib 备注:/home/cmfchina/ruby/ruby-2.4.1这个目录是ruby安装包后解压的目录,就是前面提到的ruby离线安装
$ ruby extconf.rb
$ make && make install
可是又报错了,真是无力吐槽了~~~错误信息如下
checking for deflateReset() in -lz... no
checking for deflateReset() in -llibz... no
checking for deflateReset() in -lzlib1... no
checking for deflateReset() in -lzlib... no
checking for deflateReset() in -lzdll... no
checking for deflateReset() in -lzlibwapi... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
本着不放弃的原则,只能去外国网站查查资料看怎么解决了,发现原来是要将文件安装到本地运行库的里面才行,所有安装的时候需要额外配置信息,但是前提是我们需要安装zlib,才能继续下一步。
安装好zlib,然后我们重新输入命令
$ cd /home/cmfchina/ruby/ruby-2.4./ext/zlib
备注:/home/cmfchina/ruby/ruby-2.4.这个目录是ruby安装包后解压的目录,就是前面提到的ruby离线安装
$ ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib //会生成一个Makefile文件 备注:/usr/local/zlib是我的zlib安装目录
$ make && make install
这个时候会自动生成一个Makefile文件,如图所示
接下来我们make && make install 安装一下,但是当我们make的时候,又出现了错误如下
make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop
这个时候打开ext/zlib/Makefile文件,找到下面一行把路径进行修改一下。
zlib.o: $(top_srcdir)/include/ruby.h 改成:zlib.o: ../../include/ruby.h
如图所示
修改完成,然后保存:接着我们再make && make install,这个时候安装成功了~~所以就放心地接着干吧!(没有看到我也无能为力了)安装完成后如下显示
我们回到redis的gem目录下,继续执行命令:gem install redis-3.3.0.gem
但是......又出现了错误,原来我们还需要安装OpenSSL,因为Redis集群交互是需要OpenSSL
第五步、我们又得安装OpenSSL才行,官网地址:https://www.openssl.org/source/ 上次压缩包到服务器,解压,具体不做太细讲解
$ tar -xzvf openssl-1.0.2l.tar.gz
$ cd openssl-1.0.2l
$ ./config -fPIC --prefix=/usr/local/openssl enable-shared
$ ./config -t
$ make && make install
安装openssl成功界面如下:
我们又要到到Ruby解压的源码[/home/cmfchina/ruby-2.4.1]目录下的ext/openssl 目录,如图所示
安装和zlib一样的方式安装openssl
$ cd /home/cmfchina/ruby-2.4./ext/openssl
备注:/home/cmfchina/ruby/ruby-2.4.这个目录是ruby安装包后解压的目录,就是前面提到的ruby离线安装
$ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib //会生成一个Makefile文件
备注:/usr/local/openssl是我的openssl安装目录
$ make && make install
但是我们make的时候,又出现了和zlib类似的错误
make: *** No rule to make target `/include/ruby.h', needed by `ossl.o'. Stop
还是按照刚刚zlib操作一样,打开Makefile文件,将$(top_srcdir)全部改成../..
修改后保存,再执行make && make install,这一次安装成功了~~
然后我们再回到之前redis目录下执行命令:gem install redis-3.3.0.gem
第六步、启动Redis集群
完成以上步骤之后,我们再回到第三步执行命令
在redis目录下执行命令:
$ ./redis-trib.rb create --replicas 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1:
我们选择yes,意思是服从这种主从分配方式,我们也可以通过配置文件自己指定slave
第五、Redis集群设置密码
在实际场景当中,我们都需要考虑到安全问题,设置密码这个环节也是必不可少,Redis单片机设置密码都挺简单的,一般分为两种方式:
1、先设置各个Redis单机的密码
方法一:修改所有Redis集群中的redis.conf配置文件
masterauth password //设置master密码,是为了Salve能够连接上Master
requirepass password //设置Redis访问请求密码
方法二:进入各个Redis集群中的实时配置
./redis-cli -c -p //分别进入各个Redis片机进行各自设置
config set masterauth passwd123
config set requirepass passwd123
config rewrite
注意:各个节点密码都必须一致,否则Redirected就会失败, 个人推荐第二种方式,这种方式会把密码写入到redis.conf里面去,且不用重启。
建议设置好masterauth的密码,否则后期的Master和Salve无法进行数据同步,如图所示:
2、再设置redis-trib.rb的密码进行集群分配启动(最关键一步!!!)
如果你设置了各个Redis密码,但是使用下面的命令还是报错了,对的~错了那就是对了,因为你还需要进行关键的一步需要设置,O(∩_∩)O哈哈~。
$ ./redis-trib.rb create --replicas 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1: 127.0.0.1:
一般会出现以下错误:./redis-trib.rb check 127.0.0.1:7001,则会报错ERR] Sorry, can’t connect to node 127.0.0.1:7001,我们需要再次设置client.rb的配置文件
解决方法,找到系统的client.rb(温馨提示:不知道这个再哪里,可以使用find命令进行查找:ind / -name 'client.rb'),然后修改passord,具体设置如图所示:
设置好密码保存退出之后,再执行上面集群redis-trib.rb的命令,这样就大功告成了~~~O(∩_∩)O
第六、Redis集群测试
我们来测试一下Redis集群,通过连接任一redis端口,添加数据
[root@localhost redis7001]# redis-cli -p -c
[root@localhost redis7001]# redis-cli -c -h 127.0.0.1 -p 7001 shutdown //关闭集群,如果没有-h参数,默认连接127.0.0.1,如果没有-p参数,默认连接6370端口(所有如果用默认的,就没有-h -p)
说明:-h+host –p+端口号 –c 是要连接集群,注意坑,不加会报错的
可以看到连接的是7001的节点,set name的时候计算了存在哪个hash槽上,会跳转到那个槽对应的节点
结束语:至此,Redis的集群配置的前世今生已到此结束,在没有网络的环境下中途碰到了很多坑,现在我们可以尽情享受Redis,纵使虐我千百遍,我待它如初恋
后话:推荐一个Redis的可视化工具:RedisDesktopManager 官网(https://redisdesktop.com/download),具体可以到官网看看,这里我只抛砖引玉一下,下篇文章主要介绍Redis的Sentinel(哨兵)模式
PS:未经作者允许,请勿进行转载,有问题,请留言,如若转载记得注明出处:http://www.cnblogs.com/xuliangxing/p/7146868.html
Linux 下Redis集群安装部署及使用详解(在线和离线两种安装+相关错误解决方案)的更多相关文章
-
Linux下Redis集群环境的搭建
一.安装redis(使用redis3.0版本) 1.需要gcc环境,如果没有执行命令安装gcc yum install gcc-c++ 2.下载redis3.0的源码包并上传至服务器 3.解压源码包 ...
-
【redis】 linux 下redis 集群环境搭建
Redis集群 (要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下) 127.0.0.1:63791 ...
-
Linux 下redis 集群搭建练习
Redis集群 学习参考:https://blog.csdn.net/jeffleo/article/details/54848428https://my.oschina.net/iyinghui/b ...
-
深入剖析Redis系列: Redis集群模式搭建与原理详解
前言 在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态.Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 ...
-
linux下redis 集群配置
redis.conf 配置文件说明 daemonize no --是否把redis-server启动在后台,默认是“否”.若改成yes pidfile /var/run/redis.pid --当Re ...
-
Linux下zookeeper集群搭建
Linux下zookeeper集群搭建 部署前准备 下载zookeeper的安装包 http://zookeeper.apache.org/releases.html 我下载的版本是zookeeper ...
-
(转)linux下weblogic12c集群的安装部署
本文介绍linux下weblogic12c集群的安装部署,版本12c,其他版本操作会有所不同,但其大体操作基本都是一样的 关于weblogic的集群,在此就不多做介绍了,如果有不了解的朋友可以百度搜索 ...
-
CentOS下redis集群安装
环境: 一台CentOS虚拟机上部署六个节点,创建3个master,3个slave节点 1.下载并解压 cd /root wget http://download.redis.io/releases/ ...
-
linux环境(CentOS-6.7)下redis集群的搭建全过程
linux环境下redis集群的搭建全过程: 使用mount命令将光盘挂载到/mnt/cdrom目录下: [root@hadoop03 ~]# mount -t iso9660 -o ro /dev/ ...
随机推荐
-
分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
-
Android 跑马灯
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
-
解析提高PHP执行效率的50个技巧
1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的”函数”(译注:PHP手 ...
-
arithmetic-slices-ii-subsequence(太难了)
https://leetcode.com/problems/arithmetic-slices-ii-subsequence/ 太难了... package com.company; import j ...
-
命令行下上传文件到iOS软件 专业文件管理/gplayer
U盘丢了, 就拿手机当U盘用用先. 一般情况下软件打开上传功能, 在浏览器里上传即可. 可是偏偏我的电影放在了 树莓派里面(搭建了一个SMB), 直接浏览器的话,会多占用些带宽, 我的破路由器.... ...
-
Linux - VIM(VI)编辑器
VIM(VI)编辑器 简介: VI是一个命令行界面下的文本编辑工具,最早在1976年BILL Joy开发,当时的名字叫做ex.VI支持绝大多数操作系统(最早在BSD上发布),并且功能已经十分强大. 1 ...
-
map对象建立家族姓氏查询
题目:定义一个map对象,其元素的键是家族姓氏,而值是存储该家族孩子名字的vector对象.为这个map容器输入至少六个条目.通过基于家族姓氏的查询检测你的程序,查询应输出该家族所有孩子的名字. // ...
-
简单Spring和mybatis整合配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
-
用Margin还是用Padding?(转载)
转载出自 海玉的博客 本文地址: http://www.hicss.net/use-margin-or-padding/ 用margin还是用padding这个问题是每个学习CSS进阶时的必经之路. ...
-
tushare 开源数据包的使用
tushare 使用 python开源金融接口包: tushare.org/trading.html#d2 安装: pip install tushare import tushare as ts # ...