日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis主从配置和集群配置

發(fā)布時(shí)間:2024/4/11 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis主从配置和集群配置 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Redis主從配置和集群配置

文章目錄

  • Redis主從配置和集群配置
    • 一、Redis主從配置
      • 1.主從概念
      • 2.主從配置
      • 3.數(shù)據(jù)操作
    • 二、Redis集群配置
      • 1.簡介
      • 2.Redis 集群好處
      • 3.redis集群
      • 4.實(shí)現(xiàn)機(jī)制
      • 5.依賴配置
      • 6.集群配置
        • 1.**`配置機(jī)器1`**
        • 2.**`配置機(jī)器2`**
        • 3.創(chuàng)建集群
      • 4.測試驗(yàn)證
      • 7.在哪個(gè)服務(wù)器上寫數(shù)據(jù):CRC16
      • 8.Python交互
      • 9.參考閱讀

一、Redis主從配置

1.主從概念

  • ?個(gè)master可以擁有多個(gè)slave,?個(gè)slave?可以擁有多個(gè)slave,如此下去,形成了強(qiáng)?的多級(jí)服務(wù)器集群架構(gòu)
  • master用來寫數(shù)據(jù),slave用來讀數(shù)據(jù),經(jīng)統(tǒng)計(jì):網(wǎng)站的讀寫比率是10:1
  • 通過主從配置可以實(shí)現(xiàn)讀寫分離

master和slave都是一個(gè)redis實(shí)例(redis服務(wù))

2.主從配置

  • 配置主
  • 查看當(dāng)前主機(jī)的ip地址
ifconfig

  • 修改etc/redis/redis.conf文件
sudo vi redis.conf bind 192.168.26.128
  • 重啟redis服務(wù)
sudo service redis stop redis-server redis.conf
  • 配置從
  • 復(fù)制etc/redis/redis.conf文件
sudo cp redis.conf ./slave.conf
  • 修改redis/slave.conf文件
sudo vi slave.conf編輯內(nèi)容bind 192.168.26.128 slaveof 192.168.26.128 6379 port 6378
  • redis服務(wù)
sudo redis-server slave.conf
  • 查看主從關(guān)系
redis-cli -h 192.168.26.128 info Replication

3.數(shù)據(jù)操作

  • 在master和slave分別執(zhí)?info命令,查看輸出信息 進(jìn)入主客戶端
redis-cli -h 192.168.26.128 -p 6379
  • 進(jìn)入從的客戶端
redis-cli -h 192.168.26.128 -p 6378
  • 在master上寫數(shù)據(jù)
set aa aa

  • 在slave上讀數(shù)據(jù)
get aa

二、Redis集群配置

1.簡介

  • 集群:一組通過網(wǎng)絡(luò)連接的計(jì)算機(jī),共同對(duì)外提供服務(wù),像一個(gè)獨(dú)立的服務(wù)器
  • Redis集群是一個(gè)由多個(gè)節(jié)點(diǎn)組成的分布式服務(wù)器群,它具有復(fù)制、高可用和分片特性;
  • Redis集群沒有中心節(jié)點(diǎn),并且?guī)в袕?fù)制和故障轉(zhuǎn)移特性,這可以避免單個(gè)節(jié)點(diǎn)成為性能瓶頸,或者因?yàn)槟硞€(gè)節(jié)點(diǎn)下線而導(dǎo)致整個(gè)集群下線;
  • 集群中的主節(jié)點(diǎn)負(fù)責(zé)處理槽(存儲(chǔ)數(shù)據(jù)),從節(jié)點(diǎn)則是主節(jié)點(diǎn)的復(fù)制品;
  • Redis集群將整個(gè)數(shù)據(jù)庫分成16384個(gè)槽,數(shù)據(jù)庫中的每個(gè)鍵都屬于16384個(gè)槽中的其中一個(gè);
  • 集群中的每個(gè)主節(jié)點(diǎn)都可以負(fù)責(zé)0到16384個(gè)槽,當(dāng)16384個(gè)槽都有節(jié)點(diǎn)在負(fù)責(zé)時(shí),集群進(jìn)入上線狀態(tài),可以執(zhí)行客戶端發(fā)送的數(shù)據(jù)命令;
  • 主節(jié)點(diǎn)只會(huì)執(zhí)行和自己負(fù)責(zé)的槽相關(guān)的命令,當(dāng)節(jié)點(diǎn)接收到不屬于自己處理的槽的命令時(shí),它會(huì)將處理指定槽的節(jié)點(diǎn)的地址返回給客戶端,而客戶端會(huì)向正確的節(jié)點(diǎn)重新發(fā)送命令,這個(gè)過程稱為“轉(zhuǎn)向”;
  • Redis 集群通過分區(qū)(partition)來提供一定程度的可用性(availability):即使集群中有一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊,集群也可以繼續(xù)處理命令請(qǐng)求。

