centos7 redis 重启_CentOS 7安装Redis集群(哨兵模式)

1a073ed0f1af3490fa4cbba45bfeb811.gif

环境准备

VMWare、CentOS7虚拟机(已安装好)、3台虚拟机,IP分别为192.168.182.131、192.168.182.132、192.168.182.133。也可以等第一台虚拟机Redis安装完成后,通过克隆,克隆出另外2台虚拟机,可免于前面的诸多准备工作。

安装gcc库

如操作系统没有安装gcc库,则需要提前安装gcc库。
yum -y install gcc automake autoconf libtool make

安装redis

下载Redis源码,版本为4.0.11。
wget http://download.redis.io/releases/redis-4.0.11.tar.gz

下载完成后解压。

tar xzvf redis-4.0.11.tar.gz

安装

cd redis-4.0.11make make install

配置

准备工作 在usr目录下,创建redis目录,并赋755权限。
// 进入usr目录cd /usr// 创建redis目录mkdir redis// 赋755权限chmod 755 redis

拷贝redis-4.0.11/src目录下的redis-server、redis-sentinel、redis-cli、redis-benchmark文件、redis-4.0.11目录下的redis.conf、sentinel.conf文件到redis目录下。

cp /home/luas/redis-4.0.11/src/redis-server .cp /home/luas/redis-4.0.11/src/redis-sentinel .cp /home/luas/redis-4.0.11/src/redis-cli .cp /home/luas/redis-4.0.11/src/redis-benchmark .cp /home/luas/redis-4.0.11/redis-conf .cp /home/luas/redis-4.0.11/src/sentinel.conf .

注意,紧接上一步,当前已经在/usr/redis目录下,如不在此目录下,注意添加全路径/usr/redis。

复制完成后,该目录下共有6个文件。 7d2ed759c1a513a135a6f0558b9eb27d.png 至此,准备工作完毕。此时,使用VMWare在此拍摄快照并保存。然后,克隆2份同样的虚拟机,名称分别为Redis2-192.168.182.132、Redis3-192.168.182.133(假定IP是顺序增加的),然后分别启动虚拟机。

Redis配置

主redis配置

先修改主redis配置,本例中虚拟机名为Redis1-192.168.182.131,ip地址为192.168.182.131。
vim redis.conf
修改内容如下,可上下翻动,查找需要修改的配置项。
# bind 127.0.0.1   #这一行注释protected-mode no # 保护模式为no,如为yes,则修改为noport 6379  #端口号daemonize no  #修改为no,表示redis服务可以后台运行
修改完成后,保存退出,启动redis服务。
redis-server redis.conf
注意,此处必须带上修改后的配置文件,如果不带,redis会按默认配置文件配置项来启动。 启动成功。 52574a8457d1cabec85e8b6d57aaefcb.png 使用redis-cli命令,查看服务器信息。
redis-cli info
能看到诸多信息,如服务端信息、客户端信息、Memory信息、持久化存储信息、状态信息、主从信息、CPU信息、集群信息等,可根据需要查看。 d05895dc2162e9d2e3418c9f668d8f20.png 99761b989b4aa856377aee2cd1c76c42.png f8ba66363bdff0bd63a3c2171322cbdc.png 0e84724a228b247e6a736fca33aa15c2.png dff85aa685951e2476f5bfc4538ee637.png 76126995b8efc4d1db47005206fb9d7d.png 此时,对我们最有用的,就是主从信息了,即Replication。
# Replicationrole:masterconnected_slaves:0master_replid:429a78b20ebc7605aa944b5851b322b1ae1aa8e0master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0
从显示的信息中可以看出,当前服务器是master角色,尚未有slave角色连接。 特别地,也可以使用如下命令,快捷查看对应的信息。
redis-cli -h x.x.x.x -p 6379 info xxx

例如,查看133主机Replication信息。

redis-cli -h 192.168.182.133 -p 6379 info Replication

从redis配置

主redis的配置修改并启动完成。然后,分别修改两台从redis的配置。

# bind 127.0.0.1   #这一行注释protected-mode no # 保护模式为no,如为yes,则修改为noport 6379  #端口号daemonize no  #修改为no,表示redis服务可以后台运行slaveof 192.168.124.20 6379 #配置主服务器,格式为slaveof 主IP 主端口号

修改完成后,分别启动。

如此时主redis已启动,启动之后,将会自动连接,如图:

609b5c90594242e95606173665c8df2a.png

如主redis尚未启动,或由于其它原因,连接不上,则启动后会出现错误信息(连接拒绝),如图:

291b3ae5f59af0419f9fed57b59aae65.png

如主redis已启动,但由于防火墙或其它原因,连接不成功,则会出现警告信息(host连接不上),如图:

34da6c1c17cdfa3e5b239c0c5d9d1312.png

