中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis群集部署應該怎么做

發布時間:2020-03-25 16:03:34 來源:億速云 閱讀:123 作者:小新 欄目:關系型數據庫
Redis群集部署應該怎么做?為了讓大家更加的屬性,小編就從redis群集相關概念開始講。一起往下看看吧。

一、Redis群集相關概念

Redis是從3.0版本開始支持cluter的,采用的是hash槽方式,可以將多個Redis實例整合在一起,形成一個群集,也就是將數據分散存儲到群集中的多個節點上。

Redis的cluster是一個無中心的結構,在群集中,每個master的身份是平等的,每個節點都保存數據和整個群集的狀態,并且知道其他節點所負責的槽,也會定時發送心跳信息,能夠及時感知群集中異常的節點,并且采取投票的方式來決定該節點是否為不可用,若票數為群集中節點的半數以上,則認為該節點不可用,也正是因為此特點,所以要部署Redis群集,節點數量最少要三個及以上。

群集角色有master和slave,master之間分配slots(槽),槽點編號是0-16383(共16384個)。

默認情況下,每個群集節點有兩個TCP端口在監聽,一個是6379(用于監聽客戶端的訪問連接),另一個是16379(用于群集之間的節點通信)。注意,防火墻需要放行這兩個端口的流量。

Redis的所有數據都是保存在內存中,然后不定期的通過異步方式保存到磁盤上(這稱為“半持久化模式”);也可以把每一次數據變化都寫入到一個append only file(aof)里面(這稱為“全持久化模式”)。

Redis提供的這兩種方式進行持久化,一種是RDB持久化(原理是將Redis在內存中的數據庫定時記錄dump到磁盤上的RDB持久化),另一種是AOF(append only file)持久化(原理是將Redis的操作日志以追加的方式寫入文件)

RDB的優點與缺點

RDB半持久化的優點:

  • 只包含一個文件,有利于文件備份;
  • 災難恢復比aof持久化要快;
  • 性能最大化。對于Redis的服務進程而言,在開始持久化時,它唯一需要做的只是fork出子進程,之后再由子進程完成這些持久化的工作,這樣就可以極大的避免服務進程執行IO操作了。
  • 相比較AOF機制,如果數據集過大,RDB的啟動效率會更高。
    RDB半持久化的缺點:
  • 由于RDB是通過fork子進程來協助完成數據持久化工作的,因此,如果當數據集比較大時,可能會導致整個服務停止幾百毫秒,甚至是1秒鐘。

AOF的優點與缺點

AOF全持久化的優點:

  • 可以保證數據的高可用性;
  • 寫入過程中及時出現宕機現象,也不會破壞日志文件中已經存在的內容,如果在寫入過程中宕機,重啟Redis后可以通過redis-check-aof工具來解決;
  • 如果日志過大,Redis可以自動啟用rewrite機制,生成新的文件存儲aof日志;
  • 該機制可以帶來更高的數據安全性,及數據持久性。Redis中提供了三種同步策略,即每秒同步、每修改同步和不同步。
    AOF全持久化的缺點:
  • 對于相同數量的數據集而言,AOF文件通常要大于RDB文件。RDB在恢復大數據集時的速度比AOF的恢復速度要快;
  • 根據同步策略的不同,AOF在運行效率上往往會慢于RDM,總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB一樣高效。

如果RDB和AOF同時存在,則優先選擇AOF方式。

二、部署Redis群集

1、環境如下:

Redis群集部署應該怎么做

上面共六臺centos服務器,實現三臺master分別對應一臺slave(也可以在一臺服務器上配置多個Redis實例,但不要master-slave在同一臺物理服務器,可以使用交叉master-slave的方式進行主從復制,所謂交叉就是master在node01,但對應的slave在node02,node02上master對應的slave在node03,而node03對應的slave在node01,這樣做的好處是避免因為物理服務器的宕機而造成整個群集崩潰,這里只是稍微提示以下,自行研究即可)。

