在生产场景下都必须做到高可用,否则出现问题就会造成服务停止。这里介绍下Redis的Sentinel功能实现的高可用,当然也有Redis提供的cluster功能。
<a href="http://s4.51cto.com/wyfs02/M00/7C/B0/wKioL1bWWbSz9bo5AAA2GOYNda8314.jpg" target="_blank"></a>
1.Redis的安装
1
2
3
4
5
6
7
8
9
10
<code>wget http:</code><code>//download</code><code>.redis.io</code><code>/releases/redis-3</code><code>.0.7.</code><code>tar</code><code>.gz</code>
<code>tar</code> <code>zxf redis-3.0.7.</code><code>tar</code><code>.gz</code>
<code>cd</code> <code>redis-3.0.7</code>
<code>make</code>
<code>cd</code> <code>src</code>
<code>mkdir</code> <code>-p </code><code>/usr/local/redis3</code><code>.0.7/{sbin,data,conf}</code>
<code>scp</code> <code>-r mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server localhost:</code><code>/usr/local/redis3</code><code>.0.7</code><code>/sbin</code>
<code>cp</code> <code>..</code><code>/redis</code><code>.conf </code><code>/usr/local/redis3</code><code>.0.7</code><code>/conf/</code>
<code>echo</code> <code>'PATH=$PATH:/usr/local/redis3.0.7/sbin'</code> <code>>></code><code>/etc/profile</code>
<code>source</code> <code>/etc/profile</code>
2.Redis的配置
<code>vim </code><code>/usr/local/redis3</code><code>.0.7</code><code>/conf/redis</code><code>.conf</code>
(以下为db1的配置,db2的配置只需要增加一行slaveof 192.168.2.241 6379)
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<code>#是否以服务方式开启</code>
<code>daemonize no</code>
<code>pidfile </code><code>/var/run/redis</code><code>.pid</code>
<code>#端口</code>
<code>port 6379</code>
<code>tcp-backlog 511</code>
<code>timeout 0</code>
<code>tcp-keepalive 0</code>
<code>#日志提醒级别</code>
<code>loglevel notice</code>
<code>#日志文件路径</code>
<code>logfile </code><code>""</code>
<code>#数据库数量</code>
<code>databases 16</code>
<code>#日志刷新策略(Master禁用)</code>
<code>save 900 1</code>
<code>#说明900秒内1次改动,自动保存一次数据集</code>
<code>save 300 10</code>
<code>save 60 10000</code>
<code>stop-writes-on-bgsave-error </code><code>yes</code>
<code>#以rdb方式存储时是否压缩</code>
<code>rdbcompression </code><code>yes</code>
<code>#rdb是否校验</code>
<code>rdbchecksum </code><code>yes</code>
<code>#数据文件名</code>
<code>dbfilename dump.rdb</code>
<code>#数据文件路径</code>
<code>dir</code> <code>/usr/local/redis3</code><code>.0.7</code><code>/data</code>
<code>slave-serve-stale-data </code><code>yes</code>
<code>#从服务器只读</code>
<code>slave-</code><code>read</code><code>-only </code><code>yes</code>
<code>#指定与主数据库连接时需要的密码验证,主库无需设置</code>
<code>#masterauth</code>
<code>repl-diskless-</code><code>sync</code> <code>no</code>
<code>repl-diskless-</code><code>sync</code><code>-delay 5</code>
<code>repl-disable-tcp-nodelay no</code>
<code>slave-priority 100</code>
<code>##启用增量(Master禁用)</code>
<code>appendonly no</code>
<code>#增量日志文件名,默认值为appendonly.aof</code>
<code>appendfilename </code><code>"appendonly.aof"</code>
<code>#设置对 appendonly.aof 文件进行同步的频率</code>
<code>#always 表示每次有写操作都进行同步,everysec 表示对写操作进行累积,每秒同步一次。</code>
<code>#no表示等操作系统进行数据缓存同步到磁盘,都进行同步,everysec 表示对写操作进行累#积,每秒同步一次</code>
<code>appendfsync everysec</code>
<code>no-appendfsync-on-rewrite no</code>
<code>auto-aof-rewrite-percentage 100</code>
<code>auto-aof-rewrite-min-size 64mb</code>
<code>aof-load-truncated </code><code>yes</code>
<code>lua-</code><code>time</code><code>-limit 5000</code>
<code>slowlog-log-slower-than 10000</code>
<code>slowlog-max-len 128</code>
<code>latency-monitor-threshold 0</code>
<code>notify-keyspace-events </code><code>""</code>
<code>hash</code><code>-max-ziplist-entries 512</code>
<code>hash</code><code>-max-ziplist-value 64</code>
<code>list-max-ziplist-entries 512</code>
<code>list-max-ziplist-value 64</code>
<code>set</code><code>-max-intset-entries 512</code>
<code>zset-max-ziplist-entries 128</code>
<code>zset-max-ziplist-value 64</code>
<code>hll-sparse-max-bytes 3000</code>
<code>activerehashing </code><code>yes</code>
<code>client-output-buffer-limit normal 0 0 0</code>
<code>client-output-buffer-limit slave 256mb 64mb 60</code>
<code>client-output-buffer-limit pubsub 32mb 8mb 60</code>
<code>hz 10</code>
<code>aof-rewrite-incremental-fsync </code><code>yes</code>
<code>#最大可用内存</code>
<code>#maxmemory 2mb</code>
<code>#配置成从服务器</code>
<code>#slaveof 192.168.2.250 6379</code>
<code>#客户端连接访问口令</code>
<code># requirepass foobared</code>
<code>#限制同时连接的客户数量,防止过多的client导致内存耗尽。如果有足够内存可以不进行#设置</code>
<code>#maxclients 10000</code>
3.Sentinel的配置
<code>vim </code><code>/usr/local/redis3</code><code>.0.7</code><code>/conf/sentinel</code><code>.conf</code>
<code>port 26379</code>
<code>sentinel monitor master 192.168.2.241 6379 2</code>
<code>sentinel down-after-milliseconds master 5000</code>
<code>sentinel failover-timeout master 900000</code>
<code>#sentinel can-failover master yes</code>
<code>sentinel parallel-syncs master 2</code>
<code># Generated by CONFIG REWRITE</code>
<code>dir</code> <code>"/usr/local/redis3.0.7/conf"</code>
<code>#sentinel client-reconfig-script master /usr/local/redis3.0.7/sbin/vip.sh</code>
4.启动redis-server及redis-sentinel
在db1,db2,db3上分别启动redis-server及redis-sentinel
<code>/usr/local/redis3</code><code>.0.7</code><code>/sbin/redis-server</code> <code>/usr/local/redis3</code><code>.0.7</code><code>/conf/redis</code><code>.conf</code>
<code>/usr/local/redis3</code><code>.0.7</code><code>/sbin/redis-sentinel</code> <code>/usr/local/redis3</code><code>.0.7</code><code>/conf/sentinel</code><code>.conf</code>
这个时候就已经做好了Redis的主从复制及故障转移,我们客户端的连接就需要修改,因此就涉及到VIP的问题,客户端只要连接VIP的问题,目前VIP的解决方法有
利用redis-sentinel的sentinel client-reconfig-script参数进行设置
利用keepalived进行VIP的转移
利用consul进行服务注册
a.利用redis-sentinel自带的参数进行VIP的配置
在db1,db2的sentinel.conf中加入
sentinel client-reconfig-script master1 /usr/local/redis3.0.7/sbin/vip.sh
然后创建脚本/usr/local/redis3.0.7/sbin/vip.sh
<code>#!/bin/bash</code>
<code>MASTER_IP=$6</code>
<code>LOCAL_IP=</code><code>'192.168.2.241'</code> <code>#从库修改为192.168.2.242</code>
<code>VIP=</code><code>'192.168.2.250'</code>
<code>NETMASK=</code><code>'24'</code>
<code>INTERFACE=</code><code>'eth0'</code>
<code>if</code> <code>[ ${MASTER_IP} = ${LOCAL_IP} ]; </code><code>then</code>
<code> </code><code>/sbin/ip</code> <code>addr add ${VIP}/${NETMASK} dev ${INTERFACE}</code>
<code> </code><code>/sbin/arping</code> <code>-q -c 3 -A ${VIP} -I ${INTERFACE}</code>
<code> </code><code>exit</code> <code>0</code>
<code>else</code>
<code> </code><code>/sbin/ip</code> <code>addr del ${VIP}/${NETMASK} dev ${INTERFACE}</code>
<code>fi</code>
<code>exit</code> <code>1</code>
在集群启动的时候需要手动添加VIP
<code>/sbin/ip</code> <code>addr add 192.168.2.250</code><code>/24</code> <code>dev eth0</code>
使用上面脚本的时候需要注意你的网卡是eth0,否则可能出现VIP无法使用的情况
b.利用keepalived进行VIP的切换
<code>wget http:</code><code>//www</code><code>.keepalived.org</code><code>/software/keepalived-1</code><code>.2.19.</code><code>tar</code><code>.gz</code>
<code>tar</code> <code>zxf keepalived-1.2.19.</code><code>tar</code><code>.gz</code>
<code>cd</code> <code>keepalived-1.2.19</code>
<code>.</code><code>/configure</code> <code>--prefix=</code><code>/usr/local/keepalived1</code><code>.2.19 --disable-fwmark</code>
<code>make</code> <code>&& </code><code>make</code> <code>install</code>
<code>ln</code> <code>-s </code><code>/usr/local/keepalived1</code><code>.2.19</code><code>/sbin/keepalived</code> <code>/usr/sbin/</code>
<code>ln</code> <code>-s </code><code>/usr/local/keepalived1</code><code>.2.19</code><code>/etc/sysconfig/keepalived</code> <code>/etc/sysconfig/</code>
<code>ln</code> <code>-s </code><code>/usr/local/keepalived1</code><code>.2.19</code><code>/etc/keepalived/</code> <code>/etc/keepalived</code>
<code>ln</code> <code>-s </code><code>/usr/local/keepalived1</code><code>.2.19</code><code>/etc/rc</code><code>.d</code><code>/init</code><code>.d</code><code>/keepalived</code> <code>/etc/init</code><code>.d/</code>
db1的keepalived配置文件
<code>! Configuration File </code><code>for</code> <code>keepalived </code>
<code>global_defs { </code>
<code> </code><code>notification_email { </code>
<code> </code><code>root@localhost </code>
<code> </code><code>} </code>
<code> </code><code>notification_email_from keepalived@localhost </code>
<code> </code><code>smtp_server 127.0.0.1 </code>
<code> </code><code>smtp_connect_timeout 10 </code>
<code> </code><code>router_id keepalivedha_1 </code>
<code>} </code>
<code>vrrp_script chk_redis_role { </code>
<code> </code><code>script </code><code>"/usr/local/redis3.0.7/sbin/redis-cli info | grep role:master >/dev/null 2>&1"</code>
<code> </code><code>interval 1 </code>
<code> </code><code>timeout 2 </code>
<code> </code><code>fall 2 </code>
<code> </code><code>rise 1 </code>
<code>vrrp_sync_group VG_1 { </code>
<code> </code><code>group { </code>
<code> </code><code>VI_1 </code>
<code> </code><code>} </code>
<code>vrrp_instance VI_1 { </code>
<code> </code><code>state BACKUP </code>
<code> </code><code>interface eth0 </code>
<code> </code><code>#use_vmac keepalived </code>
<code> </code><code>#vmac_xmit_base </code>
<code> </code><code>smtp_alert </code>
<code> </code><code>virtual_router_id 20 </code>
<code> </code><code>priority 100 </code>
<code> </code><code>advert_int 1 </code>
<code> </code><code>authentication { </code>
<code> </code><code>auth_type PASS </code>
<code> </code><code>auth_pass password </code>
<code> </code><code>virtual_ipaddress { </code>
<code> </code><code>192.168.2.250</code>
<code> </code><code>track_script { </code>
<code> </code><code>chk_redis_role </code>
<code>}</code>
db2的配置文件,只需要将以上文件复制过来并修改下面参数
<code>priority 98</code>
#注意一下interface eth0看下你机器的网卡接口
c.利用consul服务注册
从上面可以看出以上三种方法:
脚本跟keepalived的形式一样,但是脚本相对轻量,首次启动麻烦,配置简单,依赖于redis-sentinel
keepalived启动简单,排错简便
consul适合大型场景,及云环境没有多余的IP这种情况
以上也适用于2台服务器的场景,也可以不用3台服务器。只需要更改
<code>sentinel monitor master 192.168.2.241 6379 1</code>
后面值更改为1即可
本文转自 rong341233 51CTO博客,原文链接:http://blog.51cto.com/fengwan/1746731