说明:
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
为了让环境更有序,建议将相关的软件及库安装到统一的目录下,我这边安装到/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文件,然后直接启动即可,这里不进行描述。
下载地址: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没有安装,所以还需要进行其他安装才能
具体安装包可以网上查找,或者评论留言,这里我用的是: 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有报错解决报错问题,多数都是路径问题,可以按照自己环境进行修改
这个安装包网上很多,http://www.openssl.org/source/,下载下来,放置在:/cao/soft/tools/下
[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
[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包安装完成
将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]$
安装完成
为了管理方便在/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.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,不然会有节点计算错误的报错,这个在最后问题解答模块有介绍
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
所有都操作结束后,可以进行最后的启动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,还需要验证集群是否成功
我们在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集群配置完毕,当然还有对集群的调整,这个可以继续了解,比如增加集群的节点,删除集群节点等等。。
操作过程中会遇到很多问题,这里就一些有代表性的问题进行分析
在执行创建集群的命令时会报错,如下图:
解决方法:主要是看下redis.conf配置是否正确,如果确保无误后,需要清理上次产生的文件: dump.rdb 、nodes-7001.conf、nodes-7000.conf 、 nodes-7002.conf。然后重新启动节点,针对我的脚本文件的话,就是先执行:cleanAll.sh然后startAll.sh,最后在createSet.sh
在执行创建集群的命令时会报错,如下图:
问题原因:192.168.0.100环境无法连接到192.168.0.111,如果两者可以ping通,但是无法telnet通,最可能的原因就是防火墙
解决方法:参照上面6.3的操作,进行开放防火墙策略。
在执行创建集群的命令时会报错,如下图:
问题原因:执行./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集群的全部过程,有任何问题欢迎交流