溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Redis高可用集群的搭建配置

發(fā)布時(shí)間:2020-06-23 23:00:26 來(lái)源:億速云 閱讀:159 作者:Leah 欄目:關(guān)系型數(shù)據(jù)庫(kù)

這篇文章將為大家詳細(xì)講解有關(guān)Redis高可用集群的搭建配置,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

Redis的集群主從模型是一種高可用的集群架構(gòu)。本章主要內(nèi)容有:高可用集群的搭建,Jedis連接集群,新增集群節(jié)點(diǎn),刪除集群節(jié)點(diǎn),其他配置補(bǔ)充說(shuō)明。

高可用集群搭建

集群(cluster)技術(shù)是一種較新的技術(shù),通過(guò)集群技術(shù),可以在付出較低成本的情況下獲得在性能、可靠性、靈活性方面的相對(duì)較高的收益,其任務(wù)調(diào)度則是集群系統(tǒng)中的核心技術(shù)。

Redis 3.0 之后便支持集群。Redis 集群中內(nèi)置了 16384 個(gè)哈希槽。Redis 會(huì)根據(jù)節(jié)點(diǎn)數(shù)量大致均等的將哈希槽映射到不同的節(jié)點(diǎn)。
所有節(jié)點(diǎn)之間彼此互聯(lián)(PING-PONG機(jī)制),當(dāng)超過(guò)半數(shù)的主機(jī)認(rèn)為某臺(tái)主機(jī)掛了,則該主機(jī)就是真的掛掉了,整個(gè)集群就不可用了。
若給集群中的每臺(tái)主機(jī)分配多臺(tái)從機(jī)。主機(jī)掛了,從機(jī)上位,依然能正常工作。但是若集群中超過(guò)半數(shù)的主機(jī)掛了,無(wú)論是否有從機(jī),該集群也是不可用的。

搭建前的準(zhǔn)備工作

搭建ruby環(huán)境

redis集群管理工具 redis-trib.rb 是依賴(lài) ruby 環(huán)境。

[root@itdragon ~]# yum install ruby
[root@itdragon ~]# yum install rubygems
[root@itdragon ~]# gem install redis
[root@itdragon ~]# cd redis-4.0.2/src/
[root@itdragon src]# cp redis-trib.rb /usr/local/redis-4/bin/

第一步:安裝 ruby 環(huán)境

第二步:安裝 gem 軟件包(gem是用來(lái)擴(kuò)展或修改Ruby應(yīng)用程序的)。

第三步:在redis解壓目錄中找到 redis-trib.rb 文件,將其拷貝到啟動(dòng)redis服務(wù)的目錄下,方便管理。

可能存在的問(wèn)題

1 redis requires Ruby version >= 2.2.2,解決方法如下

2 沒(méi)有/usr/local/rvm/scripts/rvm 這個(gè)目錄.可能是上一步執(zhí)行失敗

[root@itdragon ~]# ruby --version
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
[root@itdragon ~]# yum install curl
[root@itdragon ~]# curl -L get.rvm.io | bash -s stable
[root@itdragon ~]# source /usr/local/rvm/scripts/rvm 
[root@itdragon ~]# rvm list known
[root@itdragon ~]# rvm install 2.3.3
[root@itdragon ~]# rvm use 2.3.3
[root@itdragon ~]# gem install redis

服務(wù)器">準(zhǔn)備六臺(tái)redis服務(wù)器

和主從復(fù)制邏輯一樣,將redis.conf文件拷貝6次,端口從6000~6005

[root@itdragon bin]# cp redis.conf redis6000.conf
[root@itdragon bin]# vim redis6000.conf  
port xxxx                           #修改端口
cluster-enabled yes                 #打開(kāi)注釋?zhuān)_(kāi)啟集群模式
cluster-config-file nodes-xxxx.conf #集群的配置文件
pidfile /var/run/redis_xxxx.pid     #pidfile文件
logfile "xxxx.log"                  #日志文件
dbfilename dump_xxxx.rdb            #rdb持久化文件
cluster-node-timeout 5000           #請(qǐng)求超時(shí),單位毫秒
appendonly yes                      #開(kāi)啟aof持久化方式
[root@itdragon bin]# vim start-all.sh
./redis-server redis6000.conf
./redis-server redis6001.conf
./redis-server redis6002.conf
./redis-server redis6003.conf
./redis-server redis6004.conf
./redis-server redis6005.conf
[root@itdragon bin]# chmod u+x start-all.sh
[root@itdragon bin]# ./start-all.sh 
[root@itdragon bin]# ps aux | grep redis
root     28001  0.0  0.9 145964  9696 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6000 [cluster]
root     28003  0.0  0.9 145964  9696 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6001 [cluster]
root     28008  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6002 [cluster]
root     28013  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6003 [cluster]
root     28018  0.1  0.9 145964  9652 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6004 [cluster]
root     28023  0.0  0.9 145964  9656 ?        Ssl  17:45   0:00 ./redis-server 112.74.83.71:6005 [cluster]

第一步:復(fù)制六個(gè)redis.conf 并修改相關(guān)配置,如果覺(jué)得麻煩可以用我配置的文件:https://github.com/ITDragonBlog/daydayup/tree/master/Redis/reids.conf
第二步:新增批量開(kāi)啟redis服務(wù)程序,并增加執(zhí)行權(quán)限

第三步:查看六臺(tái)redis服務(wù)是否啟動(dòng)成功

主從集群搭建

集群創(chuàng)建命令: ./redis-trib.rb create 創(chuàng)建集群,--replicas 1 給每個(gè)主機(jī)分配一個(gè)從機(jī),后面其他參數(shù)都是redis服務(wù)的ip:port。最后輸入yes來(lái)接受建議的配置

[root@itdragon bin]# ./redis-trib.rb create --replicas 1 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 112.74.83.71:6003 112.74.83.71:6004 112.74.83.71:6005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
112.74.83.71:6000
112.74.83.71:6001
112.74.83.71:6002
Adding replica 112.74.83.71:6003 to 112.74.83.71:6000
Adding replica 112.74.83.71:6004 to 112.74.83.71:6001
Adding replica 112.74.83.71:6005 to 112.74.83.71:6002
...... #省略
Can I set the above configuration? (type 'yes' to accept): yes
...... #省略
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered. #有16384個(gè)可用的插槽提供服務(wù)說(shuō)明搭建成功

[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6002 -c
112.74.83.71:6002> set testKey value
-> Redirected to slot [5203] located at 112.74.83.71:6000
OK

112.74.83.71:6000> cluster info
cluster_state:ok
......

112.74.83.71:6000> cluster nodes
0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
13ddd4c1b8c00926f61aa6daaa7fd8d87ee97830 112.74.83.71:6005@16005 slave 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 0 1512035803720 6 connected
a3bb22e04deec2fca653c606edf5b02b819f924f 112.74.83.71:6003@16003 slave 1d4779469053930f30162e89b6711d27a112b601 0 1512035802000 4 connected
1d4779469053930f30162e89b6711d27a112b601 112.74.83.71:6000@16000 myself,master - 0 1512035802000 1 connected 0-5460
a3b99cb5d22f5cbd293179e262f5eda931733c88 112.74.83.71:6001@16001 master - 0 1512035802719 2 connected 5461-10922
915a47afc4f9b94389676b4e14f78cba66be9e5d 112.74.83.71:6004@16004 slave a3b99cb5d22f5cbd293179e262f5eda931733c88 0 1512035801717 5 connected

第一步:搭建集群 ./redis-trib.rb create ,選擇yes接受建議的配置

第二步:進(jìn)入集群客戶(hù)端 ./redis-cli -h 任意主機(jī)host -p 任意主機(jī)port -c,-c表示以集群方式連接redis

第三步:保存數(shù)據(jù)

第四步:cluster info 查詢(xún)集群狀態(tài)信息

第五步:cluster nodes 查詢(xún)集群結(jié)點(diǎn)信息,這里有一個(gè)坑,后面會(huì)介紹

可能存在的問(wèn)題

Sorry, the cluster configuration file nodes.conf is already used by a different Redis Cluster node. Please make sure that different nodes use different cluster configuration files.

說(shuō)的很明確,修改cluster-config-file nodes.conf 文件避免重名,或者刪除該文件重新創(chuàng)建集群。

cluster nodes 查詢(xún)集群節(jié)點(diǎn)信息

這是很重要的命令,我們需要關(guān)心的信息有:

第一個(gè)參數(shù):節(jié)點(diǎn)ID

第二個(gè)參數(shù):IP:PORT@TCP 這里一個(gè)坑,jedis-2.9.0之前的版本解析@出錯(cuò)

第三個(gè)參數(shù):標(biāo)志(Master,Slave,Myself,F(xiàn)ail...)

第四個(gè)參數(shù):如果是從機(jī)則是主機(jī)的節(jié)點(diǎn)ID

最后兩個(gè)參數(shù):連接的狀態(tài)和槽的位置。

Jedis 連接集群

首先要配置防火墻

[root@itdragon ~]# vim /etc/sysconfig/iptables
-A INPUT -p tcp -m tcp --dport 6000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6003 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6004 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 6005 -j ACCEPT
[root@itdragon ~]# service iptables restart

最后是整合Spring

<!-- jedis集群版配置 -->
<bean id="redisClient" class="redis.clients.jedis.JedisCluster">
    <constructor-arg name="nodes">
        <set>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6000" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6001" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6002" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6003" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6004" />
            </bean>
            <bean class="redis.clients.jedis.HostAndPort">
                <constructor-arg name="host" value="${redis.host}"></constructor-arg>
                <constructor-arg name="port" value="6005" />
            </bean>
        </set>
    </constructor-arg>
    <constructor-arg name="poolConfig" ref="jedisPoolConfig" />
</bean>
<bean id="jedisClientCluster" class="com.itdragon.service.impl.JedisClientCluster"></bean>

單元測(cè)試

/**
 * 集群版測(cè)試
 * 若提示以下類(lèi)似的錯(cuò)誤:
 * java.lang.NumberFormatException: For input string: "6002@16002"
 * 若安裝的redis 版本大于4,則可能是jedis 的版本低了。選擇 2.9.0
 * 因?yàn)?cluster nodes 打印的信息中,4版本之前的是沒(méi)有 @16002 tcp端口信息
 * 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383
 */
@Test
public void testJedisCluster() throws IOException {
    HashSet<HostAndPort> nodes = new HashSet<>();
    nodes.add(new HostAndPort(HOST, 6000));
    nodes.add(new HostAndPort(HOST, 6001));
    nodes.add(new HostAndPort(HOST, 6002));
    nodes.add(new HostAndPort(HOST, 6003));
    nodes.add(new HostAndPort(HOST, 6004));
    nodes.add(new HostAndPort(HOST, 6005));
    JedisCluster cluster = new JedisCluster(nodes);
    cluster.set("cluster-key", "cluster-value");
    System.out.println("集群測(cè)試 : " + cluster.get("cluster-key"));
    cluster.close();
}

可能存在的問(wèn)題

java.lang.NumberFormatException: For input string: "6002@16002"

若redis 的版本在4.0.0之上,建議使用jedis-2.9.0以上。

源碼:
https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis

集群節(jié)點(diǎn)操作

添加主節(jié)點(diǎn)

[root@itdragon bin]# cp redis6005.conf redis6006.conf
[root@itdragon bin]# ./redis-server redis6006.conf
[root@itdragon bin]# ./redis-trib.rb add-node 112.74.83.71:6006 112.74.83.71:6000
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512115612162 0 connected   # 沒(méi)有分配槽
[root@itdragon bin]# ./redis-trib.rb reshard 112.74.83.71:6000
How many slots do you want to move (from 1 to 16384)? 500
What is the receiving node ID? 916d26e9638dc51e168f32969da11e19c875f48f
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:all
Do you want to proceed with the proposed reshard plan (yes/no)? yes
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512116047897 7 connected 0-165 5461-5627 10923-11088

第一步:創(chuàng)建 redis6006.conf 的新主機(jī),并啟動(dòng)Redis服務(wù)

第二步:新增主機(jī)節(jié)點(diǎn),若打印"[OK] New node added correctly." 表示添加成功

第三步:查詢(xún)集群節(jié)點(diǎn)信息,發(fā)現(xiàn)6006端口的主機(jī)雖然已經(jīng)添加,但連接狀態(tài)后面沒(méi)有內(nèi)容,即沒(méi)分配槽

第四步:給6006端口主機(jī)分配槽,

第一個(gè)參數(shù):需要移動(dòng)槽的個(gè)數(shù),

第二個(gè)參數(shù):接受槽的節(jié)點(diǎn)ID,

第三個(gè)參數(shù):輸入"all"表示從所有原節(jié)點(diǎn)中獲取槽,

第四個(gè)參數(shù):輸入"yes"開(kāi)始移動(dòng)槽到目標(biāo)結(jié)點(diǎn)id

第五步:查詢(xún)集群節(jié)點(diǎn)信息,發(fā)現(xiàn)6006端口的主機(jī)已經(jīng)分配了槽

核心命令:
./redis-trib.rb add-node 新增主機(jī)ip:port 集群任意節(jié)點(diǎn)ip:port
./redis-trib.rb reshard 集群任意節(jié)點(diǎn)ip:port

可能存在的問(wèn)題
[ERR] Sorry, can't connect to node 112.74.83.71:6006
說(shuō)明:新增的主機(jī)必須要是啟動(dòng)狀態(tài)。

添加從節(jié)點(diǎn)

[root@itdragon bin]# cp redis6006.conf redis6007.conf
[root@itdragon bin]# vim redis6007.conf 
[root@itdragon bin]# ./redis-server redis6007.conf
[root@itdragon bin]# ./redis-trib.rb add-node --slave --master-id 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6007 112.74.83.71:6006
[root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes
80315a4dee2d0fa46b8ac722962567fc903e797a 112.74.83.71:6007@16007 slave 916d26e9638dc51e168f32969da11e19c875f48f 0 1512117377000 7 connected

第一步:創(chuàng)建 redis6007.conf 的新主機(jī),并啟動(dòng)Redis服務(wù)
第二步:新增從機(jī)節(jié)點(diǎn),在原來(lái)的命令上多了 --slave --master-id 主節(jié)點(diǎn)ID
第三步:查詢(xún)集群節(jié)點(diǎn)信息

刪除結(jié)點(diǎn)

刪除節(jié)點(diǎn)前,要確保該節(jié)點(diǎn)沒(méi)有值,否則提示:is not empty! Reshard data away and try again. 若該節(jié)點(diǎn)有值,則需要把槽分配出去

./redis-trib.rb del-node 112.74.83.71:6006 916d26e9638dc51e168f32969da11e19c875f48f

配置文件補(bǔ)充

前幾章Redis教程中介紹了以下配置

1 開(kāi)啟Redis 的守護(hù)進(jìn)程 :daemonize yes

2 指定pid文件寫(xiě)入文件名 :pidfile /var/run/redis.pid

3 指定Redis 端口:port 6379

4 綁定的主機(jī)地址 :bind 127.0.0.1

5 Redis持久化默認(rèn)開(kāi)啟壓縮數(shù)據(jù):rdbcompression yes

6 指定rdb文件名:dbfilename dump.rdb

7 指定rdb文件位置:dir ./

8 從機(jī)啟動(dòng)時(shí),它會(huì)自動(dòng)從master進(jìn)行數(shù)據(jù)同步:slaveof < masterip> < masterport>

9 開(kāi)啟aof持久化方式:appendonly yes

10 指定aof文件名:appendfilename appendonly.aof

11 觸發(fā)aof快照機(jī)制:appendfsync everysec (no/always)

本章節(jié)是Redis教程中的最后一章,把剩下的配置也一起說(shuō)了吧

1 設(shè)置客戶(hù)端連接超時(shí)時(shí)間,0表示關(guān)閉 :timeout 300

2 設(shè)置Redis日志級(jí)別,debug、verbose(默認(rèn))、notice、warning:loglevel verbose

3 設(shè)置數(shù)據(jù)庫(kù)的數(shù)量:databases 1

4 設(shè)置Redis連接密碼:requirepass foobared

5 設(shè)置同一時(shí)間最大客戶(hù)端連接數(shù),默認(rèn)無(wú)限制:maxclients 128

6 指定Redis最大內(nèi)存限制:maxmemory < bytes>

7 指定是否啟用虛擬內(nèi)存機(jī)制:vm-enabled no

8 指定虛擬內(nèi)存文件路徑:vm-swap-file /tmp/redis.swap

9 指定包含其它的配置文件:include /path/to/local.conf

關(guān)于Redis高可用集群的搭建配置就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI