redis集羣

一 redis集羣的目的

在 Web 服務器中,高可用 是指服務器可以 正常訪問 的時間,衡量的標準是在 多長時間 內可以提供正常服務(99.9%、99.99%、99.999% 等等)。在 Redis 層面,高可用 的含義要寬泛一些,除了保證提供 正常服務(如 主從分離、快速容災技術 等),還需要考慮 數據容量擴展、數據安全 等等。

在 Redis 中,實現 高可用 的技術主要包括 持久化、複製、哨兵 和 集羣,下面簡單說明它們的作用,以及解決了什麼樣的問題:

1 持久化:持久化是 最簡單的 高可用方法。它的主要作用是 數據備份,即將數據存儲在 硬盤,保證數據不會因進程退出而丟失。

2 複製:複製是高可用 Redis 的基礎,哨兵 和 集羣 都是在 複製基礎 上實現高可用的。複製主要實現了數據的多機備份以及對於讀操作的負載均衡和簡單的故障恢復。缺陷是故障恢復無法自動化、寫操作無法負載均衡、存儲能力受到單機的限制。

3 哨兵:在複製的基礎上,哨兵實現了 自動化 的 故障恢復。缺陷是 寫操作 無法 負載均衡,存儲能力 受到 單機 的限制。

4 集羣:通過集羣,Redis 解決了 寫操作 無法 負載均衡 以及 存儲能力 受到 單機限制 的問題,實現了較爲 完善 的 高可用方案。

#####################**0 主從,哨兵,集羣三者的區別*

1.主從模式:讀寫分離,備份,一個Master可以有多個Slaves。

2.哨兵sentinel:監控,自動轉移,哨兵發現主服務器掛了後,就會從slave中重新選舉一個主服務器。

3.集羣:爲了解決單機Redis容量有限的問題,將數據按一定的規則分配到多臺機器,內存/QPS不受限於單機,可受益於分佈式集羣高擴展性。

二 安裝redis

1. 需要注意的是:必須要3個或以上的主節點,否則在創建集羣時會失敗,並且當存活的主節點數小於總節點數的一半時,整個集羣就無法提供服務了。

2. 環境準備: redis版本5.0.3  兩臺centos7系統,三主三從,ip爲192.168.10.227和192.168.6.220

3. 安裝redis 解壓,make&&make install 

三 配置redis集羣

1 創建多個redis目錄

#兩臺機器上面都需要創建這個目錄,端口最好不要一樣
mkdir -p /home/yx/server/ redis_cluster{16379/log,16380/log,16381/log} 
拷貝redis配置文件到各個目錄下
├── 16379
│   ├── log
│   │   └── redis.log
│   └── redis.conf
├── 16380
│   ├── log
│   │   └── redis.log
│   └── redis.conf
└── 16381
    ├── log
    │   └── redis.log
    ├── nodes-16381.conf
    └── redis.conf

2 修改redis配置文件

port  16379                                       #//端口16379,16380,16381       
bind 本機ip                                       #/默認ip爲127.0.0.1 需要改爲其他節點機器可訪問的ip 否則創建集羣時無法訪問對應的端口,無法創建集羣
daemonize    yes                               #redis後臺運行
pidfile  /var/run/redis_16379.pid          #pidfile文件對應16379,16380,16381   
cluster-enabled  yes                           #開啓集羣  把註釋#去掉
cluster-config-file  nodes_16379.conf   #集羣的配置  配置文件首次啓動自動生成 7000,7001,7002
cluster-node-timeout  15000                #請求超時  默認15秒,可自行設置
appendonly  yes                           #aof日誌開啓  有需要就開啓,它會每次寫操作都記錄一條日誌
logfile "/home/yx/server/redis_cluster/16379/log/redis.log"  #默認是空,設置日誌存放目錄

3 啓動redis

# 10.227
redis-server redis_cluster/16379/redis.conf 
redis-server redis_cluster/16380/redis.conf 
 redis-server redis_cluster/16381/redis.conf 

#6.220
 redis-server redis_cluster/16382/redis.conf
redis-server redis_cluster/16383/redis.conf
redis-server redis_cluster/16384/redis.conf

四 創建集羣

# 舊版創建集羣,還需要安裝ruby環境
redis-trib.rb  create  --replicas  1  192.168.10.227:16379 192.168.10.227:16380 192.168.10.227:16381 192.168.6.220:16382 192.168.6.220:16383 192.168.6.220:16384

# 新版
redis-cli --cluster create 192.168.10.227:16379 192.168.10.227:16380 192.168.10.227:16381 192.168.6.220:16382 192.168.6.220:16383 192.168.6.220:16384 --cluster-replicas 1

運行上面的命令如下圖所示:
redis集羣
輸入yes即可
出現下面信息即代表成功
redis集羣
五 驗證集羣

# 在10.227上面隨便登陸一個redis

redis-cli -h 192.168.10.227 -c -p 16379  # 登陸集羣用-c
192.168.10.227:16379> set hello world
OK
192.168.10.227:16379> keys *
1) "hello"
192.168.10.227:16379> keys
(error) ERR wrong number of arguments for 'keys' command
192.168.10.227:16379> get hello
"world"

###然後在另一臺機器上面登陸一個redis,同樣查詢
[yx@localhost server]$ redis-cli -h 192.168.6.220 -c -p 16383
192.168.6.220:16383> get hello
-> Redirected to slot [866] located at 192.168.10.227:16379
"world"

六 查看集羣情況

###########查看所有主從的情況
[yx@localhost redis_cluster]$ redis-cli -h 192.168.10.227 -c -p 16379
192.168.10.227:16379> CLUSTER nodes
dff73da0e9071afe5a13998ff24a03442386085c 192.168.6.220:16384@26384 slave 963cef978b20d22b4d3aef3baa598720a5869918 0 1561360856000 6 connected
943a534c273f6a75bab7154ac17a48066c3cee74 192.168.6.220:16382@26382 master - 0 1561360855855 4 connected 5461-10922
895f9058248c277909d9c337fd5cad180838e5e9 192.168.10.227:16381@26381 slave 943a534c273f6a75bab7154ac17a48066c3cee74 0 1561360857862 4 connected
963cef978b20d22b4d3aef3baa598720a5869918 192.168.10.227:16380@26380 master - 0 1561360857000 2 connected 10923-16383
d80910232150a3e64445393aeb8ae0eaca8632bf 192.168.6.220:16383@26383 slave 578b57a2cae8931c55da9f2cfa7762b0f2e7c0bb 0 1561360854853 5 connected
578b57a2cae8931c55da9f2cfa7762b0f2e7c0bb 192.168.10.227:16379@26379 myself,master - 0 1561360857000 1 connected 0-5460

############################集羣信息
192.168.10.227:16379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.6.220,port=16383,state=online,offset=2284,lag=1
master_replid:7e91dbdb27f711da30d410f21ca9bb20fadf7ed3
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2284
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:2284

七 故障測試

1 故意停掉一個master

redis-cli -h 192.168.10.227 -p 16380 debug segfault

停掉之前,主從情況
redis集羣

停掉之後,發現6.220上的16384變爲mater了
redis集羣

然後重新啓動那個16380,它現在變成slave了
redis集羣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章