虛擬機-搭建3主3從redis集羣

搭建3主3從的redis cluster:基於redis分佈式鎖。html

1.redis包上傳

將redis-4.0.1.tar.gz包上傳到一臺機器上去,/usr/local目錄下,解壓縮,重命名爲redisnode

scp ./redis-4.0.1.tar.gz ./ruby-2.3.4.tar.gz root@192.168.1.8:/usr/local/

image.png

tar -zxvf redis-4.0.1.tar.gz //解壓redis  
mv redis-4.0.1 redis //將解壓後的redis文件命名爲redis

image.png

2.安裝redis依賴

yum install -y tcl gcc zlib-devel openssl-devel

以上安裝了tcl、gcc、zlib-devel 、openssl-devellinux

3.編譯redis

進入redis錄內,執行make MALLOC=libc命令redis

make MALLOC=libc

image.png

4.把redis的一些命令腳本拷貝到PATH變量所在的目錄

cp -a src/redis-server src/redis-cli src/redis-sentinel src/redis-trib.rb src/redis-check-aof src/redis-check-rdb src/redis-benchmark /usr/local/bin/centos

那個/usr/local/bin,就是PATH變量的目錄,這樣就能夠直接執行redis的一些命令了 ruby

image.png

五、建立redis集羣的目錄

cd /opt
mkdir redis-cluster
mkdir redis-cluster/nodes-{7001,7002,7003} //在redis-cluster下面建立:nodes-700一、nodes-700二、nodes-7003的3個目錄

image.png

六、修改配置文件

編輯redis.conf配置文件(以7001來舉個例子,將7002和7003都編輯一下配置文件)服務器

cd redis-cluster/nodes-7001
vi redis.conf

修改配置文件內容以下:app

bind 127.0.0.1 192.168.9.216 //(注意:bind的意思不是綁定外部服務器的IP,而是綁定本機能夠接受訪問的IP)
port 7001 
pidfile redis_7001.pid 
loglevel notice
logfile "/opt/redis-cluster/nodes-7001/redis_7001.log" //日誌文件存放目錄  
dir /opt/redis-cluster/nodes-7001/    //節點主目錄存放位置  
cluster-config-file nodes-7001.conf   //集羣配置文件  
daemonize yes  //後臺進程
supervised no  //
appendonly yes
cluster-enabled yes  //集羣模式開啓
cluster-node-timeout 15000    //集羣節點之間超時時間是15秒
save 900 1  //
save 300 10
save 60 10000
dbfilename dump.rdb
appendfilename "appendonly.aof"
appendfsync everysec

image.png

上面7001配置作完以後,將7001的上面配置拷貝到700二、7003目錄下;而後修改對應配置的個性化配置路徑便可。port、pidfile、logfile、dir、cluster-config-file。分佈式

7.另外一臺機器設置

在另一臺機器上,重複上面的步驟,可是弄成700一、700二、7003測試

八、依次啓動各個redis實例

兩臺機器上都依次執行下面的命令就能夠了:

cd /usr/local/redis/src
./redis-server /opt/redis-cluster/nodes-7001/redis.conf //以配置文件形式啓動redis服務.
./redis-server /opt/redis-cluster/nodes-7002/redis.conf
./redis-server /opt/redis-cluster/nodes-7003/redis.conf

這個時候看nodes-7001裏面,會自動生成一些文件,包括nodes-7001.conf(自動生成的集羣配置文件),appendonly.aof,redis_7001.log,redis_7001.pid
查看啓動進程

ps -ef | grep redis

image.png

9.安裝ruby

咱們的這個centos 7操做系統默認沒帶ruby
將ruby-2.3.4.tar.gz上傳到/usr/local下,解壓縮,重命名爲ruby

cd ruby
./configure
make && make install
ruby -v

按照上面的步驟,兩臺機器都裝一下ruby

10.安裝ruby-redis.gem

(若是以前沒裝過下面的依賴,那麼:首先安裝:yum install -y zlib-devel openssl-devel)

咱們安裝ruby-redis.gem是去對應redis下去安裝。

在/usr/local/redis下,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

其次安裝:ruby的相關東西
cd /usr/local/ruby/ext/zlib
ruby extconf.rb
make && make install

再次gem install redis,若是再次報錯:

ERROR: While executing gem ... (Gem::Exception)
Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

cd /usr/local/ruby/ext/openssl
ruby extconf.rb
將上個步驟生成的MakeFile文件中的${top_srcdir}都替換爲../..
make && make install

基本就是上面兩個問題,都解決了以後,就能夠正常的:gem install redis

image.png

11.建立redis cluster集羣

