环境

由于不太熟悉docker,所以,把docker当虚拟机来用,服务器环境如下:

Redis Server 环境搭建

Redis Server 01 搭建 并且制作Redis镜像

容器建立

# docker run -i -t --name redis_server_01 --net mynetwork --ip : -v /root/redis_data:/redis centos /bin/bash

容器中必要包下载

# yum install wget gcc make vim -y

下载redis-5.0.0

# mkdir /soft
# cd /soft/
# wget http://download.redis.io/releases/redis-5.0.0.tar.gz

安装redis

# .tar.gz
# cd redis-
# make PREFIX=/usr/local/redis install
# make install

配置redis.conf

# /redis.conf /redis/
# .conf
修改效果如下: 
# .conf | grep -Ev "^$|^#"
protected-mode yes
port
tcp-backlog
timeout
tcp-keepalive
daemonize yes
supervised no
pidfile /redis/pid-redis-.pid
loglevel notice
logfile "log-redis-6381.log"
databases
always-show-logo yes
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename rdb-.rdb
dir /redis
masterauth j2H2n@e6Gvrhsc1Enr4^yxf*l43*ht
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-
repl-disable-tcp-nodelay no
replica-priority
requirepass j2H2n@e6Gvrhsc1Enr4^yxf*l43*ht
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size -
list-compress-depth
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
stream-node-max-bytes
stream-node-max-entries
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit replica 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
# 

开启服务并且制作镜像

# redis-server /redis/conf-redis-.conf
退出容器制作镜像
Ctrl + P + Q 可以退出容器而使之不停止
寻找CONTAINER ID并且制作为镜像
# docker ps | grep redis_server_01
制作镜像 
# docker commit 1ce7c0cf1364 redis_server_sentinel
查看镜像
# docker images | grep redis_server_sentinel

Redis Server 02 / Redis Server 03搭建

容器建立

# docker run -i -t --name redis_server_02 --net mynetwork --ip : -v /root/redis_data:/redis redis_server_sentinel /bin/bash

配置redis.conf

# .conf conf-redis-.conf
相比于redis server 01 的配置文档,server 02的配置文档有差异的地方如下:
# .conf | '
port
pidfile /redis/pid-redis-.pid
logfile "log-redis-6382.log"
dbfilename rdb-.rdb
# 

开启服务

# redis-server /redis/conf-redis-.conf

用类似的方法配置redis server 03服务器

# docker run -i -t --name redis_server_03 --net mynetwork --ip : -v /root/redis_data:/redis redis_server_sentinel /bin/bash

# .conf /redis/conf-redis-.conf

# .conf | "
port
pidfile /redis/pid-redis-.pid
logfile "log-redis-6383.log"
dbfilename rdb-.rdb
# 

# redis-server /redis/conf-redis-.conf

Redis Server 主从复制搭建

将6382/6383 作为 6381 的从库
# docker attach redis_server_02
# redis-cli -p
> AUTH j2H2n@e6Gvrhsc1Enr4^yxf*l43*ht
OK
> SLAVEOF
OK
> exit

# docker attach redis_server_03
# redis-cli -p
> AUTH j2H2n@e6Gvrhsc1Enr4^yxf*l43*ht
OK
> SLAVEOF
OK
> exit
验证主从复制
# docker attach redis_server_01
# redis-cli -p
> AUTH j2H2n@e6Gvrhsc1Enr4^yxf*l43*ht
OK
> INFO replication
# Replication
role:master
connected_slaves:
slave0:ip=,state=online,offset=,lag=
slave1:ip=,state=online,offset=,lag=
master_replid:bc1ecc220927ba0d9c368a3837c5fe43e718d1b3
master_replid2:
master_repl_offset:
second_repl_offset:-
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
> 

Redis Sentinel 环境搭建

Redis Sentinel 01 搭建

容器建立

# docker run -i -t --name redis_sentinel_01 --net mynetwork --ip : -v /root/redis_data:/redis redis_server_sentinel /bin/bash

定义邮件发送

# mkdir /redis
# cd /redis
# yum install python

定义python发送脚本
# cat sentinel_mail.py
    #!/usr/bin/env python
    import sys
    import smtplib
    import email.mime.text

    def SamMail(message):
        HOST = "SMTP服务器"
        SUBJECT = 'redis_docker_sentinel'
        TO = "发送给谁"
        FROM = "谁发送的"

        msg = email.mime.text.MIMEText(
        """
            %s
        ")

        msg['Subject'] = SUBJECT
        msg['From'] = FROM
        msg['TO'] = TO

        server = smtplib.SMTP_SSL(HOST,')
        server.login("用户名","密码")
        server.sendmail(FROM,TO.split(','),msg.as_string())
        server.quit

    def main():
        message = ""
        :]:
            message = message + argv_text
        SamMail(message)

    if __name__=="__main__":
        main()
#
测试发送
# ./sentinel_mail.py 

配置sentinel.conf

# /sentinel.conf /redis/conf-sentinel-.conf
# .conf | grep -Ev "^$|^#"
port
protected-mode no
daemonize yes
pidfile /redis/pid-redis-sentinel-.pid
logfile "/redis/log-sentinel-26381.log"
dir /tmp
sentinel monitor docker_sentinel
sentinel auth-pass docker_sentinel j2H2n@e6Gvrhsc1Enr4^yxf*l43*ht
sentinel down-after-milliseconds docker_sentinel
sentinel parallel-syncs docker_sentinel
sentinel failover-timeout docker_sentinel
sentinel notification-script docker_sentinel /redis/sentinel_mail.py
sentinel deny-scripts-reconfig yes
# 

制作镜像

# docker commit 5d61d56f35f4 redis_sentinel_server

Redis Sentinel 02 / Redis Sentinel 03 搭建

redis sentinel 2 容器建立

# docker run -i -t --name redis_sentinel_02 --net mynetwork --ip : -v /root/redis_data:/redis redis_server_sentinel /bin/bash

配置文件修改

相比于conf-sentinel-.conf,conf-sentinel-.conf不同点在于
# .conf conf-sentinel-.conf
# .conf | '
port
pidfile "/redis/pid-redis-sentinel-26382.pid"
logfile "/redis/log-sentinel-26382.log"
# 

redis sentinel 3 容器建立

# docker run -i -t --name redis_sentinel_03 --net mynetwork --ip : -v /root/redis_data:/redis redis_server_sentinel /bin/bash

配置文件修改

相比于conf-sentinel-.conf,conf-sentinel-.conf不同点在于
# .conf conf-sentinel-.conf
# .conf |
port
pidfile "/redis/pid-redis-sentinel-26383.pid"
logfile "/redis/log-sentinel-26383.log"
# 

依次启动26381,26382,26383 sentinel

# docker attach redis_sentinel_01
# redis-sentinel /redis/conf-sentinel-.conf
# docker attach redis_sentinel_02
# redis-sentinel /redis/conf-sentinel-.conf
# docker attach redis_sentinel_03
# redis-sentinel /redis/conf-sentinel-.conf 
重启完毕后,立马接收邮件如下:

 

从宿主机访问redis sentinel

# cat redis_sentinel.py
#!/usr/bin/env python3

import redis
import redis.sentinel

sentinel_list = redis.sentinel.Sentinel([
('172.30.1.24',26381),
('172.30.1.25',26382),
('172.30.1.26',26383),
])

#获取主服务器信息
get_master_info = sentinel_list.discover_master('docker_sentinel')
print (get_master_info)

#获取从服务器信息
get_slave_info = sentinel_list.discover_slaves('docker_sentinel')
print (get_slave_info)

# 

执行如下

# ./redis_sentinel.py
('172.30.1.21', 6381)
[('172.30.1.22', 6382), ('172.30.1.23', 6383)]
# 

模拟灾难切换

模拟脚本

在宿主机上定义python flask 脚本,用于获取主库和从库IP

#!/usr/bin/env python3

import redis
import redis.sentinel
import random
from flask import Flask
import logging

app = Flask(__name__)

@app.route('/master_info')
def get_redis_master_info() :
        sentinel_list = redis.sentinel.Sentinel([
                ('172.30.1.24',26381),
                ('172.30.1.24',26382),
                ('172.30.1.24',26383),
        ])

        get_master_info = sentinel_list.discover_master('docker_sentinel')
        return str(get_master_info[1])

@app.route('/slave_info')
def get_redis_slave_info() :
        sentinel_list = redis.sentinel.Sentinel([
                ('172.30.1.24',26381),
                ('172.30.1.24',26382),
                ('172.30.1.24',26383),
        ])

        get_slave_info = sentinel_list.discover_slaves('docker_sentinel')
        return_get_slave_info = get_slave_info[random.randint(0,len(get_slave_info)-1)]

        return str(return_get_slave_info[1])

@app.route('/')
def index():
        return 'hello world'

if __name__ == '__main__':
        app.debug = True
        app.run(host='0.0.0.0',port=9001)

脚本获取的效果如下:

# curl 127.0.0.1:9001/slave_info
6383
# curl 127.0.0.1:9001/master_info
6381
# 

由于是docker环境,故,域名是固定的,只需要知道端口就行了

模拟主库挂掉

关掉主库

# docker stop redis_server_01
redis_server_01
# 

收到的邮件:

再次用脚本获取当前主库和从库:

# ./redis_sentinel.py
()
[()]
# curl /master_info

# curl /slave_info

# 

再次将6380给开启:

# docker start redis_server_01
redis_server_01
# docker attach redis_server_01
# redis-server /redis/conf-redis-.conf
# 

邮件如下:

再次用脚本测试如下

# ./redis_sentinel.py
()
[(), ()]
# curl /slave_info

# curl /slave_info

# curl /slave_info

# curl /master_info

# 

可见,虽然在主库挂掉的时候,大约会有30秒的切换时间,但是总的来说,还是不错的

 

Redis sentinel之集群搭建的更多相关文章

  1. Redis 3.0 集群搭建

    Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...

  2. Redis 5.0 集群搭建

    Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...

  3. CentOS7 配置 Redis Sentinel主从集群配置

    Redis Sentinel主从集群 环境.准备 slave配置 sentinel配置 测试 C#连接Redis Sentinel 1.环境.准备 单实例3台CentOS7服务器,IP地址.: 192 ...

  4. Redis操作及集群搭建以及高可用配置

    NoSQL - Redis 缓存技术 Redis功能介绍 数据类型丰富 支持持久化 多种内存分配及回收策略 支持弱事务 支持高可用 支持分布式分片集群 企业缓存产品介绍 Memcached: 优点:高 ...

  5. Redis Sentinel哨兵集群

    Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...

  6. Redis进阶实践之十一 Redis的Cluster集群搭建

    一.引言      本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的详细概念做深入的探讨.本文只是提供了有关如何设置集群.测试和操作集群的说明,而不涉及Redis集群规范中涵 ...

  7. 超详细的 Redis Cluster 官方集群搭建指南

    今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细. 安装ruby环境 因为官方提供的创建集群的工具是用ruby写的,需要ruby2.2.2+版本支持,rub ...

  8. redis整合Spring集群搭建及业务中的使用

    1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...

  9. linux Redis 5.0集群搭建

    文档结构如下: Redis cluster 是redis的分布式解决方案,在3.0版本正式推出后,有效的解决了redis分布式方面的需求:当遇到单机内存,并发,流量等瓶颈是,可以采用cluster架构 ...

随机推荐

  1. spring框架校验自定义注解

    起因: 项目开发时遇到一个问题是对于金额类型的字段,数据库中格式一般为BigDecimal类型,两位小数点,然后在接口定义中如果不定义成String类型的话,就不能使用@pattern注解限定格式,而 ...

  2. 如何使用tensorboard查看tensorflow  graph****.pb文件的模型结构

    参考网上的:https://github.com/tensorflow/tensorflow/issues/8854 import tensorflow as tf from tensorflow.p ...

  3. eclipse与idea快捷键对比以及idea debug、git快捷键

    eclipse与idea快捷键 表格中的空格都是忘记了~ 功能 eclipse idea 生成返回值对象 alt+shift+L ctrl+alt+V 找到启动类   ctrl+alt+Home 类的 ...

  4. Loadrunner进行HTTPS协议性能测试

    1.最简单办法就是在脚本前面加上:web_set_sockets_option("SSL_VERSION","TLS"),一般能解决HTTPS协议的请求问题,无 ...

  5. cdn帮助链接汇集

    1. 如何查看节点和站点的流量,负载和连接信息 2. cdnbest常见状态码解释 3. 如何让用户访问走最近最快的线路(分组线路) 4. cdnbest里如何查看网站是否被缓存 5. cdnbest ...

  6. Linux - 常用 Linux 命令的基本使用

    常用 Linux 命令的基本使用 目标 理解学习 Linux 终端命令的原因 常用 Linux 命令体验 01. 学习 Linux 终端命令的原因 Linux 刚面世时并没有图形界面,所有的操作全靠命 ...

  7. windows server 2012R2 故障转移集群配置

    配置说明: AD:10.10.1.10/24  Node-2:10.10.1.20/24 Node-3:10.10.1.30/24 zhangsan-PC:10.10.1.50/24  VIP1:10 ...

  8. mysql设置存储中文变成问号或者乱码

    技术交流群: 816227112 问题: 解决办法: 修改my.ini  如果是my-default.ini 要重命名成my.ini 要注意顺序,有可能服务启动不起来 [mysqld] charact ...

  9. 如何将一段文本编译成C#内存程序的过程

    string code = null; // 1. 生成要编译的代码.(示例为了简单直接从程序集内的资源中读取) Stream stram = typeof(CodeDOM).Assembly .Ge ...

  10. android 7.0 调用系统相机崩溃的解决方案(非谷歌官方推荐)

    解决方案: 1.(推荐)7.0之后你的app就算有权限,给出一个URI之后手机也认为你没有权限. 不用修改原有代码,在Application的oncreate方法中:(或者直接放在调用相机的activ ...