搭建高可用的redis集群,避免standalone模式帶給你的苦難

来源:http://www.cnblogs.com/huangxincheng/archive/2016/06/24/5615037.html
-Advertisement-
Play Games

現在項目上用redis的話,很少說不用集群的情況,畢竟如果生產上只有一臺redis會有極大的風險,比如機器掛掉,或者記憶體爆掉,就比如我們生產環境 曾今也遭遇到這種情況,導致redis記憶體不夠掛掉的情況,當然這些都是我們及其不能容忍的,第一個必須要做到高可靠,其次才是高性能,好了,下麵我來 逐一搭建一 ...


  現在項目上用redis的話,很少說不用集群的情況,畢竟如果生產上只有一臺redis會有極大的風險,比如機器掛掉,或者記憶體爆掉,就比如我們生產環境

曾今也遭遇到這種情況,導致redis記憶體不夠掛掉的情況,當然這些都是我們及其不能容忍的,第一個必須要做到高可靠,其次才是高性能,好了,下麵我來

逐一搭建一下。

 

一:Redis集群搭建

1. 下載

   首先去官網下載較新的3.2.0版本,下載方式還是非常簡單的,比如官網介紹的這樣。

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

 

2. redis配置

 由於我們要做集群,而且還要redis自帶的redis-trib.rb 能正常運行,我們需要在集群中開啟三台master,三台slave,所以這裡我需要建立6個文件

夾,而且文件夾的名稱就使用埠地址的名字,比如:6389. 6380....6384。

3. config配置。

   現在directory的分佈情況大致如上圖,接下來要做的事情就是配置redis.conf了,在這裡需要配置四個選項。。。

 

<1> port  埠地址,比如6380文件夾下麵的port就是6380,

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

 

<2> cluster-enabled 和 cluster-config-file

       這個顧名思義,首先需要開啟redis的cluster模式,然後配置一個cluster-config-file文件,這個文件用於存放redis的實時信息,redis會動態追加和修

改這個conf下麵的內容信息,不過要記住,這個nodes-6379.conf 可以根據 埠文件夾依次配置,比如6380文件夾可以改成nodes-6380.conf這樣。。。

# Normal Redis instances can't be part of a Redis Cluster; only nodes that are
# started as cluster nodes can. In order to start a Redis instance as a
# cluster node enable the cluster support uncommenting the following:
#
cluster-enabled yes

# Every cluster node has a cluster configuration file. This file is not
# intended to be edited by hand. It is created and updated by Redis nodes.
# Every Redis Cluster node requires a different cluster configuration file.
# Make sure that instances running in the same system do not have
# overlapping cluster configuration file names.
#
cluster-config-file nodes-6379.conf

 

<3> directory

      為了方便管理,我這裡配置的root目錄取決於在哪個文件夾,比如6380下麵我的dir就是: dir ./6380/

# Note that you must specify a directory here, not a file name.
dir ./6379/

 

<4> protected-mode

      這個是redis 3.2 才追加的一個功能,從功能註釋中,我們就可以發現,這個預設就是不讓外界可以訪問redis,所以這裡我們就改為no,可以遠程訪問。

# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode no

 

ok,到現在為止,我們的config就修改完畢了,其他埠的文件夾也可以依次配置之~

 

二:開啟redis

    到現在為止,各個埠文件夾都配置成功了,接下來準備開啟了,真的好麽麽噠~~~,視窗太多,有點萌萌的。

 

 

接下來我們可以看一下,在6379下麵是不是有生成node-6379.conf文件,比如下麵:

 

三:配置redis-trib.rb

   因為redis-trib.rb是ruby寫的,而我們的電腦肯定是沒有ruby和一些配置依賴項,不過沒關係,有強大的yum安裝,一切都不是問題。

 

1. 執行replicas命令

[jack@localhost ~]$ cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
/usr/bin/env: ruby: No such file or directory
[jack@localhost ~]$ 

   可以看到ruby是沒有安裝的,所以下一步我們要安裝ruby了。。。

 

2. 安裝ruby 【一定要是管理員許可權哦】

