1、redis主从同步配置:

(0)主机配置:

服务器名称

ip地址

实例6379

实例6380

实例6381

controller-node1

172.16.1.90

(1)确定主从:

1)将redis 6379实例确定为redis主服务器;

修改redis 6379的"/data/6379/redis.conf"参数如下:

requirepass root

#redis安全保护模式认证密码设置为root;

2)将redis 6380实例和redis 6381实例确定为redis从服务器;

修改redis 6380和redis 6381实例的redis.conf文件,修改参数如下:

vim /data/6380/redis.conf | vim /data/6381/redis.conf

requirepass root

#redis安全保护模式认证密码设置为root;

replicaof 172.16.1.90 6379

#设置主从同步主库的ip和端口号;

masterauth root

#设置主从同步主库的密码;

(2)启动redis:

for nu in 79 80 81;do /data/63$nu/redis.sh start;done

START REDIS [ 确定 ]

START REDIS [ 确定 ]

START REDIS [ 确定 ]

netstat -tunlp | grep -E "6379|6380|6381"

tcp 0 0 172.16.1.90:6379 0.0.0.0:* LISTEN 1894/redis-server 1

tcp 0 0 172.16.1.90:6380 0.0.0.0:* LISTEN 1906/redis-server 1

tcp 0 0 172.16.1.90:6381 0.0.0.0:* LISTEN 1918/redis-server 1

(3)验证:

1)主6379实例:

172.16.1.90:6379> info replication

# Replication

role:master

connected_slaves:2

slave0:ip=172.16.1.90,port=6381,state=online,offset=364,lag=0

slave1:ip=172.16.1.90,port=6380,state=online,offset=364,lag=1

172.16.1.90:6379> set lc1 1

OK

172.16.1.90:6379> keys *

1) "lc1"

2)从6380实例:

172.16.1.90:6380> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:up

172.16.1.90:6380> keys *

1) "lc1"

3)从6381实例:

172.16.1.90:6381> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:up

172.16.1.90:6381> keys *

1) "lc1"

2、redis主从同步手动切换主从:

(1)关闭主redis 6379实例:

172.16.1.90:6379> shutdown

not connected>

172.16.1.90:6380> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:down

172.16.1.90:6381> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6379

master_link_status:down

(2)将redis 6380实例提升为主:

172.16.1.90:6380> slaveof no one

OK

删除"/data/6380/redis.conf"文件的参数为"replicaof 172.16.1.90 6379";

(3)修改redis 6381实例指向新的主:

172.16.1.90:6381> slaveof 172.16.1.90 6380

OK

修改"/data/6381/redis.conf"文件的参数为"replicaof 172.16.1.90 6380";

(4)验证:

1)redis 6380实例:

172.16.1.90:6380> info replication

# Replication

role:master

connected_slaves:1

slave0:ip=172.16.1.90,port=6381,state=online,offset=1102,lag=0

2)redis 6381实例:

172.16.1.90:6381> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6380

master_link_status:up

(5)修复redis 6379实例:

修改"/data/6379/redis.conf"文件的参数为"replicaof 172.16.1.90 6380、masterauth root"

重启redis 6379实例,该实例就加入到了主从复制的集群中了;

3、redis主从同步自动切换主从:

将环境恢复到未手动切换主从前一步;

修改redis 6379实例"/data/6379/redis.conf"文件的参数为"masterauth root",并重启redis 6379实例;

(1)redis sentinel介绍:

redis sentinel是redis官方推荐的高可用解决方案,当用redis做master-slave的高可用方案时,加入master宕机了,reids本

身(包括它的很多客户端)都没有实现主备切换,而redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集

群,发现master宕机后能进行自动切换,实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障

的Redis部署。

(2)功能:

1)监控:

Sentinel不断的检查master和slave是否正常的运行;

2)通知:

如果发现某个redis节点运行出现问题,可以通过API通知系统管理员和其他的应用程序;

3)自动故障转移:

能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave中的一个来作为新

的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址,sentinel会

修改相应redis实例的redis.conf文件添加或删除"replicaof <master-IP> <master-port>"配置;

4)配置提供者:

哨兵作为Redis客户端发现的权威来源,客户端连接到哨兵请求当前可靠的master的地址,如果发生故

障,哨兵将报告新地址;

5)sentinel的分布式特性:

很显然,只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也

有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要使用sentinel

集群,这样有几个好处:即使有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;如果只有

一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换

如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息。

6)sentinel的自动发现机制:

A、sentinel集群中各个sentinel都互相连接彼此来检查对方的可用性以及互相发送消息;

B、不需要在sentinel中配置某个master的所有slave的地址,sentinel会通过询问master来得到这些slave的地址的;

C、每个sentinel发送的消息中也包含了其当前维护的最新的master配置,如果某个sentinel发现自己的配置版本低于接收到的配

置版本,则会用新的配置更新自己的master配置;

D、当检测到了新的sentinel,则将其加入到自身维护的master监控列表中;

7)通常使用sentinel集群(每个redis实例设置一个sentinel)监控reids集群;

(3)配置:

1)复制编译包中的sentinel.conf文件到各个redis实例的目录:

sed -ri.bak "/#|^$/d" /application/redis/sentinel.conf

for nu in 79 80 81;do cp -a /application/redis/sentinel.conf /data/63$nu/;done

2)修改各个参数:

A、实例6379:

vim /data/6379/sentinel.conf

bind 172.16.1.90

port 26379

daemonize yes

pidfile "/data/6379/redis-sentinel.pid"

logfile "/data/6379/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6379 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

B、实例6380:

vim /data/6380/sentinel.conf

bind 172.16.1.90

port 26380

daemonize yes

pidfile "/data/6380/redis-sentinel.pid"

logfile "/data/6380/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6379 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

C、实例6381:

vim /data/6381/sentinel.conf

bind 172.16.1.90

port 26381

daemonize yes

pidfile "/data/6381/redis-sentinel.pid"

logfile "/data/6381/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6379 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

D、参数说明:

cat /data/6379/sentinel.conf

bind 172.16.1.90

#绑定的ip;

port 26379

#sentinel监听的端口号;

daemonize yes

#sentinel以守护进程的方式运行;

pidfile /data/6379/redis-sentinel.pid

#sentinel以守护进程运行生成的pid文件路径;

logfile /data/6379/redis-sentinel.log

#sentinel日志文件;

dir /tmp

#进程工作的目录;

sentinel monitor mymaster 172.16.1.90 6379 2

#######################################################

#指定监控的master,2表示要2个sentinel认为redis

#主实例宕机才有效;

#######################################################

sentinel auth-pass mymaster root

#连接redis验证密码,该密码和redis.cof中配置的安全验证密码一致;

sentinel down-after-milliseconds mymaster 30000

#超过30000毫秒(30s)后认为redis主实例宕机;

sentinel parallel-syncs mymaster 1

########################################################

#发生主备切换时有1个slave同时对新的master进行同步,通常

#将这个值设为1来保证每次只有一个slave 处于不能处理命令请

#求的状态;

#########################################################

sentinel failover-timeout mymaster 180000

#当主从切换超过180000毫秒(180s)后认为主从切换失败;

sentinel deny-scripts-reconfig yes

#########################################################

#不允许使用SENTINEL SET设置notification-script和

#client-reconfig-script;

#########################################################

(4)配置sentinel脚本文件:

vim /data/6379/sentinel.sh

#!/bin/sh

. /etc/init.d/functions

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

IP="172.16.1.90"

PORT="6379"

SENTINEL_PORT="26379"

SENTINEL_HOME="/application/redis/src/redis-sentinel"

CONFIG="/data/$PORT/sentinel.conf"

SENTINEL_ADMIN="redis-cli -h $IP -p ${SENTINEL_PORT}"

SENTINEL_PID="/data/$PORT/redis-sentinel.pid"

[ $UID -eq 0 ] || {

echo "please use root"

exit 1

}

function usage (){

echo "USAGE:sh $0 |start|stop|restart|"

}

RETVAL=0

function check() {

RETVAL="$?"

if [ $RETVAL -eq 0 ]; then

action "$1" /bin/true

else

action "$1" /bin/false

fi

}

function start() {

if [ -f ${SENTINEL_PID} ]; then

echo "SENTINEL_${SENTINEL_PORT} IS RUNNIG......"

else

${SENTINEL_HOME} $CONFIG

check "START SENTINEL_${SENTINEL_PORT}"

fi

}

