目录
一、环境
地址 | 操作系统 | redis端口 | 哨兵端口 |
10.24.43.6 | centos6.x | 6380 | 6381 |
10.24.43.7 | centos6.x | 6380 | 6381 |
二、部署前准备
1.路径(可自定义)
redis部署路径:/data/UnicomSMS/Redis
2.主机名(选做)
主
[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
从
[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-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 /data/UnicomSMS/Redis/redis-4.0.10/ #进入解压后的目录
make && make install #编译安装
加入环境变量
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 redis
连接redis
redis-cli
quit
两台一样
四、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
netstat -unltp | grep redis #查看进程pid号
kill -9 pid号
启动master的redis
nohup redis-server /data/UnicomSMS/redis/bin/redis.conf &> /tmp/redis.log &
netstat -unltp |grep redis
验证是否为master
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 redis-server &> /tmp/redis.log &
netstat -unltp |grep redis
验证是否为master
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 -p 6380这样指定端口,默认redis-cli是连接6379,因redis-cli是编译好的,所以不可修改
六、配置redis哨兵
vim sentinel.conf
#哨兵端口
port 6381
#mymaster为实例名称,监听主服务器(10.24.43.6)6380端口,
#这里的1表示,如果这台sentinel认为主redis挂了,才算挂
sentinel monitor mymaster 10.24.43.6 6380 1
#如果5秒内mymster没有响应,就认为SDOWN
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
启动redis-sentinel(主从服务器全部启动)
redis-sentinel /data/UnicomSMS/Redis/sentinel.conf #指定redis-sentinel配置文件
七、附加项(哨兵使用)
连接哨兵
redis-cli -p 6381
命令:
sentinel的基本状态信息
INFO
列出所有被监视的主服务器,以及这些主服务器的当前状态
SENTINEL masters
列出给定主服务器的所有从服务器,以及这些从服务器的当前状态
SENTINEL slaves
返回给定名字的主服务器的 IP 地址和端口号
SENTINEL get-master-addr-by-name
重置所有名字和给定模式 pattern 相匹配的主服务器。重置操作清除主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主服务器的所有从服务器和 Sentinel 。
SENTINEL reset
当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移,但是它会给其他sentinel发送一个最新的配置,其他sentinel会根据这个配置进行更新
SENTINEL failover
八、测试
1.主从测试
[root@redis_1 ~ ] redis-cli -p 6380
<127.0.0.1:6380>mset k1 v1 k2 v2 k3 v3
<127.0.0.1:6380>keys *
k1
k2
k3
[root@redis_2 ~ ] redis-cli -p 6380
<127.0.0.1:6380>keys *
k1
k2
k3
主创建了k1,k2,k3.这里在从我们也看到了,说明主从同步没问题
2.哨兵测试(这里我只粘贴重要部分)
[root@redis_1 ~ ] redis-cli -p 6380
<127.0.0.1:6380> info replication
role:master
connected_slaves:1
[root@redis_1 ~ ] kill -9 pid号 #只kill掉redis的进程就可以
[root@redis_2 ~ ] redis-cli -p 6380
<127.0.0.1:6380>info replication
role:master
connected_slaves:0
我们可以清晰的看到slave升到了master,证明哨兵没有问题,再来启动原主看看
[root@redis_1 ~ ] nohup redis-server /data/UnicomSMS/redis/bin/redis.conf &> /tmp/redis.log &
[root@redis_2 ~ ] redis-cli -p 6380
<127.0.0.1:6380>info replication
role:slave
[root@redis_1 ~ ] redis-cli -p 6380
<127.0.0.1:6380>info replication
role:master
connected_slaves:1
到这里,完美的哨兵已经完成了,至于调优,后续会更新,最近没时间
九、加入系统服务
/data/UnicomSMS/Redis/utils/redis_init_script #redis启动脚本位置
cp redis_init_script /etc/init.d/redis #复制到系统服务目录下
chmod +x /etc/init.d/redis #赋予执行权限
chkconfig --add redis #加入系统服务
chkconfig --level 2345 redis on #开机自启
vim /etc/init.d/redis #修改启动脚本
启动脚本默认只有start,stop,这里我自己加了个status
启动脚本如下:
#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
### BEGIN INIT INFO
# Provides: redis_6380
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Redis data structure server
# Description: Redis data structure server. See https://redis.io
### END INIT INFO
REDISPORT=6380 #端口
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/data/UnicomSMS/Redis/redis.conf"
JINCHENG=`netstat -unltp |grep redis |wc -l` #这里是我添加的status的变量,需要可以添加,下面status)段落为查看状态的判断语句,这两个地方添加上就可以使用service redis status了
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
status)
if [ $JINCHENG -eq 3 ];then
echo "redis与sentine正在运行中!"
elif [ $JINCHENG -eq 1 ];then
echo "redis正在运行中"
elif [ $JINCHENG -eq 2 ];then
echo "redis可能没有运行,sentine正在运行"
else
echo "redis没有在运行,请使用此命令检查netstat -unltp |grep redis"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac