redis3.2.8環境搭建及集羣的搭建

環境搭建

1.下載redis3.2.8壓縮包,使用SFTP上傳到linux服務器

2.解壓文件

tar-zxf redis-3.2.8.tar.gz

3.安裝c語言環境(安裝ubnutu之後,自帶c語言環境)

4.編譯源碼

 root@wang-virtual-machine:/home/wang# cd redis-3.2.8
 root@wang-virtual-machine:/home/wang/redis-3.2.8#  make

5.安裝redis

root@wang-virtual-machine:/home/wang/redis-3.2.8# make install PEREFIX=/usr/local/myredis

6.檢查是否安裝成功

root@wang-virtual-machine:/home/wang/redis-3.2.8# cd /usr/local/myredis
root@wang-virtual-machine:/usr/local/myredis# ll

有bin目錄證明安裝成功

7.使用後端啓動方式啓動redis

7.1 將redis源碼包中的redis.conf配置文件複製到/usr/local/redis/bin/下

root@wang-virtual-machine:/usr/local/myredis/bin#  cp /home/wang/redis-3.2.8/redis.conf ./

7.2 修改配置文件

root@wang-virtual-machine:/usr/local/myredis/bin# vim redis.conf

7.2.1 將daemonize 由no改爲yes
7.2.2 將bind localhost(127.0.0.1) 註釋掉 否則其他主機不能連接
7.2.3 將protected-mode 設置爲no 默認爲yes需要使用密碼

8.執行啓動命令

root@wang-virtual-machine:/usr/local/myredis/bin#  ./redis-server redis.conf

9.查看是否啓動

root@wang-virtual-machine:/usr/local/myredis# ps -aux | grep redis

這裏寫圖片描述
(*)表示所有此時是允許所有的ip連接登錄到這臺redis服務上,如果是localhost在windows下使用jedis無法連接到redis服務
10.關閉

root@wang-virtual-machine:/usr/local/myredis/bin#  ./redis-cli shutdown

jedis客戶端

spring 配置文件中

<!--jedis配置 -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!-- 最大連接數 -->
        <property name="maxTotal" value="30" />
        <!-- 最大空閒數 -->
        <property name="maxIdle" value="10" />
        <!-- 每次釋放連接的最大數目 -->
        <property name="numTestsPerEvictionRun" value="1024" />
        <!-- 釋放連接的掃描間隔(毫秒) -->
        <property name="timeBetweenEvictionRunsMillis" value="30000" />
        <!-- 連接最小空閒時間 -->
        <property name="minEvictableIdleTimeMillis" value="1800000" />
        <!-- 連接空閒多久後釋放, 當空閒時間>該值 且 空閒連接>最大空閒連接數 時直接釋放 -->
        <property name="softMinEvictableIdleTimeMillis" value="10000" />
        <!-- 獲取連接時的最大等待毫秒數,小於零:阻塞不確定的時間,默認-1 -->
        <property name="maxWaitMillis" value="1500" />
        <!-- 在獲取連接的時候檢查有效性, 默認false -->
        <property name="testOnBorrow" value="false" />
        <!-- 在空閒時檢查有效性, 默認false -->
        <property name="testWhileIdle" value="true" />
        <!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true -->
        <property name="blockWhenExhausted" value="false" />
    </bean>
    <!-- redis配置 -->
    <bean id="jedisPool" class="redis.clients.jedis.JedisPool"
        destroy-method="close">
        <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
        <constructor-arg name="host" value="192.168.140.128" />
        <constructor-arg name="port" value="6379" />
    </bean>

測試

public class JedisTest {

    @Test
    public void test() {
        String xmlPath = "classpath:spring/applicationContext.xml";
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
        JedisPool pool = (JedisPool) context.getBean("jedisPool");

        Jedis jedis = null;

        try {
            jedis = pool.getResource();
            System.out.println(jedis);
            jedis.set("name", "lisi");
            String name = jedis.get("name");
            System.out.println(name);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {

            if (jedis != null)
                jedis.close();
        }

    }

}

集羣搭建

redis-cluster架構圖

這裏寫圖片描述
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集羣中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集羣中內置了 16384 個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點

redis-cluster投票:容錯

(1)集羣中所有master參與投票,如果半數以上master節點與其中一個master節點通信超過cluster-node-timeout(redis.conf中),認爲該master節點掛掉.
(2):什麼時候整個集羣不可用(cluster_state:fail)?