2.Redis 集群好處

Redis 集群提供了以下兩個(gè)好處:

  • 將數(shù)據(jù)自動(dòng)切分(split)到多個(gè)節(jié)點(diǎn)的能力。
  • 當(dāng)集群中的一部分節(jié)點(diǎn)失效或者無法進(jìn)行通訊時(shí), 仍然可以繼續(xù)處理命令請(qǐng)求的能力。

為什么要有集群
之前我們已經(jīng)講了主從的概念,一主可以多從,如果同時(shí)的訪問量過大(1000w),主服務(wù)肯定就會(huì)掛掉,數(shù)據(jù)服務(wù)就掛掉了或者發(fā)生自然災(zāi)難
大公司都會(huì)有很多的服務(wù)器(華東地區(qū)、華南地區(qū)、華中地區(qū)、華北地區(qū)、西北地區(qū)、西南地區(qū)、東北地區(qū)、臺(tái)港澳地區(qū)機(jī)房)

3.redis集群

  • 分類
  • 軟件層面
  • 硬件層面
  • 軟件層面:只有一臺(tái)電腦,在這一臺(tái)電腦上啟動(dòng)了多個(gè)redis服務(wù)。
  • 硬件層面:存在多臺(tái)實(shí)體的電腦,每臺(tái)電腦上都啟動(dòng)了一個(gè)redis或者多個(gè)redis服務(wù)。

4.實(shí)現(xiàn)機(jī)制

  • Redis Cluster 是Redis的集群實(shí)現(xiàn),內(nèi)置數(shù)據(jù)自動(dòng)分片機(jī)制,集群內(nèi)部將所有的key映射到16384個(gè)Slot中,集群中的每個(gè)Redis Instance負(fù)責(zé)其中的一部分的Slot的讀寫。
  • 集群客戶端連接集群中任一Redis Instance即可發(fā)送命令,當(dāng)Redis Instance收到自己不負(fù)責(zé)的Slot的請(qǐng)求時(shí),會(huì)將負(fù)責(zé)請(qǐng)求Key所在Slot的Redis Instance地址返回給客戶端,客戶端收到后自動(dòng)將原請(qǐng)求重新發(fā)往這個(gè)地址,對(duì)外部透明。
  • 一個(gè)Key到底屬于哪個(gè)Slot由crc16(key)% 16384 決定。
  • 關(guān)于集群成員管理,集群的節(jié)點(diǎn)(Redis Instance)和節(jié)點(diǎn)之間兩兩定期交換集群內(nèi)節(jié)點(diǎn)信息并且更新,從發(fā)送節(jié)點(diǎn)的角度看,這些信息包括:集群內(nèi)有哪些節(jié)點(diǎn),IP和PORT是什么,節(jié)點(diǎn)名字是什么,節(jié)點(diǎn)的狀態(tài)(比如OK,PFAIL,FAIL)是什么,包括節(jié)點(diǎn)角色(master或者 slave)等。
  • 關(guān)于可用性,集群由N組主從Redis Instance組成。
  • 主可以沒有從,但是沒有從 意味著主宕機(jī)后主負(fù)責(zé)的Slot讀寫服務(wù)不可用
  • 一個(gè)主可以有多個(gè)從,主宕機(jī)時(shí),某個(gè)從會(huì)被提升為主,具體哪個(gè)從被提升為主,協(xié)議類似于Raft,參見這里。
  • 如何檢測主宕機(jī)?Redis Cluster采用quorum+心跳的機(jī)制。
  • 從節(jié)點(diǎn)的角度看,節(jié)點(diǎn)會(huì)定期給其他所有的節(jié)點(diǎn)發(fā)送Ping, cluster-node-timeout(可配置,秒級(jí))時(shí)間內(nèi)沒有收到對(duì)方的回復(fù),則單方面認(rèn)為對(duì)端節(jié)點(diǎn)宕機(jī),將該節(jié)點(diǎn)標(biāo)為PFAIL狀態(tài)。
  • 通過節(jié)點(diǎn)之間交換信息收集到quorum個(gè)節(jié)點(diǎn)都認(rèn)為這個(gè)節(jié)點(diǎn)為PFAIL,則將該節(jié)點(diǎn)標(biāo)記為FAIL,并且將其發(fā)送給其他所有節(jié)點(diǎn),其他所有節(jié)點(diǎn)收到后立即認(rèn)為該節(jié)點(diǎn)宕機(jī)。
  • 從這里可以看出,主宕機(jī)后,至少cluster-node-timeout時(shí)間內(nèi)該主所負(fù)責(zé)的Slot的讀寫服務(wù)不可用。

