集群的解決方案一(zookeeper和redis)


1、集群的概念

  1.1、集群的兩大能力

    負載均衡:負載均衡把任務比較均勻的分布到集群環境下的計算和網絡資源,以提高數據吞吐量。

    錯誤恢復(高可用):如果集群中的某一台服務器由於故障或者維護需要無法使用,資源和應用程序將轉移到可用的集群節點上。這種由於某個節點的資源不能工作,另一個可用節點中的資源能夠透明的接管並繼續完成任務的過程,叫做錯誤恢復。

負載均衡和錯誤恢復要求各服務實體中有執行同一任務的資源存在,而且對於同一任務的各個資源來說,執行任務所需的信息視圖必須是相同的。

  1.2、集群的特點

    可擴展性:集群的性能不限制於單一的服務實體,新的服務實體可以動態的添加到集群,從而增強集群的性能。

    高可用性:集群當其中一個節點發生故障時,這台節點上面所運行的應用程序將在另一台節點被自動接管,消除單點故障對於增強數據可用性、可達性和可靠性是非常重要的。

  1.3、集群與分布式的區別

    相同點:

    分布式和集群都是需要有很多節點服務器通過網絡協同工作完成整體的任務目標。

    不同點:

    分布式是指將業務系統進行拆分,即分布式的每一個節點都是實現不同的功能。而集群每個節點做的是同一件事情。

2、搭建zookeeper集群

  因為集群需要leader的存在,集群的數量最好為奇數,故集群的最少操作數量是3台,下面都將以最少數量作為示例。

  2.1、准備工作

 

  (1)安裝JDK  【此步驟省略】。

 

  (2)Zookeeper壓縮包上傳到服務器

 

  (3)將Zookeeper解壓 ,創建data目錄 ,並將 conf目錄下的zoo_sample.cfg 文件改名為 zoo.cfg

 

  (4)建立/usr/local/zookeeper-cluster目錄,將解壓后的Zookeeper復制到以下三個目錄

 

    cp -r zookeeper /usr/local/zookeeper-cluster/zookeeper-1

 

    cp -r zookeeper /usr/local/zookeeper-cluster/zookeeper-2

 

    cp -r zookeeper /usr/local/zookeeper-cluster/zookeeper-3

  (5)修改每一個conf下的zoo.cfg文件

    將每個dataDir屬性改為當前data目錄的路徑

    如果是在同一台服務器上搭建zookeeper集群則還需要將clientPort屬性分別分配不同的端口號,分別為2181  2182  2183

  2.2、配置集群

    (1)在每個zookeeper的 data 目錄下創建一個 myid 文件,並給予不同的內容,如:1、2、3 。這個文件就是記錄每個服務器的ID。

      使用echo命令寫入,使用cat命令查看寫入文件內容

 

     (2)在每一個zookeeper 的 conf目錄下zoo.cfg配置客戶端訪問端口(clientPort)和集群服務器IP列表。

server.1=192.168.25.140:2881:3881

server.2=192.168.25.140:2882:3882

server.3=192.168.25.140:2883:3883

      解釋:server.服務器ID=服務器IP地址:服務器之間通信端口:服務器之間投票選舉端口

      注意:此處為服務器通信端口,不可與client對外服務端口重復

  2.3、啟動集群

  

    Mode為follower表示是跟隨者(從)

    Mod 為leader表示是領導者(主)

  2.4、Dubbox連接zookeeper集群

<dubbo:registry
protocol="zookeeper" address="192.168.25.140:2181,192.168.25.140:2182,192.168.25.140:2183">
</dubbo:registry>

3、redis主從

  3.1、准備工作

    如果redis使用過,需要先將持久化文件dump.rdb刪掉,清空數據 rm rf *.rdb

  3.2、創建主從目錄,並將redis復制到該目錄下

    實現如下架構

 

  3.3、配置redis的conf文件

    3.3.1、修改redis.conf文件的port

    3.3.2、修改兩個從redis中redis.conf文件的slaveof

      如:slaveof 192.168.25.129 6379

      解釋:slaveof 主redisIP 主redis端口

  3.4、啟動redis集群

 

    可以看到即使連接的是第三個redis,IP端口號也顯示的是主redis

  3.5、主從關系

    當主redis掛掉后,從redis只能讀取不能寫入

  3.6、關閉主從redis

[root@jd redis03]# ./redis-cli -p 6379 shutdown
[root@jd redis03]# ./redis-cli -p 6380 shutdown
[root@jd redis03]# ./redis-cli -p 6381 shutdown
[root@jd redis03]# cd ..
[root@jd redis-master-slave]# cd redis01
[root@jd redis01]# ./redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>  exit

