redis哨兵部署


redis介紹

Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件
redis是c語言編寫的,支持數據持久化,是key-value類型數據庫。
應用在緩存,隊列系統中
redis支持數據備份,也就是master-slave模式

redis一秒可以執行10萬個命令

redis為什么這么快?

1.是完全基於內存數據庫

2.redis是完全用c寫的單線程的數據庫

redis如何安裝

1.yum安裝

安裝:yum install redis -y

卸載:yum remove redis -y

啟動:systemctl start redis

查看監聽端口:netstat -tunlp

2.redis編譯安裝(注意刪除安裝的redis)

編譯安裝三部曲

1.下載redis源碼
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
2.解壓縮tar -zxvf redis-4.0.10.tar.gz
3.切換redis源碼目錄cd redis-4.0.10
4.編譯源文件make
5.編譯好后,src/目錄下有編譯好的redis指令
6.make install 安裝到指定目錄,默認在/usr/local/bin

添加環境變量:vim /etc/profile

path= “/usr/local/bin”

重新加載變量文件:source /etc/profile

grep -v "^$" redis.conf |grep -v "^#" 去注釋#

4.更改redis的配置文件,啟動redis,支持密碼和端口

touch redis.s18.conf 內容如下:

bind 192.168.91.128 # 連接ip protected-mode yes # 開啟redis安全模式 port 6800 # 端口 daemonize yes #redis后台啟動 pidfile /var/run/redis_6379.pid loglevel notice logfile "" requirepass 123456 #密碼

啟動:redis-server redis.s18.conf

檢測端口:netstat -tunlp

5.登陸redis客戶端

redis-cli -h 192.168.91.128 -p 6800

參數解釋 -h指定主機地址 -p指定redis端口

登陸之后通過auth指令 驗證密碼

 

redis可執行文件

./redis-benchmark //用於進行redis性能測試的工具
./redis-check-dump //用於修復出問題的dump.rdb文件
./redis-cli //redis的客戶端
./redis-server //redis的服務端
./redis-check-aof //用於修復出問題的AOF文件
./redis-sentinel //用於集群管理

redis數據類型

redis是一種高級的key:value存儲系統,其中value支持五種數據類型
字符串(strings)
散列(hashes)
列表(lists)
集合(sets)
有序集合(sorted sets)

redis存放的數據是key,然后通過value來取值

keys *         查看所有key
type key     查看key類型
expire key seconds   設置過期時間
ttl key     查看key過期剩余時間       -2表示key已經不存在了
persist key 取消key的過期時間   -1表示key存在,沒有過期時間

exists key     判斷key存在   存在返回1   否則0
del keys     刪除key   可以刪除多個
dbsize         計算key的數量

set key名 value名

set kevins 凱文

ger kevins 取值

1.strings類型

  • set  設置key

  • get 獲取key

  • append key 追加string

  • mset 設置多個鍵值對

  • mget 獲取多個鍵值對

  • del 刪除key

  • incr key 遞增+1

  • decr key 遞減-1

 

redis發布訂閱

發布訂閱的命令

PUBLISH channel msg
  將信息 message 發送到指定的頻道 channel
SUBSCRIBE channel [channel ...]
  訂閱頻道,可以同時訂閱多個頻道
UNSUBSCRIBE [channel ...]
  取消訂閱指定的頻道, 如果不指定頻道,則會取消訂閱所有頻道
PSUBSCRIBE pattern [pattern ...]
  訂閱一個或多個符合給定模式的頻道,每個模式以 * 作為匹配符,比如 it* 匹配所   有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有   以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
  退訂指定的規則, 如果沒有參數則會退訂所有規則
PUBSUB subcommand [argument [argument ...]]
  查看訂閱與發布系統狀態
注意:使用發布訂閱模式實現的消息隊列,當有客戶端訂閱channel后只能收到后續發布到該頻道的消息,之前發送的不會緩存,必須Provider和Consumer同時在線。

 

redis持久化RDB與AOF**

1.當進程掛掉,只要內存數據被釋放,redis的 數據默認是會丟

2.redis支持數據持久化,兩種模式

rdb持久化,是基於內存數據快照的方式,通過save指令,強制快照到數據本地,存儲為一個二進制文件

3.開啟rdb功能,需要修改redis.conf文件

內容如下:

daemonize yes

port 6379

logfile /data/6379/redis.log

dir /data/6379

dbfilename dbmp.rdb

bind 127.0.0.1