5.依賴配置

Redis集群配置之前需要依賴一些相關(guān)庫配置,因此需要先安裝以下相關(guān)庫;

  • (1) 確保系統(tǒng)安裝zlib,否則gem install會(huì)報(bào)(no such file to load – zlib)
# download:zlib-1.2.8.tar.gz# tar –zxvfzlib-1.2. 8.tar.gz# cd zlib-1.2.8#./configure # make # makeinstall
  • (2) 安裝ruby:version(2.2.2)
# download:ruby-2.2.2.tar.gz # tar –zxvf ruby-2.2.2.tar.gz# cd /ruby-2.2.2#./configure-prefix=/usr/local/ruby # make # makeinstall # cp ruby/usr/local/bin
  • 安裝完成后可以查看相應(yīng)的版本信息:
# ruby –v
  • (3)安裝rubygem:version(1.8.16)
# down rubygems-2.4.7.tar.gz # tar –zxvf rubygems-2.4.7.tar.gz# cd rubygems-2.4.7# rubysetup.rb # cp rubygems-2.4.7/bin/gem/usr/local/bin
  • 安裝完成后可以查看相應(yīng)的版本信息:
# gem –v
  • (4)安裝redis與ruby接口gem-redis:version(3.0.6)
gem install -l /data/soft/redis-3.0.6.gem

6.集群配置

集群配置案例:

1.配置機(jī)器1

  • 在演示中,172.16.179.130為當(dāng)前ubuntu機(jī)器的ip
  • 在172.16.179.130上進(jìn)?Desktop?錄,創(chuàng)建conf?錄
  • 在conf?錄下創(chuàng)建?件7000.conf,編輯內(nèi)容如下
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?錄下創(chuàng)建?件7001.conf,編輯內(nèi)容如下

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?錄下創(chuàng)建?件7002.conf,編輯內(nèi)容如下

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

總結(jié):三個(gè)?件的配置區(qū)別在port、pidfile、cluster-config-file三項(xiàng)

  • 使?配置?件啟動(dòng)redis服務(wù)
redis-server 7000.conf redis-server 7001.conf redis-server 7002.conf

查看進(jìn)程如下圖

2.配置機(jī)器2

  • 在演示中,172.16.179.131為當(dāng)前ubuntu機(jī)器的ip
  • 在172.16.179.131上進(jìn)?Desktop?錄,創(chuàng)建conf?錄
  • 在conf?錄下創(chuàng)建?件7003.conf,編輯內(nèi)容如下
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?錄下創(chuàng)建?件7004.conf,編輯內(nèi)容如下

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?錄下創(chuàng)建?件7005.conf,編輯內(nèi)容如下

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

總結(jié):三個(gè)?件的配置區(qū)別在port、pidfile、cluster-config-file三項(xiàng)

  • 使?配置?件啟動(dòng)redis服務(wù)
redis-server 7003.conf redis-server 7004.conf redis-server 7005.conf

查看進(jìn)程如下圖

3.創(chuàng)建集群

  • redis的安裝包中包含了redis-trib.rb,?于創(chuàng)建集群
  • 接下來的操作在172.16.179.130機(jī)器上進(jìn)?
  • 將命令復(fù)制,這樣可以在任何?錄下調(diào)?此命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
  • 安裝ruby環(huán)境,因?yàn)閞edis-trib.rb是?ruby開發(fā)的
sudo apt-get install ruby
  • 在提示信息處輸?y,然后回?繼續(xù)安裝
  • 運(yùn)?如下命令創(chuàng)建集群
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
  • 執(zhí)?上?這個(gè)指令在某些機(jī)器上可能會(huì)報(bào)錯(cuò),主要原因是由于安裝的 ruby 不是最 新版本
  • 天朝的防?墻導(dǎo)致?法下載最新版本,所以需要設(shè)置 gem 的源
解決辦法如下 -- 先查看??的 gem 源是什么地址 gem source -l -- 如果是https://rubygems.org/ 就需要更換 -- 更換指令為 gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/ -- 通過 gem 安裝 redis 的相關(guān)依賴 sudo gem install redis -- 然后重新執(zhí)?指令

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后回?

4.測試驗(yàn)證