這里為了展示同一臺主機上配置多個Redis實例,所以將在node06上配置多個Redis實例,其余節點各負責一個Redis實例即可。

在進行接下來的配置前,請先下載我提供的源碼包(其實,這里部署的版本是Redis4.0的,版本還低了些,有些方便的配置無法進行,可以參考下我那篇部署Redis 5.0的博文)。

2、配置Redis實例

這里以node01的配置進行示例,其他節點照搬進行配置即可。

[root@node01 ~]# ls | grep redis    #在xshell使用rz命令上傳我提供的包,如下:
redis-4.0.14.tar.gz
[root@node01 ~]# tar zxf redis-4.0.14.tar.gz -C /usr/local/    #解包
[root@node01 ~]# cd /usr/local/    #切換至指定路徑
[root@node01 local]# mv redis-4.0.14 redis     #更改目錄名稱
[root@node01 local]# cd redis/    #切換至解壓后的目錄
[root@node01 redis]# make && make install     #無需配置,直接編譯安裝即可
[root@node01 redis]# ./utils/install_server.sh   #對Redis進行初始化
#初始化的所有選項保持默認,一路回車確認即可
#是在確認監聽端口、配置文件、日志文件、pid存放路徑等信息
 .............#省略部分內容
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
#出現上述內容,則表示初始化成功
#接下來進行一些優化,如下:
[root@node01 redis]# echo "512" > /proc/sys/net/core/somaxconn
[root@node01 redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
[root@node01 redis]# sysctl -p
vm.overcommit_memory = 1
[root@node01 redis]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@node01 redis]# vim /etc/redis/6379.conf        #編輯配置文件,修改如下
bind 0.0.0.0          #找到沒有被注釋的這一行,修改為0.0.0.0
daemonize yes    #若有注釋符號,需要刪除注釋符號,以便生效
cluster-enabled yes
cluster-node-timeout 5000
appendonly yes
#修改完成后,保存退出即可。
[root@node01 redis]# /etc/init.d/redis_6379 restart    #重啟Redis服務
[root@node01 redis]# netstat -anpt | grep redis   #確定端口6379及16379處于監聽狀態

在其他節點服務器上將上述配置依次進行以便,主機node06除外,因為稍后將在node06上展示單臺主機多Redis實例的配置。

3、配置node06主機的多Redis實例

node06這個節點上,我將配置其運行多個Redis數據庫實例,所以與前面五個節點的配置并不是完全一樣,請謹慎配置。

