redis集群部署手册

重点说明: 强烈建议(要求)生产环境必须使用非容器部署的redis-cluster集群,不要用哨兵集群

Redis Cluster集群至少需要三个master节点,且每一个节点还需要有一个Slave备份节点,本文将以单机多实例的方式部署3个主节点及3个从节点,6个节点实例分别使用不同的端口及工作目录以模拟集群机器

1、集群规划:

1.正常来说需要6台机器来进行部署,这里通过一台机器不同目录和端口(8001~8006)进行模拟,实际部署操作类似2.哪些节点是master哪些是Slaveredis集群启动脚本自动规划

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.logmasterauth suwnay123requirepass 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 ruby2. yum install rubygems3. 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,都需要开放180011800218003180041800518006的端口访问(否则集群是无法创建的)

由控制台可以看到,集群已经创建完毕,那么我们到8001这个节点看一下集群节点状态
./redis-cli -h 172.16.0.15 -p 8001 登录节点后 输入 cluster nodes

控制台信息显示: 当前集群中存在3个主节点和3个从节点,说明我们的集群已经搭建成功
至此,Redis Cluster集群就搭建完成了!

注:

1.哪些节点是master哪些是Slave是脚本自动规划出来的,本例是8001~8003master 8004~8006Slave2.利用redis-trib创建cluster的操作,只需一次即可。
  假设系统关机,把所有6个节点全关闭后,下次重启,即自动进入cluster模式,不用再次redis-trib.rb create3.如果想重新创建集群(重来一遍部署的话),先使用pkill redis-server命令,然后删除生成的所有node-800*.conf文件、删除 appendonly.aofdump.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集群的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宅狗程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值