一 redis集羣的目的node
在 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不受限於單機,可受益於分佈式集羣高擴展性。
二 安裝redisredis
1. 須要注意的是:必需要3個或以上的主節點,不然在建立集羣時會失敗,而且當存活的主節點數小於總節點數的一半時,整個集羣就沒法提供服務了。 2. 環境準備: redis版本5.0.3 兩臺centos7系統,三主三從,ip爲192.168.10.227和192.168.6.220 3. 安裝redis 解壓,make&&make install
三 配置redis集羣centos
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配置文件ruby
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
四 建立集羣app
# 舊版建立集羣,還須要安裝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
七 故障測試ide
1 故意停掉一個master
redis-cli -h 192.168.10.227 -p 16380 debug segfault
停掉以前,主從狀況
停掉以後,發現6.220上的16384變爲mater了
而後從新啓動那個16380,它如今變成slave了