save 900 1

save 300 10

save 30 10000

4.開啟redis服務端,支持rdb功能

redis-server redis-rdb.conf

5.登陸redis,寫入數據,手動執行save觸發持久化,會生成一個二進制的數據文件 dbmp.rdb,在/data/6379/redis.log目錄下

redis持久化之RDB實踐

1.將修改類的redis命令,記錄到一個日志中,以保證數據不丟,下次重啟,再執行這個文件,數據就回來

2.開啟rdb模式,修改redis-aof.conf配置如下:

daemonize yes
port 6379
logfile /data/6379/redis.log
dir /data/6379
appendonly yes
appendfsync everysec

3.指定aof配置文件啟動

redis-server redis-aof.conf

 

redis 持久化方式有哪些?有什么區別?

rdb:基於快照的持久化,速度更快,一般用作備份,主從復制也是依賴於rdb持久化功能

aof:以追加的方式記錄redis操作日志的文件。可以最大程度的保證redis數據安全,類似於mysql的binlog

 

redis在不重啟的狀態下,切換rdb持久化到aof持久化

1.准備一個支持rdb數據

配置文件redis-new-rdb.conf如下:

daemonize yes

port 6379

logfile /data/6379/redis.log

dir /data/6379

dbfilename dbmp.rdb

bind 127.0.0.1

save 900 1

save 300 10

save 30 10000庫

 

2.通過命令切換到aof功能,臨時生效

CONFIG set appendonly yes   #開啟AOF功能
CONFIG SET save "" #關閉RDB功能

3.還得修改redis的配置文件,讓他下次重啟也是aof模式

修改redis-new-rdb.conf 配置如下:

daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 appendonly yes appendfsync everysec

4.redis已經切換到aof模式

 

redis主從同步

1.redis是支持多實例的數據庫 ,在一台機器上,可以運行多個隔離的數據庫環境

實現多實例就是准備多個配置文件

替換:sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf

准備3個配置文件,實現,一主兩從的redis數據架構

准備的3個配置文件,僅僅是端口的區分就行

port 6379 daemonize yes pidfile /data/6379/redis.pid loglevel notice logfile "/data/6379/redis.log" dbfilename dump.rdb dir /data/6379 protected-mode no


port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 protected-mode no

slaveof 127.0.0.1 6379


port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 protected-mode no

slaveof 127.0.0.1 6379


追加命令:echo "slaveof 127.0.0.1 6379" >> redis-6381.conf

三個同樣的文件

建立文件夾:mkdir -p /data/{6379,6380,6381}

分別啟動三個redis數據庫實例

redis-server redis-6379.conf

redis-server redis-6380.conf redis-server redis-6381.conf

查看三個數據庫的身份信息,檢測主從狀態

進入:redis-cli -p 6379

輸入:info

查看Replication結果:

role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=280,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=280,lag=1 master_replid:8ebe1c8b3f2211e1be132332d7548d059cffc954 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:280 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:280

 

測試寫入主庫 6379數據,查看兩個從庫的信息,確認6380,6381

演示干掉主庫,手動切換主從故障

1.手動檢查進程,殺死主庫,演示故障

2.手動切換某一個從庫,換成主庫身份

就是redis-cli -p 6380 登陸6380后,輸入 slaveof on one,去掉自己的slave身份

3.將6381重新指引到6380位從庫,

redis-cli -p 6381登陸6381后,輸入slaveof 127.0.0.1 6380

4.手動改配置文件

 

自動的redis主從切換,是哨兵功能

/opt/s18redis目錄下

1.環境配置 准備3個redis數據庫實例

准備3個配置文件

redis-6379.conf

port 6379
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/var/redis/data/"

redis-6380.conf

port 6380
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/" 
slaveof 127.0.0.1 6379      // 從屬主節點

redis-6381.conf

port 6381
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/" 
slaveof 127.0.0.1 6379      // 從屬主節點

建立文件夾:mkdir -p /data/{6379,6380,6381}

檢測身份信息:redis-cli -p 6370 進入后輸入:info

 

此時再准備三個哨兵,就是三個值班的,檢測redis主從狀態

三個哨兵配置文件如下:

redis-26379.conf

port 26379  
dir /var/redis/data/
logfile "26379.log"

// 當前Sentinel節點監控 127.0.0.1 6379 這個主節點
// 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意
// s18ms是主節點的別名
sentinel monitor s18ms 127.0.0.1 6379 2