function stop() {

if [ -f ${SENTINEL_PID} ]; then

${SENTINEL_ADMIN} shutdown &>/dev/null

check "STOP SENTINEL_${SENTINEL_PORT}"

else

echo "SENTINEL_${SENTINEL_PORT} IS STOP......"

fi

}

function main(){

if [ $# -eq 1 ]; then

case "$1" in

start)

start

sleep 2

;;

stop)

stop

sleep 2

;;

restart)

stop

start

;;

*)

usage

;;

esac

else

usage

fi

}

main $*

chmod u+x sentinel.sh

说明:仿照上面的脚本,完成redis 6380实例、redis 6381实例的sentinel脚本;

(5)启动各个sentinel实例:

for nu in 79 80 81;do /data/63$nu/sentinel.sh start;done

netstat -tunlp | egrep "26379|26380|26381"

tcp 0 0 172.16.1.90:26379 0.0.0.0:* LISTEN 2475/redis-sentinel

tcp 0 0 172.16.1.90:26380 0.0.0.0:* LISTEN 2477/redis-sentinel

tcp 0 0 172.16.1.90:26381 0.0.0.0:* LISTEN 2485/redis-sentinel

(6)验证:

1)关闭主redis 6379实例:

172.16.1.90:6379> shutdown

not connected>

2)通过sentinel日志查看主从接替过程:

tailf /data/6380/redis-sentinel.log

2673:X 17 May 2019 23:21:03.206 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:21:33.363 * +slave slave 172.16.1.90:6381 172.16.1.90 6381 @ mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:26:45.840 # +sdown master mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:26:45.907 # +new-epoch 1

2673:X 17 May 2019 23:26:45.909 # +vote-for-leader 73b994f2ff6ab006c450f8c5662861ab90ee1c04 1

2673:X 17 May 2019 23:26:45.911 # +odown master mymaster 172.16.1.90 6379 #quorum 2/2

2673:X 17 May 2019 23:26:45.911 # Next failover delay: I will not start a failover before Fri May 17 23:32:46 2019

2673:X 17 May 2019 23:26:46.384 # +config-update-from sentinel 73b994f2ff6ab006c450f8c5662861ab90ee1c04 172.16.1.90 26381 @ mymaster 172.16.1.90 6379

2673:X 17 May 2019 23:26:46.384 # +switch-master mymaster 172.16.1.90 6379 172.16.1.90 6381

2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6380 172.16.1.90 6380 @ mymaster 172.16.1.90 6381

2673:X 17 May 2019 23:26:46.385 * +slave slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381

2673:X 17 May 2019 23:27:16.424 # +sdown slave 172.16.1.90:6379 172.16.1.90 6379 @ mymaster 172.16.1.90 6381

3)查看主从信息:

A、redis 6380实例:

172.16.1.90:6380> info replication

# Replication

role:slave

master_host:172.16.1.90

master_port:6381

master_link_status:up

B、redis 6381实例:

172.16.1.90:6381> info replication

#Replication

role:master

connected_slaves:1

slave0:ip=172.16.1.90,port=6380,state=online,offset=974710,lag=1

(7)将redis 6379实例启动:

启动redis 6379实例后,sentinel 3个运行进程中的一个会在"/data/6379/redis.conf"配置文件最后一行

追加"replicaof 172.16.1.90 6381" 配置,然后重启redis 6379实例,这样redis 6379实例就会被加入到集

群中作从服务器;

(8)sentinel命令:

1)SENTINEL get-master-addr-by-name <master name>:

返回给定名字的主服务器的 IP 地址和端口号。

例:

[root@controller-node1 ~]# redis-cli -h 172.16.1.90 -p 26380

172.16.1.90:26380> sentinel get-master-addr-by-name mymaster

1) "172.16.1.90"

2) "6381"

2)PING :

返回 PONG;

3)SENTINEL masters:

列出所有被监视的主服务器,以及这些主服务器的当前状态;

4)SENTINEL master <master name>:

显示指定master的信息和状态;

5)SENTINEL slaves <master name>:

列出给定主服务器的所有从服务器,以及这些从服务器的当前状态;

6)SENTINEL reset <pattern>:

重置所有名字和给定模式 pattern 相匹配的主服务器。 pattern 参数是一个 Glob 风格的模式。 重置

操作清楚主服务器目前的所有状态, 包括正在执行中的故障转移, 并移除目前已经发现和关联的, 主

服务器的所有从服务器和 Sentinel;

7)SENTINEL failover <master name>:

当主服务器失效时, 在不询问其他 Sentinel 意见的情况下, 强制开始一次自动故障迁移(不过发起故障转

移的 Sentinel 会向其他 Sentinel 发送一个新的配置,其他 Sentinel 会根据这个配置进行相应的更新);

3、将redis和sentinel脚本加入开机自启动:

chmod +x /etc/rc.d/rc.local

vim /etc/rc.d/rc.local

/data/6379/redis.sh start &>/dev/null

/data/6380/redis.sh start &>/dev/null

/data/6381/redis.sh start &>/dev/null

/data/6379/sentinel.sh start &>/dev/null

/data/6380/sentinel.sh start &>/dev/null

/data/6381/sentinel.sh start &>/dev/null

加入开机自启动在启动的时候可能由于主节点不能及时启动,可能导致主节点转换,但这都不是问题,

sentinel能做好任何故障的转移,除了sentinel选举票数(宕机较多)不够;

4、sentinel模式下主从同步集群扩容:

以redis 6381实例为主库为例;

(1)建立新的redis 6382实例:

mkdir -p /data/6382/

cp -a /data/6379/sentinel.conf /data/6382/

cp -a /data/6379/sentinel.sh /data/6382/

cp -a /data/6379/redis.conf /data/6382/

cp -a /data/6379/redis.sh /data/6382/

(2)修改sentinel.sh、redis.conf、redis.sh文件的参数为对应实例的端口号和路径并确保sedis.conf配置文件中

有以下参数:

requirepass root

#redis安全保护模式认证密码设置为root;

replicaof 172.16.1.90 6381

#设置主从同步主库的ip和端口号;

masterauth root

#设置主从同步主库的密码;

(3)修改sentinel.conf的配置文件指向新的主:

bind 172.16.1.90

port 26382

daemonize yes

pidfile "/data/6382/redis-sentinel.pid"

logfile "/data/6382/redis-sentinel.log"

dir "/tmp"

sentinel monitor mymaster 172.16.1.90 6381 2

sentinel auth-pass mymaster root

sentinel parallel-syncs mymaster 1

sentinel down-after-milliseconds mymaster 30000

sentinel failover-timeout mymaster 180000

sentinel deny-scripts-reconfig yes

(4)将新的redis 6382实例加入到开机自启动即可;

5、小结:

(1)集群有密码验证的情况下每个redis实例必须要有的参数:

requirepass root

#redis安全保护模式认证密码设置为root;

masterauth root

#设置主从同步主库的密码;

哪个redis实例为主,哪个redis实例为从,由sentinel选举,然后在各个实例redis.conf文件中增删

replicaof <master ip> <master prot>参数来决定;

(2)从节点的只读是默认的(是对从节点的一种保护,有助于主从的一致性),但是需要在redis 实例的

redis.conf文件中设置replicaof <master ip> <master prot>参数从节点只读才能生效;

(3)redis主从同步是实时异步增量同步;

