redis集群PHP解決方案


Redis3.2.4 Cluster集群搭建

服務器環境:
192.168.3.229
192.168.3.193
每台服務器搭建3個節點,組成3個主節點,3個從節點的redis集群。

注意:防火牆一定要開放監聽的redis端口,否則會創建失敗。

一、redis cluster安裝

1、下載和編譯安裝

cd /usr/local/src
wget http://download.redis.io/releases/redis-3.2.4.tar.gz
tar -zxvf redis-3.2.4.tar.gz
cd redis-3.2.4/
make && make install

 

2、創建redis節點
選擇2台服務器,分別為:192.168.3.229,192.168.3.193,每台服務器有3個節點,組成3個主節點,3個從節點的redis集群。

a、首先在192.168.3.229創建3個節點:

復制代碼
cd /usr/local/src
mkdir redis_cluster  #創建集群目錄
cd redis_cluster/
mkdir 7000 7001 7002 #分別代表三個節點,對應端口分別為7000、7001、7002

#redis.conf拷貝到7000目錄
cp redis-3.2.4/redis.conf redis_cluster/7000/
#redis.conf拷貝到7001目錄
cp redis-3.2.4/redis.conf redis_cluster/7001/
#redis.conf拷貝到7002目錄
cp redis-3.2.4/redis.conf redis_cluster/7002/
復制代碼

 

b、分別對7000、7001,7002文件夾中的3個redis.conf文件修改對應的配置:

復制代碼
daemonize yes                          #redis后台運行
pidfile   /var/run/redis_7000.pid      #pidfile文件對應7000, 7001, 7002
port 7000                              #端口7000, 7001, 7002
cluster-enabled  yes                   #開啟集群  把注釋#去掉
cluster-config-file  nodes_7000.conf   #集群的配置  配置文件首次啟動自動生成 7000,7001,7002,存在/usr/local/src/redis-3.2.4/src目錄
cluster-node-timeout  5000             #請求超時,設置5秒即可
appendonly  yes                        #aof日志開啟,有需要就開啟,它會每次寫操作都記錄一條日志
logfile "/home/xm6f/dev/redis_cluster/7000/logs/redis.log"
bind 192.168.1.105 #綁定當前服務器的IP,否則的話在集群通信的時候會出現:[ERR] Sorry, can't connect to node 192.168.200.140:7001

dbfilename dump_7000.rdb #存在/home/xm6f/dev/redis-3.2.4/src目錄
appendfilename "appendonly_7000.aof" #存在/home/xm6f/dev/redis-3.2.4/src目錄

requirepass 123456 #設置密碼,每個節點的密碼都必須一致的

masterauth 123456

復制代碼

在192.168.3.193創建3個節點:對應的端口改為7003,7004,7005.配置對應的改一下就可以了。

3、兩台機器啟動各節點(兩台服務器方式一樣)

復制代碼
cd /usr/local/src/
redis-server /usr/local/src/redis-3.2.4/redis_cluster/7000/redis.conf
redis-server /usr/local/src/redis-3.2.4/redis_cluster/7001/redis.conf
redis-server /usr/local/src/redis-3.2.4/redis_cluster/7002/redis.conf
redis-server /usr/local/src/redis-3.2.4/redis_cluster/7003/redis.conf
redis-server /usr/local/src/redis-3.2.4/redis_cluster/7004/redis.conf
redis-server /usr/local/src/redis-3.2.4/redis_cluster/7005/redis.conf
復制代碼

 

4、查看服務

ps -ef | grep redis #查看是否啟動成功
netstat -tnlp | grep redis #可以看到redis監聽端口

5、殺死所有redis進程

pkill -9 redis

 

二、創建集群
前面已經准備好了搭建集群的redis節點,接下來我們要把這些節點都串連起來搭建集群。官方提供了一個工具:redis-trib.rb(/home/xm6f/dev/redis-3.2.4/src/redis-trib.rb) 看后綴就知道這東西不能直接執行,它是用ruby寫的一個程序,所以我們還得安裝ruby.

yum -y install ruby ruby-devel rubygems rpm-build

再用 gem 這個命令來安裝 redis 接口,gem是ruby的一個工具包。

gem install redis //等一會兒就好了

當然,方便操作,兩台Server都要安裝。

注意:在執行gem install redis時,報ERROR:Error installing redis:redis requires Ruby version >= 2.2.2異常。
點擊此處查看解決方案

上面的步驟完事了,接下來運行一下redis-trib.rb

redis-trib.rb

確認所有的節點都啟動,接下來使用參數 create 創建 (在192.168.1.160中來創建)

redis-trib.rb create --replicas 1 192.168.3.229:7000 192.168.3.229:7001 192.168.3.229:7002 192.168.3.193:7003 192.168.3.193:7004 192.168.3.193:7005

注意:

a、--replicas 1參數表示為每個主節點創建一個從節點,其他參數是實例的地址集合。