//每個Sentinel節點都要定期PING命令來判斷Redis數據節點和其余Sentinel節點是否可達,如果超過30000毫秒30s且沒有回復,則判定不可達
sentinel down-after-milliseconds s18ms 30000

//當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數為1
sentinel parallel-syncs s18ms 1

//故障轉移超時時間為180000毫秒
sentinel failover-timeout s18ms 180000
daemonize yes 

redis-26380.conf

port 26380 dir /var/redis/data/ logfile "26380.log"

sentinel monitor s18ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s18ms 30000

sentinel parallel-syncs s18ms 1 sentinel failover-timeout s18ms 180000 daemonize yes

 

redis-26381.conf

port 26381 dir /var/redis/data/ logfile "26381.log"

sentinel monitor s18ms 127.0.0.1 6379 2 sentinel down-after-milliseconds s18ms 30000

sentinel parallel-syncs s18ms 1 sentinel failover-timeout s18ms 180000 daemonize yes

分別啟動三個哨兵

536 redis-sentinel redis-26379.conf 537 redis-sentinel redis-26380.conf 538 redis-sentinel redis-26381.conf

查看哨兵信息:

redis-cli -p 26379

輸入:info sentinel

此時哨兵已經正確,三個哨兵,檢測者一主兩從:

sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=s18ms,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3

 

自動主從故障切換演練

1.干掉3679,查看6380和6381的身份信息

2.正確是 哨兵會選舉6380為新的master,然后為6380為6381新salve

3.當6379重新復活之后,會自動添加到主從架構之中

 

redis-cluster的集群搭建

1.環境准備,准備6個節點(6批馬兒),指的就是啟動6個redis數據庫實例

6個節點僅僅是端口不同

redis-7000.conf

port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes    #開啟集群模式
cluster-config-file nodes-7000.conf  #集群內部的配置文件
cluster-require-full-coverage no  #redis cluster需要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那么整個cluster不對外提供服務。 因此生產環境一般為no

五個文件僅僅的是端口不同

redis-7001.conf

port 7001
daemonize yes
dir "/opt/redis/data"
logfile "7001.log"
dbfilename "dump-7001.rdb"
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-require-full-coverage no

redis-7002.conf

redis-7003.conf

redis-7004.conf

redis-7005.conf

分別啟動6個redis數據實例

[root@localhost s18cluster]# redis-server redis-7000.conf [root@localhost s18cluster]# redis-server redis-7001.conf [root@localhost s18cluster]# redis-server redis-7002.conf [root@localhost s18cluster]# redis-server redis-7003.conf [root@localhost s18cluster]# redis-server redis-7004.conf [root@localhost s18cluster]# redis-server redis-7005.conf

檢查集群狀態

redis-cli -p 7000

進行redis-cluster集群槽位分配

redis官方提供了ruby語言的腳本,進行自動槽位分配

perl python ruby都是腳本語言

1.安裝准備ruby語言的環境,用於自動化創建redis集群

#下載ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

#安裝ruby
tar -xvf ruby-2.3.1.tar.gz
./configure --prefix=/opt/ruby/
make && make install
#准備一個ruby命令#准備一個gem軟件包管理命令
#拷貝ruby命令到path下/usr/local/ruby
cp /opt/ruby/bin/ruby /usr/local/cp bin/gem /usr/local/bin

2.編譯安裝完成后,添加環境變量

把bin添加環境變量:

[root@localhost bin]# pwd /opt/ruby/bin

vim /etc/profile

source /etc/profile

3.通過ruby的軟件包管理工具安裝redis模塊(gem就是類似python的pip工具)

在opt/s18cluster/目錄下

wget http://rubygems.org/downloads/redis-3.3.0.gem
# 通過gem安裝這個redis包
gem install -l redis-3.3.0.gem
#查看gem有哪些包
gem list -- check redis gem

4.找到ruby創建redis集群的腳本工具

命令:find /opt -name redis-trib.rb

結果:/opt/redis-4.0.10/src/redis-trib.rb

5.此時就可以通過ruby來創建redis的集群,分配槽點

一鍵開啟redis-cluster集群

#每個主節點,有一個從節點,代表--replicas 1
/opt/redis-4.0.10/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

6.集群已經創建成功

redis-cli -p 7000 -c #-c是集群的模式

127.0.0.1:7000> set name kevins -> Redirected to slot [5798] located at 127.0.0.1:7001 OK


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM