<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Redis 集群搭建

          共 10701字,需瀏覽 22分鐘

           ·

          2020-12-05 21:19

          Redis?是一個(gè)?K-V?存儲(chǔ)系統(tǒng),是一個(gè)高性能的?K-V?數(shù)據(jù)庫(kù),是目前大規(guī)模使用的緩存中間件。單節(jié)點(diǎn)的Redis?已經(jīng)就達(dá)到了很高的性能,為了提高可用性我們可以使用?Redis?集群。


          集群簡(jiǎn)介

          Redis?集群是一個(gè)可以在多個(gè)?Redis?節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享的設(shè)施(installation)。

          Redis?集群不支持那些需要同時(shí)處理多個(gè)鍵的?Redis?命令, 因?yàn)閳?zhí)行這些命令需要在多個(gè)?Redis?節(jié)點(diǎn)之間移動(dòng)數(shù)據(jù), 并且在高負(fù)載的情況下, 這些命令將降低?Redis?集群的性能,并導(dǎo)致不可預(yù)測(cè)的行為。

          Redis?集群通過(guò)分區(qū)(partition)來(lái)提供一定程度的可用性(availability):即使集群中有一部分節(jié)點(diǎn)失效或者無(wú)法進(jìn)行通訊,集群也可以繼續(xù)處理命令請(qǐng)求。

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

          • 將數(shù)據(jù)自動(dòng)切分(split)到多個(gè)節(jié)點(diǎn)的能力

          • 當(dāng)集群中的一部分節(jié)點(diǎn)失效或者無(wú)法進(jìn)行通訊時(shí),仍然可以繼續(xù)處理命令請(qǐng)求的能力

          集群說(shuō)明

          集群數(shù)據(jù)共享

          Redis?集群使用數(shù)據(jù)分片(sharding)而非一致性哈希(consistency hashing)來(lái)實(shí)現(xiàn):一個(gè)?Redis?集群包含?16384?個(gè)哈希槽(hash slot),數(shù)據(jù)庫(kù)中的每個(gè)鍵都屬于這?16384?個(gè)哈希槽的其中一個(gè),集群使用公式?CRC16(key) % 16384?來(lái)計(jì)算鍵?key?屬于哪個(gè)槽,其中?CRC16(key)?語(yǔ)句用于計(jì)算鍵?key?的?CRC16?校驗(yàn)和。

          集群中的每個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分哈希槽

          一個(gè)集群可以有三個(gè)哈希槽,其中:

          • 節(jié)點(diǎn)?A?負(fù)責(zé)處理?0?號(hào)至?5500?號(hào)哈希槽

          • 節(jié)點(diǎn)?B?負(fù)責(zé)處理?5501?號(hào)至?11000?號(hào)哈希槽

          • 節(jié)點(diǎn)?C?負(fù)責(zé)處理?11001?號(hào)至?16384?號(hào)哈希槽

          集群中的主從復(fù)制

          為了使得集群在一部分節(jié)點(diǎn)下線或者無(wú)法與集群的大多數(shù)(majority)節(jié)點(diǎn)進(jìn)行通訊的情況下,仍然可以正常運(yùn)作,Redis?集群對(duì)節(jié)點(diǎn)使用了主從復(fù)制功能:集群中的每個(gè)節(jié)點(diǎn)都有?1?個(gè)至?N?個(gè)復(fù)制品(replica),其中一個(gè)復(fù)制品為主節(jié)點(diǎn)(master),而其余的?N-1?個(gè)復(fù)制品為從節(jié)點(diǎn)(slave

          集群?TCP?端口

          每個(gè)?Redis Cluster?節(jié)點(diǎn)都需要?2?個(gè)?TCP?連接打開,正常的?Redis TCP?端口被服務(wù)于客戶端,例如:6379,加上通過(guò)增加?10000?到數(shù)據(jù)端口獲取的端口,例如:16379

          第二個(gè)高端口被用來(lái)?Redis Cluster Bus,也就是使用二進(jìn)制協(xié)議的一個(gè)節(jié)點(diǎn)到節(jié)點(diǎn)的通信信道。Redis Cluster Bus?被節(jié)點(diǎn)用于故障檢測(cè),配置更新,故障轉(zhuǎn)移授權(quán)等等。客戶端不應(yīng)該嘗試與?Redis Cluster Bus?端口進(jìn)行通信,而是始終使用正常的?Redis?命令端口,然而要確保在防火墻中打開兩個(gè)端口,否則?Redis Cluster?節(jié)點(diǎn)將無(wú)法通信。

          命令端口和?Redis Cluster Bus?端口偏移是固定的,始終為?10000

          注意,為了使?Redis Cluster?正常工作,你需要為每個(gè)節(jié)點(diǎn):

          • 用于客戶端進(jìn)行通信的普通客戶端通信端口(通常使用?6379)對(duì)所有需要到達(dá)集群的客戶端,以及所有其它集群節(jié)點(diǎn)(使用客戶端端口進(jìn)行密鑰遷移)都是開放的

          • Redis Cluster Bus?端口(客戶端端口?+10000)必須可從所有其它集群節(jié)點(diǎn)訪問(wèn)

          如果不打開兩個(gè)?TCP?端口,集群將無(wú)法按預(yù)期工作

          Redis Cluster Bus?使用不同的二進(jìn)制協(xié)議進(jìn)行節(jié)占到節(jié)點(diǎn)的數(shù)據(jù)交換,這更適合于使用少量的帶寬和處理時(shí)間交換節(jié)點(diǎn)之間的信息

          安裝依賴

          $ sudo gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3$ sudo curl -sSL https://get.rvm.io | bash -s stable$ sudo source ~/.rvm/scripts/rvm$ sudo echo "ruby_url=https://cache.ruby-china.org/pub/ruby" > ~/.rvm/user/db$ rvm -v$ sudo rvm install 2.4.1$ sudo gem update$ sudo gem install redis

          集群配置

          安裝 Redis

          $ cd ~$ wget http://download.redis.io/releases/redis-4.0.9.tar.gz$ tar xzf redis-4.0.9.tar.gz$ cd redis-4.0.9$ sudo make

          創(chuàng)建配置目錄

          $ sudo mkdir -pv /usr/local/redis-cluster/{bin,etc,log,run,var}

          創(chuàng)建配置文件

          $ sudo cp ~/redis-4.0.9/redis.conf /usr/local/redis-cluster/etc/redis-7001.conf

          復(fù)制命令文件

          $ cd ~/redis-4.0.9/src/$ sudo cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-sentinel redis-cli redis-server /usr/local/redis-cluster/bin

          修改配置文件

          $ sudo vim /usr/local/redis-cluster/etc/redis-7001.confbind 192.168.33.110port 7001daemonize yes
          pidfile /user/local/redis-cluster/run/7001.pidlogfile /usr/local/redis-cluster/log/7001.logdbfilename dump-7001.rdb
          dir /usr/local/redis-cluster/var
          appendonly yesappendfilename "appendonly-7001.aof"
          cluster-enabled yescluster-config-file nodes-7001.confcluster-node-timeout 15000

          復(fù)制配置文件

          將復(fù)制后的文件中的?7001?換成相應(yīng)的名稱

          $ sudo cp /usr/local/redis-cluster/etc/redis-7001.conf /usr/local/redis-cluster/etc/redis-7002.conf$ sudo cp /usr/local/redis-cluster/etc/redis-7001.conf /usr/local/redis-cluster/etc/redis-7003.conf$ sudo cp /usr/local/redis-cluster/etc/redis-7001.conf /usr/local/redis-cluster/etc/redis-7004.conf$ sudo cp /usr/local/redis-cluster/etc/redis-7001.conf /usr/local/redis-cluster/etc/redis-7005.conf$ sudo cp /usr/local/redis-cluster/etc/redis-7001.conf /usr/local/redis-cluster/etc/redis-7006.conf

          集群部署

          啟動(dòng)節(jié)點(diǎn)

          // 啟動(dòng)配置的所有節(jié)點(diǎn)$ sudo /usr/local/redis-cluster/bin/redis-cli /usr/local/redis-cluster/etc/redis-7001.conf$ sudo /usr/local/redis-cluster/bin/redis-cli /usr/local/redis-cluster/etc/redis-7002.conf$ sudo /usr/local/redis-cluster/bin/redis-cli /usr/local/redis-cluster/etc/redis-7003.conf$ sudo /usr/local/redis-cluster/bin/redis-cli /usr/local/redis-cluster/etc/redis-7004.conf$ sudo /usr/local/redis-cluster/bin/redis-cli /usr/local/redis-cluster/etc/redis-7005.conf$ sudo /usr/local/redis-cluster/bin/redis-cli /usr/local/redis-cluster/etc/redis-7006.conf

          檢查服務(wù)

          $ ps -ef | grep redisroot     20077     1  0 May18 ?        00:01:04 /usr/local/bin/redis-server 192.168.33.110:7001 [cluster]root     20079     1  0 May18 ?        00:01:03 /usr/local/bin/redis-server 192.168.33.110:7002 [cluster]root     20081     1  0 May18 ?        00:01:03 /usr/local/bin/redis-server 192.168.33.110:7003 [cluster]root     20089     1  0 May18 ?        00:01:03 /usr/local/bin/redis-server 192.168.33.110:7004 [cluster]root     20091     1  0 May18 ?        00:01:03 /usr/local/bin/redis-server 192.168.33.110:7005 [cluster]root     20096     1  0 May18 ?        00:01:03 /usr/local/bin/redis-server 192.168.33.110:7006 [cluster]

          停止節(jié)點(diǎn)

          $ sudo /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7001 shutdown

          節(jié)點(diǎn)加入集群

          $ sudo cp ~/redis-4.0.9/src/redis-trib.rb /usr/local/redis-cluster/bin/redis-trib$ sudo chmod a+x /usr/local/redis-cluster/bin/redis-trib$ sudo /usr/local/redis-cluster/bin/redis-trib create --replicas 1 \> 192.168.33.110:7001 \> 192.168.33.110:7002 \> 192.168.33.110:7003 \> 192.168.33.110:7004 \> 192.168.33.110:7005 \> 192.168.33.110:7006 \>>> Creating cluster>>> Performing hash slots allocation on 6 nodes...Using 3 masters:127.0.0.1:7001127.0.0.1:7002127.0.0.1:7003Adding replica 127.0.0.1:7005 to 127.0.0.1:7001Adding replica 127.0.0.1:7006 to 127.0.0.1:7002Adding replica 127.0.0.1:7004 to 127.0.0.1:7003>>> Trying to optimize slaves allocation for anti-affinity[WARNING] Some slaves are in the same host as their masterM: 4ed7d8f54311fb883431c1c5a4715c1ae59d5215 127.0.0.1:7001   slots:0-5460 (5461 slots) masterM: 31030e4c35659d5de1146941a2d1f2c1524b53e9 127.0.0.1:7002   slots:5461-10922 (5462 slots) masterM: 573752b8b0747bc2c7bb3e4a1edb0e467cfdef0e 127.0.0.1:7003   slots:10923-16383 (5461 slots) masterS: 11f577639b081c1514f28a74764c9330d819dcb8 127.0.0.1:7004   replicates 573752b8b0747bc2c7bb3e4a1edb0e467cfdef0eS: ff6d7ca3ea29036385c89a5dc93f807f91307871 127.0.0.1:7005   replicates 4ed7d8f54311fb883431c1c5a4715c1ae59d5215S: a6f79f4d1de8d7bef4911e934b802829ed29a2d3 127.0.0.1:7006   replicates 31030e4c35659d5de1146941a2d1f2c1524b53e9Can I set the above configuration? (type 'yes' to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join..>>> Performing Cluster Check (using node 127.0.0.1:7001)M: 4ed7d8f54311fb883431c1c5a4715c1ae59d5215 127.0.0.1:7001   slots:0-5460 (5461 slots) master   1 additional replica(s)S: 11f577639b081c1514f28a74764c9330d819dcb8 127.0.0.1:7004   slots: (0 slots) slave   replicates 573752b8b0747bc2c7bb3e4a1edb0e467cfdef0eS: a6f79f4d1de8d7bef4911e934b802829ed29a2d3 127.0.0.1:7006   slots: (0 slots) slave   replicates 31030e4c35659d5de1146941a2d1f2c1524b53e9S: ff6d7ca3ea29036385c89a5dc93f807f91307871 127.0.0.1:7005   slots: (0 slots) slave   replicates 4ed7d8f54311fb883431c1c5a4715c1ae59d5215M: 31030e4c35659d5de1146941a2d1f2c1524b53e9 127.0.0.1:7002   slots:5461-10922 (5462 slots) master   1 additional replica(s)M: 573752b8b0747bc2c7bb3e4a1edb0e467cfdef0e 127.0.0.1:7003   slots:10923-16383 (5461 slots) master   1 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.

          啟動(dòng)腳本

          $ sudo vim /usr/local/redis-cluster/bin/start.sh#!/usr/bin/env bash
          RedisServerPath=/usr/local/redis-cluster/binRedisConfPath=/usr/local/redis-cluster/etc
          for i in 1 2 3 4 5 6; do $RedisServerPath/redis-server $RedisConfPath/redis-700$i.confdone
          /usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 \192.168.33.110:7001 \192.168.33.110:7002 \192.168.33.110:7003 \192.168.33.110:7004 \192.168.33.110:7005 \192.168.33.110:7006 \$ sudo chmod a+x /usr/local/redis-cluster/bin/start.sh
          • 停止腳本

          $ sudo vim /usr/local/redis-cluster/bin/stop.sh#!/usr/bin/env bash
          RedisClusterPath=/usr/local/redis-clusterRedisCliPath=/usr/local/redis-cluster/binip=192.168.33.110
          for i in 1 2 3 4 5 6; do $RedisCliPath/redis-cli -c -h $ip -p 700$i shutdowndone
          rm -rf $RedisClusterPath/log/*rm -rf $RedisClusterPath/run/*rm -rf $RedisClusterPath/var/*$ sudo chmod a+x /usr/local/redis-cluster/bin/stop.sh

          查看信息

          $ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7001192.168.33.110:7001> cluster nodes # 查看節(jié)點(diǎn)信息5521b06a46910c873e7ee8a274f2cb9fc41ffed1 192.168.33.110:7003@17003 master - 0 1526681994008 3 connected 10923-163838153a1b35e0fab1e48f0171653f6cffd82cbc5a6 192.168.33.110:7004@17004 slave d7e0395152496f41fe73fbbdabc8499c79f6632e 0 1526681996033 4 connecteda2ff29661185f6ad17c99232d0490b3814ba0164 192.168.33.110:7006@17006 slave affc237bf177fd4ac591314736a1358e16545d0c 0 1526681995020 6 connectedd7e0395152496f41fe73fbbdabc8499c79f6632e 192.168.33.110:7002@17002 master - 0 1526681993000 2 connected 5461-109228b613e4b5abbdf3c2486dfcb8bc1e9dde1897820 192.168.33.110:7005@17005 slave 5521b06a46910c873e7ee8a274f2cb9fc41ffed1 0 1526681993000 5 connectedaffc237bf177fd4ac591314736a1358e16545d0c 192.168.33.110:7001@17001 myself,master - 0 1526681994000 1 connected 0-5460192.168.33.110:7001> cluster info # 查看集群信息cluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:59501cluster_stats_messages_pong_sent:61755cluster_stats_messages_sent:121256cluster_stats_messages_ping_received:61750cluster_stats_messages_pong_received:59501cluster_stats_messages_meet_received:5cluster_stats_messages_received:121256

          相關(guān)命令

          實(shí)例操作

          客戶端操作

          // 從某個(gè)節(jié)點(diǎn)設(shè)置值后,去不同的節(jié)點(diǎn)獲取設(shè)置的值$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7001192.168.33.110:7001> set foo bar-> Redirected to slot [12182] located at 192.168.33.110:7003OK$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7001192.168.33.110:7001> get foo-> Redirected to slot [12182] located at 192.168.33.110:7003"bar"$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7002192.168.33.110:7002> get foo-> Redirected to slot [12182] located at 192.168.33.110:7003"bar"$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7003192.168.33.110:7003> get foo"bar"$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7004192.168.33.110:7004> get foo-> Redirected to slot [12182] located at 192.168.33.110:7003"bar"$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7005192.168.33.110:7005> get foo-> Redirected to slot [12182] located at 192.168.33.110:7003"bar"$ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7006192.168.33.110:7006> get foo-> Redirected to slot [12182] located at 192.168.33.110:7003"bar"

          程序操作

          下載安裝

          • Flexible and feature-complete Redis client for PHP and HHVM

          • Quick tour

          $ cd ~$ mkdir test$ cd test$ composer init$ composer install$ composer require predis/predis

          測(cè)試代碼


          require __DIR__ . '/vendor/autoload.php';
          for ($i = 0; $i < 6; $i++) { $parameters[] = [ 'host' => '192.168.33.110', 'port' => '700' . $i, 'password' => null, 'database' => 0, 'timeout' => 5, 'read_write_timeout' => 5, ];}$options = ['cluster' => 'redis'];
          try { $cluster = new \Predis\Client($parameters, $options);} catch (\Predis\PredisException $e) { echo $e->getMessage(); exit();}
          for ($i = 1; $i < 100; $i++) { $format = 'No.%s is a RedisCluster test.'; $cluster->set("$i", sprintf($format, $i)); echo $cluster->get("$i") . PHP_EOL;}

          測(cè)試結(jié)果

          $ php cluster.phpNo.1 is a Redis cluster test.No.2 is a Redis cluster test.No.3 is a Redis cluster test....No.99 is a Redis cluster test.
          $ /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.33.110 -p 7001192.168.33.110:7001> get 11"No.11 is a RedisCluster test."192.168.33.110:7001> get 23-> Redirected to slot [9671] located at 192.168.33.110:7002"No.23 is a RedisCluster test."192.168.33.110:7002> get 33"No.33 is a RedisCluster test."192.168.33.110:7002> get 67"No.67 is a RedisCluster test."192.168.33.110:7002> get 88-> Redirected to slot [15207] located at 192.168.33.110:7003"No.88 is a RedisCluster test."192.168.33.110:7003> get 99-> Redirected to slot [6263] located at 192.168.33.110:7002"No.99 is a RedisCluster test."192.168.33.110:7002> get 100-> Redirected to slot [339] located at 192.168.33.110:7001(nil)192.168.33.110:7001> get 17-> Redirected to slot [12304] located at 192.168.33.110:7003"No.17 is a RedisCluster test."192.168.33.110:7003> get 42-> Redirected to slot [8000] located at 192.168.33.110:7002"No.42 is a RedisCluster test."192.168.33.110:7002> get 56-> Redirected to slot [11509] located at 192.168.33.110:7003"No.56 is a RedisCluster test."192.168.33.110:7003> get 61-> Redirected to slot [2369] located at 192.168.33.110:7001"No.61 is a RedisCluster test."

          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色电影一级片电影网址 | 久久久91精品国产一区陈可心 | 久久亚洲精品成人777 | 久久综合se婷婷 | 久操激情网 |