重点说明: 强烈建议(要求)生产环境必须使用非容器部署的redis-cluster集群,不要用哨兵集群
Redis Cluster集群至少需要三个master节点,且每一个节点还需要有一个Slave备份节点,本文将以单机多实例的方式部署3个主节点及3个从节点,6个节点实例分别使用不同的端口及工作目录以模拟集群机器
1、集群规划:
1.正常来说需要6台机器来进行部署,这里通过一台机器不同目录和端口(8001~8006)进行模拟,实际部署操作类似
2.哪些节点是master哪些是Slave由redis集群启动脚本自动规划
2、去公司FTP下载redis安装文件(redis-4.0.14.tar.gz,本文档示例是使用的4.0.6版本,实际更高版本操一致),上传到集群所有节点并解压(本例只有一个节点),假如解压后目录为/usr/local/redis-4.0.6
3、cd到/usr/local/redis-4.0.6/src下执行make命令进行编译(一定要先编译 否则无法生产redis-server命令,后面启动操作无法进行)
3.1若报没有cc命令,需安装: yum install gcc-c++ -y 3.2若报:zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录 ,执行如下安装命令: make MALLOC=libc
4、在redis安装目录/usr/local/redis-4.0.6下新建目录redis-cluster,并在该目录下再新建6个子目录,8001,8002,8003,8004,8005,8006,此时目录结构如下图所(/usr/local/redis-4.0.6/redis-cluster/8001)示:
5、 将redis安装目录/usr/local/redis-4.0.6下的redis.conf文件拷贝至8001文件夹,并修改以下配置:
daemonize yes #开启后台运行
port 8001 #工作端口
bind 172.16.0.15 #绑定机器的内网IP(et0网卡IP),不能设置为外网IP或127.0.0.1 该参数属于安全访问相关参数,意为只接受从该IP所在网卡进来的连接请求(因为一般redis是内部局域网的应用访问 如果外网机器想访问该机器上的redis伪集群 那么需要注释该参数)
dir /usr/local/redis-cluster/8001/ #指定工作目录,rdb,aof持久化文件将会放在该目录下,不同实例一定要配置不同的工作目录
cluster-enabled yes #启用集群模式
cluster-config-file nodes-8001.conf #生成的集群配置文件名称,集群搭建成功后会自动生成,在工作目录下
cluster-node-timeout 20000 #节点宕机发现时间(默认15s 这里建议设置大一些20s),可以理解为主节点宕机后从节点升级为主节点时间
appendonly yes #开启AOF模式
protected-mode no # 关闭保护模式 这样除了本host能访问该redis服务 其他域也能访问
pidfile /var/run/redis_8001.pid #pid file所在目录
#下面是开启Redis的密码访问 注意masterauth和requirepass必须设置为一样(当然如果这里删除下面这2行 也就是不设置密码也是可以的 这里不设置密码 后面操作步骤9中的client.rb的密码设置也就不用操作了)
#指定日志生成路径 若直接指定为logfile ""代表不生成日志文件(相当于指向/dev/null了)
logfile /usr/local/redis-cluster/8001.log
masterauth suwnay123
requirepass sunway123#重命名高危操作命令(这里的命名字串是示例 可以自定义) rename-command KEYS "KEYS_SJC" rename-command FLUSHALL "FLUSHALL_SJC" rename-command FLUSHDB "FLUSHDB_SJC" rename-command CONFIG "CONFIG_SJC"
6、把8001文件夹下的redis.conf文件拷贝到其他5个目录,并重新修改port 、dir、cluster-config-file 三个属性为对应值(实际多台机器部署就是修改为对应机器IP、端口和目录)
这里可以使用sed命令快速修改:sed -i ‘s/8001/8002/g’ 8002/redis.conf
7、 由于创建集群需要用到redis-trib这个命令,它依赖Ruby和RubyGems,因此我们要先安装一下Ruby、RubyGems,以及ruby和redis的接口程序(注意真实的多机集群部署部署时这一步只需要在其中一台master节点机器上安装即可)
1. yum install ruby
2. yum install rubygems
3. gem install redis --version 3.3.3
如果上面安装失败或者安装速度比较慢,可以尝试:
1. gem sources --remove https://rubygems.org/ #去掉官方源
2. gem sources --remove http://rubygems.org/ #去掉官方源
3. gem sources -a https://ruby.taobao.org/ #新增国内源
4. gem install redis --version 3.3.3 #安装redis与ruby连接接口
8、 Ruby安装完成之后,我们开始启动6个节点(执行每个节点的启动命令 如./src/redis-server redis-cluster/8001/redis.conf)
9、查看一下服务是否正常起来了 ps -ef|grep redis
ok,6个节点都已经正常启动,但是现在这个6个节点还是独立无关联的节点,还需要通过后面的操作组成集群
10、开始创建集群
(1)修改client.rb文件中的密码为上面redis.conf的密码
1. client.rb的位置一般在/usr/local/share/gems/gems/redis-3.3.3/lib/redis下,
如果没有可通过find / -name "client.rb"全盘查找一下,定位到如下片段修改其中yourpassword密码:
DEFAULTS = {
:url => lambda { ENV["REDIS_URL"] },
:scheme => "redis",
:host => "127.0.0.1",
:port => 6379,
:path => nil,
:timeout => 5.0,
:password => "yourpassword",
:db => 0,
:driver => nil,
:id => nil,
:tcp_keepalive => 0,
:reconnect_attempts => 1,
:inherit_socket => false
}
(2)执行如下集群创建命令(在安装有ruby的那台机器上执行,该命令在Redis安装目录的src目录中)
./src/redis-trib.rb create --replicas 1 172.16.0.15:8001 172.16.0.15:8002 172.16.0.15:8003 172.16.0.15:8004 172.16.0.15:8005 172.16.0.15:8006
同样如果外网机器需要访问该机器上的redis伪集群,上面命令中的内网IP地址就需要变为该机器的外网IP地址进行集群创建,
另外不管是外网还是内网IP,都需要开放18001、18002、18003、18004、18005、18006的端口访问(否则集群是无法创建的)
由控制台可以看到,集群已经创建完毕,那么我们到8001这个节点看一下集群节点状态
./redis-cli -h 172.16.0.15 -p 8001 登录节点后 输入 cluster nodes
控制台信息显示: 当前集群中存在3个主节点和3个从节点,说明我们的集群已经搭建成功
至此,Redis Cluster集群就搭建完成了!
注:
1.哪些节点是master哪些是Slave是脚本自动规划出来的,本例是8001~8003是master 8004~8006是Slave
2.利用redis-trib创建cluster的操作,只需一次即可。 假设系统关机,把所有6个节点全关闭后,下次重启,即自动进入cluster模式,不用再次redis-trib.rb create
3.如果想重新创建集群(重来一遍部署的话),先使用pkill redis-server命令,然后删除生成的所有node-800*.conf文件、删除 appendonly.aof、dump.rdb即可
Redis进入fail条件:
redis集群是有很多个redis一起工作,那么就需要这个集群不是那么容易挂掉,所以呢,理论上就应该给集群中的每个节点至少一个备用的redis服务。这个备用的redis称为从节点(slave)。每一个节点都存有这个集群所有主节点以及从节点的信息。它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。
节点fail: 半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作,去连接它的备用节点。 集群fail: A、某个主节点和所有从节点全部挂掉,我们集群就进入fail状态。 B、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。 C、如果集群任意master挂掉,且当前master没有slave.集群进入fail状态。
apollo应用配置/代码引入redis配置:
#必须设置为MASTER_SLAVE模式
spring.redis.cluster.read-mode=MASTER_SLAVE
spring.redis.password = SJC#9#redis
特别注意:
如果外网机器需要连接该redis伪集群,在上述操作完成伪集群的部署启动之后,请参照
https://www.jianshu.com/p/7fec6d0d0ae0
中提到的操作完成外部访问的网络打通操作,否则应用(如java的jedis客户端)是无法连接该redis集群的