4、redis集群

  任意一個redis都可以進行讀寫操作,redis3.0以后才支持redis集群。即多主多從關系。

  4.1、redis的哈希槽

    Redis 集群中內置了 16384 個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數,這樣每個key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。

       例如三個節點:槽分布的值如下:

      SERVER1:  0-5460

      SERVER2:  5461-10922

      SERVER3:  10923-16383

  4.2、redis集群的准備工作

    安裝gcc和ruby,並上傳redis-3.0.0.gem文件

yum install gcc-c++
yum install ruby
yum install rubygems

    創建目錄,將redis-3.0.0.gem文件放入

mkdir redis-cluster

  4.3、將redis/bin復制到創建的目錄中,並修改redis.conf文件

    修改運行端口為7001 (7002 7003 .....)

    將cluster-enabled yes 前的注釋去掉(632行)

  4.4、使用腳本搭建redis主從配置

    進入解壓的redis源碼目錄中的src目錄  執行下面的命令

上傳redis-3.0.0.gem ,安裝 ruby用於搭建redis集群的腳本

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

    先啟動所有的redis 進入redis源碼目錄中的src目錄  執行下面的命令即可

./redis-trib.rb create --replicas 1 192.168.25.140:7001 192.168.25.140:7002 192.168.25.140:7003192.168.25.140:7004 192.168.25.140:7005 192.168.25.140:7006

  4.5、測試

 

redis01/redis-cli -p 7002 -c

 

    集群下的主從節點都可以進行讀寫操作,但根據槽點最終仍是存在主節點上,實質是由從節點轉發到主節點上。

  4.6、SpringDataRedis連接Redis集群

    添加配置文件applicationContext-redis-cluster.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
  xmlns:context="http://www.springframework.org/schema/context" 
  xsi:schemaLocation="http://www.springframework.org/schema/beans   
            http://www.springframework.org/schema/beans/spring-beans.xsd   
            http://www.springframework.org/schema/context   
            http://www.springframework.org/schema/context/spring-context.xsd">  
    <!-- 加載配置屬性文件 -->  
<context:property-placeholder ignore-unresolvable="true" location="classpath:properties/redis-cluster-config.properties" />  
<bean id="redis-clusterConfiguration" class="org.springframework.data.redis.connection.redis-clusterConfiguration">  
    <property name="maxRedirects" value="${redis.maxRedirects}"></property>  
    <property name="clusterNodes">  
    <set>  
        <bean class="org.springframework.data.redis.connection.redis-clusterNode">  
            <constructor-arg name="host" value="${redis.host1}"></constructor-arg>  
            <constructor-arg name="port" value="${redis.port1}"></constructor-arg>  
        </bean>  
        <bean class="org.springframework.data.redis.connection.redis-clusterNode">  
            <constructor-arg name="host" value="${redis.host2}"></constructor-arg>  
            <constructor-arg name="port" value="${redis.port2}"></constructor-arg>  
        </bean>  
        <bean class="org.springframework.data.redis.connection.redis-clusterNode">  
            <constructor-arg name="host" value="${redis.host3}"></constructor-arg>  
            <constructor-arg name="port" value="${redis.port3}"></constructor-arg>  
        </bean>  
         <bean class="org.springframework.data.redis.connection.redis-clusterNode">  
             <constructor-arg name="host" value="${redis.host4}"></constructor-arg>  
             <constructor-arg name="port" value="${redis.port4}"></constructor-arg>  
          </bean>  
          <bean class="org.springframework.data.redis.connection.redis-clusterNode">  
             <constructor-arg name="host" value="${redis.host5}"></constructor-arg>  
             <constructor-arg name="port" value="${redis.port5}"></constructor-arg>  
          </bean>  
         <bean class="org.springframework.data.redis.connection.redis-clusterNode">  
            <constructor-arg name="host" value="${redis.host6}"></constructor-arg>  
            <constructor-arg name="port" value="${redis.port6}"></constructor-arg>  
         </bean>  
       </set>  
     </property>  
</bean>  
<bean id="jedisPoolConfig"   class="redis.clients.jedis.JedisPoolConfig">  
       <property name="maxIdle" value="${redis.maxIdle}" />   
       <property name="maxTotal" value="${redis.maxTotal}" />   
</bean>  
<bean id="jeidsConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"  >  
        <constructor-arg ref="redis-clusterConfiguration" />  
        <constructor-arg ref="jedisPoolConfig" />  
</bean>    
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">  
        <property name="connectionFactory" ref="jeidsConnectionFactory" />  
</bean>  
</beans>

  添加屬性文件redis-cluster-config.properties

redis.host1=192.168.25.140
redis.port1=7001

redis.host2=192.168.25.140
redis.port2=7002

redis.host3=192.168.25.140
redis.port3=7003

redis.host4=192.168.25.140
redis.port4=7004

redis.host5=192.168.25.140
redis.port5=7005

redis.host6=192.168.25.140
redis.port6=7006

redis.maxRedirects=3
redis.maxIdle=100
redis.maxTotal=600

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM