1. 程式人生 > >redis配置文件詳解及實現主從同步切換

redis配置文件詳解及實現主從同步切換

redis redis主從


redis配置文件詳解及實現主從同步切換

redis復制

Redis復制很簡單易用,它通過配置允許slave Redis Servers或者Master Servers的復制品。接下來有幾個關於redis復制的非常重要特性:

  • 一個Master可以有多個Slaves。

  • Slaves能過接口其他slave的鏈接,除了可以接受同一個master下面slaves的鏈接以外,還可以接受同一個結構圖中的其他slaves的鏈接。

  • redis復制是在master段是非阻塞的,這就意味著master在同一個或多個slave端執行同步的時候還可以接受查詢。

  • 復制在slave端也是非阻塞的,假設你在redis.conf中配置redis這個功能,當slave在執行的新的同步時,它仍可以用舊的數據信息來提供查詢,否則,你可以配置當redis slaves去master失去聯系是,slave會給發送一個客戶端錯誤。

  • 為了有多個slaves可以做只讀查詢,復制可以重復2次,甚至多次,具有可擴展性(例如:slaves對話與重復的排序操作,有多份數據冗余就相對簡單了)。

  • 通過復制可以避免master全量寫硬盤的消耗:只要配置 master 的配置文件redis.conf來“避免保存”(註釋掉所有”save”命令),然後連接一個用來持久化數據的slave即可。但是這樣要確保masters 不會自動重啟。

原理:redis復制是怎麽進行工作

  1. 如果設置了一個slave,不管是在第一次鏈接還是重新鏈接master的時候,slave會發送一個同步命令 然後master開始後臺保存,收集所有對修改數據的命令。當後臺保存完成,master會將這個數據文件傳送到slave,然後保存在磁盤,加載到內存中;master接著發送收集到的所有的修改數據的命令,這好比一個流命令,是redis協議本身來實現的。

  2. 當master和slave因一些故障宕機時,slaves會自動的重鏈,如果master收到多個slave的同步請求,master會執行一個後臺保存,以確保所有的slaves都是正常的。 當master和slave能夠維持鏈接,就會有一個完整的同步進行。

配置redis主從

  • 配置主從同步是很簡單的,僅僅在slave的配置文件中增加類似下面這行的內容:

slaveof 192.168.1.1 6379

你可以更換master的ip地址或地址,或者,你可以使用slaveof命令,master就會啟動和slave的同步。

  • 設置slave到master的認證

如果master需要通過密碼登陸,那就需要配置slave在進行所有同步操作也要使用到密碼。 在一個運行的實例上嘗試,使用 redis-cli :

config set masterauth <password>

你也可以設置永久的。在配置文件中增加:

masterauth <password>

具體細節看下面。

安裝redis

下載安裝:

wget  	
tar  zxvf redis-2.8.2.tar.gz
cd 	redis-2.8.2
make  	PREFIX=/usr/local/redis  install
cp     	redis.conf     /usr/local/redis/

配置環境變量:

echo "export PATH=$PATH:/usr/local/redis/bin/" >>/etc/profile
source /etc/profile

Nohup啟動和停止redis服務的命令

# 後臺啟動
nohup /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf &
# 同時也可以修改配置文件實現後臺啟動,只需將daemonize no改為yes即可
# 停止
/usr/local/redis/bin/redis-cli  -p  6379 shutdown

安裝php-redis連接驅動

要確保PHP能夠連接Redis緩存服務器,需添加PHP Redis擴展程序,也即是添加PHP安ext擴展模塊:

wget  https://github.com/phpredis/phpredis/archive/3.1.2.tar.gz 
tar   xzf  3.1.2.tar.gz
# 必須運行下面的命令,編譯PHP擴展的工具,主要是根據系統信息生成對應的configure文件
/usr/local/php/bin/phpize cd   phpredis-3.1.2/
./configure --with-php-config=/usr/local/php/bin/php-config --enable-redis
make
make install

修改vim /usr/local/php/etc/php.ini配置文件,添加redis.so模塊,代碼如下

extension_dir = /usr/local/php5/lib/php/extensions/no-debug-zts-20090626" //這句不用添加也行
extension=redis.so

重啟apache,檢查phpinfo的測試頁面,是否支持redis模塊即可。

LAMP+REDIS進行緩存測試:

登陸web服務器,修改Discuz PHP網站發布/usr/local/apache2/htdcos目錄全局配置文件config_global.php,將redis服務器名稱改為redisIP地址即可。

vim /usr/local/apache2/htdocs/config/config_global.php 
// --------------------------  CONFIG MEMORY  --------------------------- //
$_config[‘memory‘][‘prefix‘] = ‘Ybxjgy_‘;
$_config[‘memory‘][‘redis‘][‘server‘] = ‘192.168.1.21‘;
$_config[‘memory‘][‘redis‘][‘port‘] = 6379;

通過瀏覽器訪問Apache PHP論壇網站,同時登陸Redis服務器,執行命令redis-cli進入Redis命令行,運行命令KEYS *,如圖12-11所示,存在以IOKLAN開頭的key,則證明Redis成功緩存LAMP+Discuz網站信息數據。

redis-cli 
redis 127.0.0.1:6379> keys *
1) "Ybxjgy_common_member_field_forum_1"
2) "Ybxjgy_forumlinks"
3) "Ybxjgy_threadtable_info"

同時你也可以測試緩存是否生效,在論壇註冊用戶,因為是第一次註冊,用戶名會寫入到mysql數據庫中,同時也會寫入到redis緩存,然後你將mysql數據庫中的該用戶刪除,發現依然可以使用之前註冊的用戶可以正常登陸網站,則說明緩存生效。這裏就不再列出命令。

redis主從實戰

準備兩臺redis服務器。

192.168.1.21 redis-master 192.168.1.24 redis-slave

開啟主服務器的後臺運行,將配置文件中 daemonize no改為daemonize yes

開啟從服務器的後臺運行,及設置slaveof的IP和端口:

vim redis.conf
port 6379daemonize yes
slaveof 192.168.1.21 6379

重啟redis主庫和從庫,測試主從同步。在主redis是上創建key values.然後在從redis上進行查詢:

主庫:

redis-cli redis 
127.0.0.1:6379> set jj www.jiajie.meOKredis 
127.0.0.1:6379> set jia www.jiajie.comOKredis 
127.0.0.1:6379> get jj"www.jiajie.me"redis 
127.0.0.1:6379> get jia"www.jiajie.com"

從庫:

redis-cli 
127.0.0.1:6379> get jj"
127.0.0.1:6379> get jia"
127.0.0.1:6379> set jie www.jiajie.org
(error) READONLY You can‘t write against a read only slave.

發現主從同步成功。從服務器只能進行讀操作。

主從切換

停止redis主服務器:

[[email protected] redis]# redis-cli -p 6379 shutdown
[[email protected] redis]# redis-cli -p 6379 
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

將redis從服務改為主:

#也可以直接在數據庫命令行中輸入slaveof no one
[[email protected] redis]# redis-cli -p 6379 slaveof NO ONEOK
[[email protected] redis]# redis-cli 127.0.0.1:6379> set jiajie www.jiajie.org
OK127.0.0.1:6379> get jiajie"www.jiajie.org"

發現從redis可以寫數據了。

假如原來的主redis恢復正常啦。要重新切換回去。

1). 將現在的主redis數據進行保存。

[[email protected] redis]# redis-cli 
127.0.0.1:6379> get jiajie"www.jiajie.org"
127.0.0.1:6379> save
OK
127.0.0.1:6379> get jiajie"www.jiajie.org"

2).將現在的主redis的dump.rdb文件拷貝到原來的主dump.rdb目錄下面

[[email protected] redis]# scp /data/redis/dump.rdb 192.168.1.21:/data/redis/dump.rdb

3).啟動原來的主redis

[[email protected] ~]# /usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

4).將原來的從依然切換成從

[[email protected] redis]# redis-cli -p 6379 slaveof 192.168.1.21 6379
OK
[[email protected] redis]# redis-cli 
127.0.0.1:6379> get jiajie"www.jiajie.org"

這時你依然可以讀取剛才從庫寫入的數據,如果不能讀取則切換失敗。

redis 配置文件詳解

# daemonize no  Linux Shell終端運行redis,改為yes即後臺運行Redis服務;
daemonize yes
# 當運行多個 redis 服務時,需要指定不同的pid文件和端口
pidfile /var/run/redis_6379.pid
# 指定redis運行的端口,默認是 6379
port 6379
# 在高並發的環境中,為避免慢客戶端的連接問題,需要設置一個高速後臺日誌
tcp-backlog 511
# 指定redis只接收來自於該 IP 地址的請求,如果不進行設置,那麽將處理所有請求
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1#設置客戶端連接時的超時時間,單位為秒。當客戶端在這段時間內沒有發出任何指令,那麽關閉該連接;
timeout 0
# 在Linux 上,指定值(秒)用於發送 ACKs 的時間。註意關閉連接需要雙倍的時間。默認為 0 。
tcp-keepalive 0
# Redis總共支持四個日誌級別: debug 、 verbose 、 notice 、 warning ,默認為 verbose
# debug     記錄很多信息,用於開發和測試# varbose   有用的信息,不像 debug 會記錄那麽多
# notice    普通的 verbose ,常用於生產環境
# warning   只有非常重要或者嚴重的信息會記錄到日誌
loglevel notice
#配置 log 文件地址#默認值為 stdout ,標準輸出,若後臺模式會輸出到 /dev/null 。
logfile /var/log/redis/redis.log
#可用數據庫數#默認值為16 ,默認數據庫為0,數據庫範圍在 0- ( database-1 )之間
databases 16
#數據寫入磁盤快照設置#保存數據到磁盤,格式如下 :
#save <seconds> <changes>
#指出在多長時間內,有多少次更新操作,就將數據同步到數據文件 rdb 。
#相當於條件觸發抓取快照,這個可以多個條件配合
#比如默認配置文件中的設置,就設置了三個條件#save 900 1  900 秒內至少有 1 個 key 被改變
#save 300 10  300 秒內至少有 300 個 key 被改變
#save 60 10000  60 秒內至少有 10000 個 key 被改變
# save 900 1# save 300 10# save 60 10000#  後臺存儲錯誤停止寫。
stop-writes-on-bgsave-error yes
#  存儲至本地數據庫時(持久化到 rdb 文件)是否壓縮數據,默認為 yes
rdbcompression yes
#  本地持久化數據庫文件名,默認值為 dump.rdb
dbfilename dump.rdb
#  工作目錄
#  數據庫鏡像備份的文件放置的路徑。
#  這裏的路徑跟文件名要分開配置是因為 redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時文件中,
#   等備份完成,再把該該臨時文件替換為上面所指定的文件,而這裏的臨時文件和上面所配置的備份文件都會放在
#   這個指定的路徑當中。
# AOF 文件也會存放在這個目錄下面
#  註意這裏必須制定一個目錄而不是文件
dir /var/lib/redis/
################################# 復制 ################################## 
 主從復制 . 設置該數據庫為其他數據庫的從數據庫 .
#  設置當本機為 slav 服務時,設置 master 服務的 IP 地址及端口,在 Redis 啟動時,它會自動從 master 進行數據同步
# slaveof <masterip><masterport>
#  當 master 服務設置了密碼保護時 ( 用 requirepass 制定的密碼 )
# slave 服務連接 master 的密碼# masterauth <master-password>
#  當從庫同主機失去連接或者復制正在進行,從機庫有兩種運行方式:
# 1)  如果 slave-serve-stale-data 設置為 yes( 默認設置 ) ,從庫會繼續響應客戶端的請求
# 2)  如果 slave-serve-stale-data 是指為 no ,出去 INFO 和 SLAVOF 命令之外的任何請求都會返回一個
#     錯誤 "SYNC with master in progress"slave-serve-stale-data yes
#  配置 slave 實例是否接受寫。寫 slave 對存儲短暫數據(在同 master 數據同步後可以很容易地被刪除)是有用的,
#  但未配置的情況下,客戶端寫可能會發送問題。
#  從 Redis2.6 後,默認 slave 為 read-onlyslaveread-only yes
#  從庫會按照一個時間間隔向主庫發送 PINGs. 可以通過 repl-ping-slave-period 設置這個時間間隔,默認是 10 秒
# repl-ping-slave-period 10# repl-timeout  設置主庫批量數據傳輸時間或者 ping 回復時間間隔,默認值是 60 秒
#  一定要確保 repl-timeout 大於 repl-ping-slave-period
# repl-timeout 6
#  在 slave socket 的 SYNC 後禁用 TCP_NODELAY
#  如果選擇“ yes ” ,Redis 將使用一個較小的數字 TCP 數據包和更少的帶寬將數據發送到 slave , 
#  但是這可能導致數據發送到 slave 端會有延遲 , 如果是 Linux kernel 的默認配置,會達到 40 毫秒 .
#  如果選擇 "no" ,則發送數據到 slave 端的延遲會降低,但將使用更多的帶寬用於復制 .
repl-disable-tcp-nodelay no
#  設置復制的後臺日誌大小。
#  復制的後臺日誌越大, slave 斷開連接及後來可能執行部分復制花的時間就越長。
#  後臺日誌在至少有一個 slave 連接時,僅僅分配一次。
# repl-backlog-size 1mb
#  在 master 不再連接 slave 後,後臺日誌將被釋放。下面的配置定義從最後一個 slave 斷開連接後需要釋放的時間(秒)。
# 0 意味著從不釋放後臺日誌
# repl-backlog-ttl 3600
#  如果 master 不能再正常工作,那麽會在多個 slave 中,選擇優先值最小的一個 slave 提升為 master ,
#  優先值為 0 表示不能提升為 master 。
slave-priority 100
#  如果少於 N 個 slave 連接,且延遲時間 <=M 秒,則 master 可配置停止接受寫操作。
#  例如需要至少 3 個 slave 連接,且延遲 <=10 秒的配置:
# min-slaves-to-write 3# min-slaves-max-lag 10
#  設置 0 為禁用
#   默認 min-slaves-to-write 為 0 (禁用), min-slaves-max-lag 為 10
################################## 安全 ####################################  
設置客戶端連接後進行任何其他指定前需要使用的密碼。
#  警告:因為 redis 速度相當快,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒鐘進行 150K 次的密碼嘗試,
#  這意味著你需要指定非常非常強大的密碼來防止暴力破解
# requirepass jfedu
#  命令重命名 .
#  在一個共享環境下可以重命名相對危險的命令。比如把 CONFIG 重名為一個不容易猜測的字符。
#  舉例 :
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
#  如果想刪除一個命令,直接把它重命名為一個空字符 "" 即可,如下:
# rename-command CONFIG ""
###################################約束####################################
設置同一時間最大客戶端連接數,默認無限制, 
#Redis 可以同時打開的客戶端連接數為 Redis 進程可以打開的最大文件描述符數,
#如果設置  maxclients 0 ,表示不作限制。
#當客戶端連接數到達限制時, Redis 會關閉新的連接並向客戶端返回 max number of clients reached 錯誤信息
# maxclients 10000
#  指定 Redis 最大內存限制, Redis 在啟動時會把數據加載到內存中,達到最大內存後, 
#  Redis 會按照清除策略嘗試清除已到期的 Key
#  如果 Redis 依照策略清除後無法提供足夠空間,或者策略設置為 ”noeviction” ,則使用更多空間的命令將會報錯,
# 例如 SET, LPUSH 等。但仍然可以進行讀取操作
#  註意: Redis 新的 vm 機制,會把 Key 存放內存, Value 會存放在 swap 區
#  該選項對 LRU 策略很有用。
# maxmemory 的設置比較適合於把 redis 當作於類似 memcached 的緩存來使用,而不適合當做一個真實的 DB 。
#  當把 Redis 當做一個真實的數據庫使用的時候,內存使用將是一個很大的開銷
# maxmemory <bytes>
#  當內存達到最大值的時候 Redis 會選擇刪除哪些數據?有五種方式可供選擇
# volatile-lru ->  利用 LRU 算法移除設置過過期時間的 key (LRU: 最近使用  Least RecentlyUsed )
# allkeys-lru ->  利用 LRU 算法移除任何 key
# volatile-random ->  移除設置過過期時間的隨機 keyallkeys->random -> remove a randomkey, any key
# volatile-ttl ->  移除即將過期的 key(minor TTL)
# noeviction ->  不移除任何可以,只是返回一個寫錯誤
#  註意:對於上面的策略,如果沒有合適的 key 可以移除,當寫的時候 Redis 會返回一個錯誤
#  默認是 :  volatile-lru
# maxmemory-policy volatile-lru  
# LRU  和  minimal TTL 算法都不是精準的算法,但是相對精確的算法 ( 為了節省內存 ) ,
# 隨意你可以選擇樣本大小進行檢測。
# Redis 默認的灰選擇 3 個樣本進行檢測,你可以通過 maxmemory-samples 進行設置
# maxmemory-samples 3
############################## AOF################################  
# 默認情況下, redis 會在後臺異步的把數據庫鏡像備份到磁盤,但是該備份是非常耗時的,而且備份也不能很頻繁,
# 如果發生諸如拉閘限電、拔插頭等狀況,那麽將造成比較大範圍的數據丟失。
#  所以 redis 提供了另外一種更加高效的數據庫備份及災難恢復方式。
#  開啟 append only 模式之後, redis 會把所接收到的每一次寫操作請求都追加到 appendonly.aof 文件中,
#  當 redis 重新啟動時,會從該文件恢復出之前的狀態。
#  但是這樣會造成 appendonly.aof 文件過大,所以 redis 還支持了 BGREWRITEAOF 指令,對 appendonly.aof 進行重新整理。
#  你可以同時開啟 asynchronous dumps 和  AOFappendonly  no# AOF 文件名稱  ( 默認 : "appendonly.aof")
# appendfilename  appendonly.aof
# Redis 支持三種同步 AOF 文件的策略 :
# no:  不進行同步,系統去操作  . Faster.# always: always 表示每次有寫操作都進行同步 . Slow, Safest.
# everysec:  表示對寫操作進行累積,每秒同步一次 . 
Compromise.
#  默認是 "everysec" ,按照速度和安全折中這是最好的。
#  如果想讓 Redis 能更高效的運行,你也可以設置為 "no"     ,讓操作系統決定什麽時候去執行
#  或者相反想讓數據更安全你也可以設置為 "always"
#  如果不確定就用  "everysec".
# appendfsync always
appendfsync everysec
# appendfsync no
# AOF 策略設置為 always 或者 everysec 時,後臺處理進程 ( 後臺保存或者 AOF 日誌重寫 ) 會執行大量的 I/O 操作
#  在某些 Linux 配置中會阻止過長的 fsync() 請求。註意現在沒有任何修復,即使 fsync 在另外一個線程進行處理
#  為了減緩這個問題,可以設置下面這個參數 no-appendfsync-on-rewriteno-appendfsync-on-rewrite no
#  當 AOF 文件增長到一定大小的時候 Redis 能夠調用  BGREWRITEAOF  對日誌文件進行重寫
#  它是這樣工作的: Redis 會記住上次進行些日誌後文件的大小 ( 如果從開機以來還沒進行過重寫,
#  那日子大小在開機的時候確定 )
#  基礎大小會同現在的大小進行比較。如果現在的大小比基礎大小大制定的百分比,重寫功能將啟動
#  同時需要指定一個最小大小用於 AOF 重寫,這個用於阻止即使文件很小但是增長幅度很大也去重寫 AOF 文件的情況
#  設置  percentage 為 0 就關閉這個特性auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
######## # LUA SCRIPTING########## 
一個 Lua 腳本最長的執行時間為 5000 毫秒( 5 秒),如果為 0 或負數表示無限執行時間。
lua-time-limit 500
0################################LOW LOG################################# 
Redis Slow Log  記錄超過特定執行時間的命令。執行時間不包括 I/O     
計算比如連接客戶端,返回結果等,只是命令執行時間
#  可以通過兩個參數設置 slow log :一個是告訴 Redis 執行超過多少時間被記錄的參數 slowlog-log-slower-than( 微秒 ) 
#  另一個是 slow log 的長度。當一個新命令被記錄的時候最早的命令將被從隊列中移除
#  下面的時間以微秒為單位,因此 1000000 代表一秒。
#  註意指定一個負數將關閉慢日誌,而設置為 0 將強制每個命令都會記錄
slowlog-log-slower-than 10000
#  對日誌長度沒有限制,只是要註意它會消耗內存
#  可以通過  SLOWLOG RESET 回收被慢日誌消耗的內存
#  推薦使用默認值 128 ,當慢日誌超過 128 時,最先進入隊列的記錄會被踢出
slowlog-max-len 128

參考: http://noodle.blog.51cto.com/2925423/1731484

http://wgkgood.blog.51cto.com/

http://www.redis.cn/topics/replication.html


本文出自 “dianel簡單不簡單” 博客,請務必保留此出處http://dianel.blog.51cto.com/12170393/1962494

redis配置文件詳解及實現主從同步切換