日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

redis集群詳解

Redis有三種集群模式,分別是:

* 主從模式 
* Sentinel模式
 * Cluster模式

三種集群模式各有特點,關于Redis介紹可以參考這里:NoSQL(二)——Redis

Redis官網:https://redis.io/ ,最新版本5.0.4


主從模式

主從模式介紹

主從模式是三種模式中最簡單的,在主從復制中,數據庫分為兩類:主數據庫(master)和從數據庫(slave)。

其中主從復制有如下特點:

* 主數據庫可以進行讀寫操作,當讀寫操作導致數據變化時會自動將數據同步給從數據庫 
  * 從數據庫一般都是只讀的,并且接收主數據庫同步過來的數據 
  * 一個master可以擁有多個slave,但是一個slave只能對應一個master
  * slave掛了不影響其他slave的讀和master的讀和寫,重新啟動后會將數據從master同步過來 
  * master掛了以后,不影響slave的讀,但redis不再提供寫服務,master重啟后redis將重新對外提供寫服務 
  * master掛了以后,不會在slave節點中重新選一個master

工作機制:

當slave啟動后,主動向master發送SYNC命令。master接收到SYNC命令后在后臺保存快照(RDB持久化)和緩存保存快照這段時間的命令,然后將保存的快照文件和緩存的命令發送給slave。slave接收到快照文件和命令后加載快照文件和緩存的執行命令。

復制初始化后,master每次接收到的寫命令都會同步發送給slave,保證主從數據一致性。

安全設置:

當master節點設置密碼后,

客戶端訪問master需要密碼
 啟動slave需要密碼,在配置文件中配置即可 
客戶端訪問slave不需要密碼

缺點:

從上面可以看出,master節點在主從模式中唯一,若master掛掉,則redis無法對外提供寫服務。

主從模式搭建

  • 環境準備
master節點 192.168.30.128 slave
節點 192.168.30.129 slave
節點 192.168.30.130
  • 全部下載安裝:
# cd /software
# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
# tar zxf redis-5.0.4.tar.gz && mv redis-5.0.4/ /usr/local/redis
# cd /usr/local/redis && make && make install 
# echo $? 0
  • 全部配置成服務:

服務文件

# vim /usr/lib/systemd/system/redis.service[Unit]Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target[Service]ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd ExecStop=/usr/libexec/redis-shutdown Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755[Install]WantedBy=multi-user.target

shutdown腳本

# vim /usr/libexec/redis-shutdown#!/bin/bash## WrApper to close properly redis and sentineltest x"$REDIS_DEBUG" != x && set -x


   REDIS_CLI=/usr/local/bin/redis-cli# Retrieve service nameSERVICE_NAME="$1"if [ -z "$SERVICE_NAME" ]; then
   SERVICE_NAME=redisfi# Get the proper config file based on service nameCONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf"# Use awk to retrieve host, port from config fileHOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`SOCK=`awk '/^[[:blank:]]*unixsockets/ { print $2 }' $CONFIG_FILE | tail -n1`# Just in case, use default host, portHOST=${HOST:-127.0.0.1}if [ "$SERVICE_NAME" = redis ]; then
    PORT=${PORT:-6379}else
    PORT=${PORT:-26739}fi# Setup additional parameters# e.g password-protected redis instances[ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"# shutdown the service properlyif [ -e "$SOCK" ] ; then
        $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdownelse
        $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdownfi123456789101112131415161718192021222324252627282930313233343536373839404142
# chmod +x /usr/libexec/redis-shutdown# useradd -s /sbin/nologin redis# chown -R redis:redis /usr/local/redis# chown -R reids:redis /data/redis# yum install -y bash-completion && source /etc/profile                 #命令補全# systemctl daemon-reload# systemctl enable redis
  • 修改配置:

192.168.30.128

# mkdir -p /data/redis # vim /usr/local/redis/redis.conf bind 192.168.30.128 
#監聽ip,多個ip用空格分隔 daemonize yes 
#允許后臺啟動 logfile "/usr/local/redis/redis.log"
#日志路徑 dir /data/redis #數據庫備份文件存放目錄 masterauth 123456 
#slave連接master密碼,master可省略 requirepass 123456 #設置master連接密碼,slave可省略 appendonly yes 
#在/data/redis/目錄生成appendonly.aof文件,將每一次寫操作請求都追加到appendonly.aof 文件中
# echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf # sysctl -p

192.168.30.129

# mkdir -p /data/redis 
# vim /usr/local/redis/redis.conf bind 192.168.30.129 daemonize yes logfile "/usr/local/redis/redis.log" dir /data/redis replicaof 192.168.30.128 6379 masterauth 123456 requirepass 123456 appendonly yes 
# echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
# sysctl -p

192.168.30.130

# mkdir -p /data/redis
# vim /usr/local/redis/redis.conf bind 192.168.30.130 daemonize yes logfile "/usr/local/redis/redis.log" dir /data/redis replicaof 192.168.30.128 6379 masterauth 123456 requirepass 123456 appendonly yes 
# echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf 
# sysctl -p
  • 全部啟動redis:
# systemctl start redis
  • 查看集群狀態:
# redis-cli -h 192.168.30.128 -a 123456 Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. 192.168.30.128:6379> info replication 
# Replication role:master connected_slaves:2 slave0:ip=192.168.30.129,port=6379,state=online,offset=168,lag=1 slave1:ip=192.168.30.130,port=6379,state=online,offset=168,lag=1 master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:168 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:168
# redis-cli -h 192.168.30.129 -a 123456 info replication Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Replication role:slave master_host:192.168.30.128 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:196 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:196 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:196

數據演示

192.168.30.128:6379> keys *
(empty list or set)

192.168.30.128:6379> set key1 100
OK

192.168.30.128:6379> set key2 lzx
OK

192.168.30.128:6379> keys *
1) "key1"
2) "key2"
123456789101112
# redis-cli -h 192.168.30.129 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

192.168.30.129:6379> keys *
1) "key2"
2) "key1"

192.168.30.129:6379> CONFIG GET dir
1) "dir"
2) "/data/redis"

192.168.30.129:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"

192.168.30.129:6379> get key1
"100"

192.168.30.129:6379> get key2
"lzx"

192.168.30.129:6379> set key3 aaa
(error) READONLY You can't write against a read only replica.
1234567891011121314151617181920212223
# redis-cli -h 192.168.30.130 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

192.168.30.130:6379> keys *
1) "key2"
2) "key1"

192.168.30.130:6379> CONFIG GET dir
1) "dir"
2) "/data/redis"

192.168.30.130:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"

192.168.30.130:6379> get key1
"100"

192.168.30.130:6379> get key2
"lzx"

192.168.30.130:6379> set key3 aaa
(error) READONLY You can't write against a read only replica.

可以看到,在master節點寫入的數據,很快就同步到slave節點上,而且在slave節點上無法寫入數據。

Sentinel模式

Sentinel模式介紹

主從模式的弊端就是不具備高可用性,當master掛掉以后,Redis將不能再對外提供寫入操作,因此sentinel應運而生。

sentinel中文含義為哨兵,顧名思義,它的作用就是監控redis集群的運行狀況,特點如下

功能作用

  1. 監控(monitoring):Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
  2. 提醒(Notifation):當被監控的某個 Redis 服務器出現問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發送通知。
  3. 自動故障轉移(Automatic failover):當一個主服務器不能正常工作時, Sentinel 會開始一次自動故障遷移操作, 它會將失效主服務器的其中一個從服務器升級為新的主服務器, 并讓失效主服務器的其他從服務器改為復制新的主服務器; 當客戶端試圖連接失效的主服務器時, 集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。

 

部署

  同樣,我們還是將每個哨兵部署在一個單獨的容器中。

  sentinel配置文件

  redis-sentinel1:https://github.com/Johnson19900110/johnsondock/blob/master/redis-sentinel/config/sentinel.conf
  redis-sentinel2:https://github.com/Johnson19900110/johnsondock/blob/master/redis-sentinel/config/sentinel-slave1.conf
  redis-sentinel3:https://github.com/Johnson19900110/johnsondock/blob/master/redis-sentinel/config/sentinel-slave2.conf

  這三個配置文件一模一樣,都是監聽master的。要不你把這個配置文件copy到容器中,要不你就創建三份,分別掛載到容器中,這里選擇了后面一種方法。

  這里介紹幾個基本的配置

    sentinel monitor mymaster redis 6379 2 監聽的master的容器別名為redis,端口是6379,最后面的2是當大于等于2個哨兵認為master主觀下線后(無論這個值為多少,至少得有一半以上的哨兵判定master主觀下線后,master才會被客觀下線),master才會被客觀下線,這是sentinel重新從slave中選舉一個來當master。

    sentinel auth-pass mymaster 123456 如果master配置了密碼,則此項必須配置,否則sentinel會將master標記問主觀下線(sdown)。

 

  Docker-composer配置文件

