1. 程式人生 > >redis--主從同步,故障切換,集群搭建

redis--主從同步,故障切換,集群搭建

目錄 好的 定期 技術 not create prot 驗證 作用

一 . redis主從同步

  準備三個配置文件,實現一主兩從的redis數據庫結構(這三個配置文件僅僅端口不一樣)

# redis-6379.conf 文件, 寫入下面數據:

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

  下面兩個文件直接替換就可以

sed  "s/6379/6380/g"  redis-6379.conf  >  redis-6380.conf
sed  
"s/6379/6381/g" redis-6379.conf > redis-6381.conf # 把6379配置成主庫,6380和6381配置成從庫, 需要在6380和6381的conf文件下寫入: slaveof 127.0.0.1 6379

  分別啟動redis數據庫

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

  通過命令查看數據庫的身份信息

127.0.0.1:6379> info  Replication     #
身份是master 127.0.0.1:6380> info Replication # 身份是slave 127.0.0.1:6381> info Replication # 身份是slave

  測試: 在主庫中寫入數據,然後咋從庫中查看,如果同步即為正常

二 . 故障切換

  手動進行主從故障切換

# 演示: 
1. 手動檢查進程, 殺死主庫. (6379)
2.手動切換到其中的一個從庫(6380),去掉conf文件中的slave身份
3.切換到另一個從庫(6381), 把conf文件中的slave指向改成 slaveof  127.0.0.1  6380

  自動主從切換, 應用哨兵

# 哨兵(redis-sentinel)集群自動切換原理簡述:
給數據庫配上幾個哨兵,讓他們監控著數據庫, 不時的去問主, 從數據庫時候還活著,如果主庫在規定時間內沒有回回復哨兵信息,證明掛了,
  哨兵會告訴其他的哨兵主庫掛啦,然後其他的哨兵去驗證一下,如果發現真的掛了,
    那麽哨兵會在從庫中選舉出一個新的主庫,然後把其他的從庫slaveof 執行這個新的主庫.

    1. 環境配置(準備三個redis配置文件)

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

# 另外兩個如下
sed "s/6379/6380/g" redis-6379.conf  > redis-6380.conf 
sed "s/6379/6381/g" redis-6379.conf  > redis-6381.conf 
# 然後分別在這兩個文件下寫上:
slaveof  127.0.0.1  6379

    2. 分別啟動三個redis

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

    3. 分別查看他們的身份信息

redis-cli  -p  6379  info  Replication     # master 主庫
redis-cli  -p  6380  info  Replication     # slave  從庫
redis-cli  -p  6380  info  Replication     # slave  從庫

    4. 準備三個哨兵(就是三個值班的,檢測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

# 另外兩個配置信息也只有端口不同

    5.分別啟動三個哨兵

[[email protected] s18msredis]# redis-sentinel redis-26379.conf 
[[email protected] s18msredis]# redis-sentinel redis-26380.conf 
[[email protected] s18msredis]# redis-sentinel redis-26381.conf

    6.查看哨兵身份信息

[[email protected] s18msredis]# redis-cli -p 26379 info sentinel
[[email protected] s18msredis]# redis-cli -p 26380 info sentinel
[[email protected] s18msredis]# redis-cli -p 26381 info sentinel

    7.測試

# 這三個哨兵檢測這一主兩從
1.幹掉(主庫)6379,查看6380和6381這兩個的身份信息
2.發現其中一個從庫(如:6380)變成了主庫, 另一個從庫變成了6380的從庫   # 這個選主庫是隨機的.
3.當6379復活後,會自動變成6380的從庫

# 原理其實就是把6380裏面的slave移除啦,然後把6381的slaveof指向了6381, 6379復活後slaveof也指向了6381

三 . redis-cluster的集群搭建

    

集群搭建的作用其實就是把一個很大的數據切片分攤, 就好比1噸重物放到一個馬車上,馬會拉不動的,
  但是分開放到6輛馬車上,每輛馬車分得重量就會變小,這樣馬就能拉動啦!

  redis-cluster 虛擬槽分區

虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有的數據映射到一個固定範圍內的整數集合,整數定義為槽(slot)。

Redis Cluster槽的範圍是0 ~ 16383槽是集群內數據管理和遷移的基本單位。采用大範圍的槽的主要目的是為了方便數據的拆分和集群的擴展,

每個節點負責一定數量的槽

  技術分享圖片

  搭建redis-cluster

準備節點(服務端)
服務端運輸數據,分配16384個槽位,管理數據
ruby腳本自動幫你分配槽位

  環境配置

# 創建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
# 我們一共需要6個節點,也就是需要6個配置文件,3主3從,最少6個才能保證高可用,這6個配置文件僅僅是端口不同

  其他個配置文件

sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf

redis-7001.conf 
redis-7002.conf 
redis-7003.conf 
redis-7004.conf 
redis-7005.conf   

  分別啟動6個redis數據庫

[[email protected] s18cluster]# redis-server redis-7000.conf 
[[email protected] s18cluster]# redis-server redis-7001.conf 
[[email protected] s18cluster]# redis-server redis-7002.conf 
[[email protected] s18cluster]# redis-server redis-7003.conf 
[[email protected] s18cluster]# redis-server redis-7004.conf 
[[email protected] s18cluster]# redis-server redis-7005.conf

  把槽分配給馬車,這樣馬車才能裝數據,ruby自動分配

#安裝準備ruby語言的環境,用於自動化創建redis集群
1.下載ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz
2.解壓縮
tar -zxvf ruby-2.3.1.tar.gz
./configure --prefix=/opt/ruby/
3.安裝
make && make install

  配置ruby的path,就是找到ruby的bin目錄的路徑,然後添加到/etc/profile中的PATH中去

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

wget http://rubygems.org/downloads/redis-3.3.0.gem

  通過gem安裝這個redis包

gem install -l redis-3.3.0.gem

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

[[email protected] s18cluster]# find /opt  -name redis-trib.rb
/opt/redis-4.0.10/src/redis-trib.rb

  此時就可以通過絕對路徑ruby來創建redis的集群工具,進行槽位分配(開啟所有集群)

/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 # --replicas 1 表示每個主節點有一個從節點

  查看集群狀態

redis-cli -p 7000 cluster info 
redis-cli -p 7000 cluster nodes  #等同於查看nodes-7000.conf文件節點信息

集群主節點狀態
redis-cli -p 7000 cluster nodes | grep master
集群從節點狀態
redis-cli -p 7000 cluster nodes | grep slave

  集群已經OK,開始測試

redis-cli -p 7000  -c    # -c 開啟集群模式

!!! 當你在其中一個節點中,創建redis的key,只要redis的key經過了重定向,分配到不同的節點中,代表集群搭建ok
     重定向之後, 只要在集群裏有數據 無論在哪個port裏面,都可以get出來,比如set name attila 被分配到7001  你登錄7000也能get到name

redis--主從同步,故障切換,集群搭建