公司內網、離線安裝redis叢集
環境準備:
- Ruby環境(叢集搭建需要用ruby建立, ruby環境在2.2以上。)
- rubygems-2.7.4.tgz 和 redis-3.2.2.gem (後面的是redis叢集需要的ruby外掛,rubygems是ruby的一個包管理工具,通過rubygems安裝redis-3.2.2.gem。)
- centos7,注意安裝系統的基礎環境,包括zlib和openssl。
安裝步驟
1、解壓安裝redis
cd /usr/local/
mkdir redis
將redis放到redis目錄下
tar -vxf redis-4.0.7.tar.gz
make
報錯
說明系統沒有安裝gcc的環境,無法進行編譯。
1.1、安裝gcc
包括:
ppl-0.10.2-11.el6.x86_64.rpm
cloog-ppl-0.15.7-1.2.el6.x86_64.rpm
mpfr-2.4.1-6.el6.x86_64.rpm
cpp-4.4.6-4.el6.x86_64.rpm
kernel-headers-2.6.32-279.el6.x86_64.rpm
glibc-headers-2.12-1.80.el6.x86_64.rpm
glibc-devel-2.12-1.80.el6.x86_64.rpm
libstdc++-devel-4.4.6-4.el6.x86_64.rpm
gcc-4.4.6-4.el6.x86_64.rpm
gcc-c++-4.4.6-4.el6.x86_64.rpm
百度雲連結:
http://pan.baidu.com/s/1kVA1pqv
安裝
rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm rpm -ivh cpp-4.4.7-4.el6.x86_64.rpm rpm -ivh kernel-headers-2.6.32-431.el6.x86_64.rpm rpm -ivh glibc-headers-2.12-1.132.el6.x86_64.rpm rpm -ivh glibc-devel-2.12-1.132.el6.x86_64.rpm rpm -ivh gcc-4.4.7-4.el6.x86_64.rpm rpm -ivh libstdc++-devel-4.4.7-4.el6.x86_64.rpm rpm -ivh gcc-c++-4.4.7-4.el6.x86_64.rpm
一定要按順序進行安裝
部分安裝提示already installed,沒關係,
執行完,gcc就安裝成功了
1.2、重新make
如果報錯:
解決辦法:make 後面帶引數
make MALLOC=libc
make install
cd src
./redis-server
看到這個介面redis單機版啟動成功,驗證: 另外開啟一個連線,到根目錄下執行
./redis-cli
ping
如果有響應,則redis單機版本安裝成功。
2、配置叢集環境(三臺機器,6個節點,至少需要6個節點。每臺機器部兩個節點)
根據上述步驟在每臺機器兩個目錄下配置兩個redis
例,樓主在 /usr/local/redis-cluster/
下新建了7000和7001兩個資料夾,分別配置兩個redis並配置不同的埠號,具體步驟如下:
2.1、建立叢集目錄
在/usr/local/目錄下執行建立redis_cluster目錄:
mkdir redis_cluster
cd redis_cluster/
mkdir 7000
mkdir 7001
2.2、配置redis.conf
將redis.conf拷貝到這兩個目錄中去:(redis.conf在安裝目錄下)
cp redis.conf ./redis_cluster/7000
cp redis.conf ./redis_cluster/7001
修改每個redis.conf的配置,需要修改的內容如下:
port 7000 //配置叢集的埠,分別是7000、7001
bind 本機的IP 127.0.0.1 // 這裡的預設配置是127.0.0.1前面加上內網ip。
daemonsize yes //允許redis在後臺執行
pidfile /var/run/redis_7000.pid //改成和埠一致
cluster-enabled yes // 開啟叢集 把註釋去掉
cluster-config-file node_7000.conf //叢集的配置,和埠一致
cluster-node-timeout 15000 // 請求超時,預設為15秒
appendonly yes // aof日誌開啟,有需要就開啟,每一次寫操作都會記錄一條日誌。
修改完成之後啟動服務:
cd src/
./redis-server ../redis_cluster/7000/redis.conf
依次啟動所有節點:
檢視啟動情況:
2.3、另外兩臺機器執行相同的操作
另兩臺機器的redis埠同樣分配為:7000、7001,然後修改對應的主機ip 和 127.0.0.1,例如bind 192.168.88.88 127.0.0.1。
3、安裝ruby環境
3.1、下載、安裝ruby
mkdir /usr/local/ruby
cd ruby/
把包放到改目錄下
tar -vxf ruby-2.5.0.tar.gz
cd ruby-2.5.0/
./configure
make && make install
驗證: ruby -v
3.2、下載安裝rubygems
cd /usr/local
mkdir rubygems
把檔案放到該目錄下
tar -vzxf rubygems-2.7.4.tgz
cd rubygems-2.7.4/
ruby setup.rb
報錯:
解決辦法:缺少了zlib包,需要下載並安裝zlib
3.2.1、下載安裝zlib
cd /usr/local
mkdir zlib
tar -vxf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure --prefix=/usr/local/zlib
make
make install
3.2.2、編譯 ruby 中的zlib
cd /usr/local/ruby-2.5.0/ext/zlib/
ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib
make
又報錯:
解決辦法:執行完extconf.rb之後會生成一個Makefile vim Makefile
把$(top_srcdir) 換成 ../../ 然後再make make make install
錯誤都解決之後,回到安裝rubygems的步驟。 進入rubygems的安裝目錄,執行ruby setup.rb
cd /usr/local/rubygems/rubygems-2.7.4
ruby setup.rb
安裝成功:
4、安裝ruby-redis外掛
4.1.1、下載redis-3.2.2.gem
剛剛安裝rubygems就是為了安裝這個外掛。 把檔案放到 /usr/local/redis 目錄下。
gem install redis-3.2.2.gem
又報錯:
解決辦法:缺少OpenSSL,下載安裝。
4.1.2、下載安裝OpenSSL
這個問題和zlib的解決方案類似,可類比解決。
cd /usr/local
mkdir openssl
tar -xvf openssl-1.0.2n.tar.gz
./config -fPIC --prefix=/usr/local/openssl enable-shared
./config -t
make && make install
安裝成功:
4.1.3、編譯ruby中的openssl
cd /usr/local/ruby/ruby-2.5.0/ext/openssl/
ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib
make
報錯:
解決辦法:vim Makefile 把所有的 $(top_srcdir) 換成 ../.. 注意替換所有
make && make install
安裝成功:
然後回到安裝 redis-3.2.2.gem ,在redis目錄下安裝。
gem install redis-3.2.2.gem
安裝成功:
叢集的操作
可以使用視覺化工具檢視和管理redis叢集。
1、建立一個叢集
執行以下命令:
./redis-trib.rb create --replicas 1 192.168.43.96:7000 192.168.43.97:7001 192.168.43.97:7001 192.168.43.98:7000 192.168.43.98:7001 192.168.43.96:7001
建立集群后,命令提示
can i set the above configuration?(type ‘yes’ to accept)
這裡輸入yes,回車。
頁面會顯示
redis cluster Waiting for the cluster to join............................................................
顯示個不停,樓主以為自己沒有配置好,其他叢集連不上了,後來通過查詢相關資料發現:
redis叢集不僅需要開通redis客戶端連線的埠,而且需要開通叢集匯流排埠
叢集匯流排埠為redis客戶端連線的埠 + 10000
如redis埠為6379
則叢集匯流排埠為16379
故,所有伺服器的點需要開通redis的客戶端連線埠和叢集匯流排埠
注意:iptables 放開,如果有安全組,也要放開這兩個埠
摘csdn自——海拉姆
上面一段話,說白了就是每個redis節點以及每個redis叢集匯流排的埠被防火牆阻塞了,需要開放相應端口才能連通:
檢視防火牆狀態:
# /etc/init.d/iptables status
如果得到一系列的資訊,說明防火牆處於開啟狀態。
MySQL預設埠3306,Linux防火牆預設是阻止的。
檢視3306埠是否開放:
# lsof -i:3306
如果有顯示說明已經開放了.如果沒有顯示說明沒有開放 【Linux公社 http://www.linuxidc.com 】
要訪問3306可以用兩種方式,一個是關閉防火牆,另一個就是讓防火牆開放3306埠。
一、開放3306埠:
方法一:
# iptables -I INPUT -i eth0 -p tcp --dport 3306 -j ACCEPT # iptables -I OUTPUT -o eth0 -p tcp --sport 3306 -j ACCEPT
對應阻止3306埠的命令為:
# iptables -I INPUT -i eth0 -p tcp --dport 3306 -j DROP # iptables -I OUTPUT -o eth0 -p tcp --sport 3306 -j DROP
然後儲存 # /etc/rc.d/init.d/iptables save
方法二:
1、修改/etc/sysconfig/iptables檔案,增加如下一行:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
然後重啟防火牆:
# service iptables restart
二、關閉防火牆:
兩種方式:
1)重啟後生效:
# chkconfig iptables off ( 對應的開啟防火牆命令為: # chkconfig iptables on )
2)即時生效,但重啟後防火牆會再次啟動:
# service iptables stop ( 對應的開啟防火牆命令為: # service iptables start )
執行以上紅色字型部分命令,開放三臺機器7000、7001、17000、17001共4*3=12個節點的埠,並重啟防火牆。
接下來,需要關閉六個節點的redis服務,並刪除appendonly.7000.aof、appendonly.7001.aof及對應nodes.conf,重啟redis服務,並重新執行:
./redis-trib.rb create --replicas 1 192.168.43.96:7000 192.168.43.97:7001 192.168.43.97:7001 192.168.43.98:7000 192.168.43.98:7001 192.168.43.96:7001
同樣敲入yes,則可以看到以下介面:
2、連線叢集
cd /usr/local/redis/redis-4.0.7/src
./redis-cli -p 7000 -c -h 192.168.43.97
引數說明: -p port 埠 -h host 主機 -c cluster 叢集
連線進叢集之後 輸入ping , 如果響應了pong 表示連線叢集成功:
連線進叢集之後可以檢視當前叢集的資訊和節點的資訊 CLUSTER INFO 列出當前節點的資訊
CLUSTER NODES 列出當前叢集中的節點資訊
前面一段很長的字串就是節點的id。從這個命令可以知道哪些節點還活著,哪些節點已經掛了。埠後面帶著fail的都是掛掉的節點。
3、關閉一個節點
退出叢集連線才能關閉某一個節點:
./redis-cli -c -h 192.168.43.98 -p 7000 shutdown
這條命令的意思是關閉98機器上埠為7000的redis節點。 關閉之後可以連線叢集去執行 CLUSTER NODES ,這個節點的狀態已經是fail。
4、節點加入、移出叢集
新增一個節點之前務必保證該節點已經啟動了,如果該節點之前在建立叢集時已經在叢集裡面了,關閉該節點然後再重新啟動,該節點會自動加入叢集。
./redis-server ../redis_cluster/7000/redis.conf
然後連線進叢集,如果該節點之前不在叢集中,連線叢集輸入cluster meet 命令就可以指定某個節點加入叢集。
CLUSTER MEET 192.168.43.98:7000
CLUSTER forget fd72b78b1eaa430ca309bc5226d90fe67199a576
這個一長段字串是節點的id,forget之後可以再去看節點的資訊。
forget之後,如果一分鐘不進行任何操作,該節點會自動加入叢集。