源码安装redis集群详解

安装redis集群:(源码安装)

说明:
1.个人是在虚拟机上安装redis集群,连不了外网只能进行源码安装,费了不少劲特意记录下,这也是很多工作场景不让连接外网的情况
2.单节点的redis,直接安装redis包修改下配置文件就可以实现,关键问题在于安装集群redis,需要有ruby环境此处重点说明下集群环境的搭建
3.内容有个人经验,也有大大小小各种网站资源,如有侵权请与本人联系,我将删除对应内容
注意:本帖内容为本人一字一字码来,转载需注明出处!!!

本文涉及所有安装包这里没有全部给出,如有需要可评论留言

【环境说明】
我这边配置redis的集群环境为两台机器:
一台:192.168.0.100 端口:7000/7001/7002
另一台:192.168.0.111 端口:7003/7004/7005
只需要在其中一台机器上操作所有步骤,用于启动redis集群,另一台机器上只需要操作1和6步骤。我这边选取第一台机器192.168.0.100进行全部操作,在另外一台只进行redis包的安装及节点信息的配置
安装时建议使用普通用户,我这里使用普通用户cao

1.安装redis包

为了让环境更有序,建议将相关的软件及库安装到统一的目录下,我这边安装到/cao/soft/tools/下。
redis包我这边采用的是redis-3.2.11(下载地址:https://redis.io/download),我的环境是:

[cao@cao tools]$ uname -a
Linux cao 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

下载redis-3.2.11.tar.gz到/cao/soft/tools/下,执行以下命令进行解压安装:

[cao@cao tools]$tar -zxvf redis-3.2.11.tar.gz
[cao@cao tools]$cd redis-3.2.1
[cao@cao redis-3.2.11]$make 
[cao@cao redis-3.2.11]$make install

将redis-3.2.11/src的部分文件拷贝到 /usr/local/bin 目录下

[cao@cao src]$ pwd
/cao/soft/tools/redis-3.2.11/src
[cao@cao src]$ cp redis-cli /usr/local/bin/
[cao@cao src]$ cp redis-trib.rb /usr/local/bin/
[cao@cao src]$ cp redis-server /usr/local/bin/

到这里redis包安装完毕,如果是启动单节点redis,只需要配置redis.conf文件,然后直接启动即可,这里不进行描述。

2.安装ruby

下载地址:http://www.ruby-lang.org/en/downloads/,根据自己系统选取适合的版本(个人不太了解,直接下载比较稳定的版本ruby-2.5.1.tar.gz)
将下载版本拷贝到/cao/soft/tools/,然后执行命令:

[cao@cao tools]$ tar -xvzf ruby-2.5.1.tar.gz    
[cao@cao tools]$ cd ruby-2.5.1

编译源代码,如下所示:

[cao@cao ruby-2.5.1]$ ./configure
[cao@cao ruby-2.5.1]$ make
[cao@cao ruby-2.5.1]$ make install

安装后,通过在命令行中输入以下命令来确保一切工作正常:

[cao@cao ruby-2.5.1]ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

如果有回显说明已经安装成功,接下来该直接进行3步的操作

[这里进行展示,你不需要操作]

这里是很多贴紧接着的操作,我当时按照这个来会有很多报错。
其他贴让下载redis-3.0.0.gem,这个可以在度娘上找有人分享的,但是大多数是需要积分的,需要的可以评论留下联系方式
将文件放在/cao/soft/tools/下,执行:

gem install redis-3.0.0.gem 

在这会有报错:

[cao@cao redis-3.0.0]$ gem install redis-3.0.0.gem 
ERROR:  Loading command: install (LoadError)
    cannot load such file -- zlib
ERROR:  While executing gem ... (NoMethodError)
    undefined method `invoke_with_build_args' for nil:NilClass

这个是很关键一步,需要到安装ruby的目录的子目录,ruby-2.5.1/ext/zlib中执行:ruby extconf.rb。但是我遇到下面问题:

[root@cao zlib]# ruby extconf.rb 
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

查找后发现是,zlib和zlib-devel没有安装,所以还需要进行其他安装才能

[展示完毕]

3.安装zlib和zlib-devel

具体安装包可以网上查找,或者评论留言,这里我用的是: zlib-1.2.11.tar、zlib-devel-1.2.11-7.fc28.x86_64.rpm
将文件放在/cao/soft/tools/下,一下命令执行如果权限不够就切换至root用户:

[cao@cao tools]$ tar -zxvf  zlib-1.2.11.tar
[cao@cao tools]$ cd zlib-1.2.11
[cao@cao zlib-1.2.11]$ ./configure
[cao@cao zlib-1.2.11]$ make
[cao@cao zlib-1.2.11]$ make install

返回/cao/soft/tools/下:

[cao@cao tools]$ rpm -ivh zlib-devel-1.2.11-7.fc28.x86_64.rpm --nodeps  

确保安装成功后,返回到/cao/soft/tools/ruby-2.5.1/ext/zlib,再次执行:ruby extconf.rb,结果如下:


[cao@cao zlib]$ ruby extconf.rb 
checking for deflateReset() in -lz... yes
checking for zlib.h... yes
checking for crc32_combine() in zlib.h... yes
checking for adler32_combine() in zlib.h... yes
checking for z_crc_t in zlib.h... yes
creating Makefile
[cao@cao zlib]$

然后继续执行:make 和 make install。
这里我执行make报错:

    [cao@cao zlib]$ make
    make: *** 没有规则可以创建“zlib.o”需要的目标“/include/ruby.h”。 停止。

我的方法是:尝试修改Makefile文件,查找/include/ruby.h所在行,将对应路径进行修改:

#zlib.o: $(top_srcdir)/include/ruby.h
    zlib.o: $(hdrdir)/ruby.h

修改后make和make install便执行成功,如有其他问题请自行解决,不然其他操作还是会不成功

备注:如果make有报错解决报错问题,多数都是路径问题,可以按照自己环境进行修改

4.安装openssl

这个安装包网上很多,http://www.openssl.org/source/,下载下来,放置在:/cao/soft/tools/下

4.1编译安装:

[cao@cao tools]$ tar -xzvf openssl-1.1.1-pre6.tar.gz 
[cao@cao tools]$ cd openssl-1.1.1-pre6  
[cao@cao openssl-1.1.1-pre6]$ ./config -fPIC --prefix=/usr/local/openssl enable-shared  
[cao@cao openssl-1.1.1-pre6]$ ./config -t  
[cao@cao openssl-1.1.1-pre6]$ make && make install 

安装完成,可以检测一下是否安装成功:

[cao@cao openssl-1.1.1-pre6]$ openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

4.2 进入ruby源码[/cao/soft/tools/ruby-2.5.1]目录下的ext/openssl 目录执行:

[cao@cao openssl]$ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib  

接下来并且将ruby 源码目录下的include目录软链接到 / 目录下,可能需要root用户权限:

[cao@cao openssl]$ ln -s /cao/soft/tools/ruby-2.5.1/include /

接着再执行make:

[cao@cao openssl]$ make

没有报错的话,继续执行:make install

[cao@cao openssl]$ make install

openssl包安装完成

5.安装redis-3.0.0.gem

将2.步中下载的redis-3.0.0.gem进行安装,在/cao/soft/tools/下,执行:gem install redis-3.0.0.gem

[cao@cao tools]$ cd redis-3.0.0/
[cao@cao redis-3.0.0]$ ls
redis-3.0.0.gem
[cao@cao redis-3.0.0]$ gem install redis-3.0.0.gem 
Successfully installed redis-3.0.0
Parsing documentation for redis-3.0.0
Installing ri documentation for redis-3.0.0
Done installing documentation for redis after 1 seconds
WARNING:  Unable to pull data from 'https://rubygems.org/': no such name (https://rubygems.org/specs.4.8.gz)
1 gem installed
[cao@cao redis-3.0.0]$ 

安装完成

6.配置redis集群

6.1 修改节点配置文件

为了管理方便在/cao/soft/tools/下新建目录redis,用于存放节点的配置文件等,然后将1.步中安装redis目录/redis-3.2.11/src/中的redis-cli 、redis-server redis-trib.rb拷贝到新建目录下:

[cao@cao redis]$ cp ../redis-3.2.11/src/redis-cli ./
[cao@cao redis]$ cp ../redis-3.2.11/src/redis-server ./
[cao@cao redis]$ cp ../redis-3.2.11/src/redis-trib.rb ./

在当前目录下新建文件夹redis_cluster,并新建7000 7001 7002三个文件夹,然后拷贝/redis-3.2.11中的redis.conf分别到每个文件夹中,接下来对配置文件进行修改:

redis.conf 文件:
    port  7000                       //端口7000,7002,7003        
    bind 本机ip                      //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
    protected-mode no               //需要不同服务器的节点连通,这个就要设置为 no
    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日志开启  有需要就开启,它会每次写操作都记录一条日志,文件名为appendfilename

特别注意protected-mode要设置为no!!!

同样的操作需要在192.168.0.111上也进行,这样7000-7005节点配置文件都配置好了,接下来就是启动节点

6.2脚本准备

进行脚本的准备,当然这步可以不做直接到6.3,为了操作的方便,我整理了一些脚本,放置在/cao/soft/tools/redis目录下。
启动节点的脚本,startAll.sh:

./redis-server redis_cluster/7000/redis.conf
./redis-server redis_cluster/7001/redis.conf
./redis-server redis_cluster/7002/redis.conf

查看节点运行情况的脚本,showRedis.sh:

#!/bin/bash
echo "ps -ef | grep redis"
ps -ef | grep redis
echo "netstat -tlnp | grep redis"
netstat -tlnp | grep redis

关闭节点的脚本,shutdownAll.sh:

redis-cli -h 192.168.0.100 -p 7000 shutdown
redis-cli -h 192.168.0.100 -p 7001 shutdown
redis-cli -h 192.168.0.100 -p 7002 shutdown

清理生成文件的脚本,cleanAll.sh:

rm -f dump.rdb nodes-7000.conf nodes-7001.conf nodes-7002.conf

创建集群的脚本,createSet.sh:

./redis-trib.rb create --replicas 1 192.168.0.100:7000 192.168.0.100:7001 192.168.0.100:7002 192.168.0.111:7003 192.168.0.111:7004 192.168.0.111:7005

注意:replicas 后面还有个1,不然会有节点计算错误的报错,这个在最后问题解答模块有介绍

6.3 启动节点,配置防火墙

ok,那么现在我们启动脚本:

[cao@cao redis]$ ./startAll.sh
[cao@cao redis]$ ./showRedis.sh 
ps -ef | grep redis
cao        5458      1  0 15:46 ?        00:00:00 ./redis-server 192.168.0.100:7000 [cluster]
cao        5460      1  0 15:46 ?        00:00:00 ./redis-server 192.168.0.100:7001 [cluster]
cao        5464      1  0 15:46 ?        00:00:00 ./redis-server 192.168.0.100:7002 [cluster]
cao        5471   5469  0 15:46 pts/0    00:00:00 grep redis
netstat -tlnp | grep redis
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 192.168.0.100:7001      0.0.0.0:*               LISTEN      5460/./redis-server 
tcp        0      0 192.168.0.100:7002      0.0.0.0:*               LISTEN      5464/./redis-server 
tcp        0      0 192.168.0.100:17000     0.0.0.0:*               LISTEN      5458/./redis-server 
tcp        0      0 192.168.0.100:17001     0.0.0.0:*               LISTEN      5460/./redis-server 
tcp        0      0 192.168.0.100:17002     0.0.0.0:*               LISTEN      5464/./redis-server 
tcp        0      0 192.168.0.100:7000      0.0.0.0:*               LISTEN      5458/./redis-server

同样在192.168.0.111环境上也执行脚本,确保7003-7005redis节点启动。
接下来是非常重要的一步,配置防火墙!这步不操作,会导致集群启动不了。
使用root用户在192.168.0.100上操作:

 [root@cao redis]#firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent
 success
 [root@cao redis]#firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent
 success
 [root@cao redis]#firewall-cmd --reload
 success

解释:集群总线端口=端口号+10000,例:7000的集群总线端口是17000。这个集群总线端口不开放,集群的时候外部服务器的节点添加不进来

使用root用户在192.168.0.111上操作:

 [root@cao redis]#firewall-cmd --zone=public --add-port=7003-7005/tcp --permanent
 success
 [root@cao redis]#firewall-cmd --zone=public --add-port=17003-17005/tcp --permanent
 success
 [root@cao redis]#firewall-cmd --reload
 success

6.4 启动集群

所有都操作结束后,可以进行最后的启动redis

[cao@cao redis]$ ./createSet.sh
...
中间略
...
/usr/local/lib/ruby/gems/2.5.0/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.100:7000
192.168.0.111:7003
192.168.0.100:7001
Adding replica 192.168.0.111:7004 to 192.168.0.100:7000
Adding replica 192.168.0.100:7002 to 192.168.0.111:7003
Adding replica 192.168.0.111:7005 to 192.168.0.100:7001
M: c23a74fdaea42bdeb9018b656eca1d73437c4ae2 192.168.0.100:7000
   slots:0-5460 (5461 slots) master
M: ce6f0338669e0673a42151e79c227ded26ce8802 192.168.0.100:7001
   slots:10923-16383 (5461 slots) master
S: 4db31e4f634e9ea0396041a038401551e851345b 192.168.0.100:7002
   replicates 85050cbb9fe7c3b564d8c9f94f43b38cdd6b843c
M: 85050cbb9fe7c3b564d8c9f94f43b38cdd6b843c 192.168.0.111:7003
   slots:5461-10922 (5462 slots) master
S: 16c90382a6ff2c6594f5e88ca1bb1da6ea45ab1a 192.168.0.111:7004
   replicates c23a74fdaea42bdeb9018b656eca1d73437c4ae2
S: 03aa07fadb89f63b3107afa0db9160a5473a595e 192.168.0.111:7005
   replicates ce6f0338669e0673a42151e79c227ded26ce8802
Can I set the above configuration? (type 'yes' to accept):

看到type ‘yes’ to accept,输入yes,然后等待几秒,出现下面内容那么恭喜你redis集群创建成功

...
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[cao@cao redis]$ 

到这里就大功告成了吗?no,还需要验证集群是否成功

6.5 验证redis集群

我们在192.168.0.100机器上连接reids集群,并进行简单操作:

[cao@cao redis]$ ./redis-cli -h 192.168.0.100 -c -p 7000
192.168.0.100:7000> hset aaa bbb '111'
-> Redirected to slot [10439] located at 192.168.0.111:7003
(integer) 1
192.168.0.111:7003> hget aaa bbb
"111"
192.168.0.111:7003>

发现可以进行操作,那么我们切换另外的端口进行验证:

[cao@cao redis]$ ./redis-cli -h 192.168.0.111 -c -p 7004
192.168.0.111:7004> hget aaa bbb
-> Redirected to slot [10439] located at 192.168.0.111:7003
"111"
192.168.0.111:7003> 

通过登录不同的端口,同样能找到key为aaa,filed为bbb的值,而且通过Redirected to slot [10439] located at 192.168.0.111:7003,很明显看出测试数据是在7003所在槽位上的,并且集群中的节点是会进行通讯的

到这里redis集群配置完毕,当然还有对集群的调整,这个可以继续了解,比如增加集群的节点,删除集群节点等等。。

【7】问题记录

操作过程中会遇到很多问题,这里就一些有代表性的问题进行分析

7.1 [ERR] Node 192.168.161.0:7003 is not empty.

在执行创建集群的命令时会报错,如下图:
源码安装redis集群详解_第1张图片
解决方法:主要是看下redis.conf配置是否正确,如果确保无误后,需要清理上次产生的文件: dump.rdb 、nodes-7001.conf、nodes-7000.conf 、 nodes-7002.conf。然后重新启动节点,针对我的脚本文件的话,就是先执行:cleanAll.sh然后startAll.sh,最后在createSet.sh

7.2 [ERR] Sorry,can’t connect to node 192.168.161.0:7003

在执行创建集群的命令时会报错,如下图:
这里写图片描述
问题原因:192.168.0.100环境无法连接到192.168.0.111,如果两者可以ping通,但是无法telnet通,最可能的原因就是防火墙
解决方法:参照上面6.3的操作,进行开放防火墙策略。

7.3 ERROR:invalid configuration for cluster creation

在执行创建集群的命令时会报错,如下图:
这里写图片描述
问题原因:执行./redis-trib.rb create命令时参数错误
解决方法:执行创建redis集群命令时,./redis-trib.rb create –replicas后面要有个1,即正确的命令应该是:

./redis-trib.rb create --replicas 1 192.168.0.100:7000 192.168.0.100:7001 192.168.0.100:7002 192.168.0.111:7003 192.168.0.111:7004 192.168.0.111:7005

以上为搭建redis集群的全部过程,有任何问题欢迎交流

你可能感兴趣的:(学习笔记)