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