Redis sentinel之集群搭建
环境
由于不太熟悉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之集群搭建的更多相关文章
- Redis 3.0 集群搭建
Redis 3.0 集群搭建 开启两个虚拟机 分别在两个虚拟机上开启3个Redis实例 3主3从两个虚拟机里的实例互为主备 下面分别在两个虚拟机上安装,网络设置参照codis集群的前两个主机 分别关闭 ...
- Redis 5.0 集群搭建
Redis 5.0 集群搭建 单机版的 Redis 搭建 https://www.jianshu.com/p/b68e68bbd725 /usr/local/目录 mkdir redis-cluste ...
- CentOS7 配置 Redis Sentinel主从集群配置
Redis Sentinel主从集群 环境.准备 slave配置 sentinel配置 测试 C#连接Redis Sentinel 1.环境.准备 单实例3台CentOS7服务器,IP地址.: 192 ...
- Redis操作及集群搭建以及高可用配置
NoSQL - Redis 缓存技术 Redis功能介绍 数据类型丰富 支持持久化 多种内存分配及回收策略 支持弱事务 支持高可用 支持分布式分片集群 企业缓存产品介绍 Memcached: 优点:高 ...
- Redis Sentinel哨兵集群
Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...
- Redis进阶实践之十一 Redis的Cluster集群搭建
一.引言 本文档只对Redis的Cluster集群做简单的介绍,并没有对分布式系统的详细概念做深入的探讨.本文只是提供了有关如何设置集群.测试和操作集群的说明,而不涉及Redis集群规范中涵 ...
- 超详细的 Redis Cluster 官方集群搭建指南
今天从 0 开始搭建 Redis Cluster 官方集群,解决搭建过程中遇到的问题,超详细. 安装ruby环境 因为官方提供的创建集群的工具是用ruby写的,需要ruby2.2.2+版本支持,rub ...
- redis整合Spring集群搭建及业务中的使用
1.redis安装 Redis是c语言开发的. 安装redis需要c语言的编译环境.如果没有gcc需要在线安装.yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到li ...
- linux Redis 5.0集群搭建
文档结构如下: Redis cluster 是redis的分布式解决方案,在3.0版本正式推出后,有效的解决了redis分布式方面的需求:当遇到单机内存,并发,流量等瓶颈是,可以采用cluster架构 ...
随机推荐
- 20175213 2018-2019-2 《Java程序设计》第6周学习总结
教材学习内容总结 1.第七章:内部类与异常类 ①.内部类和外嵌类之间的重要关系: ·内部类的外嵌类的成员变量在内部类中仍然有效,内部类中的方法也可以调用外嵌类中的方法. ·内部类的类体中不可以声明类变 ...
- C博客01--顺序、分支结构
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 经过一周的初步学习,对C语言我有了一定的认识,也体验到了代码的乐趣,这应该为我以后的学习开了一个好头.在 ...
- WCF基础_使用svcutil.exe 工具来生成调用文件
右键单击一个服务在浏览器中打开时,通常会有这么一段话: ServiceDemo 服务 已创建服务. 若要测试此服务,需要创建一个客户端,并将其用于调用该服务.可以使用下列语法,从命令行中使用 svcu ...
- 2019-04-28——Django学习
1.Django: Python Web应用开发框架,Django是走大而全的方向,它最出名的是其全自动化的管理后台:只需要使用起ORM,做简单的对象定义,它就能自动生成数据库结构.以及全功能的管理后 ...
- python脚本处理下载的b站学习视频
作为常年在b站学习的我,一直以来看到有兴趣的视频,从来都是点赞收藏下载三连,但是苦于我那小钢炮iphone se屏幕大小有限,看起视频实在费劲,决定一定要找个下载电脑上下载b站视频的方法,以前用过硕鼠 ...
- 安装centos 6.7&7.4
1.安装centos 6.7 1) 2)检查软件有无故障.没有必要检查.选择skip,跳过 3) 4) 5) 6)选择存储设备,第一个为基本存储设备,比如ssd,scsi等常见笔记本.电脑,服务器都选 ...
- ReentrantLock 实现
ReentrantLock 实现: 关于锁的操作都是依赖于state 的值,当state =0 时候,表示 线程可以获取锁,state =1 表示锁已经占用,等待释放 获取锁的方法: protec ...
- 分布式事务Hmily TCC源码--学习整合
一.什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位于不同的分布式系统的不同节点上, 本质上来说,分布式事务是为了保证不同数据库的数据一致性 TCC事务主 ...
- 十五、Collections.sort(<T>, new Comparator<T>() {})针对字符串排序
1.排序对象全是字母组成,可以根据ASCII编码表排序 package com.abcd; public class Person{ private String name; private int ...
- 查看 设置mysql时区
# 查看时区 show variables like '%time_zone%'; system_time_zone CST time_zone SYSTEM # 设置全局 set global ti ...