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 && </code><code>make</code> <code>test</code> <code>&& </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>>&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 <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 主從測試
<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,如需轉載請自行聯系原作者