一、環境
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(); } }