Redis-3.2主從複製與集羣搭建

Redis-3.2主從複製與集羣搭建

一、Redis 主從搭建

1.下載並解壓

1    

2

3

4

5

6

7

8

yum install -y gcc gcc-c++ pcre zlib pcre-devel tcl 

wget  http://download.redis.io/releases/redis-3.2.4.tar.gz

tar -zxvf redis-3.2.4.tar.gz

cd redis-3.2.4

make 

cd src && make test && make install

mkdir /etc/redis

cp ../redis.conf /etc/redis/redis.conf

2.優化參數

1

2

3

4

5

6

7

8

vim /etc/sysctl.conf

net.core.somaxconn = 20480  #最大隊列長度,應付突發的大併發連接請求,默認爲128

net.ipv4.tcp_max_syn_backlog = 20480  #半連接隊列長度,此值受限於內存大小,默認爲1024

vm.overcommit_memory = 1

0 表示檢查是否有足夠的內存可用,如果是,允許分配;如果內存不夠,拒絕該請求,並返回一個錯誤給應用程序。

1 允許分配超出物理內存加上交換內存的請求

2 內核總是返回true

sysctl -p  #使參數生效

3.配置文件說明

3.1後臺運行

1   

daemonize yes

3.2bind地址監聽

1

2

   默認bind的填寫的127.0.0.1這樣配置是隻允許本地訪問

   bind 0.0.0.0

3.3 日誌配置

1

   logfile "/var/log/redis.log"

3.4 開機自啓腳本

vim /etc/init.d/redis

1

2

3

4

5

6

7

8

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

# chkconfig: 2345 90 10

# description: service of redis for start and stop add by tomener

  

PATH=/usr/local/bin:/sbin:/usr/bin:/bin

REDISPORT=6379

EXEC=/usr/local/bin/redis-server

REDIS_CLI=/usr/local/bin/redis-cli

  

PIDFILE=/var/run/redis_6379.pid

CONF="/etc/redis/redis.conf"

AUTH="Passwd"

BIND_IP='0.0.0.0'

case "$1" in

        start)

                if [ -f $PIDFILE ]

                then

                        echo "$PIDFILE exists, process is already running or crashed."

                else

                        echo "Starting Redis server..."

                        $EXEC $CONF

                fi

                if [ "$?"="0" ]

                then

                        echo "Redis is running..."

                fi

                ;;

        stop)

                if [ ! -f $PIDFILE ]

                then

                        echo "$PIDFILE exists, process is not running."

                else

                        PID=$(cat $PIDFILE)

                        echo "Stopping..."

                       $REDIS_CLI -h $BIND_IP -a $AUTH -p $REDISPORT  SHUTDOWN

                        sleep 2

                       while [ -x $PIDFILE ]

                       do

                                echo "Waiting for Redis to shutdown..."

                               sleep 1

                        done

                        echo "Redis stopped"

                fi

                ;;

               restart|force-reload)

                    ${0} stop

                    ${0} start

                    ;;

               *)

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

                    exit 1

esac

1

2  

  chkconfig redis on

  service redis restart

4.Redis持久化

4.1 rdb方式

工作原理:

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

redis主進程fork一個子進程fork出來的子進程將內存的數據集dump到臨時的RDB中

當子進程對臨時的RDB文件寫入完畢,redis用新的RDB文件代替舊的RDB文件

默認配置如下:

1

2     

3

save 900 1

save 300 10

save 60 10000


其意義:

 當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方式:

1

2

3

  appendfsync always

  appendfsync everysec

  appendfsync no

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 <password>

6常用命令

啓動redis:

redis-server /etc/redis/redis.conf

客戶端命令工具

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

192.168.1.1:6379> auth PasswdOK

登錄,密碼驗證192.168.1.1:6379>info

查看數據庫狀態192.168.1.1:6379>info replication

查看slave的複製狀態192.168.1.1:6379>set key 123

插入數據192.168.1.1:6379>keys *

列出數據

flushdb

清空當前數據

flushall

清除所有數據庫

7.測試主從及切換

7.1 主從測試

wKioL1jP9QezMT9AAAEgqHq56Rk010.png

wKiom1jP9VTRP8_6AAEz8t7g2Ts415.png

7.2主從切換

停止主

wKiom1jP9avAqGw-AAHij6zjxrI896.png

切換從爲主

redis-cli -h localhost slaveof NO ONE

wKiom1jP9frQwHqoAAJ23aica_s403.png

恢復原來主數據庫

將現在的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄

啓動原來的主redis

wKioL1jP9ieySz7lAABO0OJWaqg371.png

在從數據庫切換主數據庫redis-cli -h localhost -p 6379 slaveof 172.17.10.193 6379

測試從已經切換回來

wKiom1jP9orAKHKBAAG-4RX46dY624.png


二、Redis 集羣搭建

Redis高版本使用ruby實現了集羣,所以需要ruby環境,安裝ruby環境和redis的gem接口後,就可以使用redis的redis-trib.rb腳本創建集羣。

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

1

    mkdir /usr/local/redis/cluster -p

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

1

2

    mkdir /usr/local/redis/cluster/7000 -p

    cp redis.conf /usr/local/redis/cluster/7000/

將redis.conf分別拷貝到這幾個目錄下面,並分別修改redis.conf 中的端口號port和目錄名一致

分別修改配置文件

1

2

3

4

5

6

7

daemonize    yes                          //redis後臺運行

pidfile  /var/run/redis_7000.pid              //pidfile文件對應7000,7002,7003

port  7000                                //端口7000,7002,7003

cluster-enabled  yes                        //開啓集羣  把註釋#去掉

cluster-config-file  nodes_7000.conf          //集羣的配置  配置文件首次啓動自動生成 7000,7001,7002

cluster-node-timeout  5000                  //請求超時  設置5秒夠了

appendonly  yes                           //aof日誌開啓  有需要就開啓,它會每次寫操作都記錄一條日誌

wKioL1jP9wuTALJ1AAJdH_ia7q0316.png

查看服務是否已經起來

wKiom1jP907gCiFVAAVOM88BxiQ959.png

2.安裝相關軟件包

1

    yum -y install ruby ruby-devel rubygems rpm-build

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

1

    gem install redis

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

1

2

    wget https://rubygems.global.ssl.fastly.NET/gems/redis-3.2.1.gem

    sudo gem install -l ./redis-3.2.1.gem


3.redis-trib.rb腳本創建集羣

1

2

3

cd /root/redis-3.2.4/src

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

7005 172.17.10.191:7006

--replicas  1  表示 自動爲每一個master節點分配一個slave節點 

wKioL1jP9-qBGHjBAAN9gZeb_hY841.png

wKiom1jP-B_yI7k7AAZgpzN7hpk902.png

./redis-trib.rb check 172.17.10.191:7000

wKioL1jP-GDCWLOhAAdfJXakOLM869.png

4.測試

redis-cli -c -p 7000

設置數據,然後停止7000端口監聽的redis

登錄其他,查看獲取數據。

wKiom1jP-SHgz3pHAAGxK9Waces741.png

wKioL1jP-Viz50OrAAK1SPaAZBs433.png

wKioL1jP-aXAN5rLAAZnRIXXPRA368.png

本文出自 “KaliArch” 博客,請務必保留此處http://kaliarch.blog.51cto.com/8966921/1908617

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章