做好自己份内事
分类: 服务器与存储
2017-12-15 18:16:00
刚刚搭建redis cluster玩玩,网上并没有看到一篇完整的详细过程的文章。
作者:赵晓筱
邮箱:zhao_xiaoxiao@foxmail.com
首先说说我的环境:我用的虚拟机搭建的,一台电脑装了三台虚拟机。nat网络模式。三台虚拟机都是centos6.8。网络完全相通的。不过可能就是宿主机压力有点大。貌似在一个虚拟机里面启动六个redis进程也是可以的。redis-4.0.6.tar.gz;ruby-2.4.3.tar.gz;zlib-1.2.11.tar.gz;openssl-1.1.0.tar.gz;安装包在官网都有,不详细概述了。
三台虚拟机分别每台安装两个redis进程。这个安装过程就不细说了。主要是这个配置文件,redis.conf。里面配置比较多,从源码里面直接拷贝一份到redis的进程的当前目录。redis进程是可以绑定多个ip的。刚刚学习阶段,不要一次修改太多配置。
每个redis进程都绑定两个ip地址,一个是局域网ip地址,一个是127.0.0.1,端口一个进程是6379,一个是6390。
daemonize yes #后台启动
logfile "/usr/local/redis_4.0.6/log/redis_4.0.6.log"#配置日志文件
port 6379#6380,同台机器上端口不能重复。
cluster-enabled yes #开启cluster,去掉注释
cluster-config-file nodes_6379/6380.conf#配置一个文件记录节点信息
cluster-node-timeout 15000#超时时间
appendonly
yes
cluster-require-full-coverage :如果将其设置为yes,则默认情况下,如果key的空间的某个百分比未被任何节点覆盖,则集群停止接受写入。 如果该选项设置为no,则即使只处理关于keys子集的请求,群集仍将提供查询。
然后启动每一个redis进程。如果是跨机器的话,记得打开防火墙的对应配置的端口。否则节点之间没有办法通信。同台机器就不需要考虑了,修改防火墙文件/etc/sysconfig/iptables修改端口开放。
redis从3.0版本就支持ruby脚本搭建cluster。脚本路径:src/redis-trib.rb。将脚本拷贝到随便一个进程的路径下,脚本是ruby,所以说ruby安装是必须的。解压源码,.configure prefix=/usr/local/ruby_2.4.3 | make | make install。如果不是安装默认路径,记得修改一些PATH,动态库的路径。否则就会报找不到什么什么的错误。
执行命令:./redis-trib.rb create --replicas 1 192.168.195.133:6379 192.168.195.134:6379 192.168.195.136:6379 192.168.195.136:6380 192.168.195.133:6380 192.168.195.134:6380
其中 --replicas 1 参数告诉命令每个节点创建一个从机。后面的参数是每台机器的ip:port。
ok,第一个问题来了,大致的错误如下:
/usr/local/ruby_2.4.3/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
from /usr/local/ruby_2.4.3/lib/ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from ./redis-trib.rb:25:in `
'
提示的意思是ruby缺少连接redis的客户端。ruby提供一个管理ruby包的工具叫gem。在ruby安装路径下bin文件夹中有这个命令;
执行命令:gem install redis --version 4.0.0
{
后续验证入托有问题,只需要手动下载文件redis-4.0.0.gem
地址:
然后手动执行执行安装命令:
gem install -l ./redis-4.0.0.gem
就可以解决此问题
}
ok,第二个问题来了,大致错误描述如下:
ERROR: Loading command: install (LoadError)
no such file to load -- zlib
大致的意思就是缺少zlib这个库的支持。安装zlib库,.configure prefix=/usr/local/zlib_1.2.11 | make | make install。
然后进入ruby源码ext/zlib目录下,执行命令:ruby ./extconf.rb --with-zlib-dir=/usr/local/zlib_1.2.11/。后面的参数是告诉命令zlib的安装路径,默认路径是不需要增加这个参数的。
命令执行就会发现zlib各种库已经找到,如果显示的还是没有找到,就要注意路径以及zlib的安装状态了。正确就会生成一个Makefile。执行make | make install。
如下的状态是错误的,后面的no如果是yes就是正确了。
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
make的时候也可能会有错误。错误大致如下:
make: *** No rule to make target `/include/ruby.h', needed by `zlib.o'. Stop.
提示头文件找不到,看了Makefile。找到这个/include/ruby.h位置,这一行的内容:zlib.o: $(top_srcdir)/include/ruby.h。但是全Makefile没有定义top_srcdir这个变量。所以我直接把这一行注释了。然后就ok了。
ok,zlib安装搞定了,再次执行gem install redis --version 4.0.0。第二个问题来了,大致如下啊:
ERROR: While executing gem ... (Gem::Exception)
Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources
因为下载使用https协议,所以需要安装openssl。ok,解压,onfigure prefix=/usr/local/openssl_1.1.0 | make | make install。然后进入ruby源码ext/zlib目录下。ruby ./extconf.rb --with-openssl-dir=/usr/local/ openssl_1.1.0/。后面的参数是告诉命令openssl_的安装路径,默认路径是不需要增加这个参数的。
然后执行命令gem update --system更新一下内容。这一条命令比较慢,需要等一会。然后执行命令:gem install redis --version 4.0.0
正确之后就可以执行命令:
./redis-trib.rb create --replicas 1 192.168.195.133:6379 192.168.195.134:6379 192.168.195.136:6379 192.168.195.133:6380 192.168.195.134:6380 192.168.195.136:6380
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.195.133:6379
192.168.195.134:6379
192.168.195.136:6379
Adding replica 192.168.195.134:6380 to 192.168.195.133:6379
Adding replica 192.168.195.133:6380 to 192.168.195.134:6379
Adding replica 192.168.195.136:6380 to 192.168.195.136:6379
M: c2d6c79be71964a6e3dccab793f43a763212bdf8 192.168.195.133:6379
slots:0-5460 (5461 slots) master
M: 470303695e64a2fa319dd05e917cf7524691ecaf 192.168.195.134:6379
slots:5461-10922 (5462 slots) master
M: f92ad3f8b513b19805b313fc9654e41c43c36044 192.168.195.136:6379
slots:10923-16383 (5461 slots) master
S: 447b53163e8368479c5fe3a30398746a114e282a 192.168.195.133:6380
replicates 470303695e64a2fa319dd05e917cf7524691ecaf
S: fcc2c67387bfaebad922cda87409c19770b93544 192.168.195.134:6380
replicates c2d6c79be71964a6e3dccab793f43a763212bdf8
S: 39e7401593e4f8338e47fb2dba7bfb5ce1b935b4 192.168.195.136:6380
replicates f92ad3f8b513b19805b313fc9654e41c43c36044
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.......................
之后就是成功标志。实践发现redis版本4和版本3的脚本有两句话的差别,但是那两句话就导致整个集群长时间无法建立成功,就在这里一直点、点、点、点,没完没了。