[jack@localhost ~]$ sudo
usage: sudo [-D level] -h | -K | -k | -V
usage: sudo -v [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-u user
            name|#uid]
usage: sudo -l[l] [-AknS] [-D level] [-g groupname|#gid] [-p prompt] [-U user
            name] [-u user name|#uid] [-g groupname|#gid] [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C fd] [-D level] [-g
            groupname|#gid] [-p prompt] [-u user name|#uid] [-g groupname|#gid]
            [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C fd] [-D level] [-g
            groupname|#gid] [-p prompt] [-u user name|#uid] file ...
[jack@localhost ~]$ su
Password: 
jacsu: incorrect password
[jack@localhost ~]$ yum install ruby
Loaded plugins: fastestmirror, refresh-packagekit, security
You need to be root to perform this command.
[jack@localhost ~]$ jack
bash: jack: command not found
[jack@localhost ~]$ su
Password: 
[root@localhost jack]# yum install ruby
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirror.bit.edu.cn
 * updates: mirror.bit.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package ruby.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Processing Dependency: ruby-libs = 1.8.7.374-4.el6_6 for package: ruby-1.8.7.374-4.el6_6.x86_64
--> Processing Dependency: libruby.so.1.8()(64bit) for package: ruby-1.8.7.374-4.el6_6.x86_64
--> Running transaction check
---> Package ruby-libs.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Processing Dependency: libreadline.so.5()(64bit) for package: ruby-libs-1.8.7.374-4.el6_6.x86_64
--> Running transaction check
---> Package compat-readline5.x86_64 0:5.2-17.1.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                Arch         Version                   Repository  Size
================================================================================
Installing:
 ruby                   x86_64       1.8.7.374-4.el6_6         base       538 k
Installing for dependencies:
 compat-readline5       x86_64       5.2-17.1.el6              base       130 k
 ruby-libs              x86_64       1.8.7.374-4.el6_6         base       1.7 M

Transaction Summary
================================================================================
Install       3 Package(s)

Total download size: 2.3 M
Installed size: 7.8 M
Is this ok [y/N]: y
Downloading Packages:
(1/3): compat-readline5-5.2-17.1.el6.x86_64.rpm          | 130 kB     00:00     
(2/3): ruby-1.8.7.374-4.el6_6.x86_64.rpm                 | 538 kB     00:00     
(3/3): ruby-libs-1.8.7.374-4.el6_6.x86_64.rpm            | 1.7 MB     00:02     
--------------------------------------------------------------------------------
Total                                           747 kB/s | 2.3 MB     00:03     
warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Importing GPG key 0xC105B9DE:
 Userid : CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6[email protected]>
 Package: centos-release-6-5.el6.centos.11.1.x86_64 (@anaconda-CentOS-201311272149.x86_64/6.5)
 From   : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : compat-readline5-5.2-17.1.el6.x86_64                         1/3 
  Installing : ruby-libs-1.8.7.374-4.el6_6.x86_64                           2/3 
  Installing : ruby-1.8.7.374-4.el6_6.x86_64                                3/3 
  Verifying  : compat-readline5-5.2-17.1.el6.x86_64                         1/3 
  Verifying  : ruby-libs-1.8.7.374-4.el6_6.x86_64                           2/3 
  Verifying  : ruby-1.8.7.374-4.el6_6.x86_64                                3/3 

Installed:
  ruby.x86_64 0:1.8.7.374-4.el6_6                                               

Dependency Installed:
  compat-readline5.x86_64 0:5.2-17.1.el6  ruby-libs.x86_64 0:1.8.7.374-4.el6_6 

Complete!
[root@localhost jack]# 

 

3. 安裝rubygems

     接著我們再次運行 replicas命令,看看會怎麼樣。。。 

[root@localhost jack]# cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
cluster/redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
    from cluster/redis-trib.rb:24
[root@localhost jack]# 

     結果苦逼了,還是報錯,看提示貌似是少了一個rubygems,這次我們還是通過yum安裝。

[root@localhost jack]# yum install -y rubygems
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
 * base: mirror.bit.edu.cn
 * extras: mirror.bit.edu.cn
 * updates: mirror.bit.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package rubygems.noarch 0:1.3.7-5.el6 will be installed
--> Processing Dependency: ruby-rdoc for package: rubygems-1.3.7-5.el6.noarch
--> Running transaction check
---> Package ruby-rdoc.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Processing Dependency: ruby-irb = 1.8.7.374-4.el6_6 for package: ruby-rdoc-1.8.7.374-4.el6_6.x86_64
--> Running transaction check
---> Package ruby-irb.x86_64 0:1.8.7.374-4.el6_6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch           Version                    Repository    Size
================================================================================
Installing:
 rubygems          noarch         1.3.7-5.el6                base         207 k
Installing for dependencies:
 ruby-irb          x86_64         1.8.7.374-4.el6_6          base         317 k
 ruby-rdoc         x86_64         1.8.7.374-4.el6_6          base         381 k

Transaction Summary
================================================================================
Install       3 Package(s)

Total download size: 905 k
Installed size: 3.0 M
Downloading Packages:
(1/3): ruby-irb-1.8.7.374-4.el6_6.x86_64.rpm             | 317 kB     00:00     
(2/3): ruby-rdoc-1.8.7.374-4.el6_6.x86_64.rpm            | 381 kB     00:00     
(3/3): rubygems-1.3.7-5.el6.noarch.rpm                   | 207 kB     00:00     
--------------------------------------------------------------------------------
Total                                           625 kB/s | 905 kB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : ruby-irb-1.8.7.374-4.el6_6.x86_64                            1/3 
  Installing : ruby-rdoc-1.8.7.374-4.el6_6.x86_64                           2/3 
  Installing : rubygems-1.3.7-5.el6.noarch                                  3/3 
  Verifying  : ruby-rdoc-1.8.7.374-4.el6_6.x86_64                           1/3 
  Verifying  : ruby-irb-1.8.7.374-4.el6_6.x86_64                            2/3 
  Verifying  : rubygems-1.3.7-5.el6.noarch                                  3/3 

Installed:
  rubygems.noarch 0:1.3.7-5.el6                                                 

Dependency Installed:
  ruby-irb.x86_64 0:1.8.7.374-4.el6_6    ruby-rdoc.x86_64 0:1.8.7.374-4.el6_6   

Complete!
[root@localhost jack]# 

 

4. 安裝redis驅動

 

   還是繼續不死心,我們繼續運行replicas命令命令。

[root@localhost jack]# cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
/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 cluster/redis-trib.rb:25
[root@localhost jack]# 

 

卧槽,還是有問題,這次貌似是一個gem_original_require沒有安裝,當然這個一般是說ruby版本太老了,所以現在親要麼升級ruby版本,要麼直接安裝

ruby的redis驅動。

[root@localhost jack]# gem install redis
Successfully installed redis-3.3.0
1 gem installed
Installing ri documentation for redis-3.3.0...
Installing RDoc documentation for redis-3.3.0...

 

6. 運行replicas命令

   終於貌似所有的依賴我們都解決了,接下來就可以真的執行了,真是一把辛酸淚啊。。。操。。。

[root@localhost jack]# cluster/redis-trib.rb  create --replicas 1 192.168.161.133:6379 192.168.161.133:6380 192.168.161.133:6381 192.168.161.133:6382 192.168.161.133:6383 192.168.161.133:6384
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.161.133:6379
192.168.161.133:6380
192.168.161.133:6381
Adding replica 192.168.161.133:6382 to 192.168.161.133:6379
Adding replica 192.168.161.133:6383 to 192.168.161.133:6380
Adding replica 192.168.161.133:6384 to 192.168.161.133:6381
M: fdae457e803e2e04a7c549c69b44a2beefdae3bc 192.168.161.133:6379
   slots:0-5460 (5461 slots) master
M: 74285cee0fa65e64b443ecc630e447a8a65ee9f8 192.168.161.133:6380
   slots:5461-10922 (5462 slots) master
M: 14ed067a1b85044325d5800fa8479a6b4e41a10c 192.168.161.133:6381
   slots:10923-16383 (5461 slots) master
S: c50b1ff1fe3a00b16703f3b5705d2dafe046240b 192.168.161.133:6382
   replicates fdae457e803e2e04a7c549c69b44a2beefdae3bc
S: 8f7bd92f7ffb48e327820693a5820b5be7ea5556 192.168.161.133:6383
   replicates 74285cee0fa65e64b443ecc630e447a8a65ee9f8
S: 4a85ed078b4c99afad7f3a9a8df09082c681a649 192.168.161.133:6384
   replicates 14ed067a1b85044325d5800fa8479a6b4e41a10c
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 192.168.161.133:6379)
M: fdae457e803e2e04a7c549c69b44a2beefdae3bc 192.168.161.133:6379
   slots:0-5460 (5461 slots) master
M: 74285cee0fa65e64b443ecc630e447a8a65ee9f8 192.168.161.133:6380
   slots:5461-10922 (5462 slots) master
M: 14ed067a1b85044325d5800fa8479a6b4e41a10c 192.168.161.133:6381
   slots:10923-16383 (5461 slots) master
M: c50b1ff1fe3a00b16703f3b5705d2dafe046240b 192.168.161.133:6382
   slots: (0 slots) master
   replicates fdae457e803e2e04a7c549c69b44a2beefdae3bc
M: 8f7bd92f7ffb48e327820693a5820b5be7ea5556 192.168.161.133:6383
   slots: (0 slots) master
   replicates 74285cee0fa65e64b443ecc630e447a8a65ee9f8
M: 4a85ed078b4c99afad7f3a9a8df09082c681a649 192.168.161.133:6384
   slots: (0 slots) master
   replicates 14ed067a1b85044325d5800fa8479a6b4e41a10c
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@localhost jack]# 

從上面可以看到,trib程式告知我們是否用 6379,6380,6381 作為主, 6382,6383,6384作為從。。然後我就恩准了。。就這樣我們的集群

就創建好了,好了,這篇就講到這裡,也不是特別複雜吧~~~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql資料庫是被廣泛應用的關係型資料庫,其體積小、支持多處理器、開源並免費的特性使其在Internet中小型網站中的使用率尤其高。在使用mysql的過程中不規範的sql編寫、非最優的策略選擇都可能導致系統性能甚至功能上的缺陷。 ...
  • 推薦:http://www.cnblogs.com/roucheng/p/GUID.html ...
  • Oracle用戶被鎖原因及辦法 在登陸時被告知test用戶被鎖 1、用dba角色的用戶登陸,進行解鎖,先設置具體時間格式,以便查看具體時間 SQL> alter session set nls_date_format=’yyyy-mm-dd hh24:mi:ss’; Session altered. ...
  • 在 CentOS7 上安裝 MongoDB 1 通過 SecureCRT 連接至 CentOS7 伺服器; 2 進入到 /usr/local/ 目錄: cd /usr/local 3 在當前目錄下創建 tools 目錄: mkdir -p tools 4 進入到 tools 目錄中: cd tool ...
  • 在 CentOS7 上安裝 MySQL5.7 1 通過 SecureCRT 連接到阿裡雲 CentOS7 伺服器; 2 進入到目錄 /usr/local/ 中: cd /usr/local/ 3 創建目錄 /usr/local/tools,如果有則忽略: mkdir -p tools 4 創建 /u ...
  • 存儲過程(stored procedure)有時候稱為sproc,它是真正的腳本-或者更準確的說,他是批處理(batch)-它存儲於資料庫中,而不是淡出的文件中。無論如何,這個比較並不是很確定。存儲過程有輸出參數,輸入參數已及返回值等。而腳本不會有這些內容。 存儲過程基本語法:CREATE PROC ...
  • 語法:select * from 表名 where (欄位名) in (select 欄位,名 from 表名 group by 欄位名 having count(*) > 1); 如一下goods表: : 執行sql語句:select * from goods where inventory in ...
  • # 創建學生表 create table student(age int,name varchar(32))engine myisam charset utf8;insert into student values(18,'小白'); # 創建教師表,結構與學生表結構一模一樣create table ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...