centos 7 配置redis集羣

一、環境

  VirtualBox下三臺虛擬機,操作系統centos7

服務器名 ip
redis1 192.168.56.101
redis2 192.168.56.102
redis3 192.168.56.103

  關閉三臺服務器的防火牆

  [root@redis1 ~]# systemctl stop firewalld

 [root@redis1 ~]# systemctl disable firewalld

二、下載與安裝redis 

  •  建立redis安裝目錄

        [root@redis1 ~]# mkdir /redis/

       [root@redis1 ~]# cd /redis/

  •  下載redis

      wget  http://download.redis.io/releases/redis-4.0.11.tar.gz 

  •  解壓並進入目錄

      [root@redis1 redis]# tar xvzf redis-4.0.11.tar.gz

     [root@redis1 redis]# cd redis-4.0.11/

  • 建立redis配置文件目錄並拷貝默認配置文件

    [root@redis1 redis-4.0.11]# mkdir /redis/conf/

   [root@redis1 redis-4.0.11]# cp redis.conf /redis/conf/

  • 建立依懶

  [root@redis1 redis-4.0.11]# cd deps/
  [root@redis1 deps]# make hiredis lua jemalloc linenoise

 [root@redis1 deps]# cd ..

  • 編譯redis

 [root@redis1 redis-4.0.11]# make

  •    安裝redis

   [root@redis1 redis-4.0.11]# make PREFIX=/redis install

  • 進入redis目錄,查看redis二進制文件是否生成

  [root@redis1 redis-4.0.11]# cd /redis

  [root@redis1 redis]# ls bin
   redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server

  • 拷貝/redis目錄到其它兩臺服務器

  [root@redis1 ~]# rsync -av /redis 192.168.56.102

 [root@redis1 ~]# rsync -av /redis 192.168.56.103

三、建立redis集羣

  •   集羣的拓撲結構
服務器 端口 角色
redis1 6379 master
6380 redis3的slave
redis2 6380 master
6379 redis1的slave
redis3 6381 master
6380 redis2的slave
  • 建立redis集羣配置文件

     [root@redis1 redis]# mkdir data
     [root@redis1 redis]# mkdir log  
     [root@redis1 redis]# mkdir run
    [root@redis1 redis]# cd conf

    

[root@redis1 conf]# cat redis-6379.conf 
  daemonize yes
  pidfile "/redis/run/redis-6379.pid"
  port 6379
  bind 192.168.56.101
  logfile "/redis/log/redis-6379.log"
  dbfilename "dump-6379.rdb"
  dir "/redis/data"

  cluster-enabled yes
  cluster-config-file nodes-6379.conf
  cluster-node-timeout 10000

[root@redis1 conf]# cat redis-6381.conf 
  daemonize yes
  pidfile "/redis/run/redis-6381.pid"
  port 6381
  bind 192.168.56.101
  logfile "/redis/log/redis-6381.log"
  dbfilename "dump-6381.rdb"
  dir "/redis/data"

  cluster-enabled yes
  cluster-config-file nodes-6381.conf
  cluster-node-timeout 10000

建立redis2的配置文件: redis-6379.conf  redis-6380.conf

建立redis3的配置文件: redis-6380.conf  redis-6381.conf

----------------------------------------------------------------------

  • 啓動redis

[root@redis1 redis]# redis-server conf/redis-6379.conf 
[root@redis1 redis]# redis-server conf/redis-6381.conf
[root@redis2 redis]# redis-server conf/redis-6380.conf 
[root@redis2 redis]# redis-server conf/redis-6379.conf 
[root@redis3 redis]# redis-server conf/redis-6381.conf 
[root@redis3 redis]# redis-server conf/redis-6380.conf

啓動後查看集羣信息

  [root@redis1 redis]# redis-cli -h 192.168.56.101 -p 6379 INFO CLUSTER
  # Cluster
  cluster_enabled:1
[root@redis1 redis]# ps -ef | grep redis-server
  root      5285     1  0 17:13 ?        00:00:00 redis-server 192.168.56.101:6379 [cluster]
  root      5292     1  0 17:13 ?        00:00:00 redis-server 192.168.56.101:6381 [cluster]

---------------------------------------------------------

  • 查看日誌文件

