1 ip 分布
10.48.64.25 host-25 master(6379) sentilen(26379)
10.48.64.30 host-30 slave(6379) sentilen(26379)
10.48.64.35 host-35 slave(6379) sentilen(26379)
下载,安装编译
下载
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
解压
tar zxvf redis-5.0.5.tar.gz
安装编译工具
yum install gcc -y
yum install gcc-c++ -y
yum install tcl -y
编译
cd redis-5.0.5
make MALLOC=libc
新建目录,并复制文件
mkdir /usr/local/redis/{bin/data/logs} -pv
cp ./src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redis-server,redis-trib.rb} /usr/local/redis/bin
复制客户到path 目录
cp ./src/redis-cli /usr/local/bin/
master slave 配置文件
$ cat /usr/local/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize yes
port 6379
pidfile "/usr/local/redis/data/redis_6379.pid"
dir "/usr/local/redis/data"
dbfilename "dump.rdb"
loglevel notice
logfile "/usr/local/redis/logs/redis_6379.log"
host-30 slave 配置文件 root@host-30[05:05:27]:~/ksa/redis-5.0.5
$ cat /usr/local/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize yes
port 6379
pidfile "/var/run/redis.pid"
dir "/usr/local/redis/data"
dbfilename "dump.rdb"
loglevel notice
logfile "/usr/local/redis/logs/redis_6379.log"
slaveof 10.48.64.25 6379
host-35 slave 配置文件 root@host-35[05:05:27]:~/ksa/redis-5.0.5
$ cat /usr/local/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize yes
port 6379
pidfile "/var/run/redis.pid"
dir "/usr/local/redis/data"
dbfilename "dump.rdb"
loglevel notice
logfile "/usr/local/redis/logs/redis_6379.log"
slaveof 10.48.64.25 6379
sentinel 配置文件
在每个节点上都配置 sentinel 端口为 26379,并且sentinel配置的文件都是一样的
$ cat /usr/local/redis/sentinel.conf
port 26379
daemonize yes
logfile "/usr/local/redis/logs/sentinel_26379.log"
dir "/usr/local/redis"
sentinel monitor mymaster 10.48.64.25 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
bind 0.0.0.0
初始化依次启动 redis-server
host-25;
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
host-30
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
host-35
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
启动sentienl ,所有节点都执行
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
查看节点分布
redis-cli info replication
sentinel 参数解释:
sentinel monitor mymaster 127.0.0.1 6379 1
指示 Sentinel 去监视一个被命名为 mymaster 的master,可指定为任何名字
Master IP为127.0.0.1 , 端口号为 6379 ,
这个master判断为失效至少需要 1 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)
注意,无论你设置多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移
sentinel down-after-milliseconds mymaster 30000
down-after-milliseconds 指定了 Sentinel 认为master已经断线所需的毫秒数
sentinel parallel-syncs mymaster 1
parallel-syncs 指定了在执行故障转移时, 最多可以有多少个slave同时对新的master进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel failover-timeout mymaster 180000
failover-timeout 指定故障切换允许的毫秒数,超过这个时间,就认为故障切换失败,默认为3分钟
常用启动脚本
$ cat start_redis_server.sh
/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf
$ cat start_sentinel.sh
#!/bin/sh
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.con
$ cat stop_redis_server.sh
redis-cli SHUTDOWN
python 测试sentinel 集群代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/usr/bin/env python
import redis
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.48.64.25', 26379),
('10.48.64.30', 26379),
('10.48.64.35', 26379)
],
socket_timeout=0.5)
# 获取主服务器地址
def get_master(cluster_name):
master = sentinel.discover_master(cluster_name)
print(master)
# 输出:('172.31.0.2', 5001)
# 获取从服务器地址
def get_slave(cluster_name):
slave = sentinel.discover_slaves(cluster_name)
print(slave)
# 输出:[('172.31.3', 5001), ('172.31.0.4', 5001), ('172.31.0.5', 5001)]
# 获取主服务器进行写入
def write_data():
master = sentinel.master_for(
'mymaster',
socket_timeout=0.5,)
w_ret = master.set('foo', 'ksa')
# 输出:True
# # 获取从服务器进行读取(默认是round-roubin)
def read_data():
slave = sentinel.slave_for(
'mymaster',
socket_timeout=0.5,
)
r_ret = slave.get('foo')
print(r_ret)
# # 输出:bar
if __name__ == '__main__':
# get_master('mymaster')
# get_slave('mymaster')
write_data()
read_data()