redis 是一個用c語言編寫的高性能k/v存儲數據庫,支持持久存儲,是非關系型數據庫。redis默認使用TCP的6379端口監聽請求,單進程的模型。
配置文件
redis配置文件為/etc/redis.conf,下面我們挑出一些經常需要配置的參數來看看:
1.INCLUDES段
include :跟文件或者路徑,表示配置文件包含的子配置文件
2.NETWORK段,網絡相關設置
bind :跟ip地址,表示次服務通過哪個網卡監聽請求,寫0.0.0.0表示監聽本機所有地址,默認為127.0.0.1
protected-mode :保護模式,默認為yes,開啟后如果沒有設置requirepass項目和bind仍然是默認的127.0.0.1,就進入了保護模式,只能從本地進行連接
port :監聽的端口,默認為6379
tcp-backlog 511:后援隊列長度,此處默認為511,就是達到最大負載時,允許多少請求可以處于等待狀態
timeout 0:客戶端連接空閑的超時時長,就是客戶端多久沒有操作,服務端就會自動斷開,默認為0表示不斷開
tcp-keepalive 300:tcp的持久連接,用來實現復用的,三次握手建立連接后在多少時間之內可以一直使用這個連接。
3.SECURITY段,安全相關的配置
requirepass :設置密碼認證,默認注釋,設置密碼直接跟在后邊就行,不過這個密碼是明文的,所以要注意配置文件不能被不想關的人讀取
rename-command CONFIG "":用來給命令設置別名的,CONFIG命令可以直接設置各項參數,可以查看,所以為了安全可以將命令設置為別的名字
4.LIMITS段,設置限制
maxclients 10000:最大并發連接
maxmemory <bytes>:最大使用的內存空間,不限制就默認能用多少用多少
maxmemory-policy noeviction:內存空間滿時的處理策略,有以下幾種:
- volatile-lru:在擁有過期時間的鍵中,使用LRU方式淘汰
- allkeys-lru:全部鍵使用LRU方式淘汰
- volatile-random:擁有過期時間的鍵中隨機淘汰
- allkeys-random:全部鍵隨機淘汰
- volatile-ttl:按生命周期所剩時間進行淘汰
- noeviction:不淘汰,要將redis作為存儲時可以使用這一項,做緩存時別用這一項
maxmemory-samples 5:每一批選出幾個樣本,再去按照上面的策略進行淘汰,默認為5
此外,redis參數支持運行時修改,使用CONFIG命令可以在交互界面中修改參數:
1.CONFIG GET:后邊跟參數名,可以獲取參數當前的設置信息
2.CONFIG SET:后邊跟參數名=值,設定參數的值
3.REWRITE:將設定成功的參數同步到配置文件中,如果之前這個參數有值,會覆蓋之前的值
4.RESET STAT:重置計數器
redis持久機制
redis是一種內存型數據庫,而他支持的持久存儲是通過將數據備份到磁盤上的方式實現的,這個存儲方式有兩種:
1.RDB方式:就是snapshotting(快照)的方式,這種方式是redis的默認機制,特點是高效但數據容易丟失。在程序交互界面中使用兩個命令可以實現這個種機制
- SAVE命令:主進程往磁盤中寫入快照,此時redis服務由于主進程被占用,其他什么事都做不了了
- BGSAVE命令:開子進程在后臺執行寫入快照,主程序能繼續提供服務
下面是配置文件中對應這種方式的配置項,放在SNAPSHOTTING段中
save 900 1
save 300 10
save 60 10000:這三段的意思就是在多久的時間內,變化的鍵達到多少次就執行快照,第一個參數為時間,第二個參數為次數,用這三段即達到長時間變化少時快照,也能達到短時間內變化量很大時去快照的效果
stop-writes-on-bgsave-error yes:快照失敗時拒絕寫入,與其丟失數據,不如先拒絕提供服務的好,yes為開啟
rdbcompression yes:快照要不要壓縮,yes為壓縮,這個就看時磁盤空間開銷大還是cpu開銷大了,視情況而定
rdbchecksum yes:快照做完要不要校驗,這個還是有必要的
dbfilename dump.rdb:快照名字,默認為dump.rdb
dir /var/lib/redis:快照存放路徑,默認為/var/lib/redis
2.AOF方式:就是用追加的方式,類似于mysql的二進制日志方式,BGREWRITEAOF命令為執行AOF方式的備份,這個方式的機制為AOF文件重寫,他會直接讀取內存,將多次執行的命令轉換為一個簡單實現結果的命令,再去存入磁盤,比如讓一個數自增1000次,挺麻煩,而結果卻是一個簡單的數字,這時就將這個自增1000次的指令,重寫成直接生成這個數字的命令,在重放時會大大縮短執行時間。
下面為AOF的相關配置,在配置文件中的APPEND ONLY MODE段
appendonly no:AOF功能默認時關閉的,要使用時改為yes即可
appendfilename "appendonly.aof":快照名,存放的位置是在SNAPSHOTTING段中的dir定義的
appendfsync always|everysec|no:每次執行追加的時間,always表示有改變就去同步到磁盤,everysec表示每秒鐘保存一次,no表示內核決定什么時候保存
no-appendfsync-on-rewrite no:在rewrite時不同步,no為同步,yes為不同步,同步會增加寫入操作,因為rewrite完之后還得再次去同步,但是不同步萬一數據丟失了就不太好了,所以為了數據安全還是最好將這項目設定為no
auto-aof-rewrite-percentage 100:100表示百分之百,就是變化量達到元數據的百分之百時自動同步
auto-aof-rewrite-min-size 64mb:上面這個設定有個弊端就是當數據量很小時候變化量很容易達到100,所以同步的頻率會很高,但是沒有這個必要,所以這條加個限定就是當數據量小于64m時不去同步,兩個條件一起滿足才會去同步
redis的主從
redis也可以像mysql一樣實現主從,過程相對于Mysql來說更加簡單,步驟如下:
1.環境:
- 時間同步,關閉selinux和firewalld
- 主節點:172.16.200.108,使用centos7.3系統,redis-3.2.3
- 從節點1:172.16.200.109,其他同上
- 從節點2:172.16.200.120,同上
- 從節點3:172.16.200.107,同上
2.在主節點上設置認證
[root@localhost ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@localhost ~]# service redis start
[root@localhost ~]# redis-cli
127.0.0.1:6379> CONFIG SET requirepass "123"
127.0.0.1:6379> CONFIG REWRITE
3.在幾個從節點上添加主節點
[root@localhost ~]# vim /etc/redis.conf
bind 0.0.0.0
[root@localhost ~]# service redis start
[root@localhost ~]# redis-cli
127.0.0.1:6379> CONFIG SET masterauth 123
127.0.0.1:6379> CONFIG REWRITE
OK
4.驗證
在主節點上執行info replication命令,查看復制集群狀態
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:3
slave0:ip=172.16.200.107,port=6379,state=online,offset=365,lag=1
slave0:ip=172.16.200.120,port=6379,state=online,offset=365,lag=1
slave1:ip=172.16.200.109,port=6379,state=online,offset=365,lag=1
master_repl_offset:365
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:364
可以看到,此節點為主,三個從節點的信息都顯示的很清楚,證明配置成功了。
我們來看下配置文件中關于主從的配置,在REPLICATION段中
slave-serve-stale-data yes:表示當主節點宕機時,從節點的數據還能不能繼續提供服務
slave-read-only yes:從節點只讀
repl-diskless-sync no:是否做基于磁盤的同步,yes為無磁盤復制,內存中將數據構建好就直接可以同步給從了,不需要像保存到磁盤中
repl-diskless-sync-delay 5:延遲5秒湊夠一波數據后在發送給從
slave-priority 100:表示當前從節點的優先級,這個優先級用于主節點宕機時,對比別的從節點,誰的優先級高誰就成為主節點,優先級數字越小越高,0表示不能當主節點。
min-slaves-to-write 3:至少有三個從節點在線才允許主節點寫入
min-slaves-max-lag 10:落后10秒的從節點不算做一個在線的從節點,對應上面這條配置,這兩條默認是注釋的,所以不必在意從節點會少于3個
slave-announce-ip 5.5.5.5和slave-announce-port 1234:表示集群中向別的節點發送數據時候使用的ip和端口,這兩條默認是注釋的,所以系統自動選擇使用哪個ip和端口。
redis高可用
redis主節點高可用服務有自帶的,叫做redis-sentinel,他的配置文件為/etc/redis-sentinel.conf ,這個配置文件會根據集群的環境自動修改,不過一些參數還是要配置的。當主節點宕機時,會自動我們需要在每個節點上配置好,然后啟用redis-sentinel服務。
步驟
1.環境,還是剛才的主從環境
2.在每個節點上配置/etc/redis-sentinel.conf,大致需要配置的選項都寫在了下邊:
- bind 0.0.0.0 :這個默認沒有,但是不寫的話會自動啟用安全機制,限制互相之間的通信,所以將他寫在prot選項下面就行,這里就奔放的寫0.0.0.0了
- sentinel monitor mymaster 172.16.200.108 6379 2 :設置監控的集群名字叫mymaster,然后主節點的ip和端口,2表示有幾個從節點同意一個從節點可以成為主節點,這個節點才能成功成為主節點。
- sentinel auth-pass mymaster 123 :設置監控集群的密碼
- sentinel down-after-milliseconds mymaster 50 :主觀down,就是這個節點多久沒有收到一個另一個節點的消息,就認為他宕了
- sentinel parallel-syncs mymaster 1:并行同步的從節點個數,設置高了
- sentinel failover-timeout mymaster 180000:故障轉移多少時間沒成功,就去開始下一輪轉移
- sentinel notification-script <master-name> <script-path>:通知腳本設置,當有節點宕掉時,通過什么方式通知管理員,可以時郵件短信等方式,這里就不設置了
- logfile /var/log/redis/sentinel.log:日志位置
3.每個節點都啟動redis-sentinel
[root@localhost ~]# service redis-sentinel start
[root@localhost ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:26379 *:*
LISTEN 0 128 127.0.0.1:6379 *:*
此時,我們看到redis的6379端口和sentinel的26379端口都已經啟動了。
4.驗證
我們可以使用redis-cli -h 26379 去連上sentinel管理端口去查看當前的信息,有如下幾個命令:
SENTINEL masters:查看當前主節點信息
SENTINEL slaves <MASTER_NAME>:查看當前集群名稱中從節點的信息
SENTINEL failover <MASTER_NAME>:手動切換集群的主節點
SENTINEL get-master-addr-by-name <MASTER_NAME>:
所以我們從主節點登陸上去驗證以下:
[root@localhost etc]# redis-cli -p 26379
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.200.108"
5) "port"
6) "6379"
...
從顯示信息可以看出來,現在只有一個集群(因為只有一個1))當前的主節點為172.16.200.108,集群名字叫做mymaster,還有很多信息這里就不顯示了
查看從節點信息:
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "172.16.200.120:6379"
3) "ip"
4) "172.16.200.120"
...
2) 1) "name"
2) "172.16.200.109:6379"
3) "ip"
4) "172.16.200.109"
可以看到當前從節點有三個,各自的信息都列了出來
我們還可以手動切換主節點
127.0.0.1:26379> sentinel failover mymaster
OK
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.200.109"
5) "port"
6) "6379"
...
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "172.16.200.108:6379"
3) "ip"
4) "172.16.200.108"
切換完成后我們看到當前的主節點變成172.16.200.109了,而之前的主節點變為從節點了。
5.模擬故障
當前的主節點為172.16.200.109,我們將之上的redis服務手動關閉,然后查看高可用系統的處理情況:
在172.16.200.109上,關閉redis
[root@localhost ~]# service redis stop
然后查看當前集群主節點
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "172.16.200.107"
我們看到主節點已經變成200.107了,再次重啟手動宕掉的節點,查看從節點
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "172.16.200.109:6379"
3) "ip"
4) "172.16.200.109"
5) "port"
6) "6379"
7) "runid"
...
看到之前宕機的109節點上線后變為從節點繼續運行了,工作一切正常,實驗成功!@=