[root@redis1 redis]# cat log/redis-6379.log 
5284:C 09 Oct 17:13:19.983 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
5284:C 09 Oct 17:13:19.983 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=5284, just started
5284:C 09 Oct 17:13:19.983 # Configuration loaded
5285:M 09 Oct 17:13:19.985 * Increased maximum number of open files to 10032 (it was originally set to 1024).
5285:M 09 Oct 17:13:19.986 * No cluster configuration found, I'm b41e3d483fce47c914dbb5e482e9a8e057b61c7d
5285:M 09 Oct 17:13:19.988 * Running mode=cluster, port=6379.

  • redis-cli運行CLUSTER MEET ,產生三個master節點

  [root@redis1 redis]# redis-cli -h 192.168.56.101 -p 6379 cluster meet 192.168.56.101 6379

 [root@redis1 redis]# redis-cli -h 192.168.56.101 -p 6379 cluster meet 192.168.56.102 6380

  [root@redis1 redis]# redis-cli -h 192.168.56.101 -p 6379 cluster meet 192.168.56.103 6381

  • 查看節點情況

   [root@redis2 redis]# redis-cli -h 192.168.56.102 -p 6380 cluster nodes
    7a6905b19aa375c23df23f97f4b9e44e0a5f8028 192.168.56.103:6381@16381 master - 0 1539150315902 2 connected
 edc5e78369f5ce0620952b782be76459d0abb982 192.168.56.102:6380@16380 myself,master - 0 1539150315000 0 connected
  b41e3d483fce47c914dbb5e482e9a8e057b61c7d 192.168.56.101:6379@16379 master - 0 1539150314288 1 connected  

  • 爲三個節點master分配slot,做爲數據sharding

[root@redis1 redis]# for i in {0..5400}; do
  > redis-cli -h 192.168.56.101 -p 6379 cluster addslots $i; done

[root@redis1 redis]# for i in {5401..11000}; do
> redis-cli -h 192.168.56.102 -p 6380 cluster addslots $i; done

[root@redis1 redis]# for i in {11001..16383}; do
> redis-cli -h 192.168.56.103 -p 6381 cluster addslots $i; done

[root@redis2 redis]# redis-cli -h 192.168.56.102 -p 6380 cluster nodes
7a6905b19aa375c23df23f97f4b9e44e0a5f8028 192.168.56.103:6381@16381 master - 0 1539151203814 2 connected 11001-16383
edc5e78369f5ce0620952b782be76459d0abb982 192.168.56.102:6380@16380 myself,master - 0 1539151203000 0 connected 5401-11000
b41e3d483fce47c914dbb5e482e9a8e057b61c7d 192.168.56.101:6379@16379 master - 0 1539151202429 1 connected 0-5400

  • 設置三個master的slave,實現數據複製與主節點failover

   192.168.56.101的6381的redis實例做爲192.168.56.103的6381的從節點,當從192.168.56.103的6381的redis實例寫入數據時,數據自動複製到192.168.56.101的6381的redis實例,當192.168.56.103的6381的redis實例宕機時,192.168.56.101的6381的redis實例提升爲master。

 [root@redis1 redis]# redis-cli -h 192.168.56.101 -p 6381 cluster meet 192.168.56.103 6381
[root@redis1 redis]# redis-cli -h 192.168.56.101 -p 6381 cluster replicate 7a6905b19aa375c23df23f97f4b9e44e0a5f8028
[root@redis1 redis]# redis-cli -h 192.168.56.102 -p 6379 cluster meet 192.168.56.101 6379
[root@redis1 redis]# redis-cli -h 192.168.56.102 -p 6379 cluster replicate b41e3d483fce47c914dbb5e482e9a8e057b61c7d
[root@redis1 redis]# redis-cli -h 192.168.56.103 -p 6380 cluster meet 192.168.56.102 6380
[root@redis1 redis]# redis-cli -h 192.168.56.103 -p 6380 cluster replicate edc5e78369f5ce0620952b782be76459d0abb982

  • 查看集羣節點情況

[root@redis2 redis]# redis-cli -h 192.168.56.102 -p 6380 cluster nodes
edc5e78369f5ce0620952b782be76459d0abb982 192.168.56.102:6380@16380 myself,master - 0 1539152305000 3 connected 5401-11000
fb5339f24e7fb781504fe37b67bbb9b0df3fbda9 192.168.56.101:6381@16381 slave 7a6905b19aa375c23df23f97f4b9e44e0a5f8028 0 1539152307001 2 connected
b41e3d483fce47c914dbb5e482e9a8e057b61c7d 192.168.56.101:6379@16379 master - 0 1539152307204 1 connected 0-5400
3d8ef6fed6eb7f72a4f9deb41dc6c6fe34ab2910 192.168.56.103:6380@16380 slave edc5e78369f5ce0620952b782be76459d0abb982 0 1539152306098 3 connected
7a6905b19aa375c23df23f97f4b9e44e0a5f8028 192.168.56.103:6381@16381 master - 0 1539152307000 2 connected 11001-16383
86f47c11821b116e2aa88f571c471a845379c44d 192.168.56.102:6379@16379 slave b41e3d483fce47c914dbb5e482e9a8e057b61c7d 0 1539152308490 1 connected