### REDIS-SENTINEL ################################################
  # master
  redis-sentinel:
    image: johnson19900110/redis-sentinel:latest
    restart: always  #如果master未開啟數據持久化,此項應該刪除
    volumes:
      - ./redis-sentinel/config/sentinel.conf:/usr/local/etc/redis/redis-sentinel.conf
    networks:
      - backend
    depends_on:
      - redis

  # redis sentinel slave 1
  redis-sentinel-slave1:
    image: johnson19900110/redis-sentinel:latest
    restart: always
    volumes:
      - ./redis-sentinel/config/sentinel-slave1.conf:/usr/local/etc/redis/redis-sentinel.conf
    networks:
      - backend
    depends_on:
      - redis-slave1
      - redis-sentinel

  # redis sentinel slave 2
  redis-sentinel-slave2:
    image: johnson19900110/redis-sentinel:latest
    restart: always
    volumes:
      - ./redis-sentinel/config/sentinel-slave2.conf:/usr/local/etc/redis/redis-sentinel.conf
    networks:
      - backend
    depends_on:
      - redis-slave2
      - redis-sentinel-slave1

  

  啟動容器

docker-compose up -d redis-sentinel-slave2

執行以上命令后,就啟動了三個哨兵模式的容器

Redis集群做法的難點,百萬并發客戶端「實戰」

 

這是我們進入容器,查看是否redis-sentinel是否在工作。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

我們可看到,已經與master建立連接,通過status=ok可以知道,master正在正常工作,并且有2個從節點和3個哨兵節點。現在你再打開sentinel的配置文件,會發現發生了改變。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

conf文件被重寫了,并且哨兵模式會自動檢測到master的兩個slave和另外兩個sentinel。

 

故障演示

  1、使master宕機,只需要關閉master的容器即可。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

如果此時再去三個哨兵節點里用info sentinel查看信息。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

會發現這時候master節點的address信息變了,這就說明哨兵模式起作用了。但他這里還是顯示新的master有兩個slave。是因為原master節點宕機了,一旦它重啟,sentinel就會把它變成新的master節點的slave節點。我們可以去172.18.0.6這個容器中看下。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

可以用以上docker命令查看容器的IP地址。進入容器后,還是在redis-cli下用info replication查看信息。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

我們可以看到這個slave變成了新的master,另外一個slave也變成了新master節點的slave。如果你查看redis節點的配置文件,會發現也被重寫了。 這是我們再重啟原master節點試試(注意:當他重啟成功后,就變成了slave節點,所以要打開持久化配置)。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

當容器重啟成功后,我們再去新的master節點中使用info replication查看下。

Redis集群做法的難點,百萬并發客戶端「實戰」

 

正如我們所料,它成為了新的master的slave節點。如果你查看原master的配置文件,會發現多了

Redis集群做法的難點,百萬并發客戶端「實戰」

 

最后,因為新的master節點是slave節點升級的,所以他的持久化配置還是存在的,如果你想要關掉它,只需要進入redis-cli,然后執行

Redis集群做法的難點,百萬并發客戶端「實戰」

 

至此,一次redis的master節點故障轉移就演示完成了。這次演示實現了redis的監控自動故障轉移特性。

提醒特性是使用的訂閱功能,需要后端代碼開發配合的。

Cluster模式

部署

  • 這里使用ruby部署redis cluster,首先下載安裝,只需要在一臺服務器上安裝即可
    yum install rubyyum install rubygems
  • 下載ruby運行需要的包,這里是redis-3.3.5.gem,安裝
    gem install redis-3.3.5.gem
  • 拷貝redis/src/redis-trib.rb 到redis安裝目的,我這里是/data/service/bin/
  • 這里需要6臺服務器,為了方便,每一臺服務器上起2個服務,端口分別是6379,6380
  • 修改每一個redis.conf(6臺都需要),注釋掉cluster-enabled yes
  • 請啟動每一個redis服務
