天天看點

Redis 3.0.7基于Sentinel的高可用安裝及配置

在生産場景下都必須做到高可用,否則出現問題就會造成服務停止。這裡介紹下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>&gt;&gt;</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>&amp;&amp; </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 &gt;/dev/null 2&gt;&amp;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

繼續閱讀