天天看點

Redis-3.2主從複制與叢集搭建

Redis-3.2主從複制與叢集搭建

一、Redis 主從搭建

1.下載下傳并解壓

1

2

3

4

5

6

7

8

<code>yum </code><code>install</code> <code>-y gcc gcc-c++ pcre zlib pcre-devel tcl </code>

<code>wget  http:</code><code>//download</code><code>.redis.io</code><code>/releases/redis-3</code><code>.2.4.</code><code>tar</code><code>.gz</code>

<code>tar</code> <code>-zxvf redis-3.2.4.</code><code>tar</code><code>.gz</code>

<code>cd</code> <code>redis-3.2.4</code>

<code>make</code> 

<code>cd</code> <code>src &amp;&amp; </code><code>make</code> <code>test</code> <code>&amp;&amp; </code><code>make</code> <code>install</code>

<code>mkdir</code> <code>/etc/redis</code>

<code>cp</code> <code>..</code><code>/redis</code><code>.conf </code><code>/etc/redis/redis</code><code>.conf</code>

2.優化參數

<code>vim </code><code>/etc/sysctl</code><code>.conf</code>

<code>net.core.somaxconn = 20480  </code><code>#最大隊列長度,應付突發的大并發連接配接請求,預設為128</code>

<code>net.ipv4.tcp_max_syn_backlog = 20480  </code><code>#半連接配接隊列長度,此值受限于記憶體大小,預設為1024</code>

<code>vm.overcommit_memory = 1</code>

<code>0 表示檢查是否有足夠的記憶體可用,如果是,允許配置設定;如果記憶體不夠,拒絕該請求,并傳回一個錯誤給應用程式。</code>

<code>1 允許配置設定超出實體記憶體加上交換記憶體的請求</code>

<code>2 核心總是傳回</code><code>true</code>

<code>sysctl -p  </code><code>#使參數生效</code>

3.配置檔案說明

3.1背景運作

<code>daemonize </code><code>yes</code>

3.2bind位址監聽

<code>預設bind的填寫的127.0.0.1這樣配置是隻允許本地通路</code>

<code>bind 0.0.0.0</code>

3.3 日志配置

<code>logfile </code><code>"/var/log/redis.log"</code>

3.4 開機自啟腳本

vim /etc/init.d/redis

9

10

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

<code># chkconfig: 2345 90 10</code>

<code># description: service of redis for start and stop add by tomener</code>

<code> </code> 

<code>PATH=</code><code>/usr/local/bin</code><code>:</code><code>/sbin</code><code>:</code><code>/usr/bin</code><code>:</code><code>/bin</code>

<code>REDISPORT=6379</code>

<code>EXEC=</code><code>/usr/local/bin/redis-server</code>

<code>REDIS_CLI=</code><code>/usr/local/bin/redis-cli</code>

<code>PIDFILE=</code><code>/var/run/redis_6379</code><code>.pid</code>

<code>CONF=</code><code>"/etc/redis/redis.conf"</code>

<code>AUTH=</code><code>"Passwd"</code>

<code>BIND_IP=</code><code>'0.0.0.0'</code>

<code>case</code> <code>"$1"</code> <code>in</code>

<code>        </code><code>start)</code>

<code>                </code><code>if</code> <code>[ -f $PIDFILE ]</code>

<code>                </code><code>then</code>

<code>                        </code><code>echo</code> <code>"$PIDFILE exists, process is already running or crashed."</code>

<code>                </code><code>else</code>

<code>                        </code><code>echo</code> <code>"Starting Redis server..."</code>

<code>                        </code><code>$EXEC $CONF</code>

<code>                </code><code>fi</code>

<code>                </code><code>if</code> <code>[ </code><code>"$?"</code><code>=</code><code>"0"</code> <code>]</code>

<code>                        </code><code>echo</code> <code>"Redis is running..."</code>

<code>                </code><code>;;</code>

<code>        </code><code>stop)</code>

<code>                </code><code>if</code> <code>[ ! -f $PIDFILE ]</code>

<code>                        </code><code>echo</code> <code>"$PIDFILE exists, process is not running."</code>

<code>                        </code><code>PID=$(</code><code>cat</code> <code>$PIDFILE)</code>

<code>                        </code><code>echo</code> <code>"Stopping..."</code>

