Redis在Centos7下的集群安装
最近花了3天时间,终于把Redis的集群搭建起来了,高开低走,开始觉得还算容易,装到后面做集群的时候被Ruby环境坑了2天,不过最后还是搞定了,这里跟大家分享下。
Redis集群的安装分为3大步骤:
步骤一:Redis节点安装
步骤二:OS上Ruby环境搭建
步骤三:Redis集群配置
Redis节点安装步骤如下:
1,下载Redis文件
下载命令:
$wgethttp://download.redis.io/releases/redis-4.0.2.tar.gz
2,解压命令:
$gunzip redis-4.0.2.tar.gz
$tar -xvf redis-4.0.2.tar
3,编译下载文件
$cd redis-4.0.2
$make
与其它互联网组件略有区别的是执行文件不在bin目录下而是在src下,配置文件没在config下,在主目录下。
4,Ruby命令
查看状态:$pe –ef | grep redis
启动redis:进入src下$./redis-server
关闭redis:就是kill -9
5,使用Ruby
Src下有一个redis_cli执行文件,cli就是client的缩写,是自带的一个客户端程序,通过它可以操作redis。
我的集群节点如下
133物理机下安装3个节点
Master1:7000
Master2:7001
Master3:7002
135物理机下安装3个节点
Slaver1:7000,作为Master1的读
Slaver2:7001,作为Master2的读
Slaver3:7002,作为Master3的读
先来处理133上的3个结点:
Port 7000
Daemonize yes
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
appendonly yes
bind修改成节点自己的IP,关于这个配置项需要详细说明下:
这个需要配置提供服务的网卡,跟Eureka那种配置对端地址的思想完全相反,需要配置自己的IP,默认的127.0.0.1表示只可以通过内部网卡,对于一台物理机内部做集群没问题,但是跨IP跨物理机的时候远程的节点之间是无法访问的。所以我这里133要与135做集群,需要把133的bind改成192.168.226.133,135的bind要改成192.168.226.135。
在redis主目录下创建个cluster目录,里面再创建7000、7001、7002三个子目录,将修改后的redis.conf分别copy到这3个子目录中,copy后修改下port和cluster-config-filep(nodes-7000.conf这个文件我们只管配置就好,不需要我们去维护这个文件,由Redis自动维护)
修改完毕后启动这3个Redis结点:
同样的处理要在135上做一遍。
参考命令aaa@qq.com:/home/docker/redis/redis-4.0.2/cluster/7002/redis.conf .
记得也给135把这3个节点启动起来。
OK现在我们已经有了6个启动着的Redis节点,下面通过命令对他们按照我们的蓝图进行配置。
配置使用的是src下redis-trib.rb这个管理工具,此工具需要Ruby环境运行,我们在使用它之前需要给环境搭建好ruby环境。
Ruby环境搭建
CentOS自带的Ruby版本是2.0.0,不能直接用于4.0.2版本的Redis,需要对Ruby先做升级,升级的思路就是在CentOS上下载Ruby的Source,编译后安装。
1下载ruby source并安装
下载新版本的ruby
$wget https://ruby.taobao.org/mirrors/ruby/ruby-2.3.0.tar.gz
gunzip tar –xvf解压它
$./configure
$make
$make install
检查ruby是否是新版本
$ruby –v
2下载安装RubyGems
$yum install rubygems
3 gem安装redis
$gem install redis --version 4.0.1
4检查安装结果
./redis-trib.rb
执行下会出现命令提示,标识ruby环境准备成功。
Ruby环境搭建浪费我好久,有很多坑在里面,在本文的最后把我遇到的各种错误以及解决办法给予了罗列。
Redis集群配置
集群配置方案一:交给Redis自动分配
配置的思路比较简单,直接上命令:
./redis-trib.rb create --replicas 1 192.168.226.133:7000 192.168.226.133:7001 192.168.226.133:7002 192.168.226.135:7000 192.168.226.135:7001 192.168.226.135:7002
Replicas 1表示要给master挂在1个slaver,然后后面的参数就是简单暴力的把所有启动着的节点罗列上去就好。
可以看得出Redis自动帮我们做Solt段和Master、Slaver的分配。
利用redis-cli随便登陆一个节点:
$ ./redis-cli -h 192.168.226.133 -p 7000
查看cluster信息:
Cluster info
Cluster_state:集群目前的状态
Cluster_slots_assigned:多少个slot是被分配了的
Cluster_slots_ok:多少个slot是正常运行的
Cluster_know_nodes:集群总共有多少个节点构成
Cluster_size:集群有多少个master构成
Cluster_my_epoch:当前节点编号
Cluster_stats_message_XXXX:集群见通信的信息,例如sent和receiverd送出去多少二进制流
,返回多少二进制流等等。
Set一个值测试一下集群:
这个错误的意思是:对testcase进行hash之后要落到9596 slot上,cluser nodes得到所有节点的信息发现9596应该在135:7000这个master上。
$ ./redis-cli -h 192.168.226.135 -p 7000
切换到135:7000之后,成功!
我可以看到135:7000这个master的slaver是133:7002,所以切换到这个slaver上再试下:
$ ./redis-cli -h 192.168.226.133 -p 7002
直接执行get操作会提示重定向到master上,需要readonly命令告诉该节点我只是来读取数据的,再get就可以获得到master中的数据了。
集群配置方式二:自己手动指定关系
这次配置思路是先用133上7000、7001、7002做3个master节点的集群(Redis集群至少需要3个节点),然后再将135上7000、7001、7002分别做为slaver挂在133上。首先,要把方式一中的集群删掉:
Kill掉133和135中的共6个redis进程
删除133和135中的个文件nodes-7000.conf、nodes-7001.conf、nodes-7002.conf、dump.rdb、appendonly.aof
删掉了上面的配置文件和数据文件之后,每个redis节点又成了崭新的了,重启启动起来吧,开始配置。
./redis-trib.rb create 192.168.226.133:7000 192.168.226.133:7001 192.168.226.133:7002
这里去掉了replicas参数标识都是master节点
利用redis-trib.rb add-node命令将135的3个节点添加到集群中:
$ ./redis-trib.rb add-node192.168.226.135:7000 192.168.226.133:7000
$ ./redis-trib.rb add-node192.168.226.135:7001 192.168.226.133:7000
$ ./redis-trib.rb add-node192.168.226.135:7002 192.168.226.133:7000
这时检查下cluster nodes的状态,发现6个都是master,只不过有3个没有slot而已。
利用cluster replicate master节点ID这个命令,将某节点作为slaver添加到某个master上
将3个135的节点都添加到对应的133节点上,验证方式同方案一。
集群安装时常见问题以及解决办法:
常见错误1:
/usr/bin/env: ruby: No such file ordirectory
原因Ruby没安装
常见错误2:
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file-- redis (LoadError)
from/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
from./redis-trib.rb:25:in `<main>'
原因RubyGems没安装
常见问题3:
ERROR: Error installing redis:
redisrequires Ruby version >= 2.2.2.
原因安装的Ruby版本太低了,centOS7自带的是2.0.0版本的ruby,需要安装新版本的ruby
常见问题4:
ERROR: Loading command: update (LoadError)
cannotload such file -- zlib
ERROR: While executing gem ... (NoMethodError)
undefined method`invoke_with_build_args' for nil:NilClass
解决方案:
进入到ruby源码文件夹中的ext/zlib
$ruby ./extconf.rb
如果这里make失败,
$yum search ‘zlib’
$yum install zlib-devel.x86_64
再回去执行extconf.rb
$make
$make install
常见问题5:
需要安装个openssl,下载地址:https://github.com/openssl/openssl/releases/tag/OpenSSL_1_0_2l
$./config -fPIC --prefix=/usr/local/opensslenable-shared
$./config -t
$make && make install
检查安装结果
$openssl version
再利用ruby源码装ext下的openssl
将ruby源码目录下的include目录软链接到 / 目录下
$ln -s /home/docker/Templates/ruby-2.3.0/include/
还是在/ext/openssl下make
$make
$make install
常见问题6:
在执行gem install redis的时候报这个错误
源的问题,请求不到,只能自己再手动下载个扔上去。
https://rubygems.org/downloads/redis-4.0.1.gem
安装命令:
$gem install redis-4.0.1.gem
常见问题7:
恭喜你,你如果看到这个错误,说明你离最后的成功只差最后一步了,是因为redis这些节点没有启动,或者网络配置问题。
常见问题8:
一直等待 Waiting for the cluster to join很久都没有反应
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379
则集群总线端口为16379
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
firewall-cmd --zone=public--add-port=9300/tcp --permanent
firewall-cmd --zone=public--add-port=9300/udp --permanent
firewall-cmd --reload