濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > Redis集群搭建全記錄

Redis集群搭建全記錄

熱門標(biāo)簽:北京語(yǔ)音電銷機(jī)器人價(jià)格 邯鄲外呼調(diào)研線路 武漢呼叫中心外呼系統(tǒng)線路商 買了外呼系統(tǒng)不想用了怎么辦 電話機(jī)器人電話卡封號(hào)怎么辦 真人語(yǔ)音電銷機(jī)器人系統(tǒng) 開封百應(yīng)電銷機(jī)器人聯(lián)系方式 樂昌電話機(jī)器人 浦東上海400開頭的電話申請(qǐng)

Redis集群是一個(gè)提供在多個(gè)Redis節(jié)點(diǎn)間共享數(shù)據(jù)的程序集。

  Redis集群中不支持處理多個(gè)keys的命令。

  Redis集群通過(guò)分區(qū)來(lái)提供一定程度的可用性。在某個(gè)節(jié)點(diǎn)宕機(jī)或者不可用的時(shí)候可以繼續(xù)處理命令。

Redis集群數(shù)據(jù)分片

  在Redis集群中,使用數(shù)據(jù)分片(sharding)而不是一致性hash(consistency hashing)來(lái)實(shí)現(xiàn),一個(gè)Redis集群包含16384個(gè)哈希槽(hash slot),數(shù)據(jù)庫(kù)中的每個(gè)鍵都存在這些哈希槽中的某一個(gè),通過(guò)CRC16校驗(yàn)后對(duì)16384取模來(lái)決定。

  加入說(shuō)現(xiàn)在集群中有三個(gè)節(jié)點(diǎn),那么

 ?、俟?jié)點(diǎn)A包含0到5500號(hào)哈希槽。

  ②節(jié)點(diǎn)B包含5501到11000號(hào)哈希槽。

 ?、酃?jié)點(diǎn)C包含11001到16384號(hào)哈希槽。

  然后如果我們要增加一個(gè)節(jié)點(diǎn)的時(shí)候,會(huì)從ABC三個(gè)節(jié)點(diǎn)分別得到一部分槽到D上。如果我們移除一個(gè)節(jié)點(diǎn)的時(shí)候,就會(huì)把移除的節(jié)點(diǎn)的分隔槽移到剩下的槽上面。

Redis主從復(fù)制模型

  為了實(shí)現(xiàn)Redis的集群的高可用性。Redis提供了一個(gè)主從復(fù)制模型。每個(gè)節(jié)點(diǎn)都會(huì)有N-1個(gè)復(fù)制品。

  如果在創(chuàng)建集群的時(shí)候,我們?yōu)槊總€(gè)節(jié)點(diǎn)添加了一個(gè)從節(jié)點(diǎn),這時(shí)候,如果其中的某個(gè)主節(jié)點(diǎn)掛掉了,便會(huì)把它的從節(jié)點(diǎn)做為新的主節(jié)點(diǎn),繼續(xù)提供服務(wù)。但是如果主節(jié)點(diǎn)和從節(jié)點(diǎn)都掛掉了,那就不可以繼續(xù)使用了。

Redis集群搭建

  Redis集群由多個(gè)云新在集群模式下的Redis實(shí)例組成。實(shí)例的集群模式需要通過(guò)配置來(lái)開啟。

  下面是一個(gè)包含了最少選項(xiàng)的集群配置文件實(shí)例:

port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
pidfile /var/run/redis_xxxx.pid
dir /usr/local/redis-cluster/xxxx

port指定了節(jié)點(diǎn)的端口號(hào)

cluster-enabled yes選項(xiàng)用于開啟實(shí)例的集群模式

cluster-config-file nodes.conf設(shè)置了保存節(jié)點(diǎn)的配置文件路徑,這個(gè)文件無(wú)須認(rèn)為修改,是在集群?jiǎn)?dòng)的時(shí)候創(chuàng)建。

cluster-node-timeout 5000:設(shè)置了方式失敗的等待時(shí)間。即5秒還訪問(wèn)不了就認(rèn)為這個(gè)節(jié)點(diǎn)不可用。

appendonly yes:用于開啟aof持久化

 pidfile /var/run/redis_xxxx.pid設(shè)置pid文件的位置,其中xxxx為端口號(hào)

dir /usr/local/redis-cluster/xxxx設(shè)置工作目錄,其中xxxx為端口號(hào)。

此時(shí)目錄中的文件是這樣的

[root@localhost 10:49 /usr/local/redis-cluster]# ll 7000 7001 7002 7003 7004 7005
7000:
總用量 7080
-rw-r--r--. 1 root root  57787 9月 10 10:44 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 09:50 redis-server

7001:
總用量 7080
-rw-r--r--. 1 root root  57787 9月 10 10:46 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7002:
總用量 7080
-rw-r--r--. 1 root root  57787 9月 10 10:46 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7003:
總用量 7080
-rw-r--r--. 1 root root  57787 9月 10 10:47 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7004:
總用量 7080
-rw-r--r--. 1 root root  57787 9月 10 10:48 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7005:
總用量 7080
-rw-r--r--. 1 root root  57787 9月 10 10:48 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server
[root@localhost 10:49 /usr/local/redis-cluster]#

下面啟動(dòng)這六個(gè)節(jié)點(diǎn)

[root@localhost 10:51 /usr/local/redis-cluster]# ./7000/redis-server ./7000/redis.conf
3547:C 10 Sep 10:51:58.519 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3547:C 10 Sep 10:51:58.519 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3547, just started
3547:C 10 Sep 10:51:58.519 # Configuration loaded
[root@localhost 10:51 /usr/local/redis-cluster]# ./7001/redis-server ./7001/redis.conf
3552:C 10 Sep 10:52:05.549 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3552:C 10 Sep 10:52:05.550 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3552, just started
3552:C 10 Sep 10:52:05.550 # Configuration loaded
[root@localhost 10:52 /usr/local/redis-cluster]# ./7002/redis-server ./7002/redis.conf
3557:C 10 Sep 10:52:13.098 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3557:C 10 Sep 10:52:13.098 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3557, just started
3557:C 10 Sep 10:52:13.098 # Configuration loaded
[root@localhost 10:52 /usr/local/redis-cluster]# ./7003/redis-server ./7003/redis.conf
3563:C 10 Sep 10:52:18.986 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3563:C 10 Sep 10:52:18.986 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3563, just started
3563:C 10 Sep 10:52:18.986 # Configuration loaded
[root@localhost 10:52 /usr/local/redis-cluster]# ./7004/redis-server ./7004/redis.conf
3568:C 10 Sep 10:52:23.709 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3568:C 10 Sep 10:52:23.710 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3568, just started
3568:C 10 Sep 10:52:23.710 # Configuration loaded
[root@localhost 10:52 /usr/local/redis-cluster]# ./7005/redis-server ./7005/redis.conf
3573:C 10 Sep 10:52:27.146 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
3573:C 10 Sep 10:52:27.147 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3573, just started
3573:C 10 Sep 10:52:27.147 # Configuration loaded
[root@localhost 10:52 /usr/local/redis-cluster]#

查看啟動(dòng)后的進(jìn)程:

[root@localhost 10:52 /usr/local/redis-cluster]# ps aux|grep redis
root   3548 0.2 0.2 41964 2288 ?    Ssl 10:51  0:00 ./7000/redis-server 127.0.0.1:7000 [cluster]
root   3553 0.1 0.2 41964 2288 ?    Ssl 10:52  0:00 ./7001/redis-server 127.0.0.1:7001 [cluster]
root   3558 0.2 0.2 41964 2288 ?    Ssl 10:52  0:00 ./7002/redis-server 127.0.0.1:7002 [cluster]
root   3564 0.1 0.2 41964 2292 ?    Ssl 10:52  0:00 ./7003/redis-server 127.0.0.1:7003 [cluster]
root   3569 0.2 0.2 41964 2292 ?    Ssl 10:52  0:00 ./7004/redis-server 127.0.0.1:7004 [cluster]
root   3574 0.1 0.2 41964 2288 ?    Ssl 10:52  0:00 ./7005/redis-server 127.0.0.1:7005 [cluster]
root   3580 0.0 0.0  6048  784 pts/2  S+  10:52  0:00 grep redis
[root@localhost 10:52 /usr/local/redis-cluster]#

再次查看文件目錄:

[root@localhost 11:01 /usr/local/redis-cluster]# ll 7000 7001 7002 7003 7004 7005
7000:
總用量 7084
-rw-r--r--. 1 root root    0 9月 10 10:51 appendonly.aof
-rw-r--r--. 1 root root   114 9月 10 10:51 nodes-7000.conf
-rw-r--r--. 1 root root  57787 9月 10 10:44 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 09:50 redis-server