[root@node06 ~]# tar zxf redis-4.0.14.tar.gz -C /usr/local/
[root@node06 ~]# cd /usr/local/
[root@node06 local]# mv redis-4.0.14 redis
[root@node06 local]# cd redis/
[root@node06 redis]# make && make install    #編譯安裝后,無需進行初始化
[root@node06 redis]# redis-server    #啟動查看需要優化的項
#在前面幾個節點的優化配置就是從此命令執行后的提示信息獲得的
#接下里就優化這些提示的配置咯!
[root@node06 redis]# echo "512" > /proc/sys/net/core/somaxconn
[root@node06 redis]# echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf 
[root@node06 redis]# sysctl -p
vm.overcommit_memory = 1
[root@node06 redis]# echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
[root@node06 redis]# vim redis.conf     #編輯當前目錄下的模板配置文件以下幾項
bind 0.0.0.0
port 6379
daemonize yes        #開啟后臺守護進程,以便后臺運行
cluster-enabled yes        #開啟群集
cluster-node-timeout 5000     #群集節點間的超時時間,單位是毫秒
appendonly yes       #是否開啟同步到磁盤
appendfilename "appendonly-6379.aof"     #aof日志的名字
#編輯完成后,保存退出即可
[root@node06 redis]# mkdir -p /usr/local/redis-cluster/{6379..6382}
#以上是打算運行幾個Redis實例,就創建幾個目錄即可,這里我以實例的端口號給目錄命名(暫時打算運行4個Redis實例)
#以下是將修改后的配置文件復制到指定的目錄下一份
[root@node06 redis]# cp redis.conf /usr/local/redis-cluster/6379/
[root@node06 redis]# cp redis.conf /usr/local/redis-cluster/6380/
[root@node06 redis]# cp redis.conf /usr/local/redis-cluster/6381/
[root@node06 redis]# cp redis.conf /usr/local/redis-cluster/6382/
#然后下面將復制過去的各個配置文件中改為與Redis實例對應的端口號
[root@node06 redis]# cd /usr/local/redis-cluster/
[root@node06 redis-cluster]# sed -i s/6379/6380/g 6380/redis.conf
[root@node06 redis-cluster]# sed -i s/6379/6381/g 6381/redis.conf
[root@node06 redis-cluster]# sed -i s/6379/6382/g 6382/redis.conf
[root@node06 redis-cluster]# cd 6379    #切換到6379目錄
[root@node06 6379]# redis-server redis.conf     #啟動該目錄下的配置文件
101582:C 04 Nov 23:37:04.988 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
101582:C 04 Nov 23:37:04.988 # Redis version=4.0.14, bits=64, commit=00000000, modified=0, pid=101582, just started
101582:C 04 Nov 23:37:04.988 # Configuration loaded
#接下來就是依次啟動各個實例
[root@node06 6379]# cd ../6380
[root@node06 6380]# redis-server redis.conf 
[root@node06 6380]# cd ../6381
[root@node06 6381]# redis-server redis.conf 
[root@node06 6381]# cd ../6382
[root@node06 6382]# redis-server redis.conf 
[root@node06 6382]# netstat -anpt | grep redis    #查看Redis相關端口的監聽情況

上述查看Redis端口監聽情況的返回信息如下:

Redis群集部署應該怎么做

