1. 程式人生 > >linux運維、架構之路-redis

linux運維、架構之路-redis

redhat creat not run core dom 重置 info command strong

一、redis介紹

Redis是一個開源,高級的鍵值存儲和一個適用的解決方案,用於構建高性能,可擴展的Web應用程序。

Redis屬於非關系型數據庫和Memcached類似,redis也是一個key-value型存儲系統。但redis支持的存儲value類型相對更多,包括string(字符串)、list(列表)、set(集合)和zset(有序集合)等。這些數據類型都支持push/pop、add/remove及取交集、並集和差集及更豐富的操作,而且這些操作都是原子性的。為了保證效率,redis的數據都是緩存在內存中。區別是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在基礎上實現了master-slave(主從)同步。

Redis官方網網站是:http://www.redis.io/

Redis中文資料網站:https://redis.io/topics/problems

1、redis特點:

①、支持內存緩存,這個功能相當於memcached
②、支持持久化存儲,這個功能相當於memcachedb,ttserver
③、數據庫類型更豐富。比其他key-value庫功能更強
④、支持主從集群、分布式
⑤、支持隊列等特殊功能

2、Redis和Memecache的不同

①、存儲方式:
memecache 把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小, Redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化(筆者註:有RDB快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別註意配置文件快照參數,要不就很有可能服務器頻繁滿載做dump)


②、數據支持類型:
redis在數據支持上要比memecache多的多。
③、使用底層模型不同
新版本的redis直接自己構建了VM 機制,因為一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。
④、運行環境不同
redis目前官方只支持Linux 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統環境上的優化

3、Redis支持的鍵值類型

String 字符串
Hash 哈希
List 列表
Set 集合
Zset 有序集合

二、部署安裝redis

1、環境

[root@redis ~]# cat /etc/redhat-release 
CentOS release 
6.9 (Final) [root@redis ~]# uname -r 2.6.32-696.el6.x86_64 [root@redis ~]# /etc/init.d/iptables status iptables: Firewall is not running. [root@redis ~]# getenforce Disabled

2、安裝

mkdir /server/tools -p
cd /server/tools/
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
tar xf redis-3.2.8.tar.gz 
cd redis-3.2.8
make
make PREFIX=/usr/local/redis–3.2.8  install
ln -s /usr/local/redis–3.2.8 /usr/local/redis
echo "export PATH=/usr/local/redis/bin:$PATH" >>/etc/profile
source  /etc/profile

3、安裝目錄文件介紹

[root@redis ~]# tree /usr/local/redis/bin/
/usr/local/redis/bin/
├── redis-benchmark           #redis性能讀寫測試工具
├── redis-check-aof           #對更新日誌appenonly.aof檢查,類似於mysql binlog
├── redis-check-rdb           #用於本地數據庫rdb文件的檢查
├── redis-cli                 #redis命令行客戶端操作工具
├── redis-sentinel -> redis-server
└── redis-server              #redis服務器daemon啟動程序

4、創建redis配置文件目錄

啟動redis

mkdir /usr/local/redis/conf/ -p                                    #創建配置文件目錄
cp -a /server/tools/redis-3.2.8/redis.conf /usr/local/redis/conf/  #拷貝配置文件
redis-server /usr/local/redis/conf/redis.conf &                    #啟動redis

啟動成功如下:

[root@redis ~]# 4876:C 15 May 14:16:39.704 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ‘‘-._                                             
      _.-``    `.  `_.  ‘‘-._           Redis 3.2.8 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ‘‘-._                                   
 (          ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|` _.-|     Port: 6379
 |    `-._   `._    /     _.-    |     PID: 4876
  `-._    `-._  `-./  _.-    _.-                                   
 |`-._`-._    `-.__.-    _.-_.-|                                  
 |    `-._`-._        _.-_.-    |           http://redis.io        
  `-._    `-._`-.__.-_.-    _.-                                   
 |`-._`-._    `-.__.-    _.-_.-|                                  
 |    `-._`-._        _.-_.-    |                                  
  `-._    `-._`-.__.-_.-    _.-                                   
      `-._    `-.__.-    _.-                                       
          `-._        _.-                                           
              `-.__.-                                               

4876:M 15 May 14:16:39.708 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4876:M 15 May 14:16:39.708 # Server started, Redis version 3.2.8
4876:M 15 May 14:16:39.708 # 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.
4876:M 15 May 14:16:39.708 # 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.
4876:M 15 May 14:16:39.708 * The server is now ready to accept connections on port 6379

關閉redis

①使用redis自帶腳本:redis-cli shutdown
②ps –ef|grep redis 進行kill殺掉進程

5、redis配置文件詳解

daemonize yes                              #是否以後臺進程運行
pidfile /var/run/redis/redis-server.pid    #pid文件位置
port 6379                                  #監聽端口
bind 127.0.0.1                             #綁定地址,如外網需要連接,設置0.0.0.0 空格分隔
timeout 300                                #連接超時時間,單位秒
loglevel notice                            #日誌級別,分別有:
        # debug :適用於開發和測試
        # verbose :更詳細信息
        # notice :適用於生產環境
        # warning :只記錄警告或錯誤信息
logfile /var/log/redis/redis-server.log     #日誌文件位置
syslog-enabled no                           #是否將日誌輸出到系統日誌
databases 16                                #設置數據庫數量,默認數據庫為0
############### 快照方式 ###############
    save 900 1                              #在900s(15m)之後,至少有1個key發生變化,則快照
    save 300 10                             #在300s(5m)之後,至少有10個key發生變化,則快照
    save 60 10000                           #在60s(1m)之後,至少有1000個key發生變化,則快照
    rdbcompression yes                      #dump時是否壓縮數據
    dir /var/lib/redis                      #數據庫(dump.rdb)文件存放目錄
############### 主從復制 ###############
    slaveof <masterip> <masterport>         #主從復制使用,用於本機redis作為slave去連接主redis
    masterauth <master-password>            #當master設置密碼認證,slave用此選項指定master認證密碼
    slave-serve-stale-data yes              #當slave與master之間的連接斷開或slave正在與master進行數據同步時,如果有slave請求,當設置為yes時,slave仍然響應請求,此時可能有問題,如果設置no時,slave會返回"SYNC with master in progress"錯誤信息。但INFO和SLAVEOF命令除外。
############### 安全 ###############
    requirepass foobared                    #配置redis連接認證密碼
############### 限制 ###############
    maxclients 128                          #設置最大連接數,0為不限制
    maxmemory <bytes>                       #內存清理策略,如果達到此值,將采取以下動作:
        # volatile-lru      默認策略,只對設置過期時間的key進行LRU算法刪除
        # allkeys-lru       刪除不經常使用的key
        # volatile-random   隨機刪除即將過期的key
        # allkeys-random    隨機刪除一個key
        # volatile-ttl      刪除即將過期的key
        # noeviction        不過期,寫操作返回報錯
    maxmemory-policy volatile-lru          #如果達到maxmemory值,采用此策略
    maxmemory-samples 3                    #默認隨機選擇3個key,從中淘汰最不經常用的
############### 附加模式 ###############
    appendonly no                          #AOF持久化,是否記錄更新操作日誌,默認redis是異步(快照)把數據寫入本地磁盤
    appendfilename appendonly.aof          #指定更新日誌文件名
        # AOF持久化三種同步策略:
        # appendfsync always               #每次有數據發生變化時都會寫入appendonly.aof
        # appendfsync everysec             #默認方式,每秒同步一次到appendonly.aof
        # appendfsync no                   #不同步,數據不會持久化
    no-appendfsync-on-rewrite no           #當AOF日誌文件即將增長到指定百分比時,redis通過調用BGREWRITEAOF是否自動重寫AOF日誌文件。
############### 虛擬內存 ###############
    vm-enabled no                          #是否啟用虛擬內存機制,虛擬內存機將數據分頁存放,把很少訪問的頁放到swap上,內存占用多,最好關閉虛擬內存
    vm-swap-file /var/lib/redis/redis.swap#虛擬內存文件位置
    vm-max-memory 0                       #redis使用的最大內存上限,保護redis不會因過多使用物理內存影響性能
    vm-page-size 32                       #每個頁面的大小為32字節
    vm-pages 134217728                    #設置swap文件中頁面數量
    vm-max-threads 4                      #訪問swap文件的線程數
############### 高級配置 ###############
    hash-max-zipmap-entries 512           #哈希表中元素(條目)總個數不超過設定數量時,采用線性緊湊格式存儲來節省空間
    hash-max-zipmap-value 64              #哈希表中每個value的長度不超過多少字節時,采用線性緊湊格式存儲來節省空間
    list-max-ziplist-entries 512          #list數據類型多少節點以下會采用去指針的緊湊存儲格式
    list-max-ziplist-value 64             #list數據類型節點值大小小於多少字節會采用緊湊存儲格式
    set-max-intset-entries 512            #set數據類型內部數據如果全部是數值型,且包含多少節點以下會采用緊湊格式存儲
    activerehashing yes                   #是否激活重置哈希

三、redis主從搭建

1、Master節點

cp -a /server/tools/redis-3.2.8/redis.conf /usr/local/redis/conf/6379.conf
修改配置文件如下:
daemonize no 
修改為:
daemonize yes  #後臺程序方式運行

啟動Master:

redis-server /usr/local/redis/conf/6379.conf
[root@redis ~]# ps aux|grep redis
root       5005  0.0  0.9 135592  9720 ?        Ssl  14:44   0:04 redis-server 127.0.0.1:6379

2、配置slave節點

cp -a /server/tools/redis-3.2.8/redis.conf /usr/local/redis/conf/6380.conf
修改配置文件如下:
daemonize no 修改為:daemonize yes
port 6379
修改為:
port 6380
增加一行:
slaveof 127.0.0.1 6379

啟動Slave

redis-server /usr/local/redis/conf/6380.conf
[root@redis ~]# ps aux|grep redis
root       5014  0.0  0.7 133544  7656 ?        Ssl  14:47   0:04 redis-server 127.0.0.1:6380 

3、查看redis主從同步信息

啟動redis客戶端連接6379和6380兩個實例

[root@redis ~]# redis-cli  -h 127.0.0.1 -p 6379
127.0.0.1:6379> 
[root@redis ~]# redis-cli  -h 127.0.0.1 -p 6380
127.0.0.1:6380>

①主節點輸入info

[root@redis ~]# redis-cli  -h 127.0.0.1 -p 6379
127.0.0.1:6379> info

技術分享圖片

②從節點輸入info

技術分享圖片

4、測試

主節點:

127.0.0.1:6379> set name lulu
OK
127.0.0.1:6379> get name
"lulu"

從節點:

127.0.0.1:6380> get name
"lulu"

###至此兩個實例實現了數據同步###

linux運維、架構之路-redis