進入redis/src下面:執行以下命令。

./redis-trib.rb create --replicas 1 192.168.1.8:7001 192.168.1.8:7002 192.168.1.8:7003 192.168.1.9:7001 192.168.1.9:7002 192.168.1.9:7003

跟上全部的redis實例,一共是6個

redis cluster自動會將6個redis實例作成3主3從的
image.png

此時顯示一直在等待,實際上是由於redis.conf中的bind出了問題,不能bind 127.0.0.1

在兩臺機器上,都執行:ps -aux | grep redis,看到3個redis進程
kill -9 殺死全部的redis進程

對/opt/redis-cluster目錄下的nodes-幾個文件夾內的文件,都刪除,保留一個redis.conf*

而後修改6個redis實例的redis.conf,bind裏面都去掉127.0.0.1
重啓啓動6個redis實例

image.png

再次執行redis-trib.rb create --replicas 1命令

image.png

12.redis cluster設置密碼

在/opt/redis-cluster/nodes-7001/redis.conf各個目錄下設置密碼:

masterauth founder123
requirepass founder123

經過指令找到安裝的redis在ruby環境中的配置client.rb

find / -name "client.rb"

image.png

打開client.rb並按照圖示修改第二步所設置的密碼
image.png
image.png

運行集羣的指令
image.png

13.測試redis cluster

在/usr/local/redis/src目錄下:

redis-cli -c -h 192.168.1.8 -p 7001
127.0.0.1:7001> CLUSTER info
127.0.0.1:7001> CLUSTER nodes
127.0.0.1:7001> set foo bar
127.0.0.1:7003> get foo

image.png

image.png

image.png

問題

在執行建立集羣節點時候,會出現報錯狀況;解決方案以下:
image.png

錯誤提示是說:slot插槽被佔用了、這是由於 搭建集羣前時,之前redis的舊數據和配置信息沒有清理乾淨。
解決方案:用redis-cli 登陸到每一個節點執行 flushall 和 cluster reset 就能夠了。
image.png

最後從新建立集羣
image.png

redis互聯網訪問配置

由於我想在本地測試,因此須要外網訪問redis集羣

此處爲止注意點
1 redis 配置文件中 把bind取消,而後把保護模式關閉

#bind 內網ip 127.0.0.1
protected-mode no
cluster-node-timeout 5000 
cluster-announce-ip 112.65.xx.xxx //外網ip 
cluster-announce-port ${PORT} //外網訪問端口
cluster-announce-bus-port 1${PORT}  //外網數據傳輸端口

2 建立集羣的時候用外網ip
redis-cli --cluster create 外網Ip:7001 外網Ip:7002 外網Ip:7003 外網Ip:7004 外網Ip:7005

三、特別注意:
上面除了須要在linux的redis集羣機器上開通7001-7006端口外,還須要開通17001-17006端口。以前一直搭建失敗是由於:內網配置集羣時候17001-17006端口沒有開放。

注意單機版問題

Can I set the above configuration? (type 'yes' to accept): yes

/usr/lib64/ruby/gems/1.8/gems/redis-3.0.7/lib/redis/client.rb:97:in `call': ERR Slot 16011 is already busy (Redis::CommandError)

        from /usr/lib64/ruby/gems/1.8/gems/redis-3.0.7/lib/redis.rb:2432:in `method_missing'

        from /usr/lib64/ruby/gems/1.8/gems/redis-3.0.7/lib/redis.rb:37:in `synchronize'

        from /usr/lib/ruby/1.8/monitor.rb:242:in `mon_synchronize'

        from /usr/lib64/ruby/gems/1.8/gems/redis-3.0.7/lib/redis.rb:37:in `synchronize'

        from /usr/lib64/ruby/gems/1.8/gems/redis-3.0.7/lib/redis.rb:2431:in `method_missing'

        from ./redis-trib.rb:203:in `flush_node_config'

        from ./redis-trib.rb:629:in `flush_nodes_config'

        from ./redis-trib.rb:628:in `each'

        from ./redis-trib.rb:628:in `flush_nodes_config'

        from ./redis-trib.rb:964:in `create_cluster_cmd'

        from ./redis-trib.rb:1340:in `send'

        from ./redis-trib.rb:1340

問題在於在進行單機版的redis搭建中,節點conf文件名字同樣形成的,只要把節點文件改爲不一樣名字,而且要從新啓動各個redis,以後就能成功
若是仍是不行 參考:
https://www.cnblogs.com/zt007...

參考

https://www.jianshu.com/p/813...
http://www.redis.cn/commands/...
https://blog.csdn.net/hanguof...

相關文章
相關標籤/搜索