一 概況
1 redis集群類型
在 Web 服務器中,高可用 是指服務器可以 正常訪問 的時間,衡量的標准是在 多長時間 內可以提供正常服務(99.9%、99.99%、99.999% 等等)。在 Redis 層面,高可用 的含義要寬泛一些,除了保證提供 正常服務(如 主從分離、快速容災技術 等),還需要考慮 數據容量擴展、數據安全 等等。
在 Redis 中,實現 高可用 的技術主要包括 持久化、復制、哨兵 和 集群,下面簡單說明它們的作用,以及解決了什么樣的問題:
1 持久化:持久化是 最簡單的 高可用方法。它的主要作用是 數據備份,即將數據存儲在 硬盤,保證數據不會因進程退出而丟失。
2 復制:復制是高可用 Redis 的基礎,哨兵 和 集群 都是在 復制基礎 上實現高可用的。復制主要實現了數據的多機備份以及對於讀操作的負載均衡和簡單的故障恢復。缺陷是故障恢復無法自動化、寫操作無法負載均衡、存儲能力受到單機的限制。
3 哨兵:在復制的基礎上,哨兵實現了 自動化 的 故障恢復。缺陷是 寫操作 無法 負載均衡,存儲能力 受到 單機 的限制。
4 集群:通過集群,Redis 解決了 寫操作 無法 負載均衡 以及 存儲能力 受到 單機限制 的問題,實現了較為 完善 的 高可用方案。
2 三種模式的區別
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,如果在實際環境中,當然是6台機器最為完美了。
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
運行上面的命令如下圖所示:

輸入yes即可
出現下面信息即代表成功

五 驗證集群
# 在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
停掉之前,主從情況

運行這個命令,停掉16380這個redis
redis-cli -h 192.168.10.227 -p 16380 debug segfault
停掉之后,發現6.220上的16384變為mater了

然后重新啟動那個16380,它現在變成slave了

2 我連續停掉兩個master
當我把兩個主都停掉之后,其中兩個從,依然變成了主
得到的結果是,允許主最多壞兩個,從最終剩一個!
