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

1、Redis 主從搭建
node

1.下載並解壓c++

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.系統參數調優redis

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 後臺運行vim

daemonize yes

3.2 bind地址監聽緩存

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

3.3 日誌配置安全

logfile "/var/log/redis.log"

3.4 服務啓動腳本ruby

vim /etc/init.d/redis

# 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
chkconfig redis on    #設置開機自啓動
service redis restart    #啓動服務

3.5 設置密碼bash

編輯配置文件/etc/redis/redis.conf,重啓生效網絡

requirepass redispwd  
redis-cli -p 6379 -a redispwd            #鏈接數據庫須要-a參數輸入密碼

3.6 備份恢復

使用命令查看備份目錄,此目錄爲服務啓動時候的目錄,恢復能夠將文件存放到此目錄下,重啓啓動redis服務,既可完成rdb數恢復。

CONFIG GET dir           #查看備份目錄
save                 #執行備份

e10c245f11955ad2fc393636f5290f42.png

4.Redis持久化

4.1 rdb方式

工做原理:

redis生成dump.rdb文件時,工做過程以下:

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

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

默認配置以下:

save 900 1
save 300 10
save 60 10000

其意義:

1key更新值時每900秒保存一次數據到硬盤

10key更新值時每300秒保存一次到硬盤

10000key更新值時每60秒保存一次到硬盤

4.2 aof方式

aof本質是redis操做(寫操做)日誌文件。aof默認是未開啓的,須要在配置文件中進行設置,在配置文件中將這一行改成appendonly yes就能夠了。

工做原理:

AOF append only file

每當Redis執行一個改變數據集的命令時,這個命令都會被追加到AOF文件的末尾。

redis從新啓動時,程序能夠經過AOF文件恢復數據。

三種appedn方式:

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 概述

Redisreplication機制容許slavemaster那裏經過網絡傳輸拷貝到完整的數據備份。具備如下特色:

  • 異步複製,從2.8版本開始,slave能不時地從master那裏獲取到數據。

  • 容許單個master配置多個slave,易橫向擴展

  • slave容許其它slave鏈接到本身。一個slave除了能夠鏈接master外,它還能夠鏈接其它的slave。造成一個圖狀的架構。

  • master在進行replication時是非阻塞的,這意味着在replication期間,master依然可以處理客戶端的請求。

  • slavereplication期間也是非阻塞的,也能夠接受來自客戶端的請求,可是它用的是以前的舊數據。能夠經過配置來決定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會把這份數據集發送給slaveslave會把接收到的數據進行持久化,而後再加載到內存中。而後,master再將以前緩存在內存中的命令發送給slave

masterslave之間的鏈接因爲某些緣由而斷開時,slave可以自動重連master,若是master收到了多個slave併發鏈接請求,它只會進行一次持久化,而不是一個鏈接一次,而後再把這一份持久化的數據發送給多個併發鏈接的slave

masterslave斷開重連後,通常都會對整份數據進行復制。但從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 Passwd           #登陸,密碼驗證
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


2、Redis 集羣搭建

Redis高版本使用ruby實現了集羣,因此須要ruby環境,安裝ruby環境和redisgem接口後,就可使用redisredis-trib.rb腳本建立集羣。

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

mkdir /usr/local/redis/cluster -p

再在其下建立目錄 7000700170027003

mkdir /usr/local/redis/cluster/7000 -p
cp redis.conf /usr/local/redis/cluster/7000/

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

分別修改配置文件

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.安裝相關軟件包

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

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

gem install redis

若是安裝失敗,可手動安裝

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腳本建立集羣

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

相關文章
相關標籤/搜索