4、主機node01安裝配置ruby的運行環境,便于管理Redis群集
[root@node01 ~]# yum -y install rpm-build openssl openssl-devel  #安裝依賴
[root@node01 ~]# ls | egrep  "gem|ruby"     #將下面的兩個包上傳至主機node01
redis-3.3.0.gem
ruby-2.3.1.tar.gz
[root@node01 ~]# tar zxf ruby-2.3.1.tar.gz -C /usr/src    #解包
[root@node01 ~]# cd /usr/src/ruby-2.3.1/     #進入解壓后的目錄
[root@node01 ruby-2.3.1]#  ./configure --prefix=/usr/local/ruby && make && make install   #編譯安裝,時間較長
#下面是對生成的命令做軟連接
[root@node01 ruby-2.3.1]# ln -sf /usr/local/ruby/bin/* /usr/local/bin/
[root@node01 ruby-2.3.1]# ln -sf /usr/local/redis/src/redis-trib.rb /usr/local/bin/
[root@node01 ruby-2.3.1]# cd      #回到 .gem文件所在目錄
[root@node01 ~]# gem install redis-3.3.0.gem   #執行此命令
Successfully installed redis-3.3.0
Parsing documentation for redis-3.3.0
Installing ri documentation for redis-3.3.0
Done installing documentation for redis after 0 seconds
1 gem installed
#返回上述信息則表示成功
5、配置群集中的各個節點
[root@node01 ~]# redis-cli -p 6379     #登錄到本地Redis實例
#以下是將參與群集的各個節點添加到群集中
127.0.0.1:6379> CLUSTER MEET 192.168.20.3 6379
OK
127.0.0.1:6379> CLUSTER MEET 192.168.20.4 6379
OK
127.0.0.1:6379> CLUSTER MEET 192.168.20.5 6379
OK
127.0.0.1:6379> CLUSTER MEET 192.168.20.6 6379
OK
127.0.0.1:6379> CLUSTER MEET 192.168.20.7 6379
OK
127.0.0.1:6379> set a b         #雖然節點添加完成,但是由于沒有分配hash槽,所以無法添加數據
(error) CLUSTERDOWN Hash slot not served
127.0.0.1:6379> CLUSTER INFO     #查看群集的狀態
cluster_state:fail        #是失敗的
192.168.20.3:6379> exit
#接下來為群集中的節點分配槽點
#必須小心分配,一旦分配錯誤,很麻煩
#雖然可以將命令中的“add”換為“del”,但是我沒有成功
#一定要將0至16383完全分配出去,最好是等份分配
#只需給作為master的節點分配即可,我這里node01至node03為master
[root@node01 ~]# redis-cli -h 192.168.20.2 -p 6379 cluster addslots {0..5461}
OK
[root@node01 ~]# redis-cli -h 192.168.20.3 -p 6379 cluster addslots {5462..10922}
OK
[root@node01 ~]# redis-cli -h 192.168.20.4 -p 6379 cluster addslots {10923..16383}
OK
[root@node01 ~]# redis-cli -p 6379 -c       #進入群集,需要加“-c”選項
127.0.0.1:6379> CLUSTER NODES       #查看群集中的節點信息
#接下來是將各個slave從節點與master進行綁定
#node04作為node01的從節點,node05作為node02的從節點,node06的6379實例作為node03的從節點
#需要配置哪個從節點,就需要登錄到哪個實例
127.0.0.1:6379> CLUSTER NODES     #可以先執行此命令,查看相應節點的ID,以便接下來指定
[root@node01 ~]# redis-cli -h 192.168.20.5 -p 6379   #登錄到node04
192.168.20.5:6379> CLUSTER REPLICATE 5cd3d0eec161a7bcc785202397fd8363074ae9c2
#上面指定的是node01節點的ID
OK
192.168.20.5:6379> exit    #退出實例
[root@node01 ~]# redis-cli -h 192.168.20.6 -p 6379    #登錄到node05
192.168.20.6:6379> CLUSTER REPLICATE e2de936c380eb2239f0a349dcbfba5daa74fa1d7
#上述指定的是node02的節點ID
OK
192.168.20.6:6379> exit   #退出實例
[root@node01 ~]# redis-cli -h 192.168.20.7 -p 6379   #登錄到node06的6379實例
192.168.20.7:6379> CLUSTER REPLICATE dd03b02213df3a91608d1f4ae8080c37f4790d7c
#上述是指定node03的節點ID
OK
192.168.20.7:6379> exit

配置至此,可再次查看群集的節點信息,會發現主從之間都對應上了,如下:

Redis群集部署應該怎么做

至此,群集即可正常讀寫數據了,如下:

[root@node01 ~]# redis-cli -h 192.168.20.2 -p 6379 -c    #登錄到群集
192.168.20.2:6379> set b c
OK
6、使用ruby安裝的命令管理Redis群集
[root@node01 ~]# redis-trib.rb check 127.0.0.1:6379   #檢查群集的狀態

上述命令返回的信息如下:
Redis群集部署應該怎么做

7、將node06的6380實例添加節點到Redis群集中
1)添加節點
[root@node01 ~]# redis-trib.rb add-node 192.168.20.7:6380 192.168.20.2:6379  
#在添加節點時,不添加其他配置,默認加入群集后,角色是master

返回的提示信息如下則表示成功:

Redis群集部署應該怎么做

2)添加節點后需要分配相應的槽點

由于一個群集若要正常運行,必須將所有的槽點分配出去,所以當有新的節點加入后,需要重新給新加入的節點分配槽點,如下:

[root@node01 ~]# redis-trib.rb check 127.0.0.1:6379    #執行此命令進行確認新加入的節點時master
[root@node01 ~]# redis-trib.rb reshard 192.168.20.2:6379   #指定群集地址及端口
How many slots do you want to move (from 1 to 16384)? 4096
#若是四個master,那么平均值為4096,所以這里輸入4096
What is the receiving node ID? 010752fb2527317a938fcb5b4e73822db805b3a1
#指定接收的節點,也就是新加入的node06主機上6380的那個實例的ID   
Source node #1:all   #指定從哪個節點的槽點分配,這里輸入“all”選擇所有節點
Do you want to proceed with the proposed reshard plan (yes/no)? yes    #輸入“yes”進行確認