<code>                       </code><code>$REDIS_CLI -h $BIND_IP -a $AUTH -p $REDISPORT  SHUTDOWN</code>

<code>                        </code><code>sleep</code> <code>2</code>

<code>                       </code><code>while</code> <code>[ -x $PIDFILE ]</code>

<code>                       </code><code>do</code>

<code>                                </code><code>echo</code> <code>"Waiting for Redis to shutdown..."</code>

<code>                               </code><code>sleep</code> <code>1</code>

<code>                        </code><code>done</code>

<code>                        </code><code>echo</code> <code>"Redis stopped"</code>

<code>               </code><code>restart|force-reload)</code>

<code>                    </code><code>${0} stop</code>

<code>                    </code><code>${0} start</code>

<code>                    </code><code>;;</code>

<code>               </code><code>*)</code>

<code>                    </code><code>echo</code> <code>"Usage: /etc/init.d/redis {start|stop|restart|force-reload}"</code> <code>&gt;&amp;2</code>

<code>                    </code><code>exit</code> <code>1</code>

<code>esac</code>

<code>chkconfig redis on</code>

<code>service redis restart</code>

3.5 設定密碼

編輯配置檔案/etc/redis/redis.conf,重新開機生效

<code>requirepass redispwd  </code>

<code>redis-cli -p 6379 -a redispwd            </code><code>#連接配接資料庫需要-a輸入密碼</code>

3.6 備份恢複

使用指令檢視備份目錄,此目錄為服務啟動時候的目錄,恢複可以将檔案存放到此目錄下,重新開機啟動redis服務,既可完成rdb數恢複。

<code>CONFIG GET </code><code>dir</code>            <code>#檢視備份目錄</code>

<code>save                     </code><code>#執行備份</code>

<a href="https://s5.51cto.com/oss/201711/14/e10c245f11955ad2fc393636f5290f42.png" target="_blank"></a>

4.Redis持久化

4.1 rdb方式

工作原理:

當redis生成dump.rdb檔案時,工作過程如下:

redis主程序fork一個子程序fork出來的子程序将記憶體的資料集dump到臨時的RDB中

當子程序對臨時的RDB檔案寫入完畢,redis用新的RDB檔案代替舊的RDB檔案

預設配置如下:

<code>save 900 1</code>

<code>save 300 10</code>

<code>save 60 10000</code>

其意義:

當1個key更新值時每900秒儲存一次資料到硬碟

當10個key更新值時每300秒儲存一次到硬碟

當10000個key更新值時每60秒儲存一次到硬碟

4.2 aof方式

aof本質是redis操作(寫操作)日志檔案。aof預設是未開啟的,需要在配置檔案中進行設定,在配置檔案中将這一行改為appendonly yes就可以了。

工作原理

AOF :append only file。

每當Redis執行一個改變資料集的指令時,這個指令都會被追加到AOF檔案的末尾。

當redis重新啟動時,程式可以通過AOF檔案恢複資料。

三種appedn方式:

<code>appendfsync always</code>

<code>appendfsync everysec</code>

<code>appendfsync no</code>

appendfsync always每次有新指令追加到 AOF 檔案時就執行一次 fsync :非常慢,也非常安全

appendfsync everysec每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),并且在故障時隻會丢失 1 秒鐘的資料。

appendfsync no從不 fsync :将資料交給作業系統來處理。更快,也更不安全的選擇。

推薦(并且也是預設)的措施為每秒 fsync 一次, 這種 fsync 政策可以兼顧速度和安全性。

aof能夠保證資料的安全,但是在重新開機時比較耗時,而且aof檔案的體積比rdb檔案大。

5. Redis主從複制

5.1 概述

Redis的replication機制允許slave從master那裡通過網絡傳輸拷貝到完整的資料備份。具有以下特點:

異步複制,從2.8版本開始,slave能不時地從master那裡擷取到資料。

允許單個master配置多個slave

slave允許其它slave連接配接到自己。一個slave除了可以連接配接master外,它還可以連接配接其它的slave。形成一個圖狀的架構。

master在進行replication時是非阻塞的,這意味着在replication期間,master依然能夠處理用戶端的請求。

