為什麼要有集群 上一篇隨筆說了基本的主從概念以及搭建,一主可以有多從,如果同時訪問的量過大(1000w)或者發生自然災難,主服務肯定就會掛掉,數據服務就掛掉了 大公司都會有很多的伺服器(華東地區、華南地區、華中地區、華北地區、西北地區、西南地區、東北地區、台港澳地區機房) 集群的概念 集群是一組相互 ...
為什麼要有集群
- 上一篇隨筆說了基本的主從概念以及搭建,一主可以有多從,如果同時訪問的量過大(1000w)或者發生自然災難,主服務肯定就會掛掉,數據服務就掛掉了
- 大公司都會有很多的伺服器(華東地區、華南地區、華中地區、華北地區、西北地區、西南地區、東北地區、台港澳地區機房)
集群的概念
- 集群是一組相互獨立的、通過高速網路互聯的電腦,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與集群相互作用時,集群像是一個獨立的伺服器。集群配置是用於提高可用性和可縮放性。
當請求到來首先由負載均衡伺服器處理,把請求轉發到另外的一臺伺服器上。
redis集群
- 分類
- 軟體層面
- 硬體層面
- 軟體層面:只有一臺電腦,在這一臺電腦上啟動了多個redis服務。
- 硬體層面:存在多台實體的電腦,每臺電腦上都啟動了一個redis或者多個redis服務。
搭建集群
- 當前擁有兩台主機172.16.179.130、172.16.179.131,這⾥的IP在使⽤時要改為實際值
參考閱讀
- redis集群搭建 http://www.cnblogs.com/wuxl360/p/5920330.html
- [Python]搭建redis集群 http://blog.5ibc.net/p/51020.html
接下來我們開始搭建,大家可以跟著我一起搭建試試,關鍵步驟我都會貼出來:
配置機器1
- 在演示中,172.16.179.130為當前ubuntu機器的ip
- 在172.16.179.130上進⼊Desktop⽬錄,創建conf⽬錄
-
在conf⽬錄下創建⽂件7000.conf,編輯內容如下
port 7000 bind 172.16.179.130 daemonize yes pidfile 7000.pid cluster-enabled yes cluster-config-file 7000_node.conf cluster-node-timeout 15000 appendonly yes
- 在conf⽬錄下創建⽂件7001.conf,編輯內容如下
port 7001 bind 172.16.179.130 daemonize yes pidfile 7001.pid cluster-enabled yes cluster-config-file 7001_node.conf cluster-node-timeout 15000 appendonly yes
- 在conf⽬錄下創建⽂件7002.conf,編輯內容如下
port 7002 bind 172.16.179.130 daemonize yes pidfile 7002.pid cluster-enabled yes cluster-config-file 7002_node.conf cluster-node-timeout 15000 appendonly yes
-
總結:三個⽂件的配置區別在port、pidfile、cluster-config-file三項
-
使⽤配置⽂件啟動redis服務
redis-server 7000.conf redis-server 7001.conf redis-server 7002.conf
- 查看進程如下圖
配置機器2
- 在演示中,172.16.179.131為當前ubuntu機器的ip
- 在172.16.179.131上進⼊Desktop⽬錄,創建conf⽬錄
-
在conf⽬錄下創建⽂件7003.conf,編輯內容如下
port 7003 bind 172.16.179.131 daemonize yes pidfile 7003.pid cluster-enabled yes cluster-config-file 7003_node.conf cluster-node-timeout 15000 appendonly yes
- 在conf⽬錄下創建⽂件7004.conf,編輯內容如下
port 7004 bind 172.16.179.131 daemonize yes pidfile 7004.pid cluster-enabled yes cluster-config-file 7004_node.conf cluster-node-timeout 15000 appendonly yes
- 在conf⽬錄下創建⽂件7005.conf,編輯內容如下
port 7005 bind 172.16.179.131 daemonize yes pidfile 7005.pid cluster-enabled yes cluster-config-file 7005_node.conf cluster-node-timeout 15000 appendonly yes
-
總結:三個⽂件的配置區別在port、pidfile、cluster-config-file三項,同上一臺機器
-
使⽤配置⽂件啟動redis服務
redis-server 7003.conf redis-server 7004.conf redis-server 7005.conf
- 查看進程如下圖
所以說,配置了一個第二個自然就可以水到渠成了,然後就是創建了
創建集群
- redis的安裝包中包含了redis-trib.rb,⽤於創建集群
- 接下來的操作在172.16.179.130機器上進⾏
-
將命令複製,這樣可以在任何⽬錄下調⽤此命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
-
安裝ruby環境,因為redis-trib.rb是⽤ruby開發的
sudo apt-get install ruby
-
在提示信息處輸⼊y,然後回⻋繼續安裝
- 運⾏如下命令創建集群
redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005
-
執⾏上⾯這個指令在某些機器上可能會報錯,主要原因是由於安裝的 ruby 不是最 新版本!
-
天朝的防⽕牆導致⽆法下載最新版本,所以需要設置 gem 的源
-
解決辦法如下
-- 先查看⾃⼰的 gem 源是什麼地址 gem source -l -- 如果是https://rubygems.org/ 就需要更換 -- 更換指令為 gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ -- 通過 gem 安裝 redis 的相關依賴 sudo gem install redis -- 然後重新執⾏指令
redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005
- 提示如下主從信息,輸⼊yes後回⻋
- 提示完成,集群搭建成功
數據驗證
- 根據上圖可以看出,當前搭建的主伺服器為7000、7001、7003,對應的從伺服器是7004、7005、7002
-
在172.16.179.131機器上連接7002,加參數-c表示連接到集群
redis-cli -h 172.16.179.131 -c -p 7002
-
寫⼊數據
set name itheima
-
⾃動跳到了7003伺服器,並寫⼊數據成功
- 在7003可以獲取數據,如果寫入數據又重定向到7000(負載均衡)
在哪個伺服器上寫數據:CRC16
- redis cluster在設計的時候,就考慮到了去中⼼化,去中間件,也就是說,集群中 的每個節點都是平等的關係,都是對等的,每個節點都保存各⾃的數據和整個集 群的狀態。每個節點都和其他所有節點連接,⽽且這些連接保持活躍,這樣就保 證了我們只需要連接集群中的任意⼀個節點,就可以獲取到其他節點的數據
- Redis集群沒有並使⽤傳統的⼀致性哈希來分配數據,⽽是採⽤另外⼀種叫做哈希 槽 (hash slot)的⽅式來分配的。redis cluster 預設分配了 16384 個slot,當我們 set⼀個key 時,會⽤CRC16演算法來取模得到所屬的slot,然後將這個key 分到哈 希槽區間的節點上,具體演算法就是:CRC16(key) % 16384。所以我們在測試的 時候看到set 和 get 的時候,直接跳轉到了7000端⼝的節點
- Redis 集群會把數據存在⼀個 master 節點,然後在這個 master 和其對應的salve 之間進⾏數據同步。當讀取數據時,也根據⼀致性哈希演算法到對應的 master 節 點獲取數據。只有當⼀個master 掛掉之後,才會啟動⼀個對應的 salve 節點,充 當 master
- 需要註意的是:必須要3個或以上的主節點,否則在創建集群時會失敗,並且當存 活的主節點數⼩於總節點數的⼀半時,整個集群就⽆法提供服務了
與Python交互
-
安裝包如下
pip install redis-py-cluster
-
redis-py-cluster源碼地址https://github.com/Grokzen/redis-py-cluster
-
創建⽂件redis_cluster.py,示例碼如下
from rediscluster import * if __name__ == '__main__': try: # 構建所有的節點,Redis會使⽤CRC16演算法,將鍵和值寫到某個節點上 startup_nodes = [ {'host': '192.168.26.128', 'port': '7000'}, {'host': '192.168.26.130', 'port': '7003'}, {'host': '192.168.26.128', 'port': '7001'}, ] # 構建StrictRedisCluster對象 src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True) # 設置鍵為name、值為skylark的數據 result=src.set('name','skylark') print(result) # 獲取鍵為name name = src.get('name') print(name) except Exception as e: print(e)