至此,新的節點就添加完成了,并且分配了相應的槽點,但是...還沒有從節點,所以接下來為新加入的master分配一個從節點。

8、為新加入的master分配從節點

分配從節點的方式有兩種,一種是不指定為哪個master的從節點,自動綁定到沒有從節點的master上,一種是直接指定綁定到哪個master上,這里將這兩種方式都寫下來。

#方式一:
[root@node01 ~]# redis-trib.rb add-node --slave 192.168.20.7:6381 192.168.20.7:6380
#將node06上的6381實例以slave的身份加入到群集
#注意,返回的信息不可有紅色字樣,那就說明有錯誤
[root@node01 ~]# redis-trib.rb check 192.168.20.2:6379
#查看確認新加入的slave是否與node06的6380master實例綁定
#方式二:
[root@node01 ~]# redis-trib.rb add-node --slave --master-id 010752fb2527317a938fcb5b4e73822db805b3a1 192.168.20.7:6382 192.168.20.2:6380
#上述命令指定的ID就是6380實例的master的ID,直接指定為6380的slave節點
[root@node01 ~]# redis-trib.rb check 192.168.20.2:6379   
#查看群集狀態,可以看到master6380有兩個slave了,都是上面新加入的slave
9、刪除主節點操作

刪除主節點的操作其實就是把添加主節點的操作反了過了,需要先將要刪除的主節點上的槽點分配給其他master,然后才可以執行刪除操作,并且刪除主節點后,該master對應的slave也將會隨著slots槽進行轉移到新的master上。

這里以移除node06上的6380實例為例。

#移除6380實例上的槽點
[root@node01 ~]# redis-trib.rb reshard 192.168.20.2:6379   #指定群集監聽地址
How many slots do you want to move (from 1 to 16384)? 4096   #輸入要刪除多少槽
What is the receiving node ID? 5cd3d0eec161a7bcc785202397fd8363074ae9c2
#這里指定的是刪除主節點后,主節點上的槽分配給誰?這里寫了node02的6379實例的ID
Source node #1:010752fb2527317a938fcb5b4e73822db805b3a1
#這里指定的是要刪除哪個主節點?指定的ID是node06上6380實例的ID
Source node #2:done    #輸入done表示結束
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#輸入“yes”表示確認
#移除槽點后,接下來將6380實例從群集中移除,如下:
[root@node01 ~]# redis-trib.rb del-node 192.168.20.2:6379 010752fb2527317a938fcb5b4e73822db805b3a1
#上面指定的是6380實例的ID

至此,6380實例就被徹底移除群集了,并且原本與之對應的slave也隨著槽點轉移到node02也一起成為了node02的slave。現在查看群集信息,node02的master應該是對應了三個slave。

關于Redis群集部署應該怎么做就分享到這里了,當然并不止以上和大家分析的辦法,不過小編可以保證其準確性是絕對沒問題的。希望以上內容可以對大家有一定的參考價值,可以學以致用。如果喜歡本篇文章,不妨把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

张家界市| 施秉县| 桂东县| 托里县| 运城市| 吉木萨尔县| 麻江县| 昌乐县| 衡东县| 博野县| 兴义市| 炎陵县| 昭苏县| 武义县| 江达县| 航空| 望谟县| 娄烦县| 沙坪坝区| 军事| 同仁县| 讷河市| 古田县| 盐源县| 通渭县| 加查县| 黄陵县| 元氏县| 乌兰浩特市| 汝阳县| 洛阳市| 乌兰察布市| 海林市| 满城县| 西平县| 湖口县| 饶阳县| 仁怀市| 历史| 濮阳县| 迁安市|