企業實戰LNMP+redis高效能伺服器

shuchaoyang發表於2020-12-19

企業實戰LNMP+redis高效能伺服器

1. Redis入門簡介

Redis是一個開源的使用ANSIC語言編寫、支援網路、可 基於記憶體亦可持久化的日誌型 、Key-Value資料庫,並提供多種語言的API。

Redis是一個key-value儲存系統。 和Memcached快取類似,Redis支援儲存的value型別相對更多,包括 string(字串) list(連結串列) set(集合) hash(雜湊型別) 。並且支援在伺服器端計算集合的並,交和補集(difference)等,還支援多種排序功能。Redis也被看成是一個資料結構伺服器。

Redis支援主從同步 ,資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其它從伺服器的主伺服器。

2. 安裝redis

2.1 yum安裝

[root@node01 src]# yum install redis -y

2.2 原始碼編譯安裝


# 下載解壓

[root@node01 src] # cd /usr/src
[root@node01 src] # wget
[root@node01 src] # tar xf redis-stable.tar.gz
[root@node01 src] # cd redis-stable

# 編譯安裝redis
[root@node01 redis-stable] # make PREFIX=/usr/local/redis install
[root@node01 redis-stable] # cp redis.conf /usr/local/redis/6379.conf

# 到這一步,redis已經安裝好了
# 在前端執行redis:
[root@node01 redis-stable] # /usr/local/redis/bin/redis-server  /usr/local/redis/6379.conf
# 後臺執行redis:
[root@node01 redis-stable] # nohup  /usr/local/redis/bin/redis-server  /usr/local/redis/6379.conf  &

#關閉redis服務:
[root@node01 redis-stable] # /usr/local/redis/bin/redis-cli -p 6379 shutdown

# 啟動之後,redis日誌可能會出現一些警告資訊:
1629:M 21 June 01:50:41.918 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1629:M 21 Nov 01:50:41.918 # Server started, Redis version 3.2.12

1629:M 21 June 01:50:41.918 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add
'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

1629:M 21 June 01:50:41.918 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command
'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

#第一個報錯是backlog引數導致的,backlog主要控制的是三次握手的時候,server端收到客戶端ack確認號的佇列長度,如果佇列滿了,客戶端將收到錯誤提示。
[root@node01 redis-stable] # vim /etc/sysctl.conf
net.core .somaxconn = 512

#第二個報錯是因為vm.overcommit_memory=0,0表示核心會檢查有沒有多的記憶體給程式使用,
如果沒有,記憶體的申請失敗,並將錯誤返回給程式。可以設定為1,表示核心允許分配所有的實體記憶體給程式。
還有2,表示所有的實體記憶體和swap全部給程式。
[root@node01 redis-stable] # vim /etc/sysctl.conf
vm .overcommit_memory = 1

#第三個報錯是開啟了大頁記憶體動態分配,設定關閉,讓redis負責記憶體管理
[root@node01 redis-stable] # echo never > /sys/kernel/mm/transparent_hugepage/enabled

# 然後執行一下命令,重啟redis就不會提示警告資訊了:
[root@node01 redis-stable] # sysctl -p

# 這樣啟動有點麻煩,也可以配置指令碼啟動:
[root@node01 redis-stable] # /usr/src/redis-stable/utils/install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

#配置redis的埠,可以預設為6379,直接回車
Please select the redis port for this instance: [6379]
Selecting default: 6379
#配置redis的配置檔案,放到redis的安裝目錄,加上檔名:
Please select the redis config file name [/etc/redis/6379.conf] /usr/local/redis/6379.conf
#配置redis的日誌,放到redis的安裝目錄,加上檔名:
Please select the redis log file name [/var/log/redis_6379.log] /usr/local/redis/redis_6379.log
#配置redis的資料目錄,也放在安裝目錄,加上埠號區分:
Please select the data directory for this instance [/var/lib/redis/6379] /usr/local/redis/6379
#選擇redis的啟動程式,加上檔名
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port           : 6379
Config file    : /usr/local/redis/6379.conf
Log file       : /usr/local/redis/redis_6379.log
Data dir       : /usr/local/redis/6379
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@node01 redis-stable] #

3. lnmp整合redis

已經部署好lnmp,併發布了一套入口網站。

3.1 安裝php-redis連線驅動

現在redis安裝好了,但是還是沒法快取資料,因為php還沒有於redis建立聯絡:

3.1.1 原始碼方式安裝php,整合redis
下載php的redis模組

[root@node01 redis-stable] # cd /usr/src
[root@node01 src] # wget
[root@node01 src] # tar xf 4.2.0.tar.gz
[root@node01 src] # cd phpredis-4.2.0/
[root@node01 src] # /usr/local/php/bin/phpize
[root@node01 src] # ./configure  --with-php-config=/usr/local/php/bin/php-config  --enable-redis
[root@node01 src] # make && make install

#編輯php.ini配置檔案,新增redis模組
[root@node01 src] # vi /usr/local/php/etc/php.ini
exteedis.so
3.1.2 yum方式安裝php,整合redis
安裝php7.0

[root@node01 src]# yum install -y
[root@node01 src]# yum install yum-utils -y
[root@node01 src]# yum-config-manager --enable remi-php70
[root@node01 src]# yum install php php-fpm php-mysql php-redis -y

3.2 測試redis模組是否新增成功

[root@node01 src]# vim /usr/share/nginx/html/wordpress/info.php


<?php
       phpinfo();
?>

訪問,可看到redis模組即可:

3.3 安裝redis外掛

在wordpress後臺,安裝Redis Object Cache外掛,並且啟用,看到如果已連線,表示成功

3.4 檢視快取資訊

也可以在shell中透過客戶端工具連線redis服務端,檢視快取資訊:

[root@node01 src]# /usr/local/redis/bin/redis-cli

127.0.0.1:6379> keys *
1) "wp:site-transient:update_core"
2) "wp:site-transient:update_themes"
3) "wp:options:can_compress_scripts"
4) "wp:site-transient:update_plugins"
5) "wp:userslugs:superman"
6) "wp:user_meta:1"
7) "wp:transient:plugin_slugs"
8) "wp:default:is_blog_installed"
9) "wp:site-transient:theme_roots"
10) "wp:useremail:40671852@qq.com"
11) "wp:options:alloptions"
12) "wp:userlogins:superman"
13) "wp:site-transient:available_translations"
14) "wp:options:notoptions"
15) "wp:users:1"
127.0.0.1:6379>

3.5 配置遠端redis伺服器

如果redis是在遠端伺服器上,則需要修改redis伺服器所在的ip地址

[root@node01 src]# vim /usr/share/nginx/html/wordpress/wp-content/object-cache.php


$parameters = array(
           'scheme' => 'tcp',
           'host' => '192.168.1.182',
           'port' => 6379,
           'timeout' => 5,
           'read_timeout' => 5,
           'retry_interval' => null
       );
       
# 如果配置虛擬主機,還有一個discuz網站也需要快取,
如果不加以配置,兩個站點資料都會快取在一個資料庫中,
不太便於管理,可以讓不同應用選擇不同的資料庫進行快取。

# 修改discuz的網站配置檔案,指定資料庫:
[root@node01 src]# vim /usr/local/nginx/html/upload/config/config_global.php

$_config['memory']['redis']['serializer'] = 1;
$_config['memory']['redis']['db'] = 2;


# 進一步修改discuz的配置檔案:
[root@node01 src]# vim /usr/share/nginx/html/upload/source/class/memory/memory_driver_redis.php

@$this->obj->setOption(Redis::OPT_SERIALIZER, $config['serializer']);
                               $this->select($config['db']);

3.6 正式解讀redis配置檔案


# 監聽地址,預設是監聽本地迴環地址,可以修改為0.0.0.0,表示監聽所有ip地址,如果要監聽多個,用空格隔開。

bind 127.0.0.1

# 開啟保護模式,如果沒有配置bind,而是直接註釋了bind,那麼遠端伺服器是不能直接檢視鍵值資料的,可以設定為no(不建議),或者設定bind監聽埠,不要直接註釋;再或者設定密碼requirepass 123456
protected-mode yes

# 監聽埠,可以修改
port 6379

# ack佇列長度
tcp-backlog 511

# 客戶端與服務端的連線超時時間,0表示永不超時
timeout 0
會話探測時間,redis服務端預設每隔300s發ack包給客戶端,探測客戶端是否還在,還在就保持連線
tcp-keepalive 300

# 預設情況下redis是在前臺執行,可以設定為yes,讓redis以守護程式在後臺執行。
daemonize no
supervised no
pidfile /var/run/redis_6379.pid

# 日誌級別,有debug,verbose,notice,warning
loglevel notice

# 日誌路徑
logfile /usr/local/redis/6379.log

# 是否把日誌輸出到系統日誌,預設為no
syslog-enabled no

# 設定資料庫個數,從0號資料庫開始,預設為17個
databases 16

# 在啟動時是否顯示日誌
always-show-logo yes

# 在900秒內修改一個鍵觸發快照
save 900 1

# 在300秒修改10個鍵觸發快照
save 300 10

# 在60秒修改10000個鍵觸發快照
save 60 10000

# 在快照出現問題時,禁止redis寫入操作
stop-writes-on-bgsave-error yes

# 進行持久化時,是否壓縮,預設為壓縮
rdbcompression yes

# 在儲存或者載入rdb資料庫時是否開啟校驗
rdbchecksum yes

# rdb檔名,可以修改
dbfilename dump.rdb

# 資料庫檔案存放路徑
dir /usr/local/redis/6379

4. redis備份概念

Redis所有資料都是儲存在記憶體中,Redis資料備份可以定期的透過非同步方式儲存到磁碟上,該方式稱為半持久化模式,如果每一次資料變化都寫入aof檔案裡面,則稱為全持久化模式。同時還可以基於Redis主從複製實現Redis備份與恢復。

5. redis備份模式

  • 半持久化rdb模式

  • 全持久化aof模式

  • redis主從複製

5.1 半持久化rdb模式

半持久化 rdb模式是Redis備份預設方式 ,是透過快照(snapshotting)完成的,當符合在redis.conf配置檔案中設定的條件時Redis會自動將記憶體中的所有資料進行快照並儲存在硬碟上,完成資料備份。

Redis啟動後會讀取rdb快照檔案,將資料從硬碟載入到記憶體 ,根據資料量大小與結構和伺服器效能不同,通常將一個記錄一千萬個字串型別鍵、大小為1GB的快照檔案載入到記憶體中需花費20~30秒鐘。

5.1.1 rdb持久化實現過程

Redis實現快照的過程,Redis使用fork函式複製(寫時複製)一份當前程式(父程式)的副本(子程式),父程式繼續接收並處理客戶端發來的命令,而子程式開始將記憶體中的資料寫入硬碟中的臨時檔案,當子程式 寫入完所有資料 後會用該臨時檔案替換舊的rdb檔案,至此一次快照操作完成。

5.1.2 開啟rdb持久化

Redis進行rdb快照的條件由使用者在配置檔案中自定義,由兩個引數構成: 時間和改動的鍵的個數

當在指定的時間內被更改的鍵的個數大於指定的數值時就會進行快照。在配置檔案中已經預置了3個條件:

save   900  1        #900秒內有至少1個鍵被更改則進行快照;

save   300  10       #300秒內有至少10個鍵被更改則進行快照;
save   60   10000     #60秒內有至少10000個鍵被更改則進行快照

      預設可以存在多個條件,條件之間是“或”的關係,只要滿足其中一個條件,就會進行快照。