slave在replication期間也是非阻塞的,也可以接受來自用戶端的請求,但是它用的是之前的舊資料。可以通過配置來決定slave是否在進行replication時用舊資料響應用戶端的請求,如果配置為否,那麼slave将會傳回一個錯誤消息給用戶端。不過當新的資料接收完全後,必須将新資料與舊資料替換,即删除舊資料,在替換資料的這個時間視窗内,slave将會拒絕用戶端的請求和連接配接。

一般使用replication來可以實作擴充性,例如說,可以将多個slave配置為“隻讀”,或者是純粹的資料備援備份。

能夠通過replication來避免master每次持久化時都将整個資料集持久化到硬碟中。隻需把master配置為不進行持久化操作(把配置檔案中持久化相關的配置項注釋掉即可),然後連接配接上一個slave,這個slave則被配置持久化選項。不過需要注意的是,在這個方案中,必須確定master不會自動啟動。

5.2 Master持久化功能關閉時Replication的安全性

當有需要使用到replication機制時,一般都會強烈建議把master的持久化開關打開。即使為了避免持久化帶來的延遲影響,不把持久化開關打開,那麼也應該把master配置為不會自動啟動的。

5.3 replication工作原理

為如果你為master配置了一個slave,不管這個slave是否是第一次連接配接上Master,它都會發送一個SYNC指令給master請求複制資料。

master收到SYNC指令後,會在背景進行資料持久化,持久化期間,master會繼續接收用戶端的請求,它會把這些可能修改資料集的請求緩存在記憶體中。當持久化進行完畢以後,master會把這份資料集發送給slave,slave會把接收到的資料進行持久化,然後再加載到記憶體中。然後,master再将之前緩存在記憶體中的指令發送給slave。

當master與slave之間的連接配接由于某些原因而斷開時,slave能夠自動重連master,如果master收到了多個slave并發連接配接請求,它隻會進行一次持久化,而不是一個連接配接一次,然後再把這一份持久化的資料發送給多個并發連接配接的slave。

當master和slave斷開重連後,一般都會對整份資料進行複制。但從redis2.8版本開始,支

5.4 主從配置

與replication相關的配置比較簡單,隻需要把下面一行加到slave的配置檔案中:

slaveof  masterIPaddress  6379

如果master通過requirepass配置項設定了密碼,slave每次同步操作都需要驗證密碼,可以通過在slave的配置檔案中添加以下配置項:

masterauth &lt;password&gt;

6常用指令

啟動redis:

redis-server /etc/redis/redis.conf

用戶端指令工具

/usr/local/bin/redis-cli -h 192.168.1.1

192.168.1.1:6379&gt; auth PasswdOK

登入,密碼驗證192.168.1.1:6379&gt;info

檢視資料庫狀态192.168.1.1:6379&gt;info replication

檢視slave的複制狀态192.168.1.1:6379&gt;set key 123

插入資料192.168.1.1:6379&gt;keys *

列出資料

flushdb

清空目前資料

flushall

清除所有資料庫

7.測試主從及切換

7.1 主從測試

<a href="https://s1.51cto.com/wyfs02/M00/8E/F5/wKioL1jP9QezMT9AAAEgqHq56Rk010.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M01/8E/F7/wKiom1jP9VTRP8_6AAEz8t7g2Ts415.png" target="_blank"></a>

7.2主從切換

停止主

<a href="https://s5.51cto.com/wyfs02/M02/8E/F7/wKiom1jP9avAqGw-AAHij6zjxrI896.png" target="_blank"></a>

切換從為主

redis-cli -h localhost slaveof NO ONE

<a href="https://s1.51cto.com/wyfs02/M00/8E/F7/wKiom1jP9frQwHqoAAJ23aica_s403.png" target="_blank"></a>

恢複原來主資料庫

将現在的主redis根目錄下dump.rdb檔案拷貝覆寫到原來主redis的根目錄

啟動原來的主redis

<a href="https://s1.51cto.com/wyfs02/M01/8E/F5/wKioL1jP9ieySz7lAABO0OJWaqg371.png" target="_blank"></a>

在從資料庫切換主資料庫redis-cli -h localhost -p 6379 slaveof 172.17.10.193 6379

測試從已經切換回來

<a href="https://s5.51cto.com/wyfs02/M02/8E/F7/wKiom1jP9orAKHKBAAG-4RX46dY624.png" target="_blank"></a>