4、測試集羣情況

  1. 殺死192.168.56.101的6379的redis實例,192.168.56.102的6379的redis實例應該升級爲master

    [root@redis1 redis]# lsof -i:6379
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 2757 root    6u  IPv4  44114      0t0  TCP redis1:6379 (LISTEN)
redis-ser 2757 root   17u  IPv4 117037      0t0  TCP redis1:6379->redis2:39952 (ESTABLISHED)
[root@redis1 redis]# kill -9 2757

查看節點情況:

[root@redis3 redis]# redis-cli -h 192.168.56.103 -p 6381 cluster nodes
edc5e78369f5ce0620952b782be76459d0abb982 192.168.56.102:6380@16380 master - 0 1539152595000 3 connected 5401-11000
b41e3d483fce47c914dbb5e482e9a8e057b61c7d 192.168.56.101:6379@16379 master,fail - 1539152576772 1539152575000 1 disconnected
3d8ef6fed6eb7f72a4f9deb41dc6c6fe34ab2910 192.168.56.103:6380@16380 slave edc5e78369f5ce0620952b782be76459d0abb982 0 1539152595758 3 connected
7a6905b19aa375c23df23f97f4b9e44e0a5f8028 192.168.56.103:6381@16381 myself,master - 0 1539152596000 2 connected 11001-16383
86f47c11821b116e2aa88f571c471a845379c44d 192.168.56.102:6379@16379 master - 0 1539152597275 4 connected 0-5400
fb5339f24e7fb781504fe37b67bbb9b0df3fbda9 192.168.56.101:6381@16381 slave 7a6905b19aa375c23df23f97f4b9e44e0a5f8028 0 1539152595000 2 connected

2. 重啓192.168.56.101的6379

  [root@redis1 redis]# redis-server conf/redis-6379.conf 

  查看節點情況:看到192.168.56.101:6379成爲了56.102 6379的slave

edc5e78369f5ce0620952b782be76459d0abb982 192.168.56.102:6380@16380 master - 0 1539152856219 3 connected 5401-11000
b41e3d483fce47c914dbb5e482e9a8e057b61c7d 192.168.56.101:6379@16379 slave 86f47c11821b116e2aa88f571c471a845379c44d 0 1539152855757 4 connected
3d8ef6fed6eb7f72a4f9deb41dc6c6fe34ab2910 192.168.56.103:6380@16380 slave edc5e78369f5ce0620952b782be76459d0abb982 0 1539152854496 3 connected
7a6905b19aa375c23df23f97f4b9e44e0a5f8028 192.168.56.103:6381@16381 myself,master - 0 1539152855000 2 connected 11001-16383
86f47c11821b116e2aa88f571c471a845379c44d 192.168.56.102:6379@16379 master - 0 1539152853000 4 connected 0-5400
fb5339f24e7fb781504fe37b67bbb9b0df3fbda9 192.168.56.101:6381@16381 slave 7a6905b19aa375c23df23f97f4b9e44e0a5f8028 0 1539152855000 2 connected

3. 驗證生成數據sharding

生成100個數

[root@redis1 redis]#  for i in {0..100}; do
> redis-cli -c -h 192.168.56.102 -p 6380 set key$i $i; done

分別查看三個master

  [root@redis1 redis]# redis-cli -c -h 192.168.56.102 -p 6380
192.168.56.102:6380> KEYS *
 1) "key65"
 2) "key1"
 3) "key72"
 4) "key26"
 5) "key14"
 6) "key61"
 7) "key90"
 8) "key54"
 9) "key44"
10) "key43"
[root@redis1 redis]# redis-cli -c -h 192.168.56.103 -p 6381
192.168.56.103:6381> keys *
 1) "key8"
 2) "key57"
 3) "key71"
 4) "key52"
 5) "key27"
 6) "key34"
 7) "key84"
 8) "key66"
 9) "key74"
10) "key75"
[root@redis1 redis]# redis-cli -c -h 192.168.56.102 -p 6379
192.168.56.102:6379> keys *
 1) "key55"
 2) "key15"
 3) "key82"
 4) "key60"
 5) "key68"
 6) "key99"
 7) "key95"
 8) "key2"
 9) "key20"
10) "key51"

五、java操作redis集羣

  •   新建一maven項目,pom.xml加入
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>
  • 建立java類文件RedisCluster.java
public static void main(String[] args) throws Exception{
    try {
        Set<HostAndPort> hostAndPorts=new HashSet<>();
        hostAndPorts.add(new HostAndPort("192.168.56.101",6379));
        hostAndPorts.add(new HostAndPort("192.168.56.102",6380));
        hostAndPorts.add(new HostAndPort("192.168.56.103",6381));
        JedisCluster jedisCluster=new JedisCluster(hostAndPorts);
        for(int i=0;i<100;i++){
            jedisCluster.set("key"+i,""+i);
        }
    }catch (Exception ex){
        ex.printStackTrace();
    }
}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章