1 主机环境

我这里使用的操作系统是 centos 6.5,安装在 vmware 上,共三台。

主机名 IP 操作系统 用户名 安装目录
node1 192.168.1.101 centos 6.5 wxyuan /redis
node2 192.168.1.102 centos 6.5 wxyuan /redis
node3 192.168.1.103 centos 6.5 wxyuan /redis

2 进程端口规划

node1 node2 node3
redis,6379 redis,6379 redis,6379
sentinel,26379 sentinel,26379 sentinel,26379

redis 下载地址:http://download.redis.io/releases/,选择需要的版本下载,我使用的版本是 redis-3.2.1.tar.gz

3 安装 redis

3.1 检查是否安装了 gcc

[wxyuan@node1 ~]$ rpm -qa|grep gcc
libgcc-4.4.7-4.el6.x86_64
gcc-4.4.7-4.el6.x86_64
gcc-c++-4.4.7-4.el6.x86_64

如果未安装,可使用yum install gcc 命令安装

3.2 编译安装 redis

(1). 解压 redis 安装包tar -zxvf redis-3.2.1.tar.gz
(2). 编译安装 redis

[wxyuan@node1 ~]$ cd redis-3.2.1
[wxyuan@node1 ~]$ make
[wxyuan@node1 ~]$ make install PREFIX=/redis # PREFIX 指定安装目录

安装完成后,在 /redis 目录下会新增 bin 目录,这里面是启动 redis 服务的相关脚本。
创建 /redis/conf、/redis/data、/redis/log 目录。

3.3 修改配置文件 redis.conf

拷贝 redis-3.2.1/redis.conf 文件到 /redis/conf 目录下,编辑 /redis/conf/redis.conf 文件
node1 主机上修改内容如下

bind 192.168.1.101 127.0.0.1 #绑定多个IP,既可以远程访问,也可以本地客户端访问
port 6379 #指定端口
appendonly yes #开启aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"

node2 主机上修改内容如下

bind 192.168.1.102 127.0.0.1 #绑定多个IP,既可以远程访问,也可以本地客户端访问
port 6379 #指定端口
appendonly yes #开启aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
slaveof 192.168.1.101 6379

node3 主机上修改内容如下

bind 192.168.1.103 127.0.0.1 #绑定多个IP,既可以远程访问,也可以本地客户端访问
port 6379 #指定端口
appendonly yes #开启aof持久化
daemonize yes
pidfile "/redis/redis_6379.pid"
logfile "/redis/log/redis_6379.log"
dir "/redis/data"
slaveof 192.168.1.101 6379

3.4 增加配置文件 sentinel.conf

在 /redis/conf 下增加配置文件 sentinel.conf,文件内容为:
node1 主机上内容如下

bind 192.168.1.101
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

node2 主机上内容如下

bind 192.168.1.102
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

node3 主机上内容如下

bind 192.168.1.103
port 26379
daemonize yes
logfile "/redis/log/sentinel.log"
dir "/redis/data"
sentinel monitor mymaster 192.168.1.101 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

部分参数说明:
(1) sentinel monitor [masterName] [ip] [port] [quorum]

-masterName 指定 master 的名字
-ip 指定 master 的 IP
-port 指定 maseter 的端口
-quorum quorum 是 Sentinel 需要协商同意 master 是否可到达的数量。为了真正的标记 slave 为失败,并最终是否需要启动一个故障转移进程。无论怎样,quorum 只用于检测故障。为了实际执行故障转移,Sentinel 需要选举 leader 并进行授权。这只发生在大多数 Sentinel 进程的选举。

(2) down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。

如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下(subjectively down,简称 SDOWN )。
不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。

(3) parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。
关于 sentinel 的详细配置说明请参考Sentinel 配置详解

4 启动 redis 和 sentinel

在三台主机上分别执行下述命令,启动 redis 服务和 sentinel 服务

[wxyuan@node1 ~]$ cd /redis
[wxyuan@node1 redis$ ./bin/redis-server conf/redis.conf
[wxyuan@node1 redis$ ./bin/redis-sentinel conf/sentinel.conf

5 故障转移测试

在 node1 使用 redis-cli 命令查看主从信息

[wxyuan@node1 redis]$ ./bin/redis-cli -p 6379 info replication
# Replication
role:master
connected_slaves:2

可以看到 node1 上的 redis 进程为 master,现在 kill 掉 node1 上的 redis 进程,观察故障转移情况。
使用 redis-cli 命令查看主从信息

[wxyuan@node1 redis]$ ./bin/redis-cli -p 6379 -h 192.168.1.102 info replication
# Replication
role:master
connected_slaves:1
slave1:ip=192.168.1.103,port=6379,state=online,offset=13836,lag=1

[wxyuan@node1 redis]$ ./bin/redis-cli -p 6379 -h 192.168.1.103 info replication
# Replication
role:slave
master_host:192.168.1.102
master_port:6379

可以看到 node2 上的 redis 进程已经变成了 master。重启 node1 上的 redis 进程后,会发现该 redis 进程已经变成了 slave。
另外,可以通过 sentinel.log 文件观察故障转移过程。
注意:此时打开 sentinel 文件,会发现内容已经被改变了;sentinel 进程启动后,会根据 redis 进程的运行情况修改 sentinel.conf 文件内容。

  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:PipeSoloSymWide 等,欢迎大家加入,贡献开源。

    3119 引用 • 3882 回帖 • 656 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    121 引用 • 186 回帖 • 926 关注
感谢    关注    收藏    赞同    反对    举报    分享