新聞中心
線(xiàn)上的統(tǒng)一聊天和推送項(xiàng)目使用的是Redis主從,redis版本2.8.6

站在用戶(hù)的角度思考問(wèn)題,與客戶(hù)深入溝通,找到禹會(huì)網(wǎng)站設(shè)計(jì)與禹會(huì)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶(hù)體驗(yàn)好的作品,建站類(lèi)型包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請(qǐng)域名、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋禹會(huì)地區(qū)。
redis主從和MySQL主從目的差不多,但redis主從配置很簡(jiǎn)單,主要在從節(jié)點(diǎn)配置文件指定主節(jié)點(diǎn)ip和端口:slaveof 192.168.1.197 6379,然后啟動(dòng)主從,主從就搭建好了redis主從中如果主節(jié)點(diǎn)發(fā)生故障,不會(huì)自動(dòng)切換,需要借助redis的Sentinel或者keepalive來(lái)實(shí)現(xiàn)主的故障轉(zhuǎn)移
redis集群是一個(gè)無(wú)中心的分布式redis存儲(chǔ)架構(gòu),可以在多個(gè)節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享,解決了redis高可用、可擴(kuò)展等問(wèn)題,redis集群提供了以下兩個(gè)好處
1、將數(shù)據(jù)自動(dòng)切分(split)到多個(gè)節(jié)點(diǎn)
2、當(dāng)集群中的某一個(gè)節(jié)點(diǎn)故障時(shí),redis還可以繼續(xù)處理客戶(hù)端的請(qǐng)求。
一個(gè) Redis 集群包含 16384 個(gè)哈希槽(hash slot),數(shù)據(jù)庫(kù)中的每個(gè)數(shù)據(jù)都屬于這16384個(gè)哈希槽中的一個(gè)。集群使用公式 CRC16(key) % 16384 來(lái)計(jì)算鍵 key 屬于哪個(gè)槽。集群中的每一個(gè)節(jié)點(diǎn)負(fù)責(zé)處理一部分哈希槽。
集群中的主從復(fù)制
集群中的每個(gè)節(jié)點(diǎn)都有1個(gè)至N個(gè)復(fù)制品,其中一個(gè)為主節(jié)點(diǎn),其余的為從節(jié)點(diǎn),如果主節(jié)點(diǎn)下線(xiàn)了,集群就會(huì)把這個(gè)主節(jié)點(diǎn)的一個(gè)從節(jié)點(diǎn)設(shè)置為新的主節(jié)點(diǎn),繼續(xù)工作。這樣集群就不會(huì)因?yàn)橐粋€(gè)主節(jié)點(diǎn)的下線(xiàn)而無(wú)法正常工作
下面開(kāi)始搭建redis集群
由于最小的redis集群需要3個(gè)主節(jié)點(diǎn),一臺(tái)機(jī)器可運(yùn)行多個(gè)redis實(shí)例,我搭建時(shí)使用兩臺(tái)機(jī)器,6個(gè)redis實(shí)例,其中三個(gè)主節(jié)點(diǎn),三個(gè)從節(jié)點(diǎn)作為備份
網(wǎng)上很多使用單臺(tái)服務(wù)器開(kāi)6個(gè)端口,操作差不多,只是配置基本相對(duì)簡(jiǎn)單點(diǎn),多臺(tái)服務(wù)器更接近生產(chǎn)環(huán)境
redis 6個(gè)節(jié)點(diǎn)的ip和端口對(duì)應(yīng)關(guān)系
server1:
192.168.1.198:7000
192.168.1.198:7001
192.168.1.198:7002
server2:
192.168.1.199:7003
192.168.1.199:7004
192.168.1.199:7005
1、安裝需要的依賴(lài)包
[root@localhost ~]# yum install gcc gcc-c++ kernel-devel automake autoconf libtool make wget tcl vim ruby rubygems unzip git -y
2、兩臺(tái)機(jī)器分別下載redis并安裝
[root@localhost src]# cd /usr/local/
[root@localhost local]# wget http://download.redis.io/releases/redis-3.0.6.tar.gz
[root@localhost local]# tar xzf redis-3.0.6.tar.gz
[root@localhost local]# cd redis-3.0.6
[root@localhost redis-3.0.6]# make
3、創(chuàng)建集群需要的目錄
server1執(zhí)行:
mkdir -p /usr/local/cluster
cd /usr/local/cluster
mkdir 7000
mkdir 7001
mkdir 7002server2執(zhí)行:
mkdir -p /usr/local/cluster
cd /usr/local/cluster
mkdir 7003
mkdir 7004
mkdir 7005
4、修改配置文件redis.conf
cp /usr/local/redis-3.0.6/redis.conf /usr/local/cluster
cd /usr/local/cluster
vi redis.conf
##注意每個(gè)實(shí)例的端口號(hào)不同
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes##修改完redis.conf配置文件中的這些配置項(xiàng)之后把這個(gè)配置文件分別拷貝到7000/7001/7002/7003/7004/7005節(jié)點(diǎn)目錄下
server1執(zhí)行:
cp /usr/local/cluster/redis.conf /usr/local/cluster/7000
cp /usr/local/cluster/redis.conf /usr/local/cluster/7001
cp /usr/local/cluster/redis.conf /usr/local/cluster/7002server2執(zhí)行:
cp /usr/local/cluster/redis.conf /usr/local/cluster/7003
cp /usr/local/cluster/redis.conf /usr/local/cluster/7004
cp /usr/local/cluster/redis.conf /usr/local/cluster/7005##注意:拷貝完成之后要分別修改7001/7002/7003/7004/7005目錄下面redis.conf文件中的port參數(shù),分別改為對(duì)應(yīng)的文件夾的名稱(chēng)
5、分別啟動(dòng)這6個(gè)redis實(shí)例,并查看是否成功:ps -ef|grep redis
server1執(zhí)行:
[root@localhost cluster]# cd /usr/local/cluster/7000
[root@localhost 7000]# redis-server redis.conf
[root@localhost 7000]# cd /usr/local/cluster/7001
[root@localhost 7001]# redis-server redis.conf
[root@localhost 7001]# cd /usr/local/cluster/7002
[root@localhost 7002]# redis-server redis.conf
[root@localhost 7002]# ps -ef|grep redis
root 2741 1 0 09:39 ? 00:00:00 redis-server *:7000 [cluster]
root 2747 1 0 09:40 ? 00:00:00 redis-server *:7001 [cluster]
root 2751 1 0 09:40 ? 00:00:00 redis-server *:7002 [cluster]
root 2755 2687 0 09:40 pts/0 00:00:00 grep redisserver2執(zhí)行:
[root@localhost cluster]# cd /usr/local/cluster/7003
[root@localhost 7003]# redis-server redis.conf
[root@localhost 7003]# cd /usr/local/cluster/7004
[root@localhost 7004]# redis-server redis.conf
[root@localhost 7004]# cd /usr/local/cluster/7005
[root@localhost 7005]# redis-server redis.conf
[root@localhost 7005]# ps -ef|grep redis
root 1619 1 0 09:40 ? 00:00:00 redis-server *:7003 [cluster]
root 1623 1 0 09:40 ? 00:00:00 redis-server *:7004 [cluster]
root 1627 1 0 09:41 ? 00:00:00 redis-server *:7005 [cluster]
root 1631 1563 0 09:41 pts/0 00:00:00 grep redis
6、執(zhí)行redis的創(chuàng)建集群命令創(chuàng)建集群(注意ip地址和端口號(hào))
[root@localhost cluster]# cd /usr/local/redis-3.0.6/src
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.1.198:7000 192.168.1.198:7001 192.168.1.198:7002 192.168.1.199:7003 192.168.1.199:7004 192.168.1.199:70056.1到這一步因?yàn)榍懊娴?步裝了依賴(lài)包,未提示ruby和rubygems的錯(cuò)誤,但還是會(huì)報(bào)錯(cuò),提示不能加載redis,是因?yàn)槿鄙賠edis和ruby的接口,使用gem 安裝
錯(cuò)誤內(nèi)容:
/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 ./redis-trib.rb:25
解決:gem install redis
6.2 再次執(zhí)行第6步的命令,正常執(zhí)行,提示是否允許修改配置文件,輸入yes,然后整個(gè)集群配置完成!
[root@localhost src]# ./redis-trib.rb create --replicas 1 192.168.1.198:7000 192.168.1.198:7001 192.168.1.198:7002 192.168.1.199:7003 192.168.1.199:7004 192.168.1.199:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.199:7003
192.168.1.198:7000
192.168.1.199:7004
Adding replica 192.168.1.198:7001 to 192.168.1.199:7003
Adding replica 192.168.1.199:7005 to 192.168.1.198:7000
Adding replica 192.168.1.198:7002 to 192.168.1.199:7004
M: 2f70e9f2b4a06a846e46d7034a54e0fe6971beea 192.168.1.198:7000
slots:5461-10922 (5462 slots) master
S: e60f49920cf8620927b200b0001892d08067d065 192.168.1.198:7001
replicates 02f1958bd5032caca2fd47a56362c8d562d7e621
S: 26101db06b5c2d4431ca8308cf43d51f6939b4fc 192.168.1.198:7002
replicates 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299
M: 02f1958bd5032caca2fd47a56362c8d562d7e621 192.168.1.199:7003
slots:0-5460 (5461 slots) master
M: 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299 192.168.1.199:7004
slots:10923-16383 (5461 slots) master
S: ebb27bd0a48b67a4f4e0584be27c1c909944e935 192.168.1.199:7005
replicates 2f70e9f2b4a06a846e46d7034a54e0fe6971beea
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.1.198:7000)
M: 2f70e9f2b4a06a846e46d7034a54e0fe6971beea 192.168.1.198:7000
slots:5461-10922 (5462 slots) master
M: e60f49920cf8620927b200b0001892d08067d065 192.168.1.198:7001
slots: (0 slots) master
replicates 02f1958bd5032caca2fd47a56362c8d562d7e621
M: 26101db06b5c2d4431ca8308cf43d51f6939b4fc 192.168.1.198:7002
slots: (0 slots) master
replicates 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299
M: 02f1958bd5032caca2fd47a56362c8d562d7e621 192.168.1.199:7003
slots:0-5460 (5461 slots) master
M: 6c4f18b9e8729c3ab5d43b00b0bc1e2ee976f299 192.168.1.199:7004
slots:10923-16383 (5461 slots) master
M: ebb27bd0a48b67a4f4e0584be27c1c909944e935 192.168.1.199:7005
slots: (0 slots) master
replicates 2f70e9f2b4a06a846e46d7034a54e0fe6971beea
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
7、測(cè)試集群
server1上登錄redis客戶(hù)端并執(zhí)行
[root@localhost src]# redis-cli -c -p 7000
127.0.0.1:7000> get key
-> Redirected to slot [12539] located at 192.168.1.199:7004
"val"
192.168.1.199:7004> set name test
-> Redirected to slot [5798] located at 192.168.1.198:7000
OK
192.168.1.198:7000> set adress shanghai
-> Redirected to slot [1562] located at 192.168.1.199:7003
OK
192.168.1.199:7003>server2上登錄redis客戶(hù)端并執(zhí)行
[root@localhost src]# redis-cli -c -p 7003
127.0.0.1:7003> set key val
-> Redirected to slot [12539] located at 192.168.1.199:7004
OK
192.168.1.199:7004> get keyv
"val"
192.168.1.199:7004> set key2 val2
-> Redirected to slot [4998] located at 192.168.1.199:7003
OK
192.168.1.199:7003> get key2
"val2"
192.168.1.199:7003>
從中可以發(fā)現(xiàn)存時(shí)是分布式存儲(chǔ),取時(shí)也是從集群中取,測(cè)試成功
8、redis cluster 架構(gòu)
1)redis-cluster架構(gòu)圖
架構(gòu)細(xì)節(jié):
(1)所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.
(2)節(jié)點(diǎn)的fail是通過(guò)集群中超過(guò)半數(shù)的節(jié)點(diǎn)檢測(cè)失效時(shí)才生效.
(3)客戶(hù)端與redis節(jié)點(diǎn)直連,不需要中間proxy層.客戶(hù)端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可
(4)redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value
2) redis-cluster選舉:容錯(cuò)
(1)領(lǐng)著選舉過(guò)程是集群中所有master參與,如果半數(shù)以上master節(jié)點(diǎn)與master節(jié)點(diǎn)通信超過(guò)(cluster-node-timeout),認(rèn)為當(dāng)前master節(jié)點(diǎn)掛掉.
(2):什么時(shí)候整個(gè)集群不可用(cluster_state:fail),當(dāng)集群不可用時(shí),所有對(duì)集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯(cuò)誤
a:如果集群任意master掛掉,且當(dāng)前master沒(méi)有slave.集群進(jìn)入fail狀態(tài),也可以理解成進(jìn)群的slot映射[0-16383]不完成時(shí)進(jìn)入fail狀態(tài).
b:如果進(jìn)群超過(guò)半數(shù)以上master掛掉,無(wú)論是否有slave集群進(jìn)入fail狀態(tài).
標(biāo)題名稱(chēng):CentOS完美搭建Redis3.0集群并附測(cè)試
文章路徑:http://fisionsoft.com.cn/article/cdsjijd.html


咨詢(xún)
建站咨詢(xún)