[root@node01 src]# ./redis-cli -h 172.168.10.252 -p 7000172.168.10.252:7000> get date(nil)172.168.10.252:7000> get aa(nil)172.168.10.252:7000> get name(error) MOVED 5798 172.168.10.253:7000172.168.10.252:7000>
  • 目前主要的 Redis 集群客戶端(或者說,支持集群功能的 Redis 客戶端)有以下這些:

  • 1、redis-rb-cluster:antirez 使用Ruby 編寫的 Redis 集群客戶端,集群客戶端的官方實(shí)現(xiàn);

  • 2、predis:Redis的 PHP 客戶端,支持集群功能;

  • 3、jredis:Redis的 JAVA 客戶端,支持集群功能;

  • 4、StackExchange.Redis:Redis 的C# 客戶端,支持集群功能;

  • 5、內(nèi)置的 redis-cli :在啟動(dòng)時(shí)給定 -c 參數(shù)即可進(jìn)入集群模式,支持部分集群功能;

7.在哪個(gè)服務(wù)器上寫數(shù)據(jù):CRC16

  • redis cluster在設(shè)計(jì)的時(shí)候,就考慮到了去中?化,去中間件,也就是說,集群中的每個(gè)節(jié)點(diǎn)都是平等的關(guān)系,都是對(duì)等的,每個(gè)節(jié)點(diǎn)都保存各?的數(shù)據(jù)和整個(gè)集 群的狀態(tài)。
  • 每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接,?且這些連接保持活躍,這樣就保 證了我們只需要連接集群中的任意?個(gè)節(jié)點(diǎn),就可以獲取到其他節(jié)點(diǎn)的數(shù)據(jù)
  • Redis集群沒有并使?傳統(tǒng)的?致性哈希來分配數(shù)據(jù),?是采?另外?種叫做哈希 槽 (hash slot)的?式來分配的。
  • redis cluster 默認(rèn)分配了 16384 個(gè)slot,當(dāng)我們 set?個(gè)key 時(shí),會(huì)?CRC16算法來取模得到所屬的slot,然后將這個(gè)key 分到哈 希槽區(qū)間的節(jié)點(diǎn)上,具體算法就是:CRC16(key) % 16384。
  • 所以我們?cè)跍y試的 時(shí)候看到set 和 get 的時(shí)候,直接跳轉(zhuǎn)到了7000端?的節(jié)點(diǎn)
    Redis 集群會(huì)把數(shù)據(jù)存在?個(gè) master 節(jié)點(diǎn),然后在這個(gè) master 和其對(duì)應(yīng)的salve 之間進(jìn)?數(shù)據(jù)同步。
  • 當(dāng)讀取數(shù)據(jù)時(shí),也根據(jù)?致性哈希算法到對(duì)應(yīng)的 master 節(jié) 點(diǎn)獲取數(shù)據(jù)。
  • 只有當(dāng)?個(gè)master 掛掉之后,才會(huì)啟動(dòng)?個(gè)對(duì)應(yīng)的 salve 節(jié)點(diǎn),充 當(dāng) master
  • 需要注意的是:必須要3個(gè)或以上的主節(jié)點(diǎn),否則在創(chuàng)建集群時(shí)會(huì)失敗,并且當(dāng)存 活的主節(jié)點(diǎn)數(shù)?于總節(jié)點(diǎn)數(shù)的?半時(shí),整個(gè)集群就?法提供服務(wù)了

8.Python交互

  • 安裝包如下
pip install redis-py-cluster

redis-py-cluster源碼地址https://github.com/Grokzen/redis-py-cluster

  • 創(chuàng)建?件redis_cluster.py,示例碼如下
from rediscluster import * if __name__ == '__main__':try:# 構(gòu)建所有的節(jié)點(diǎn),Redis會(huì)使?CRC16算法,將鍵和值寫到某個(gè)節(jié)點(diǎn)上startup_nodes = [{'host': '192.168.26.128', 'port': '7000'},{'host': '192.168.26.130', 'port': '7003'},{'host': '192.168.26.128', 'port': '7001'},]# 構(gòu)建StrictRedisCluster對(duì)象src=StrictRedisCluster(startup_nodes=startup_nodes,decode_responses=True)# 設(shè)置鍵為name、值為itheima的數(shù)據(jù)result=src.set('name','itheima')print(result)# 獲取鍵為namename = src.get('name')print(name)except Exception as e:print(e)

9.參考閱讀

  • redis集群搭建http://www.cnblogs.com/wuxl360/p/5920330.html
  • [Python]搭建redis集群http://blog.5ibc.net/p/51020.html

總結(jié)

以上是生活随笔為你收集整理的Redis主从配置和集群配置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。