b、防火牆一定要開放監聽的端口,否則會創建失敗。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@localhost redis-cluster] #
redis-trib.rb create --replicas 1 192.168.3.229:7000 192.168.3.229:7001 192.168.3.229:7002 192.168.3.193:7003 192.168.3.193:7004 192.168.3.193:7005
>>> Creating cluster 
>>> Performing  hash  slots allocation on 6 nodes... 
Using 3 masters: 
127.0.0.1:7001 
127.0.0.1:7002 
127.0.0.1:7003 
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001 
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002 
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003 
M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001 
    slots:0-5460 (5461 slots) master 
M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002 
    slots:5461-10922 (5462 slots) master 
M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003 
    slots:10923-16383 (5461 slots) master 
S: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004 
    replicates dfd510594da614469a93a0a70767ec9145aefb1a 
S: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005 
    replicates e02eac35110bbf44c61ff90175e04d55cca097ff 
S: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006 
    replicates 4385809e6f4952ecb122dbfedbee29109d6bb234 
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 127.0.0.1:7001) 
M: dfd510594da614469a93a0a70767ec9145aefb1a 127.0.0.1:7001 
    slots:0-5460 (5461 slots) master 
M: e02eac35110bbf44c61ff90175e04d55cca097ff 127.0.0.1:7002 
    slots:5461-10922 (5462 slots) master 
M: 4385809e6f4952ecb122dbfedbee29109d6bb234 127.0.0.1:7003 
    slots:10923-16383 (5461 slots) master 
M: ec02c9ef3acee069e8849f143a492db18d4bb06c 127.0.0.1:7004 
    slots: (0 slots) master 
    replicates dfd510594da614469a93a0a70767ec9145aefb1a 
M: 83e5a8bb94fb5aaa892cd2f6216604e03e4a6c75 127.0.0.1:7005 
    slots: (0 slots) master 
    replicates e02eac35110bbf44c61ff90175e04d55cca097ff 
M: 10c097c429ca24f8720986c6b66f0688bfb901ee 127.0.0.1:7006 
    slots: (0 slots) master 
    replicates 4385809e6f4952ecb122dbfedbee29109d6bb234 
[OK] All nodes agree about slots configuration. 
>>> Check  for  open  slots... 
>>> Check slots coverage... 
[OK] All 16384 slots covered.

上面顯示創建成功,有3個主節點,3個從節點,每個節點都是成功連接狀態。

       

php操作redis cluster集群成功實例

                 

PHP要操作redis cluster集群有兩種方式:

1、使用phpredis擴展,這是個c擴展,性能更高,但是phpredis2.x擴展不行,需升級phpredis到3.0,但這個方案參考資料很少

2、使用predis,純php開發,使用了命名空間,需要php5.3+,靈活性高

我用的是predis,下載地址https://github.com/nrk/predis/zipball/master

下載好后重命名為predis,

 

server1:192.168.3.229
server2:192.168.3.193

predis.php

 
  1. <?php  
  2. require 'predis/autoload.php';//引入predis相關包  
  3. //redis實例  
  4. $servers = array(  
  5.     'tcp://192.168.3.229:7000',  
  6.     'tcp://192.168.3.229:7001',  
  7.     'tcp://192.168.3.229:7002',  
  8.     'tcp://192.168.3.193:7003',  
  9.     'tcp://192.168.3.193:7004',  
  10.     'tcp://192.168.3.193:7005',  
  11. );  
  12.   
  13. $client = new Predis\Client($servers, array('cluster' => 'redis'));  
  14.   
  15. $client->set("name1", "11");  
  16. $client->set("name2", "22");  
  17. $client->set("name3", "33");  
  18.   
  19. $name1 = $client->get('name1');  
  20. $name2 = $client->get('name2');  
  21. $name3 = $client->get('name3');  
  22. var_dump($name1, $name2, $name3);die;  
  23. ?>  

name1,name2,name3是3個key,按照算法分配到3個slot上,有可能分到3台服務器上

 

首先運行predis.php查看結果:

然后登錄到redis客戶端進行集群驗證:

server1

 
  1. [root@localhost src]# redis-cli -c -p 7000  
  2. 127.0.0.1:7000> get name1  
  3. -> Redirected to slot [12933] located at 192.168.1.199:7004  
  4. "11"  
  5. 192.168.1.199:7004> get name2  
  6. -> Redirected to slot [742] located at 192.168.1.199:7003  
  7. "22"  
  8. 192.168.1.199:7003> get name3  
  9. "33"  
  10. 192.168.1.199:7003>  

server2

 
  1. [root@localhost src]# redis-cli -c -p 7003  
  2. 127.0.0.1:7003> get name1  
  3. -> Redirected to slot [12933] located at 192.168.1.199:7004  
  4. "11"  
  5. 192.168.1.199:7004> get name2  
  6. -> Redirected to slot [742] located at 192.168.1.199:7003  
  7. "22"  
  8. 192.168.1.199:7003> get name3  
  9. "33"  
  10. 192.168.1.199:7003>  

可以看到數據分布在各個服務器上,可以根據ps -ef | grep redis,殺掉其中幾個redis實例,再看效果

 

 

 

參考文獻:  redis集群教程   、php操作redis cluster集群成功實例

 

 


免責聲明!

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



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