1. 程式人生 > >Redis叢集部署指南(三主三從)

Redis叢集部署指南(三主三從)

Redis叢集部署指南
一、       Redis叢集方案Redis叢集方案採用Redis3.0支援的redis-cluster叢集架構:架構方案:1.   所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬;2.   節點的fail是通過叢集中超過半數的節點檢測失效時才生效;3.   客戶端與redis節點直連,不需要中間proxy層,客戶端不需要連線叢集所有的節點,連線叢集中任何一個可用的節點即可。4.   redis-cluster把所有的物理節點對映到[0~16383]slot上,cluster負責維護node<->slot<->value。容錯機制:1.   redis-cluster的容錯機制是通過選舉產生master,選擇過程是叢集中所有的master參與,如果半數以上的master節點與master節點的通訊超時(cluster-node-timeout),則認為當前master節點掛掉。什麼時候整個叢集不可用(cluster_state:fail),當叢集不可用時,所有對叢集的操作均不可用,收到ERRORQ錯誤。



二、       環境準備1     伺服器
序號HOSTNAME配置備註
1redis-node1CPU:2*2  記憶體:16GB
2redis-node2CPU:2*2  記憶體:16GB
3redis-node3CPU:2*2  記憶體:16GB
4redis-node4CPU:2*2  記憶體:16GB
5redis-node5CPU:2*2  記憶體:16GB
6redis-node6CPU:2*2  記憶體:16GB


2     伺服器設定Step1. 將6379埠在防火牆看開啟:[[email protected] ~]# vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp--dport 6379 -j ACCEPT

注:必須加在REJECT前面。

Step 2. 修改Selinux引數:[[email protected] ~]# vi /etc/selinux/configSELINUX=disabled
注:分別在其它幾個節點上同樣配置防火牆和SELINUX。

三、       軟體準備注:本文中演示的Redis版本為Redis 3.2.6(生產上實際使用3.2.8),通用於Redis 3.x的所有版本,如果Redis版本為2.x的,則有所不同。
PS: 開發和生產環境,分別有HTTP服務,目前已經將安裝包部署在該HTTP伺服器上,可以直接從HTTP伺服器上下載:生產環境:開發(測試)環境:


四、       安裝Redis1     安裝系統元件
Step 1. 安裝gcc[[email protected] ~]# yum install –y gcc-c++
Step 2. 安裝tcl[[email protected] ~]# yum install –y tcl

2     安裝Redis
Step 1. 解壓Redis到/usr/local目錄下[[email protected] ~]# tar -zxvf/root/software/redis-3.2.6.tar.gz -C /usr/local/
Step 2. 在解壓後的目錄中進行make和make test[[email protected] ~]# cd /usr/local/redis-3.2.6[[email protected] redis-3.2.6]# make[[email protected] redis-3.2.6]# make test
注:要檢查make和make test的結果是否都正確,如果報錯,針對性檢查並安裝系統缺少的元件。


Step 3. 複製redis-server和redis-cli到/usr/local/bin目錄下:[[email protected] redis-3.2.6]# cd src
[[email protected] src]# cp redis-server/usr/local/bin/[[email protected] src]# cp redis-cli/usr/local/bin/

Step 3. 驗證Redis安裝是否成功:[[email protected] ~]# redis-server

[[email protected] ~]# redis-cli

注:安裝其它5臺伺服器,重複本章節的4.1~4.2。

五、       配置叢集模式1     配置redis.confStep 1. 配置redis.conf[[email protected] ~]# mkdir /etc/redis[[email protected] ~]# cd /etc/redis[[email protected] ~]# vi redis.confport 6379daemonize yescluster-enabledyescluster-config-file/etc/redis/nodes.confcluster-node-timeout 5000        appendonly yesrequirepass Ab123456
注1:cluster-node-timeout是叢集中各節點相互通訊時,允許“失聯”的最大毫秒數,本演示中配置的為5秒,如果超過5秒某個節點沒有向其它節點彙報成功,認為該節點掛了。
注2:requirepass是Redis訪問密碼,為了安全起見,該引數建議必須配置,從但客戶端Jedis版本必須使用2.8.x以上的版本,否則需要通過擴充套件JedisCluster來實現對密碼訪問的支援。此外幾個Redis節點的密碼應該設定為相同的。
注3:分別在其它幾個節點上建立與上面相同的redis.conf檔案,內容也相同。
注4:重啟/重建Redis叢集時,必須刪除去/etc/redis/nodes.conf檔案。
Step 2. 以次啟動所有節點[[email protected] ~]# redis-server/etc/redis/redis.conf[[email protected] ~]# redis-server/etc/redis/redis.conf[[email protected] ~]# redis-server/etc/redis/redis.conf[[email protected] ~]# redis-server/etc/redis/redis.conf[[email protected] ~]# redis-server/etc/redis/redis.conf[[email protected] ~]# redis-server/etc/redis/redis.conf





2     安裝Redis叢集所需的Ruby工具Step 1. 安裝Ruby工具:Redis叢集需要藉助其它工具將相關節點加入到Cluster中,而這個工具是由Redis提供一個名為redis-trib.rb的ruby指令碼,否則接下來建立cluster會失敗。[[email protected] ~]# cd /usr/local/redis-3.2.6/src[[email protected] src]# yum install –y ruby[[email protected] src]# yum install -y rubygems[[email protected] src]# gem install redis--version 3.0.0[[email protected] src]# gem list

Step 2. 設定Ruby連線Redis的密碼:[[email protected] ~]# vi /usr/lib/ruby/gems/1.8/gems/redis-3.0.0/lib/redis/client.rb:password => "Ab123456"

注:分別在其它幾個節點上用同樣的方式安裝好Ruby工具。
3     利用redis-trib.rb建立Redis叢集Step 1. 在src目錄下執行以下指令碼:
[[email protected] ~]# cd /usr/local/redis-3.2.6/src[[email protected] src]# ./redis-trib.rb create --replicas1 10.50.130.101:6379 10.50.130.102:6379 10.50.130.103:6379 10.50.130.104:637910.50.130.105:6379 10.50.130.106:6379


注1:只需在其中某個個節點執行以上指令碼(本例在第一個節點執行)。
注2:利用redis-trib建立Cluster,只需要操作一次即可,假設系統關機、重啟,把所有的節點全部關閉之後,下次重啟後,即自動進入Cluster模式,不用現次執行redis-trib.rb cteate命令。
Step 2. 檢視Cluster程序:[[email protected] ~]# ps -ef|grep redis[[email protected] ~]# ps -ef|grep redis[[email protected] ~]# ps -ef|grep redis[[email protected] ~]# ps -ef|grep redis[[email protected] ~]# ps -ef|grep redis[[email protected] ~]# ps -ef|grep redis

Step 3. 檢視節點屬性(Master/Slave)[[email protected] ~]# cd/usr/local/redis-3.2.6/src[[email protected] src]# ./redis-trib.rb check10.50.130.101:6379[[email protected] src]# ./redis-trib.rb check10.50.130.102:6379[[email protected] src]# ./redis-trib.rb check10.50.130.103:6379[[email protected] src]# ./redis-trib.rb check10.50.130.104:6379[[email protected] src]# ./redis-trib.rb check10.50.130.105:6379[[email protected] src]# ./redis-trib.rb check10.50.130.106:6379
Step 4. 檢視節點/叢集資訊redis-cli客戶端登入到任一個節點,檢視:


六、       Jedis測試Redis叢集
package com.pingan.cloud.redis;
import java.util.HashSet;import java.util.Set;
importorg.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;
/***@author Simon.Hoo*@version v1.0.0*@since JDK1.7*/public class RedisTest {
       privatestatic JedisCluster cluster;
       /**        * @param args        */       publicstatic void main(String[] args) {              HostAndPorthost1 = new HostAndPort("10.50.130.101", 6379);              HostAndPorthost2 = new HostAndPort("10.50.130.102", 6379);              HostAndPorthost3 = new HostAndPort("10.50.130.103", 6379);              HostAndPorthost4 = new HostAndPort("10.50.130.104", 6379);              HostAndPorthost5 = new HostAndPort("10.50.130.105", 6379);              HostAndPorthost6 = new HostAndPort("10.50.130.106", 6379);
              Set<HostAndPort>jedisClusterNode = new HashSet<HostAndPort>();              jedisClusterNode.add(host1);              jedisClusterNode.add(host2);              jedisClusterNode.add(host3);              jedisClusterNode.add(host4);              jedisClusterNode.add(host5);              jedisClusterNode.add(host6);
              GenericObjectPoolConfigpoolConfig = new GenericObjectPoolConfig();              poolConfig.setMaxWaitMillis(-1);              poolConfig.setMaxTotal(1000);              poolConfig.setMinIdle(8);              poolConfig.setMaxIdle(100);
              intconnectionTimeout=10;              intsoTimeout=10;       int maxAttempts = 10;       String password="Ab123456";
              cluster= new JedisCluster(jedisClusterNode,connectionTimeout,soTimeout,maxAttempts,password,poolConfig);
              cluster.set("abcdefg","1234567890");              System.out.println(cluster.get("abcdefg"));       }}