三节点redis5 sentinel哨兵模式集群搭建

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

86d645c7b80d9dcd7ff68609a4c647d2f8f.jpg

 

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()

 

 

 

 

 

转载于:https://my.oschina.net/u/4072296/blog/3071165

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值