14.5、redis-sentinel高可用的更多相关文章

  1. Redis Sentinel 高可用实现说明

    背景:      前面介绍了Redis 复制.Sentinel的搭建和原理说明,通过这篇文章大致能了解Sentinel的原理和实现方法以及相关的搭建.这篇文章就针对Redis Sentinel的搭建做 ...

  2. Redis Sentinel高可用架构

    Redis目前高可用的架构非常多,比如keepalived+redis,redis cluster,twemproxy,codis,这些架构各有优劣,今天暂且不说这些架构,今天主要说说redis se ...

  3. Redis Sentinel 高可用服务搭建

    阅读目录: 关于 Redis 的概念 关于 Redis Sentinel 的概念 搭建 Redis Server(master) 搭建 Redis Server(slave) 搭建 Redis Sen ...

  4. 【转载】Redis Sentinel 高可用服务架构搭建

    作者:田园里的蟋蟀 出处:http://www.cnblogs.com/xishuai/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接. 阅读 ...

  5. Redis|Sentinel 高可用架构

    一 前言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端 ...

  6. Redis Sentinel 高可用方案

      redis 主从复制的问题 Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用: 1,一旦主节点宕机,从节点作为主节点的备份可以随时顶上来. 2,扩展主节点的读能力,分担主节点读压 ...

  7. Redis Sentinel 高可用部署实践集群

    一.Redis Sentinel 介绍    1.Sentinel     数据库环境搭建,从单机版到主备.再到多数据库集群,我们需要一个高可用的监控:比如Mysql中,我们可能会采用MHA来搭建我们 ...

  8. redis sentinel 高可用(HA)方案部署,及python应用示例

    redis sentinel(哨兵)高可用集群的部署方法,并通过 python 程序实例讲解如何使用 redis sentinel 简介 介绍 redis sentinel(哨兵)集群的部署,配置一主 ...

  9. Redis Sentinel 高可用机制

    内容目录: Sentinel 如何工作的? 核心配置项 怎么选出新 master 的? Sentinel 有多个,具体谁来执行故障转移? Sentinel 是怎么发现 slave 和其他 sentin ...

  10. Redis+sentinel 高可用实践

    1.环境规划 10.213.50.138(主) redis+sentinel 10.213.50.168(从) redis+sentinel 10.213.50.227  作为客户端测试插入数 2.r ...

随机推荐

  1. [bug] TypeError : unsupported operand type(s) for += : 'NoneType' and 'int'

    原因 Flask购物网站中,每点击货物一次,数据库中货物的浏览次数+1,默认浏览次数为NULL,故无法完成运算 解决 将数据库中相应字段默认值设为0,注意要先断开数据库连接

  2. 分布式存储ceph---ceph添加/删除osd(5)

    一.添加osd 当前ceph集群中有如下osd,现在准备新添加osd: 1.选择一个osd节点,添加好新的硬盘: 2.显示osd节点中的硬盘,并重置新的osd硬盘: 列出节点磁盘:ceph-deplo ...

  3. addrinfo结构体原型-(转自 cxz2009)

    addrinfo结构体原型 typedef struct addrinfo {    int ai_flags;        //AI_PASSIVE,AI_CANONNAME,AI_NUMERIC ...

  4. Linux基础命令学习记录(一)

    使用频繁的Linux命令 一.文件和目录 1.cd命令 cd / 进入根目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd 进入个人的主目录 cd ~ 进入个人的主目录 cd - ...

  5. jQuery的链式编程风格

    jQuery的链式编程风格 首先本人通过一个案例来展示jQuery的链式编程风格.先写一个页面,展示一个列表,代码如下: <body> <div> <ul class=& ...

  6. Windows登录服务器CLI运行脚本出现 syntax error: unexpected end of file 错误的解决

    0.前言 通常我们在编辑 Linux 服务器上的文件时,直接在 Linux 环境比较麻烦(当然熟练使用 VIM 的程序员除外哈哈),有时我们会使用 Windows 将文件编辑好再上传到服务器端,我用的 ...

  7. 快速上手 Linkerd v2 Service Mesh(服务网格)

    在本指南中,我们将引导您了解如何将 Linkerd 安装到您的 Kubernetes 集群中. 然后我们将部署一个示例应用程序来展示 Linkerd 的功能. 安装 Linkerd 很容易.首先,您将 ...

  8. 服务器ip迁移纪要

    21楼机房之前已配25网段静态ip,机架上14台服务器接22楼机房交换机,同样25网段. 实际有两种情况, a.25网段ip没有被他人占用,这种情况无需更改ip. b.该IP已被外部使用,ip冲突,无 ...

  9. 机器学习PAL基本概念

    机器学习PAL基本概念 本文介绍PAI-Studio.PAI-DSW及PAI-EAS的基本概念. PAI-Studio PAI-DSW PAI-EAS

  10. MindSpore张量mindspore::tensor

    MindSpore张量mindspore::tensor MSTensor #include <ms_tensor.h> MSTensor定义了MindSpore Lite中的张量. 构造 ...