二、Redis 叢集搭建

Redis安裝成功後,建立單獨目錄

<code>mkdir</code> <code>/usr/local/redis/cluster</code> <code>-p</code>

再在其下建立目錄 7000、7001、7002、7003

<code>mkdir</code> <code>/usr/local/redis/cluster/7000</code> <code>-p</code>

<code>cp</code> <code>redis.conf </code><code>/usr/local/redis/cluster/7000/</code>

将redis.conf分别拷貝到這幾個目錄下面,并分别修改redis.conf 中的端口号port和目錄名一緻

分别修改配置檔案

<code>daemonize    </code><code>yes</code>                          <code>//redis</code><code>背景運作</code>

<code>pidfile  </code><code>/var/run/redis_7000</code><code>.pid              </code><code>//pidfile</code><code>檔案對應7000,7002,7003</code>

<code>port  7000                                </code><code>//</code><code>端口7000,7002,7003</code>

<code>cluster-enabled  </code><code>yes</code>                        <code>//</code><code>開啟叢集  把注釋</code><code>#去掉</code>

<code>cluster-config-</code><code>file</code>  <code>nodes_7000.conf          </code><code>//</code><code>叢集的配置  配置檔案首次啟動自動生成 7000,7001,7002</code>

<code>cluster-node-timeout  5000                  </code><code>//</code><code>請求逾時  設定5秒夠了</code>

<code>appendonly  </code><code>yes</code>                           <code>//aof</code><code>日志開啟  有需要就開啟,它會每次寫操作都記錄一條日志</code>

<a href="https://s4.51cto.com/wyfs02/M02/8E/F5/wKioL1jP9wuTALJ1AAJdH_ia7q0316.png" target="_blank"></a>

檢視服務是否已經起來

<a href="https://s2.51cto.com/wyfs02/M02/8E/F7/wKiom1jP907gCiFVAAVOM88BxiQ959.png" target="_blank"></a>

2.安裝相關軟體包

<code>yum -y </code><code>install</code> <code>ruby ruby-devel rubygems rpm-build</code>

再用 gem 這個指令來安裝 redis接口    gem是ruby的一個工具包

<code>gem </code><code>install</code> <code>redis</code>

如果安裝失敗,可手動安裝

<code>wget https:</code><code>//rubygems</code><code>.global.ssl.fastly.NET</code><code>/gems/redis-3</code><code>.2.1.gem</code>

<code>sudo</code> <code>gem </code><code>install</code> <code>-l .</code><code>/redis-3</code><code>.2.1.gem</code>

3.redis-trib.rb腳本建立叢集

<code>cd</code> <code>/root/redis-3</code><code>.2.4</code><code>/src</code>

<code>.</code><code>/redis-trib</code><code>.rb create --replicas 1 172.17.10.191:7000 172.17.10.191:7001 172.17.10</code>

<code>7005 172.17.10.191:7006</code>

--replicas  1  表示 自動為每一個master節點配置設定一個slave節點 

<a href="https://s3.51cto.com/wyfs02/M02/8E/F5/wKioL1jP9-qBGHjBAAN9gZeb_hY841.png" target="_blank"></a>

<a href="https://s1.51cto.com/wyfs02/M00/8E/F7/wKiom1jP-B_yI7k7AAZgpzN7hpk902.png" target="_blank"></a>

./redis-trib.rb check 172.17.10.191:7000

<a href="https://s4.51cto.com/wyfs02/M00/8E/F5/wKioL1jP-GDCWLOhAAdfJXakOLM869.png" target="_blank"></a>

4.測試

redis-cli -c -p 7000

設定資料,然後停止7000端口監聽的redis

登入其他,檢視擷取資料。

<a href="https://s5.51cto.com/wyfs02/M01/8E/F7/wKiom1jP-SHgz3pHAAGxK9Waces741.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M01/8E/F5/wKioL1jP-Viz50OrAAK1SPaAZBs433.png" target="_blank"></a>

<a href="https://s5.51cto.com/wyfs02/M00/8E/F5/wKioL1jP-aXAN5rLAAZnRIXXPRA368.png" target="_blank"></a>

本文轉自 KaliArch 51CTO部落格,原文連結:http://blog.51cto.com/kaliarch/1908617,如需轉載請自行聯系原作者