启动后,使用redis-cli命令,查看服务器信息。

redis-cli info

d878aee959a7019092d4c941ff05ca4f.png

可以看到,当前服务器角色为slave,且master服务器为192.168.182.131,端口为6379,符合之前配置文件中的设定。 值得注意的是,master_link_status状态为up,代表master服务器可用。如为down,多半说明主服务器防火墙处于开启状态。 先查看当前服务器防火墙状态。
// 查看防火墙状态firewall-cmd --state
9e8fa5b63793ff7ea4f03ce11ea2508b.png 从输出的信息可以看出,当前服务器防火墙处于开启并运行的状态。 粗暴一些的办法,可直接关闭防火墙:
// 关闭防火墙systemctl stop firewalld // 关闭防火墙service firewalld stop
但是,生产环境下,肯定不能太粗暴。此时,应该放开6379(如端口设置为别的,此处也需设置为相同的值)端口。

可先查看端口是否开放。

firewall-cmd --query-port=6379/tcp

8a607ccbbce1fa909dd7fa11b16b1f9b.png

如为yes,说明端口处于开放状态;如为no,说明处于关闭状态,需要开启。

# 开启redis端口firewall-cmd --permanent --add-port=6379/tcp# 移除redis端口firewall-cmd --permanent --remove-port=6379/tcp# 重启防火墙firewall-cmd --reload
说明:
  1. firwall-cmd:是Linux提供的操作firewall的一个工具;
  2. --permanent:表示设置为持久;
  3. --add-port:标识添加的端口;
  4. --remove-port:标识移除的端口。

防火墙重启后,可再执行info命令,查看相关信息,是否连接成功,一般情况下,同时,redis启动界面已显示连接成功,同步数据等信息。
8142:S 09 May 14:48:16.367 * MASTER <-> SLAVE sync: receiving 176 bytes from master8142:S 09 May 14:48:16.367 * MASTER <-> SLAVE sync: Flushing old data8142:S 09 May 14:48:16.368 * MASTER <-> SLAVE sync: Loading DB in memory8142:S 09 May 14:48:16.368 * MASTER <-> SLAVE sync: Finished with success
此时,再回过头查看redis主服务器的info信息如下。
# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.182.133,port=6379,state=online,offset=70,lag=1slave1:ip=192.168.182.132,port=6379,state=online,offset=84,lag=1master_replid:84d8fbe799dc8d4143fa2a4938b4545f8d5eb3dfmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:84second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:84
此时,已有2台从redis实例连接,同时,也输出了2台从redis实例的相关信息。 测试 在主redis实例上,即可读,亦可写。 af15a295f11ee0a8bda9ca8600af5820.png 在从redis实例上,只能读,不能写。 0ac4964170a156d149da68e2995e9525.png 同时,可以看到,在主redis实例上写的数据,在从redis实例上,依然可以查到。 redis主从复制集群搭建完成,下面开始做哨兵集群。 哨兵配置 分别在三台redis实例上,启动一个哨兵进程。三个哨兵进程监控这个redis主从集群,如果主服务器挂了,哨兵进程就会从从服务器里选一台作为主服务器,选举机制配置文件中有表明。

三台redis服务器上的哨兵配置都是相同的,内容如下:

protected-mode no  #保护模式关闭port 26379  #端口号dir "/tmp"   #服务运行临时目录sentinel monitor mymaster 192.168.182.131 6379 2 # sentinel auth-pass mymaster “123456”sentinel down-after-milliseconds mymaster 3000 sentinel parallel-syncs mymaster 1    sentinel failover-timeout mymaster 180000  sentinel deny-scripts-reconfig yeslogfile /var/log/sentinel.logpidfile /var/run/sentinel.piddaemonize yes
配置项说明 sentinel auth-pass mymaster “123456” 设置连接master和slave时的密码,需要注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。 同时,如果要做自动故障转移,则建议所有的redis.conf都设置masterauth,因为自动故障只会重写主从关系,即slaveof,不会自动写入masterauth。如果Redis原本没有设置密码,则可以忽略。 sentinel monitor mymaster 192.168.182.131 6379 2  sentinel监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址192.168.182.131,端口号为6379,而将这个主实例判断为失效至少需要2个sentinel进程的同意,只要同意sentinel的数量不达标,自动failover就不会执行。 sentinel parallel-syncs mymaster 指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长。但是如果这个数字越大,就意味着越多的slave实例因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。 sentinel deny-scripts-reconfig yes 不允许使用SENTINEL SET设置notification-script和client-reconfig-script。 sentinel failover-timeout mymaster 180000 如果在该时间(ms)内未能完成failover操作,则认为该failover失败。 sentinel down-after-milliseconds mymaster 3000  指定了sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么sentinel将这个实例标记为主观下线。只有一个sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移,只有在足够数量的sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行。 sentinel notification-script  指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用。 sentinel的notification-script和reconfig-script是用来配置当某一事件发生时所需要执行的脚本,可以通过脚本来通知管理员,例如当系统运行不正常时发邮件通知相关人员。对于脚本的运行结果有以下规则:
  • 若脚本执行后返回1,那么该脚本稍后将会被再次执行,重复次数目前默认为10
  • 若脚本执行后返回2,或者比2更高的一个返回值,脚本将不会重复执行。
  • 如果脚本在执行过程中由于收到系统中断信号被终止了,则同返回值为1时的行为相同。
  • 一个脚本的最大执行时间为60s,如果超过这个时间,脚本将会被一个SIGKILL信号终止,之后重新执行。

sentinel client-reconfig-script 当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。以下参数将会在调用脚本时传给脚本: 目前总是“failover”, 是“leader”或者“observer”中的一个。 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的。这个脚本应该是通用的,能被多次调用,不是针对性的。 配置示例:
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

分别启动三台实例的sentinel进程。

redis-sentinel sentinel-conf

b1672abd8320e12202c05e8483e8bc8f.png

在主实例服务器查看其sentinel信息。当然,也可以把命令连起来:redis-cli -p 26379 info sentinel。

[luas@test1 redis]$ redis-cli -p 26379127.0.0.1:26379> info sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.182.131:6379,slaves=2,sentinels=3

可以看到主实例的信息,有多少台从实例等。

此时,哨兵模式算是搭建完毕。

测试

关闭主实例,ctrl + c关闭窗口,kill -9杀进程,redis-cli -p 6379 shutdown等,都可以。 132服务器redis进程响应如下。 a62ada2672da3b7faffb55bd2f1ff71f.png 132服务器sentinel进程响应如下。 9b7285f84f6c312562bc3b4af908bd1d.png 133服务器redis进程响应如下。 4c90f266f84327e97b0013f09eda786e.png 133服务器sentinel进程响应如下。 fd4dc895343f7500462f4342e1ebf9b0.png 此时,查看133实例(此时,已提升为主实例)的信息,已经提升为主实例,132实例为其从实例。 76ff9a5f81dbacc2a47d1fc575684b19.png 然后,启动131实例。启动完成后,查看其信息,发现其已经自动注册为133master实例的slave实例。 a7500afe02925f2bf8f21229b4bed1d6.png 查看其信息,显示其为slave实例,主实例为133服务器。 2cffacb2c3b3a8cd8893a70754af0d00.png 至此,Redis主从复制集群(哨兵模式)成功搭建完成。

问题

redis搭建完成后,停止主实例,从实例一直报错,连不上主实例,不会自动进行故障转移。 1、sentinel.conf配置文件不正确,修改为正确的配置。 2、防火墙未开放6379(redis端口)、26379(sentinel端口)端口。 其中,数防火墙这个原因最坑。sentinel.conf修改完成后,无论怎么尝试都不不会进行故障转移。后来脑中突然想起来防火墙这回事,此时,主实例服务器的6379端口已放开,而2台从实例的6379端口尚未放开。将2台从实例的6379端口放开后,主实例里面做出了响应,开始从两个从实例同步信息,如图。 d7dfb920fbcb842d49e9849bc947cbfb.png 真是坑啊。 同样的,3台服务器防火墙还需要放开26379(sentinel端口)端口。3台服务器均放开后,停止主实例,看到从实例窗口滚动了下,一看,故障转移成功,奥利给,感谢各TV!!! redis make 命令后,报错:致命错误:jemalloc/jemalloc.h:没有那个文件或目录 解决方案非常简单:
make MALLOC=libc

c7879bac46909131d8ddf16068abf6e7.gif

- End -

a0a12048e2512868341b4491c8765e6b.gif

回复以下关键字,获取更多资源

SpringCloud进阶之路 | Java 基础 | 微服务 | JAVA WEB | JAVA 进阶 | JAVA 面试 | MK 精讲 a0a12048e2512868341b4491c8765e6b.gif

往期精选

c00843798e36a4168dee57dd6f7b1757.png 8848dc337f3820185d201abd057963a8.png 

可能是最全的Thymeleaf参考手册(一):配置

ribbon,不带这么坑人的!

Spring Cloud进阶之路 | 十二:断路器聚合监控(Turbine)

面试宝典(一):除零问题

重温Java基础(七):位运算符

避坑指南(四):zuul整合断路器监控线程池一直loading

docker进阶之路-基础篇 | 二:protainer安装与使用

集群式Quartz定时任务框架实践

如果喜欢我们的文章

可以关注我们

也可以点击右下角的在看告诉我们

期待与您相遇

9a08f48284b4fc5de78cc3253aeb68f2.png

点“在看”你懂得

3de0b21c6109c21a4595add40f15b0fc.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值