目录
1.redis 下载
windows历史版本下载:
https://github.com/MSOpenTech/redis/releases
linux下载最新稳定版本:
或根据需要下载指定的linux历史版本:
http://download.redis.io/releases/
2.redis 单机版安装启动
windows
下载 Redis-x64-xxx.zip压缩包,解压。
打开cmd窗口切换目录至redis安装目录下运行:
如:
E:
cd app\Redis3.2.100
redis-server.exe redis.windows.conf
显示如下界面:
这个作为服务端不需要关闭,另启一个cmd窗口来访问它。
目录至redis目录下运行:
redis-cli.exe -h 127.0.0.1 -p 6379
可以简单存取试一下,并且输入命令时会有提示。
linux
示例使用压缩包为redis-5.0.4.tar.gz,将下载好的压缩包放到指定的目录下
tar –zxvf redis-5.0.4.tar.gz
cd redis-5.0.4
yum install gcc
在该目录下可以make,make后编译好的文件会保存到src目录下
make有可能会出现问题导致我们找不到redis-server等文件:
1.gcc没有安装
redis是C实现的,需要gcc来进行编译,如果我们是自己刚搭建的虚拟机,很可能没有安装gcc,需要切换root用户使用命令安装gcc:yum install gcc,如果我们使用的是非root使用此命令需要在前面加上sudo:sudo yum install gcc,一般情况我们都不会以root用户进行操作,所以会经常用到sudo。
(注:如果是新创建的用户无法使用sudo,报:“linux用户不在sudoers文件中“,需要用root去修改/etc/sudoers文件,在
root ALL=(ALL) ALL 后面新增一行
用户名 ALL=(ALL) ALL
由于该文件是readonly的,要使用wq!强制保存退出。)
2. zmalloc.h:50:31: jemalloc/jemalloc.h:No such file or directory
如果有MALLOC这个环境变量,会有用这个环境变量的去建立redis,默认的分配器是 jemalloc,如果我们没有jemalloc就会make 出错。所以需要加参数(如果有libc)。
make MALLOC=libc
3. sh: ./mkreleasehdr.sh: Permission denied
权限不够,需要增加对mkreleasehdr.sh的权限
chmod +x mkreleasehdr.sh
make install这一步会把src目录下的二进制文件复制到/usr/local/bin/目录下,由于把文件保存到/usr/local/bin/目录下的方式不方便管理,一般会把文件统一保存到
/usr/local/redis/bin/目录下
mkdir -p /usr/local/redis/bin/ (-p:确保目录名称存在,如果目录不存在的就新创建一个)
从src下拷贝一份到/usr/local/redis/bin/目录
cp redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis/bin/
src下的启动
redis启动的方式有三种:前台启动、后台启动(2种)
前台启动:
./redis-server,它的缺点也十分明显,就是当前窗口不能再进行操作了,这时需要我们进行
后台启动:
1. 在src目录下使用命令nohup ./redis-server &,可以打开nohup.log可以查看redis启动情况。我们也可以执行ps -ef | grep redis 命令查看redis是否启动。
2. 修改redis.config文件,daemonize改为yes,文件内容较多可以使用/daemonize回车快速查找
redis-5.0.4目录下执行./src/redis-server redis.conf
停止:
使用ps -ef | grep redis 命令查看:
./redis-cli -p 6379 shutdown,6379的值取决于*:后的值。
在/usr/local/redis/bin下的使用上述启动方式尝试启动,可以启动,但发现有警告,且无法关闭服务:
从给出的信息上看主要有四个问题需要解决:
1. WARNING: The TCP backlog setting of 511
原因是tcp设置128这个值太小了,需要修改etc/sysctl.conf文件,在里面添net.core.somaxconn= 1024,然后执行sysctl -p就可以消除这个warning。
2. WARNING overcommit_memory is set to 0!
将“vm.overcommit_.=1”添加到/etc/sysctl.conf
执行:
sysctl vm.overcommit_memory=1
3. WARNING you have Transparent Huge Pages (THP) support enabled in your kernel.
终端root用户执行:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
vi /etc/rc.local
将echo never > /sys/kernel/mm/transparent_hugepage/enabled加入在语句exit 0之前
4. Failed opening the RDB file dump.rdb (in server root dir /usr/local/redis/bin) for saving: Permission denied
需要更改rdb文件默认路径
例:修改conf文件,复制一份新的conf文件,如test.conf,在test.conf进行修改,
打开后定位到如下位置:
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the ‘dbfilename‘ configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir ./
将其中的"dir ./"修改为相应的目录,如"dir /home/stu1/redis_dbfiles/"(这里需要注意最后的斜杠不能忘记,如果缺失斜杠可能会解析为文件而非目录),保存。之后启动redis时,使用脚本./redis-server test.conf启动服务。
3.redis.conf 配置项说明
1. 指定Redis监听端口,默认端口为6379
port 6379
2. 绑定的主机地址,默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
bind 127.0.0.1
3. Redis默认不是以守护进程的方式运行,可以通过该配置项修改。使用yes启用守护进程,效果为redis后台运行。
daemonize no
4. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
pidfile /var/run/redis.pid
5.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
timeout 100
6. 开启集群
cluster-enabled yes
7. 指定本地数据库存放目录
dir ./
8. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
slaveof <masterip> <masterport>
9. 当master服务设置了密码保护时,slav服务连接master的密码
masterauth <master-password>
10. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
requirepass foobared
11. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
loglevel verbose
12. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout
13. 设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id
databases 16
14. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
save <seconds> <changes>
Redis默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。
15. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes
16. 指定本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
17. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxclients 128
18. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
maxmemory <bytes>
19. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendonly no
20. 指定更新日志文件名,默认为appendonly.aof
appendfilename appendonly.aof
21. 指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折中,默认值)
appendfsync everysec
22. 指定是否启用虚拟内存机制,默认值为no
vm-enabled no
23. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-swap-file /tmp/redis.swap
24. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
vm-max-memory 0
25. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不确定,就使用默认值
vm-page-size 32
26. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,在磁盘上每8个pages将消耗1byte的内存。
vm-pages 134217728
27. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
vm-max-threads 4
28. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes
29. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
30. 指定是否激活重置哈希,默认为开启
activerehashing yes
31. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf
4.redis 集群搭建
redis 集群是一个可以在多个redis节点之间进行数据共享的设施。
redis 集群不支持那些需要同时处理多个键的redis命令,因为执行这些命令需要在多个 redis 节点之间移动数据,并且在高负载的情况下,这些命令将降低redis集群的性能,并导致不可预测的行为。
redis 集群通过分区来提供一定程度的可用性,即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
redis集群提供了以下两个好处:
将数据自动切分到多个节点的能力。
当集群中的一部分节点失效或者无法进行通讯时,仍然可以继续处理命令请求的能力。
关于redis的集群化方案,目前有三种:
(1)Twitter开发的twemproxy
(2)redis官方的redis-cluster
(3)豌豆荚开发的codis
twemproxy 架构简单,就是用proxy对后端redis server进行代理,但是由于代理层的消耗性能很低,而且通常涉及多个key的操作都是不支持的,而且本身不支持动态扩容和透明的数据迁移,而且也失去维护,Twitter内部已经不再使用。
redis-cluster 是三个里性能最强大的,因为他使用去中心化的思想,使用哈希槽方式将16348个哈希槽覆盖到所有节点上,对于存储的每个key值,使用CRC16(KEY)&16348=slot,得到它对应的,并在访问key时就去找它的哈希槽在哪一个节点上,然后由当前访问节点从实际被分配了这个哈希槽的节点去取数据,节点之间使用轻量协议通信,减少带宽占用,性能很高,自动实现负载均衡与高可用,自动实现failover,并且支持动态扩展,实现的复杂度低,去中心化思想免去了proxy的消耗,是全新的思路。但是它也有一些不足:例如官方没有提供图形化管理工具、运维体验差、全手工数据迁移、并且自己对自己本身的redis命令支持也不完全等。
codis 使用的也是proxy思路,但是做的比较好,是这两种之间的一个中间级。使用方法和普通的redis没有任何区别,设置好下属的多个redis实例后就可以了,使用时在本需要连接redis的地方改为连接codis,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回codis。它优点是可以不停机动态新增或删除数据节点,旧节点的数据也可以自动恢复到新节点。并且支持redis命令是最多的,提供图形化的dashboard,方便集群管理。
redis-cluster方式搭建:
搭建环境
Ruby环境
yum -y install ruby
yum -y install rubygems
下载redis-xxx.gem并安装:
https://rubygems.org/gems/redis/versions/
gem install redis-xxx.gem
redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群,要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以redis集群至少需要6台服务器。我们在练习搭建时候可以搭建伪分布式集群,即一台服务器虚拟运行6个redis实例。
准备6份redis及src目录下的redis-trib.rb文件。redis-trib.rb文件是redis集群的管理文件,ruby脚本。
如下所示:
drwxrwxr-x. 2 stu1 stu1 168 4月 10 09:35 redis1
drwxrwxr-x. 2 stu1 stu1 168 4月 10 09:35 redis2
drwxrwxr-x. 2 stu1 stu1 168 4月 10 09:36 redis3
drwxrwxr-x. 2 stu1 stu1 168 4月 10 09:36 redis4
drwxrwxr-x. 2 stu1 stu1 168 4月 10 09:37 redis5
drwxrwxr-x. 2 stu1 stu1 168 4月 10 09:37 redis6
-rwxrwxr-x. 1 stu1 stu1 3600 4月 10 09:30 redis-trib.rb
注:在复制redis文件的时候需要留意“用户”和“文件类型”,如原来的文件为绿色可执行文件,复制后的文件为白色普通文件,需要使用chmod a+x命令改为可执行文件。
将每个节点的redis.conf配置文件进行修改,端口号如果是同一台主机的话,必须不同。不同主机可以相同,因为使用了1台机器,所以需要设置6个不同的端口号:
redis.conf 配置
################################ GENERAL #####################################
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes(后台启动)
IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES
# JUST COMMENT THE FOLLOWING LINE.
bind 绑定ip (如:192.168.56.101 127.0.0.1)
# redis.conf的bind地址默认使用了127.0.0.1,实际上是需要修改为服务器的固定ip
# 不然在配置集群时有可能会出现出现 [ERR] Sorry, can't connect to node 错误。
# Accept connections on the specified port, default is 6379.
# If port 0 is specified Redis will not listen on a TCP socket.
port 端口号(例:port 7001)
################################ REDIS CLUSTER ###############################
#
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# WARNING EXPERIMENTAL: Redis Cluster is considered to be stable code, however
# in order to mark it as "mature" we need to wait for a non trivial percentage
# of users to deploy it in production.
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#
# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
cluster-enabled yes (启用redis-cluster集群)
cluster-config-file nodes.conf(存放配置名称)
# redis集群其他配置参数:
# cluster-node-timeout <milliseconds>
# cluster-slave-validity-factor <factor>
# cluster-migration-barrier <count>
# cluster-require-full-coverage <yes / no>
# Specify the log file name. Also the empty string can be used to force
# Redis to log on the standard output. Note that if you use standard
# output for logging but daemonize, logs will be sent to /dev/null
logfile 日志存放路径(例:logfile /home/stu1/redis/redis-cluster/redis1/redis1_log.log)
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# above using the 'dbfilename' configuration directive.
#
# The Append Only File will also be created inside this directory.
#
# Note that you must specify a directory here, not a file name.
dir dump.rdb文件存放路径(例:dir /home/stu1/redis/redis-cluster/redis1)
启动脚本 start-all.sh
我们可以使用./redis-server redis.conf来依次启动,不过由于操作太麻烦,可以使用脚本方便我们启动:
cd redis1
./redis-server redis.conf
cd ..
cd redis2
./redis-server redis.conf
cd ..
cd redis3
./redis-server redis.conf
cd ..
cd redis4
./redis-server redis.conf
cd ..
cd redis5
./redis-server redis.conf
cd ..
cd redis6
./redis-server redis.conf
cd ..
停止脚本 stop-all.sh
同样的也需要一个停止脚本:
./redis1/redis-cli -p 7001 shutdown
./redis2/redis-cli -p 7002 shutdown
./redis3/redis-cli -p 7003 shutdown
./redis4/redis-cli -p 7004 shutdown
./redis5/redis-cli -p 7005 shutdown
./redis6/redis-cli -p 7006 shutdown
使用启动脚本启动节点./start-all.sh并查看进程:
创建集群
redis3、4创建集群:
./redis-trib.rb create --replicas 1 192.168.56.101:7001 192.168.56.101:7002 192.168.56.101:7003 192.168.56.101:7004 192.168.56.101:7005 192.168.56.101:7006
因为我使用的是redis5版本,上述命令是一个过时已不再支持的方式,在redis5中创建集群已经使用“redis-cli”来实现,使用c语言实现,不再使用ruby语言所以会报: redis-trib.rb is not longer available!
redis5创建集群:
redis-cli --cluster create 192.168.56.101:7001 192.168.56.101:7002 192.168.56.101:7003 192.168.56.101:7004 192.168.56.101:7005 192.168.56.101:7006 --cluster-replicas 1
成功启动:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.56.101:7005 to 192.168.56.101:7001
Adding replica 192.168.56.101:7006 to 192.168.56.101:7002
Adding replica 192.168.56.101:7004 to 192.168.56.101:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
//因为主从节点都在一台主机上所以会有warning
M: 19a4d0bbe4d04d41ed68fc4e05a89c53e4d7682b 192.168.56.101:7001
slots:[0-5460] (5461 slots) master
M: f1ced90d36a8354ba398443503748abd70d3fbc2 192.168.56.101:7002
slots:[5461-10922] (5462 slots) master
M: 49dd0ec091761712fb0685f843c281594ac659cc 192.168.56.101:7003
slots:[10923-16383] (5461 slots) master
S: 2dc937f2a7fa757b72dcf33a916ff4be52f260dd 192.168.56.101:7004
replicates f1ced90d36a8354ba398443503748abd70d3fbc2
S: c4fc0436205740c40d6d6e8ff8127b674490f53b 192.168.56.101:7005
replicates 49dd0ec091761712fb0685f843c281594ac659cc
S: 937a7612d2851a70ea8350f6fd68aeb509b449e1 192.168.56.101:7006
replicates 19a4d0bbe4d04d41ed68fc4e05a89c53e4d7682b
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 192.168.56.101:7001)
M: 19a4d0bbe4d04d41ed68fc4e05a89c53e4d7682b 192.168.56.101:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: f1ced90d36a8354ba398443503748abd70d3fbc2 192.168.56.101:7002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 937a7612d2851a70ea8350f6fd68aeb509b449e1 192.168.56.101:7006
slots: (0 slots) slave
replicates 19a4d0bbe4d04d41ed68fc4e05a89c53e4d7682b
S: 2dc937f2a7fa757b72dcf33a916ff4be52f260dd 192.168.56.101:7004
slots: (0 slots) slave
replicates f1ced90d36a8354ba398443503748abd70d3fbc2
M: 49dd0ec091761712fb0685f843c281594ac659cc 192.168.56.101:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: c4fc0436205740c40d6d6e8ff8127b674490f53b 192.168.56.101:7005
slots: (0 slots) slave
replicates 49dd0ec091761712fb0685f843c281594ac659cc
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
如果创建cluster出现了异常:
Node xxx is not empty. Either the node already knows other nodes
需要删除每个节点的aof、rdb、nodes.conf文件,并对数据库进行清除flushdb
集群创建成功用客户端登陆任意redis结点查询集群中的节点情况:
./redis-cli -c -h 192.168.56.101 -p 7001
其中-c表示以集群方式连接redis,-h指定ip地址,-p指定端口号
cluster nodes 查询集群结点信息:
cluster info 查询集群状态信息:
连接任接一个节点,使用条命令,redis可以自动跳转说明集群成功:
redis3、4 参考redis cluster管理工具redis-trib.rb详解
redis5 参考官网的redis-cli方式
Jedis 集群代码测试
我们需要集群没有问题,bind配置正确,服务端口有没有开放(开放对应端口:firewall-cmd --zone=public --add-port=7001/tcp –permanent并重启防火墙:firewall-cmd --reload)
否则会出redis.clients.jedis.exceptions.JedisConnectionException: no reachable node in cluster异常
pom文件导入的jedis版本要和redis服务器版本兼容,如redis版本过高,jedis版本过低,会报:java.lang.NumberFormatException: For input string: "7004@17004异常
测试代码:
package s.t;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
public class JedisClusterTest {
public static void main(String[] args) {
// 创建并填充节点信息
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.56.101", 7001));
nodes.add(new HostAndPort("192.168.56.101", 7002));
nodes.add(new HostAndPort("192.168.56.101", 7003));
nodes.add(new HostAndPort("192.168.56.101", 7004));
nodes.add(new HostAndPort("192.168.56.101", 7005));
nodes.add(new HostAndPort("192.168.56.101", 7006));
// 创建JedisCluster对象
JedisCluster jedisCluster = new JedisCluster(nodes);
// 使用jedisCluster操作redis
String key = "jedisCluster";
String setResult = jedisCluster.set(key, "hello redis!");
System.out.println(setResult);
String getResult = jedisCluster.get(key);
System.out.println(getResult);
jedisCluster.close();
}
}
控制台输出
OK
hello redis!
linux下也可已以看到:
说明我们已经成功从redis存取值了。
5.Sentinel 集群搭建
redis-sentinel是redis官方推荐的高可用性解决方案,Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Sentinel可以监视任意多个主服务器,以及主服务器属下的从服务器,并在被监视的主服务器下线时,自动执行故障转移操作。为了防止sentinel的单点故障,可以对sentinel进行集群化,创建多个sentinel。
Sentinel功能介绍:
监控:Sentinel会不断检查主实例和从属实例是否按预期工作。
通知:Sentinel可以通过API通知系统管理员,另一台计算机程序,其中一个受监控的Redis实例出现问题。
自动故障转移:如果主服务器未按预期工作,Sentinel可以启动故障转移过程,其中从服务器被提升为主服务器,其他其他服务器将重新配置为使用新主服务器,并且使用Redis服务器的应用程序会通知有关新服务器的地址、连接。
配置提供商:Sentinel充当客户端服务发现的权限来源:客户端连接到Sentinels,以便询问负责给定服务的当前Redis主服务器的地址。如果发生故障转移,Sentinels将报告新地址。
官网给出的sentinel.conf典型的最小配置文件如下所示:
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
只需要指定要监视的主服务器,为每个单独的主服务器提供不同的名称。无需指定自动发现的从站。Sentinel将自动更新配置以及有关从站的其他信息(以便在重新启动时保留信息)。每次在故障转移期间将从站升级为主站并且每次发现新的Sentinel时,也会重写配置。
我们自己添加sentinel.conf文件修改配置,这里要添加三份sentinel.conf文件,一个健壮的部署至少需要三个哨兵实例,且为奇数,以保证不会出现正反方投票数相等的情况。例如:sentinel1.conf,以s1,s2,s3代替mymaster,将如下内容复制到sentinel.conf文件中,另外两份文件修改端口号和日志文件目录。
#当前Sentinel服务运行的端口
port 5001
# 守护进程模式
daemonize yes
#关闭保护模式,需要增加密码证或是IP限制等保护机制,否则极度危险
protected-mode no
# 指明日志文件名
logfile "./sentinel1.log"
# 哨兵监听的主服务器
# sentinel monitor [master-group-name] [ip] [port] [quorum]
# master-group-name:master名称(可以自定义)
# ip port : IP地址和端口号
# quorun:票数,Sentinel需要协商同意master是否可到达的数量。
sentinel monitor s1 192.168.56.101 7001 2
sentinel monitor s2 192.168.56.101 7002 2
sentinel monitor s3 192.168.56.101 7003 2
# 3s内mymaster无响应(默认30秒),则认为mymaster宕机了
# sentinel down-after-milliseconds mymaster 3000
sentinel down-after-milliseconds s1 3000
sentinel down-after-milliseconds s2 3000
sentinel down-after-milliseconds s3 3000
# 如果10秒后,mysater仍没启动过来,则启动failover
# sentinel failover-timeout mymaster 10000
sentinel failover-timeout s1 10000
sentinel failover-timeout s2 10000
sentinel failover-timeout s3 10000
# 设置master和slaves验证密码
# sentinel auth-pass mymaster 123456
# 执行故障转移时,最多有1个从服务器同时对新的主服务器进行同步
# sentinel parallel-syncs mymaster 1
sentinel parallel-syncs s1 1
sentinel parallel-syncs s2 1
sentinel parallel-syncs s3 1
启动哨兵
方式一:redis-sentinel sentinel.conf(推荐,这种方式启动和redis实例没有任何关系)
方式二:redis-server sentinel.conf --sentinel
使用方式一启动并查看进程:
redis-sentinel sentinel1.conf
redis-sentinel sentinel2.conf
redis-sentinel sentinel3.conf
redis-sentinel成功启动。
再去查看日志文件可以看到哨兵通过监控主数据库可以自动获取从数据库的信息并监控,本例中哨兵发现了7004、7005和7006三个从数据库。
主服务器master宕机测试:
当主服务器master宕机,sentinel会通过选举机制从salve中选出一个作为新master,哨兵会发送给其他从服务器slave配置选中的这个为新主服务器master,并删除监听列表中出现故障的master服务器。我们随意kill一个主服务器进程,本次示例kill了7002,哨兵日志如下:
+sdown 表示哨兵主观认为主数据库停止服务了
+odown 表示哨兵客观认为主数据库停止服务了
try-failover 表示哨兵开始进行故障恢复
+slave 表示故障恢复后新的主从结构,主数据库由原来的7002变为现在的7004从数据库。
我们再去登录任意redis进行操作,服务正常,原来的7002变成了7004,当原来的主数据库发生故障后,原来的从数据库转换为新的主数据库,哨兵作用得以体现。
现在把之前挂掉的7002重启,查看7002服务器信息角色为slave,它的主数据库为7004,说明原来的master即使恢复正常,也不会自动恢复成master。