  • 如果集羣任意master掛掉,且當前master沒有slave,則集羣進入fail狀態。也可以理解成集羣的[0-16383]slot映射不完全時進入fail狀態。(主從複製發生錯誤)
  • 如果集羣超過半數以上master掛掉,無論是否有slave,集羣進入fail狀態。

redis 集羣環境搭建

集羣管理工具(redis-trib.rb)是使用ruby腳本語言編寫的。
1 . 安裝ruby環境

apt-get update
apt-get install ruby
apt-get install rubygems

2.安裝ruby和redis接口
將以redis-3.0.0.gem文件上傳到linux系統

root@wang-virtual-machine:/home/wang# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed

3 . 在myredis下創建redis-cluster目錄

root@wang-virtual-machine:/usr/local/myredis# mkdir redis-cluster

4 .將redis-3.2.8包下src目錄中的集羣管理工具文件文件拷貝到myredis/redis-cluster/

root@wang-virtual-machine:/home/wang/redis-3.2.8/src# ll *.rb
-rwxrwxr-x 1 wang wang 60852  212 23:14 redis-trib.rb
root@wang-virtual-machine:/home/wang/redis-3.2.8/src#  cp redis-trib.rb /usr/local/myredis/redis-cluster

5 .查看是否拷貝成功

root@wang-virtual-machine:/usr/local/myredis/redis-cluster# ll
總用量 68
drwxr-xr-x 2 root root  4096  59 17:52 ./
drwxr-xr-x 4 root root  4096  59 17:43 ../
-rwxr-xr-x 1 root root 60852  59 17:52 redis-trib.rb*

在主機上模擬搭建集羣的過程

搭建集羣最少也得需要3臺主機,如果每臺主機再配置一臺從機的話,則最少需要6臺機器。

1 .創建6個redis實例,需要端口號7001~7006複製一臺主機

 root@wang-virtual-machine:/usr/local/myredis# cp bin ./redis-cluster/7001 -R

2 .存在持久化文件則刪除

 rm -rf appendonly.aof dump.rdb

3 .設置集羣參數

  root@wang-virtual-machine:/usr/local/myredis/redis-cluster# vim 7001/redis.conf
   cluster-enabled yes //開啓集羣
   port 7001           //端口

4 .複製出7002-7006的機器

 root@wang-virtual-machine:/usr/local/myredis/redis-cluster# cp 7001 ./7002 -R

5 .修改其他主機端口

6 .創建腳本啓動所有主機

 root@wang-virtual-machine:/usr/local/myredis/redis-cluster# vim start-all.sh
cd 7001
./redis-server redis.conf
cd ..
cd 7002
./redis-server redis.conf
cd ..
cd 7003
./redis-server redis.conf
cd ..
cd 7004
./redis-server redis.conf
cd ..
cd 7005
./redis-server redis.conf
cd ..
cd 7006
./redis-server redis.conf
cd ..

7 . 修改start-all.sh文件的權限

  chmod u+x start-all.sh

8 .查看主機是否全部啓動

     ps -aux | grep redis

9 . 創建集羣

/redis-trib.rb create --replicas 1 192.168.140.129:7001 192.168.140.129:7002 192.168.140.129:7003 192.168.140.129:7004 192.168.140.129:7005  192.168.140.129:7006

這裏寫圖片描述
10 .連接集羣

root@wang-virtual-machine:/usr/local/myredis/redis-cluster/7001# ./redis-cli -h 192.168.140.129 -p 7001 -c

11 .查看集羣信息

cluster info

12 .查看集羣節點

cluster nodes

jedis連接

<!-- redis集羣設置 -->
    <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
        <constructor-arg index="0">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="192.168.140.129"></constructor-arg>
                    <constructor-arg index="1" value="7001"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="192.168.140.129"></constructor-arg>
                    <constructor-arg index="1" value="7002"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="192.168.140.129"></constructor-arg>
                    <constructor-arg index="1" value="7003"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="192.168.140.129"></constructor-arg>
                    <constructor-arg index="1" value="7004"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="192.168.140.129"></constructor-arg>
                    <constructor-arg index="1" value="7005"></constructor-arg>
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg index="0" value="192.168.140.129"></constructor-arg>
                    <constructor-arg index="1" value="7006"></constructor-arg>
                </bean>

            </set>
        </constructor-arg>
        <constructor-arg index="1" ref="jedisPoolConfig">
        </constructor-arg>

    </bean>

測試

@Test
    public void test1() {
        JedisCluster cluster = (JedisCluster) context.getBean("jedisCluster");
        cluster.set("name", "zhangsan");
        String name = cluster.get("name");
        System.out.println(name);

    }
發佈了57 篇原創文章 · 獲贊 29 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章