創建啟動集群的啟動腳本,內容如下:
/redis-trib.rb create --replicas 1 192.168.25.128:7001 192.168.25.128:7002 192.168.25.128:7003 192.168.25.128:7004 192.168.25.128:7005 192.168.25.128:7006
執行此腳本Creating cluster
Connecting to node 192.168.25.128:7001: OK
Connecting to node 192.168.25.128:7002: OK
Connecting to node 192.168.25.128:7003: OK
Connecting to node 192.168.25.128:7004: OK
Connecting to node 192.168.25.128:7005: OK
Connecting to node 192.168.25.128:7006: OKPerforming hash slots allocation on 6 nodes…
Using 3 masters:
192.168.25.128:7001
192.168.25.128:7002
192.168.25.128:7003
Adding replica 192.168.25.128:7004 to 192.168.25.128:7001
Adding replica 192.168.25.128:7005 to 192.168.25.128:7002
Adding replica 192.168.25.128:7006 to 192.168.25.128:7003
M: 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3 192.168.25.128:7001
slots:0-5460 (5461 slots) master
M: 8cd93a9a943b4ef851af6a03edd699a6061ace01 192.168.25.128:7002
slots:5461-10922 (5462 slots) master
M: 2935007902d83f20b1253d7f43dae32aab9744e6 192.168.25.128:7003
slots:10923-16383 (5461 slots) master
S: 74f9d9706f848471583929fc8bbde3c8e99e211b 192.168.25.128:7004
replicates 2e48ae301e9c32b04a7d4d92e15e98e78de8c1f3
S: 42cc9e25ebb19dda92591364c1df4b3a518b795b 192.168.25.128:7005
replicates 8cd93a9a943b4ef851af6a03edd699a6061ace01
S: 8b1b11d509d29659c2831e7a9f6469c060dfcd39 192.168.25.128:7006
replicates 2935007902d83f20b1253d7f43dae32aab9744e6
Can I set the above configuration? (type ‘yes’ to accept): yesNodes configuration updated
。。。。。。。。。。省略。。。。。。
test it!
注意:
可能遇到到問題
1、xxx is not Empty,請停著個xxx的節點,刪除bin目錄下的dump.rdb,notes.conf,note6380.conf,必要時刪除/var/run/redis.pid
2、cannot connect to xxxx,你著redis配置密碼了,在ruby的client里面寫上你配置的密碼,具體怎么找這個文件,find命令
3、執行集群啟動基本一直卡在:Waiting for the cluster to join …,請在你服務器上開啟16379和16380端口,反正就是10000+你redis的端口

三、原理

原理圖如下

Redis集群做法的難點,百萬并發客戶端「實戰」

 

eids cluster模式最小得6個服務,每個服務之間通過ping-pong機制實現相互感知(注意:此模式沒有單獨的哨兵監控,集群內部完全自制)。redis集群數據存儲類似于hashmap,其將數據劃成16484個片區(又叫插槽,每個槽可以放n多個數據),通過對key進行一定的算法與16384取模,得到其在16384中間的一個片區中。如上圖姑且認為1-4;2-5;3-6,兩兩結對,前者為master負責寫(其實也具備讀能力),后者slave負責讀,而且是只讀,防止數據出現不一致,同時slave從master同步數據。按照上述配對,1-4主從將只負責0-5500片區的讀寫;2~5主從只負責5501-11000片區的讀寫;3-6主從負責11001-16383片區的讀寫,從而實現了分攤了讀寫的壓力。

三、容災恢復

  • 主節點(如1)宕機,從節點(如4)將上位成master
  • 主節點又活了,角色反轉為slave
  • 主從成對的宕機,redis cluster將重新在剩下的節點上分配16384個片區(通過配置:cluster-require-full-coverage)

四、JAVA如何使用

public void jedisCluster() throws Exception { // 這里建議能把所有節點都寫上就寫上,防止單點連接失敗 Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort(yourIp, 7001)); nodes.add(new HostAndPort(yourIp, 7002)); nodes.add(new HostAndPort(yourIp, 7003)); nodes.add(new HostAndPort(yourIp, 7004)); nodes.add(new HostAndPort(yourIp, 7005)); nodes.add(new HostAndPort(yourIp, 7006)); JedisCluster jedisCluster = new JedisCluster(nodes); jedisCluster.set("k1", "100"); String result = jedisCluster.get("k1"); System.out.println(result); jedisCluster.close();

探討cluster模式存在的問題

  • 多鍵操作不支持(如mset k1 v1 k2 v2;k1,k2可能不在一個服務器上)
  • 由于多鍵操作不支持直接導致redis事物不支持
  • 由于多鍵操作不支持直接導致redis可能不支持luna腳本(未測試),那些希望通過redis搭配

 

總結;文章內容僅代表個人觀點,如有不正之處,歡迎批評指正,謝謝大家。

luna腳本實現搶購秒殺方案的可能需要在測試一下,有空本人在測試一下。

有一起學習的可以后臺私信“資料”領取視頻資料 各大廠面試題內容包括C/C++,linux,Nginx,golang,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,ffmpeg,流媒體, 音視頻,CDN,P2P,K8S,Docker,Golang,TCP/IP,協程,嵌入式,ARM,DPDK等等。。。

分享到:
標簽:集群 Redis
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定