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

站在用戶的角度思考問題,與客戶深入溝通,找到禹會網(wǎng)站設(shè)計與禹會網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、申請域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋禹會地區(qū)。
redis主從和MySQL主從目的差不多,但redis主從配置很簡單,主要在從節(jié)點配置文件指定主節(jié)點ip和端口:slaveof 192.168.1.197 6379,然后啟動主從,主從就搭建好了redis主從中如果主節(jié)點發(fā)生故障,不會自動切換,需要借助redis的Sentinel或者keepalive來實現(xiàn)主的故障轉(zhuǎn)移
redis集群是一個無中心的分布式redis存儲架構(gòu),可以在多個節(jié)點之間進(jìn)行數(shù)據(jù)共享,解決了redis高可用、可擴(kuò)展等問題,redis集群提供了以下兩個好處
1、將數(shù)據(jù)自動切分(split)到多個節(jié)點
2、當(dāng)集群中的某一個節(jié)點故障時,redis還可以繼續(xù)處理客戶端的請求。
一個 Redis 集群包含 16384 個哈希槽(hash slot),數(shù)據(jù)庫中的每個數(shù)據(jù)都屬于這16384個哈希槽中的一個。集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽。集群中的每一個節(jié)點負(fù)責(zé)處理一部分哈希槽。
集群中的主從復(fù)制
集群中的每個節(jié)點都有1個至N個復(fù)制品,其中一個為主節(jié)點,其余的為從節(jié)點,如果主節(jié)點下線了,集群就會把這個主節(jié)點的一個從節(jié)點設(shè)置為新的主節(jié)點,繼續(xù)工作。這樣集群就不會因為一個主節(jié)點的下線而無法正常工作
下面開始搭建redis集群
由于最小的redis集群需要3個主節(jié)點,一臺機(jī)器可運(yùn)行多個redis實例,我搭建時使用兩臺機(jī)器,6個redis實例,其中三個主節(jié)點,三個從節(jié)點作為備份
網(wǎng)上很多使用單臺服務(wù)器開6個端口,操作差不多,只是配置基本相對簡單點,多臺服務(wù)器更接近生產(chǎn)環(huán)境
redis 6個節(jié)點的ip和端口對應(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、安裝需要的依賴包
[root@localhost ~]# yum install gcc gcc-c++ kernel-devel automake autoconf libtool make wget tcl vim ruby rubygems unzip git -y
2、兩臺機(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
##注意每個實例的端口號不同
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes##修改完redis.conf配置文件中的這些配置項之后把這個配置文件分別拷貝到7000/7001/7002/7003/7004/7005節(jié)點目錄下
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ù),分別改為對應(yīng)的文件夾的名稱
5、分別啟動這6個redis實例,并查看是否成功: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地址和端口號)
[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到這一步因為前面第1步裝了依賴包,未提示ruby和rubygems的錯誤,但還是會報錯,提示不能加載redis,是因為缺少redis和ruby的接口,使用gem 安裝
錯誤內(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,然后整個集群配置完成!
[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、測試集群
server1上登錄redis客戶端并執(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客戶端并執(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)存時是分布式存儲,取時也是從集群中取,測試成功
8、redis cluster 架構(gòu)
1)redis-cluster架構(gòu)圖
架構(gòu)細(xì)節(jié):
(1)所有的redis節(jié)點彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.
(2)節(jié)點的fail是通過集群中超過半數(shù)的節(jié)點檢測失效時才生效.
(3)客戶端與redis節(jié)點直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點,連接集群中任何一個可用節(jié)點即可
(4)redis-cluster把所有的物理節(jié)點映射到[0-16383]slot上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value
2) redis-cluster選舉:容錯
(1)領(lǐng)著選舉過程是集群中所有master參與,如果半數(shù)以上master節(jié)點與master節(jié)點通信超過(cluster-node-timeout),認(rèn)為當(dāng)前master節(jié)點掛掉.
(2):什么時候整個集群不可用(cluster_state:fail),當(dāng)集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
a:如果集群任意master掛掉,且當(dāng)前master沒有slave.集群進(jìn)入fail狀態(tài),也可以理解成進(jìn)群的slot映射[0-16383]不完成時進(jìn)入fail狀態(tài).
b:如果進(jìn)群超過半數(shù)以上master掛掉,無論是否有slave集群進(jìn)入fail狀態(tài).
當(dāng)前題目:CentOS完美搭建Redis3.0集群并附測試
文章地址:http://www.5511xx.com/article/cdsjijd.html


咨詢
建站咨詢