7001:
總用量 7084
-rw-r--r--. 1 root root    0 9月 10 10:52 appendonly.aof
-rw-r--r--. 1 root root   114 9月 10 10:52 nodes-7001.conf
-rw-r--r--. 1 root root  57787 9月 10 10:46 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7002:
總用量 7084
-rw-r--r--. 1 root root    0 9月 10 10:52 appendonly.aof
-rw-r--r--. 1 root root   114 9月 10 10:52 nodes-7002.conf
-rw-r--r--. 1 root root  57787 9月 10 10:46 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7003:
總用量 7084
-rw-r--r--. 1 root root    0 9月 10 10:52 appendonly.aof
-rw-r--r--. 1 root root   114 9月 10 10:52 nodes-7003.conf
-rw-r--r--. 1 root root  57787 9月 10 10:47 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7004:
總用量 7084
-rw-r--r--. 1 root root    0 9月 10 10:52 appendonly.aof
-rw-r--r--. 1 root root   114 9月 10 10:52 nodes-7004.conf
-rw-r--r--. 1 root root  57787 9月 10 10:48 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server

7005:
總用量 7084
-rw-r--r--. 1 root root    0 9月 10 10:52 appendonly.aof
-rw-r--r--. 1 root root   114 9月 10 10:52 nodes-7005.conf
-rw-r--r--. 1 root root  57787 9月 10 10:48 redis.conf
-rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server
[root@localhost 11:01 /usr/local/redis-cluster]#

可以看到生成了aof和nodes文件,保存的時(shí)候還會(huì)有dump文件生成。

在看看pid

[root@localhost 11:03 /usr/local/redis-cluster]# ll /var/run/redis*
-rw-r--r--. 1 root root 5 9月 10 10:51 /var/run/redis_7000.pid
-rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7001.pid
-rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7002.pid
-rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7003.pid
-rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7004.pid
-rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7005.pid
[root@localhost 11:03 /usr/local/redis-cluster]#

接下來(lái),我們就需要使用redis-trib工具和這六個(gè)節(jié)點(diǎn)來(lái)創(chuàng)建集群了。

redis-trib位于redis源碼的src目錄下。

我們復(fù)制一份到redis-cluster目錄下。

[root@localhost 11:03 /usr/local/redis-cluster]# ll ../redis/src/redis-trib*
-rwxrwxr-x. 1 root root 60843 7月 24 22:58 ../redis/src/redis-trib.rb
[root@localhost 11:04 /usr/local/redis-cluster]# cp ../redis/src/redis-trib.rb ./
[root@localhost 11:05 /usr/local/redis-cluster]# ll
總用量 84
drwxr-xr-x. 2 root root 4096 9月 10 10:51 7000
drwxr-xr-x. 2 root root 4096 9月 10 10:52 7001
drwxr-xr-x. 2 root root 4096 9月 10 10:52 7002
drwxr-xr-x. 2 root root 4096 9月 10 10:52 7003
drwxr-xr-x. 2 root root 4096 9月 10 10:52 7004
drwxr-xr-x. 2 root root 4096 9月 10 10:52 7005
-rwxr-xr-x. 1 root root 60843 9月 10 11:05 redis-trib.rb
[root@localhost 11:05 /usr/local/redis-cluster]#

開始啟動(dòng)集群:

[root@localhost 11:13 /usr/local/redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
/usr/bin/env: ruby: 沒有那個(gè)文件或目錄
[root@localhost 11:15 /usr/local/redis-cluster]#

下面是本人失敗的安裝版本,后面也有成功的版本。

因?yàn)槭莚uby的程序,所以我們需要安裝ruby,

yum -y install  ruby

繼續(xù)啟動(dòng)集群:

