一、环境
地址 | 操作系统 | redis端口 | 哨兵端口 |
10.24.43.6 | centos6.x | 6380 | 6381 |
10.24.43.7 | centos6.x | 6380 | 6381 |
VIP:10.24.43.8 |
二、部署前准备
1.路径
redis部署路径:/data/UnicomSMS/Redis
2.主机名(选做)
master
[root@master ~]# cat /etc/sysconfig/network
HOSTNAME=master
[root@master ~]# cat /etc/hosts
127.0.0.1 master localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
slave
[root@slave ~]# cat /etc/sysconfig/network
HOSTNAME=slave
[root@slave ~]# cat /etc/hosts
127.0.0.1 slave localhost
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
3.安装yum
请确保你的主机有网络并安装了wget
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup #备份
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo #下载阿里源
yum makecache #缓存
yum -y update #更新阿里源
4.准备安装包
redis安装包
redis-4.0.10.tar.gz
下载地址:http://download.redis.io/releases/redis-4.0.10.tar.gz
linux下载:wget http://download.redis.io/releases/redis-4.0.10.tar.gz
依赖包安装
yum -y install gcc gcc-c++ tcl
一般不需要安装tcl,但是make是有可能会报错tcl版本低,我一般都安上
三、安装redis
进入安装包路径
cd /data/UnicomSMS/Redis
解压
tar -zxvf redis-4.0.10.tar.gz
进入解压后的目录
cd /usr/local/redis/redis-4.0.10/
编译安装
make
make makeinstall
加入环境变量
echo 'PATH=$PATH':/data/UnicomSMS/Redis/redis-4.0.10/bin/ >> /etc/profile #路径别写错哦
source /etc/profile
开启并放入后台运行
cd /data/UnicomSMS/Redis/redis-4.0.10/src
nohup redis-server &>/dev/null &
检查端口是否运行
netstat -unltp | grep :6379
连接redis
redis-cli -p 6379
quit
停掉redis
killall redis
两台一样
四、redis主从部署
配置master
修改端口
vi redis.conf
port 6380 #端口
daemonize yes #开启后台守护进程
bind 0.0.0.0 #绑定地址,默认是127.0.0.1,0.0.0.0表示绑定所有地址
pidfile "/var/run/redis-6380.pid"
logfile "/var/log/redis/redis-6380.log"
protected-mode no #关闭保护模式
杀掉之前的redis
ps -ef |grep redis
killall redis
启动master的redis
nohup bin/redis-server /data/UnicomSMS/redis/bin/redis.conf &> /tmp/redis.log &
netstat -unltp |grep redis
验证是否为master
src/redis-cli -p 6380 info | grep role
配置slave
修改端口
vi redis.conf
port 6380
daemonize yes
bind 0.0.0.0
protected-mode no
pidfile "/var/run/redis-6380.pid"
logfile "/var/log/redis/redis-6380.log"
slaveof 10.24.43.6 6380 #指定主服务器ip和端口
永久为从
# slaveof <masterip> <masterport>
我们可以在配置文件中直接修改 slaveof 属性,我们直接配置主服务器的ip 地址,和端口号,如果这里主服务器有配置密码可以通过配置masterauth 来设置链接密码
启动master的redis
nohup bin/redis-server &> /tmp/redis.log &
netstat -unltp |grep redis
验证是否为master
src/redis-cli -p 6380 info | grep role
临时做从的话
在启动后配置
nohup src/redis-server /redis.conf &> /tmp/three.log &
netstat -unltp |grep redis
查看是否为master
src/redis-cli -p 6380 info | grep role
命令行切换到从
src/redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6380
特点
在当前slave掉线后,再启动会从服务器会读取自己本地的 rdb 回复数据,而不会去自动链接主服务
六、配置redis哨兵
vim sentinel.conf
#master6380为实例名称,监听主服务器(10.24.43.6)6380端口,
#这里的1表示,如果这台sentinel认为主redis挂了,才算挂
sentinel monitor master6380 10.10.10.63 6380 1
#如果5秒内master6380没有响应,就认为SDOWN
sentinel down-after-milliseconds master6380 5000
sentinel failover-timeout master6380 15000
#自动切换后,执行脚本,实现vip自动漂移
sentinel client-reconfig-script master6381 /opt/notify_master6381.sh
添加/opt/notify_master6381.sh,实现vip自动漂移(主从服务器都要配置)
root@wyq63 ~]# cat /opt/notify_master6381.sh
#!/bin/bash
MASTER_IP=$6 #第六个参数是新主redis的ip地址
LOCAL_IP='10.24.43.6' #这里记得要改,每台服务器写自己的本地ip即可
VIP='10.24.43.8'
NETMASK='24' #子网掩码位数
INTERFACE='eth0'#网卡接口设备名称
if [ ${MASTER_IP} = ${LOCAL_IP} ];then
/usr/sbin/ip addr add ${VIP}/${NETMASK} dev ${INTERFACE} #将VIP绑定到该服务器上
/usr/sbin/arping -q -c 3 -A ${VIP} -I ${INTERFACE}
exit 0
else
/usr/sbin/ip addr del ${VIP}/${NETMASK} dev ${INTERFACE} #将VIP从该服务器上删除
exit 0
fi
exit 1
启动redis-sentinel(主从服务器全部启动)
redis-sentinel /etc/redis-sentinel.conf #指定redis-sentinel配置文件
查看主(从)服务器sentinel状态
[root@wyq63 ~]# redis-cli -h 10.10.10.63 -p 6381 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master6380,status=ok,address=10.24.43.6:6380,slaves=2,sentinels=3
绑定VIP到redis主服务器(第一次需要手动绑定,后面故障切换就不需要)
从服务器的sentinel状态可以看出,当前主redis服务器ip是10.24.43.6
ip addr add 10.24.43.8/24 dev eth0 #绑定vip到网卡上
arping -q -c 3 -A 10.24.43.8 -I eth0 #arp抑制
ip a #查看当前网卡ip状态
通过VIP(10.25.43.8)测试连接redis-server和redis-sentinel
[root@wyq64 ~]# redis-cli -h 10.25.43.8 -p 6380 info replication #连接redis-server
# Replication
role:master
connected_slaves:2
slave:ip=10.24.43.7,port=6379,state=online,offset=174706,lag=1
master_repl_offset:174706
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:174705
七、附加项(哨兵使用)
连接哨兵:
src/redis-cli -p 26379
命令:
sentinel的基本状态信息
INFO
列出所有被监视的主服务器,以及这些主服务器的当前状态
SENTINEL masters
列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
SENTINEL slaves
返回给定名字的主服务器的 IP 地址和端口号
SENTINEL get-master-addr-by-name
重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。
SENTINEL reset
当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新
SENTINEL failover
[root@wyq64 ~]# redis-cli -h 10.24.43.8 -p 6381 info sentinel #连接redis-sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=master6380,status=ok,address=10.24.43.6:6380,slaves=1,sentinels=2
故障测试
[root@wyq63 ~]# redis-cli -h 10.24.43.6 -p 6380 shutdown #关闭主redis
[root@wyq63 ~]# redis-cli -h 10.24.43.8 -p 6381 info sentinel #通过vip查看sentinel状态
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
#发现主redis已经切换到10.24.43.7这台从服务器上了
master:name=master6380,status=ok,address=10.24.43.7:6380,slaves=1,sentinels=2
ip a查看现在vip情况