5.1.3 禁用rdb持久化

如果想要==禁用==自動快照,只需要將所有的save引數刪除(註釋)即可

5.1.4 rdb資料檔案路徑

Redis預設會將快照檔案儲存在Redis資料目錄,預設檔名為:dump.rdb檔案,可以透過配置dir和dbfilename兩個引數分別指定快照檔案的儲存路徑和檔名。也可以在Redis命令列執行 config get dir 獲取Redis資料儲存路徑。

rdb檔案是經過壓縮(可以配置rdbcompression引數以禁用壓縮節省CPU佔用)的二進位制格式,所以佔用的空間會小於記憶體中的資料大小,更加利於傳輸。

除了自動快照,還可以 手動傳送SAVE和BGSAVE命令讓Redis執行快照 ,兩個命令的區別在於:

  • save是由主程式進行快照操作,會阻塞住其他請求。

  • bgsave是透過fork子程式進行快照操作。

5.1.5 rdb持久化常用引數
save 
900 
1  
900秒內有1個鍵發生變化開始快照

save 300 10   300秒內有10個鍵發生變化開始快照
save 60 10000 60秒內有10000個鍵發生變化開始快照
# 快速理解,可以從下往上去看,即使只有一個鍵發生變化,最後也會執行900秒的規則。

#後臺儲存發生故障時,客戶端停止寫入
stop-writes-on-bgsave-error yes

#在儲存過程中,啟動壓縮
rdbcompression yes

#啟動redis時,是否檢查rdb資料庫的完整性
rdbchecksum yes

#rdb資料庫的名字,可自定義
dbfilename dump.rdb

#rdb資料庫存放路徑,可以自定義
dir /var/lib/redis

5.2 全持久化AOF模式

如果資料很重要無法承受任何損失,可以考慮使用AOF方式進行持久化,預設Redis沒有開啟AOF(append only file)方式的全持久化模式。

5.2.1 aof持久化實現過程

開啟AOF持久化後每執行一條會更改Redis中的資料的命令,Redis就會將該命令寫入硬碟中的AOF檔案。

在啟動時Redis會逐個執行AOF檔案中的命令來將硬碟中的資料載入到記憶體中,載入的速度相較RDB會慢一些。

5.2.2 開啟aof持久化

Redis預設是沒有開啟全持久化的,需要在配置檔案修改引數實現

#開啟aof持久化,預設為禁止no

appendonly yes
5.2.3 aof資料檔案路徑

AOF檔案的儲存位置和RDB檔案的位置相同,都是透過dir引數設定的,預設的檔名是appendonly.aof,可以透過appendfilename引數修改該名稱。

Redis允許同時開啟AOF和RDB,既保證了資料安全又使得進行備份等操作十分容易

5.2.4 aof持久化常用引數

#開啟aof持久化,預設為禁止no

appendonly yes

#指定aof檔名,可自定義
appendfilename "appendonly.aof"

#每執行一條命令即寫入磁碟
#appendfsync always

#每秒同步記憶體資料到磁碟
appendfsync everysec

#設定為no,讓寫入動作交由作業系統完成,同步的頻率會相對比較低,不建議
# appendfsync no

#在rdb寫磁碟過程中,是否需要停止aof,預設是不停,如果負載較高,建議停止。
# 這個時候資料也不會丟失,在暫時存在記憶體佇列,rdb資料寫完後,aof繼續。
no-appendfsync-on-rewrite no

#aof檔案大小相比上次檔案大小,增長100%時,重寫
auto-aof-rewrite-percentage 100

#aof檔案至少超過64M時,重寫
auto-aof-rewrite-min-size 64mb

# redis在恢復時,會忽略最後一條可能存在問題的指令(因為斷電等原因導致的一些錯誤指令)
aof-load-truncated yes

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/291614/viewspace-2743728/,如需轉載,請註明出處,否則將追究法律責任。

相關文章