[root@localhost 11:21 /usr/local/redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
    from ./redis-trib.rb:24
[root@localhost 11:22 /usr/local/redis-cluster]#

還是報(bào)錯(cuò)了,說(shuō)需要rubygems,我們繼續(xù)安裝:

yum -y install rubygems

繼續(xù)啟動(dòng)集群:

[root@localhost 11:24 /usr/local/redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
    from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
    from ./redis-trib.rb:25
[root@localhost 11:24 /usr/local/redis-cluster]#

依然還是報(bào)錯(cuò)了...,我們需要安裝更高版本的ruby。

 所以,我決定,先卸載掉1.8的ruby。

yum -y remove ruby

然后重新安裝

wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
tar xzvf ruby-2.4.1.tar.gz
cd ruby-2.4.1
./configure
make
make install

然后查看ruby的版本:

[root@localhost 12:47 ~]# ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [i686-linux]
[root@localhost 12:47 ~]#

最后,為了運(yùn)行redis-trib我們需要安裝redis gem。

如果出現(xiàn)下面的錯(cuò)誤

[root@localhost 13:01 /usr/local/redis-cluster]# gem install redis
ERROR: Loading command: install (LoadError)
    cannot load such file -- zlib
ERROR: While executing gem ... (NoMethodError)
  undefined method `invoke_with_build_args' for nil:NilClass

我們繼續(xù)開啟集群:依然還是報(bào)錯(cuò),幾經(jīng)折騰,還是沒解決掉

最好,找到了下面這種方法。

成功版本

通過(guò)rvm這個(gè)ruby的管理工具來(lái)安裝ruby。

首先安裝rvm,如果下面的命令提示找不到curl,可以通過(guò)yum install -y crul來(lái)安裝crul。

[root@localhost 19:45 ~]# curl -L get.rvm.io | bash -s stable
 % Total  % Received % Xferd Average Speed  Time  Time   Time Current
                 Dload Upload  Total  Spent  Left Speed
100 24090 100 24090  0   0 11517   0 0:00:02 0:00:02 --:--:-- 48276
Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc
gpg: 于 2017年09月11日 星期一 05時(shí)59分21秒 JST 創(chuàng)建的簽名,使用 RSA,鑰匙號(hào) BF04FF17
gpg: 無(wú)法檢查簽名:No public key
Warning, RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found. Assuming you trust Michal Papis import the mpapis public key (downloading the signatures).

GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.3.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc'! Try to install GPG v2 and then fetch the public key:

  gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

or if it fails:

  command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -

the key can be compared with:

  https://rvm.io/mpapis.asc
  https://keybase.io/mpapis

NOTE: GPG version 2.1.17 have a bug which cause failures during fetching keys from remote server. Please downgrade or upgrade to newer version (if available) or use the second method described above.

[root@localhost 19:45 ~]#

發(fā)現(xiàn)失敗了,我們按照提示進(jìn)行操作。

[root@localhost 19:45 ~]# curl -sSL https://rvm.io/mpapis.asc | gpg2 --import -
gpg: 鑰匙環(huán)‘/root/.gnupg/secring.gpg'已建立
gpg: /root/.gnupg/trustdb.gpg:建立了信任度數(shù)據(jù)庫(kù)
gpg: 密鑰 D39DC0E3:公鑰“Michal Papis (RVM signing) mpapis@gmail.com>”已導(dǎo)入
gpg: 合計(jì)被處理的數(shù)量:1
gpg:      已導(dǎo)入:1 (RSA: 1)
gpg: 沒有找到任何絕對(duì)信任的密鑰
[root@localhost 19:45 ~]# curl -L get.rvm.io | bash -s stable
 % Total  % Received % Xferd Average Speed  Time  Time   Time Current
                 Dload Upload  Total  Spent  Left Speed
100 24090 100 24090  0   0  3763   0 0:00:06 0:00:06 --:--:-- 3763
Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz
Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc
gpg: 于 2017年09月11日 星期一 05時(shí)59分21秒 JST 創(chuàng)建的簽名,使用 RSA,鑰匙號(hào) BF04FF17
gpg: 完好的簽名,來(lái)自于“Michal Papis (RVM signing) mpapis@gmail.com>”
gpg:        亦即“Michal Papis michal.papis@toptal.com>”
gpg:        亦即“[jpeg image of size 5015]”
gpg: 警告:這把密鑰未經(jīng)受信任的簽名認(rèn)證!
gpg:    沒有證據(jù)表明這個(gè)簽名屬于它所聲稱的持有者。
主鑰指紋: 409B 6B17 96C2 7546 2A17 0311 3804 BB82 D39D C0E3
子鑰指紋: 62C9 E5F4 DA30 0D94 AC36 166B E206 C29F BF04 FF17
GPG verified '/usr/local/rvm/archives/rvm-1.29.3.tgz'
Creating group 'rvm'

Installing RVM to /usr/local/rvm/
Installation of RVM in /usr/local/rvm/ is almost complete:

 * First you need to add all users that will be using rvm to 'rvm' group,
  and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.

 * To start using RVM you need to run `source /etc/profile.d/rvm.sh`
  in all your open shell windows, in rare cases you need to reopen all shell windows.
[root@localhost 19:46 ~]

發(fā)現(xiàn)rvm已經(jīng)安裝成功了,為了讓配置立即生效,我們需要用source命令導(dǎo)入rvm的配置文件。

先查看下配置文件的路徑,然后導(dǎo)入。

[root@localhost 19:46 ~]# find / -name rvm.sh
/etc/profile.d/rvm.sh
[root@localhost 19:49 ~]# source /etc/profile.d/rvm.sh

接下來(lái)就可以安裝高版本的ruby了,建議安裝2.2.3版本,不然的話,等下gen install redis的時(shí)候,可能會(huì)報(bào)下面的錯(cuò)誤:

[root@localhost 19:59 ~]# gem install redis
Fetching: redis-4.0.0.gem (100%)
ERROR: Error installing redis:
    redis requires Ruby version >= 2.2.2.

廢話少說(shuō),接下來(lái)安裝2.2.3版本的ruby

[root@localhost 20:16 ~]# rvm install 2.3.3
Searching for binary rubies, this might take some time.
No binary rubies available for: centos/6/i386/ruby-2.3.3.
Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies.
Checking requirements for centos.
Requirements installation successful.
Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.3.3, this may take a while depending on your cpu(s)...
ruby-2.3.3 - #downloading ruby-2.3.3, this may take a while depending on your connection...
 % Total  % Received % Xferd Average Speed  Time  Time   Time Current
                 Dload Upload  Total  Spent  Left Speed
100 13.7M 100 13.7M  0   0 1285k   0 0:00:10 0:00:10 --:--:-- 1394k
ruby-2.3.3 - #extracting ruby-2.3.3 to /usr/local/rvm/src/ruby-2.3.3....
ruby-2.3.3 - #applying patch /usr/local/rvm/patches/ruby/ruby_2_3_gcc7.patch.
ruby-2.3.3 - #applying patch /usr/local/rvm/patches/ruby/2.3.3/random_c_using_NR_prefix.patch.
ruby-2.3.3 - #configuring..........................................................
ruby-2.3.3 - #post-configuration..
ruby-2.3.3 - #compiling....................................................................................-
ruby-2.3.3 - #installing...........................
ruby-2.3.3 - #making binaries executable..
ruby-2.3.3 - #downloading rubygems-2.6.13
ruby-2.3.3 - #extracting rubygems-2.6.13.....
ruby-2.3.3 - #removing old rubygems.........
ruby-2.3.3 - #installing rubygems-2.6.13..........................
ruby-2.3.3 - #gemset created /usr/local/rvm/gems/ruby-2.3.3@global
ruby-2.3.3 - #importing gemset /usr/local/rvm/gemsets/global.gems..........................................|
ruby-2.3.3 - #generating global wrappers........
ruby-2.3.3 - #gemset created /usr/local/rvm/gems/ruby-2.3.3
ruby-2.3.3 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list
ruby-2.3.3 - #generating default wrappers........
ruby-2.3.3 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-2.3.3 - #complete
Please be aware that you just installed a ruby that requires 2 patches just to be compiled on an up to date linux system.
This may have known and unaccounted for security vulnerabilities.
Please consider upgrading to ruby-2.4.1 which will have all of the latest security patches.
Ruby was built without documentation, to build it run: rvm docs generate-ri
[root@localhost 20:27 ~]# ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [i686-linux]
[root@localhost 20:28 ~]# gem -v
2.6.13
[root@localhost 20:28 ~]#

可以看到,不進(jìn)ruby安裝好了2.3.3版本,還把rubygems也安裝好了。

如果要?jiǎng)h除掉某個(gè)版本的ruby可以用這個(gè)命令:rvm remove 1.9.3。

我們繼續(xù)安裝:

[root@localhost 20:28 ~]# gem install redis
Fetching: redis-4.0.0.gem (100%)
Successfully installed redis-4.0.0
Parsing documentation for redis-4.0.0
Installing ri documentation for redis-4.0.0
Done installing documentation for redis after 3 seconds
1 gem installed
[root@localhost 20:33 ~]#

看到這里,折騰了兩個(gè)晚上終于弄好了。接下來(lái)就是使用我們的redis-trib開啟集群了。

為了方便,我把redis-trib.rb這個(gè)文件復(fù)制了一份到/usr/local/bin這個(gè)目錄下,因?yàn)檫@個(gè)目錄在PATH下面,里面的命令可以直接執(zhí)行。

再次確認(rèn)下六個(gè)redis節(jié)點(diǎn)的運(yùn)行是ok的。

[root@localhost 20:35 /usr/local/redis-cluster]# ps aux|grep redis
root   2486 0.1 0.2 46060 2304 ?    Ssl 18:30  0:12 ./7000/redis-server 127.0.0.1:7000 [cluster]
root   2491 0.1 0.2 46060 2308 ?    Ssl 18:30  0:13 ./7001/redis-server 127.0.0.1:7001 [cluster]
root   2496 0.1 0.2 46060 2308 ?    Ssl 18:30  0:13 ./7002/redis-server 127.0.0.1:7002 [cluster]
root   2501 0.1 0.2 46060 2304 ?    Ssl 18:30  0:13 ./7003/redis-server 127.0.0.1:7003 [cluster]
root   2506 0.1 0.2 46060 2308 ?    Ssl 18:30  0:14 ./7004/redis-server 127.0.0.1:7004 [cluster]
root   2511 0.1 0.2 46060 2304 ?    Ssl 18:30  0:12 ./7005/redis-server 127.0.0.1:7005 [cluster]
root   31426 0.0 0.0  6048  784 pts/2  S+  20:35  0:00 grep redis
[root@localhost 20:35 /usr/local/redis-cluster]#

[root@localhost 20:35 /usr/local/redis-cluster]# redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000
  slots:0-5460 (5461 slots) master
M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001
  slots:5461-10922 (5462 slots) master
M: 6de604de12b4b4a3be46766bb95ccf4618dc0d75 127.0.0.1:7002
  slots:10923-16383 (5461 slots) master
S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003
  replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2
S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004
  replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99
S: a4a09d80a4bb6c82345c376c59e5ae49e1d49701 127.0.0.1:7005
  replicates 6de604de12b4b4a3be46766bb95ccf4618dc0d75
Can 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 cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000
  slots:0-5460 (5461 slots) master
  1 additional replica(s)
S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003
  slots: (0 slots) slave
  replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2
M: 6de604de12b4b4a3be46766bb95ccf4618dc0d75 127.0.0.1:7002
  slots:10923-16383 (5461 slots) master
  1 additional replica(s)
M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001
  slots:5461-10922 (5462 slots) master
  1 additional replica(s)
S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004
  slots: (0 slots) slave
  replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99
S: a4a09d80a4bb6c82345c376c59e5ae49e1d49701 127.0.0.1:7005
  slots: (0 slots) slave
  replicates 6de604de12b4b4a3be46766bb95ccf4618dc0d75
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost 20:37 /usr/local/redis-cluster]#


在創(chuàng)建的過(guò)程中,redis會(huì)給出一份預(yù)想的配置給我們看,確定沒問(wèn)題就輸入yes并回車。系統(tǒng)就給我們創(chuàng)建了三個(gè)主,三個(gè)從的集群結(jié)構(gòu)。

可以看到All 16384 slots covered。

redis-cli

redis-cli默認(rèn)情況下連接的是本地的6379端口的redis服務(wù)器。

現(xiàn)在有六個(gè)端口,所以需要指定參數(shù)。

redis-cli -h xxx -p xxx -a xxx

-h:指定服務(wù)器

-p:指定端口號(hào)

-a:指定密碼

-c:開啟集群模式

[root@localhost 20:53 /usr/local/redis-cluster]# redis-cli -c -p 7000
127.0.0.1:7000> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> exit
[root@localhost 20:53 /usr/local/redis-cluster]# redis-cli -c -p 7002
127.0.0.1:7002> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
"zhangsan"
127.0.0.1:7001>

可以看到,已經(jīng)可以共享數(shù)據(jù)了。

 但是,如果我們把某一個(gè)主節(jié)點(diǎn)殺掉呢?

[root@localhost 19:52 /usr/local/redis-cluster]# redis-cli -p 7002 debug segfault
Error: Server closed the connection
[root@localhost 19:53 /usr/local/redis-cluster]# redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000
  slots:0-5460 (5461 slots) master
  1 additional replica(s)
M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001
  slots:5461-10922 (5462 slots) master
  1 additional replica(s)
S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004
  slots: (0 slots) slave
  replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99
M: a4a09d80a4bb6c82345c376c59e5ae49e1d49701 127.0.0.1:7005
  slots:10923-16383 (5461 slots) master
  0 additional replica(s)
S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003
  slots: (0 slots) slave
  replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost 19:54 /usr/local/redis-cluster]#

可以看到7005端口的節(jié)點(diǎn)已經(jīng)變成主節(jié)點(diǎn)了。那如果繼續(xù)把7005節(jié)點(diǎn)也宕掉呢?

[root@localhost 19:58 /usr/local/redis-cluster]# redis-cli -p 7005 debug segfault
Error: Server closed the connection
[root@localhost 19:58 /usr/local/redis-cluster]# redis-trib.rb check 127.0.0.1:7000
[ERR] Sorry, can't connect to node 127.0.0.1:7005
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000
  slots:0-5460 (5461 slots) master
  1 additional replica(s)
M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001
  slots:5461-10922 (5462 slots) master
  1 additional replica(s)
S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004
  slots: (0 slots) slave
  replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99
S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003
  slots: (0 slots) slave
  replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.
[root@localhost 19:58 /usr/local/redis-cluster]#

可以看到集群已經(jīng)出現(xiàn)問(wèn)題了。

追記:

在搭建多機(jī)多點(diǎn)集群的時(shí)候,遇到以下問(wèn)題:

1、一直在等待...

>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.......................

解決辦法:確認(rèn)端口是否開放。如果沒有開發(fā),可以修改/etc/sysconfig/iptables文件,開放端口(復(fù)制一行前面開放端口的來(lái)修改),然后service iptables restart重啟防火墻。

極端的可以service iptables stop來(lái)關(guān)閉防火墻

2、槽被利用

/usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis/client.rb:119:in `call': ERR Slot 5461 is already busy (Redis::CommandError)
 from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:2742:in `block in method_missing'
 from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:45:in `block in synchronize'
 from /usr/local/rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
 from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:45:in `synchronize'
 from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:2741:in `method_missing'
 from /usr/local/bin/redis-trib.rb:212:in `flush_node_config'
 from /usr/local/bin/redis-trib.rb:776:in `block in flush_nodes_config'
 from /usr/local/bin/redis-trib.rb:775:in `each'
 from /usr/local/bin/redis-trib.rb:775:in `flush_nodes_config'
 from /usr/local/bin/redis-trib.rb:1296:in `create_cluster_cmd'
 from /usr/local/bin/redis-trib.rb:1700:in `main>'

解決辦法:刪除掉在redis.conf的dir目錄下的幾個(gè)文件redis.conf文件除外。

如果還是有相同的問(wèn)題,可以考慮對(duì)所有節(jié)點(diǎn)執(zhí)行下面兩個(gè)命令。

redis-cli -p 端口號(hào)-h 主機(jī)物理地址 FLUSHALL

redis-cli -p 端口號(hào)-h 主機(jī)物理地址 CLUSTER RESET SOFT

您可能感興趣的文章:
  • redis集群搭建教程及遇到的問(wèn)題處理
  • 詳解docker搭建redis集群的環(huán)境搭建
  • 詳解centos下搭建redis集群
  • 玩轉(zhuǎn)Redis搭建集群之Sentinel詳解
  • Redis 集群搭建和簡(jiǎn)單使用教程
  • docker redis5.0 cluster集群搭建的實(shí)現(xiàn)
  • 基于docker搭建redis集群的方法
  • Redis6.0搭建集群Redis-cluster的方法
  • 5分鐘搭建redis集群(redis5.0.5)

標(biāo)簽:松原 六安 鄂州 石嘴山 自貢 淄博 宜春 河北

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Redis集群搭建全記錄》,本文關(guān)鍵詞  Redis,集群,搭建,全,記錄,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Redis集群搭建全記錄》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于Redis集群搭建全記錄的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    东乡族自治县| 沈丘县| 池州市| 厦门市| 仁怀市| 凤翔县| 镇沅| 秦安县| 乌拉特后旗| 安西县| 永康市| 绵阳市| 荣昌县| 静宁县| 弥勒县| 邮箱| 正镶白旗| 永清县| 房产| 伊宁市| 小金县| 青州市| 清涧县| 阜新市| 汉阴县| 肇庆市| 阿拉善盟| 丰原市| 禄丰县| 蕉岭县| 涡阳县| 平顺县| 深圳市| 林周县| 昌图县| 高邑县| 青浦区| 临海市| 辽中县| 体育| 丁青县|