Redis-3.2主從復制與集群搭建
一、Redis 主從搭建
1.下載并解壓
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.優化參數
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后臺運行
daemonize?yes
3.2bind地址監聽
默認bind的填寫的127.0.0.1這樣配置是只允許本地訪問 bind?0.0.0.0
3.3 日志配置
logfile?"/var/log/redis.log"
3.4 開機自啟腳本
vim /etc/init.d/redis
#?chkconfig:?2345?90?10 #?description:?service?of?redis?for?start?and?stop?add?by?tomenerPATH=/usr/local/bin:/sbin:/usr/bin:/bin REDISPORT=6379 EXEC=/usr/local/bin/redis-server REDIS_CLI=/usr/local/bin/redis-cliPIDFILE=/var/run/redis_6379.pid CONF="/etc/redis/redis.conf" AUTH="Passwd" BIND_IP='0.0.0.0' case?"$1"?instart)if?[?-f?$PIDFILE?]thenecho?"$PIDFILE?exists,?process?is?already?running?or?crashed."elseecho?"Starting?Redis?server..."$EXEC?$CONFfiif?[?"$?"="0"?]thenecho?"Redis?is?running..."fi;;stop)if?[?!?-f?$PIDFILE?]thenecho?"$PIDFILE?exists,?process?is?not?running."elsePID=$(cat?$PIDFILE)echo?"Stopping..."$REDIS_CLI?-h?$BIND_IP?-a?$AUTH?-p?$REDISPORT??SHUTDOWNsleep?2while?[?-x?$PIDFILE?]doecho?"Waiting?for?Redis?to?shutdown..."sleep?1doneecho?"Redis?stopped"fi;;restart|force-reload)${0}?stop${0}?start;;*)echo?"Usage:?/etc/init.d/redis?{start|stop|restart|force-reload}"?>&2exit?1 esac
chkconfig?redis?on service?redis?restart
3.5 設置密碼
編輯配置文件/etc/redis/redis.conf,重啟生效
requirepass?redispwd?? redis-cli?-p?6379?-a?redispwd????????????#連接數據庫需要-a輸入密碼
3.6 備份恢復
使用命令查看備份目錄,此目錄為服務啟動時候的目錄,恢復可以將文件存放到此目錄下,重啟啟動redis服務,既可完成rdb數恢復。
CONFIG?GET?dir????????????#查看備份目錄 save?????????????????????#執行備份
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
其意義:
當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方式:
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 主從測試
7.2主從切換
停止主
切換從為主
redis-cli -h localhost slaveof NO ONE
恢復原來主數據庫
將現在的主redis根目錄下dump.rdb文件拷貝覆蓋到原來主redis的根目錄
啟動原來的主redis
在從數據庫切換主數據庫redis-cli -h localhost -p 6379 slaveof 172.17.10.193?6379
測試從已經切換回來
二、Redis 集群搭建
Redis高版本使用ruby實現了集群,所以需要ruby環境,安裝ruby環境和redis的gem接口后,就可以使用redis的redis-trib.rb腳本創建集群。
Redis安裝成功后,創建單獨目錄
mkdir?/usr/local/redis/cluster?-p
再在其下創建目錄 7000、7001、7002、7003
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日志開啟??有需要就開啟,它會每次寫操作都記錄一條日志
查看服務是否已經起來
2.安裝相關軟件包
yum?-y?install?ruby?ruby-devel?rubygems?rpm-build
再用 gem 這個命令來安裝 redis接口? ? gem是ruby的一個工具包
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節點?
./redis-trib.rb check 172.17.10.191:7000
4.測試
redis-cli -c -p 7000
設置數據,然后停止7000端口監聽的redis
登錄其他,查看獲取數據。