Redis Cluster 설치 및 구성 java Source
운영체제 : ubuntu 12.04
1. 패키지 설치
apt-get install -y git curl build-essential ruby
2.redis 최신소스 다운로드 및 컴파일
git clone https://github.com/antirez/redis.git /opt/redis cd /opt/redis make
3.redis 바이너리 설치
ln -s /opt/redis/src/redis-cli /usr/sbin/redis-cli ln -s /opt/redis/src/redis-trib.rb /usr/sbin/redis-trib.rb ln -s /opt/redis/src/redis-server /usr/sbin/redis-server ln -s /opt/redis/src/redis-sentinel /usr/sbin/redis-sentinel ln -s /opt/redis/src/redis-check-aof /usr/sbin/redis-check-aof ln -s /opt/redis/redis-benchmark /usr/sbin/redis-benchmark ln -s /opt/redis/src/redis-check-dump /usr/sbin/redis-check-dump
4.gem redis 설치
gem install redis
참고 : centos gem 설치방법
yum install ruby ruby-devel ruby-irb ruby-rdoc ruby-ri yum install rubygems gem update gem update --system gem install redis
5.redis conf 생성 및 설정
mkdir 7379 8379 9379 cp /opt/redis/redis.conf /opt/redis/7379/7379.conf echo 'cluster-enabled yes' >> /opt/redis/7379/7379.conf echo 'cluster-config-file nodes.conf' >> /opt/redis/7379/7379.conf echo 'cluster-node-timeout 5000' >> /opt/redis/7379/7379.conf sed -i '/^appendonly no/ s:.*:appendonly yes:' /opt/redis/7379/7379.conf sed -i 's/port 6379/port 7379/g' /opt/redis/7379/7379.conf sed -i 's/dir .\//dir \/opt\/redis\/7379\//g' /opt/redis/7379/7379.conf sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /opt/redis/7379/7379.conf sed -i 's/pidfile \/var\/run\/redis.pid/pidfile \/opt\/redis\/7379\/redis.pid/g' /opt/redis/7379/7379.conf cp /opt/redis/redis.conf /opt/redis/8379/8379.conf cp /opt/redis/redis.conf /opt/redis/9379/9379.conf sed -i 's/port 7379/port 8379/g' /opt/redis/8379/8379.conf sed -i 's/dir .\//dir \/opt\/redis\/8379\//g' /opt/redis/8379/8379.conf sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /opt/redis/8379/8379.conf sed -i 's/pidfile \/var\/run\/redis.pid/pidfile \/opt\/redis\/8379\/redis.pid/g' /opt/redis/8379/8379.conf sed -i 's/port 7379/port 9379/g' /opt/redis/9379/9379.conf sed -i 's/dir .\//dir \/opt\/redis\/9379\//g' /opt/redis/9379/9379.conf sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /opt/redis/9379/9379.conf sed -i 's/pidfile \/var\/run\/redis.pid/pidfile \/opt\/redis\/9379\/redis.pid/g' /opt/redis/9379/9379.conf
6. redis 실행
/opt/redis/src/redis-server /opt/redis/7379/7379.conf & /opt/redis/src/redis-server /opt/redis/8379/8379.conf & /opt/redis/src/redis-server /opt/redis/9379/9379.conf &
7.redis cluster 설정(master 3개)
src/redis-trib.rb create --replicas 0 127.0.0.1:7379 127.0.0.1:8379 127.0.0.1:9379
위의 명령실행 결과
>>> Creating cluster Connecting to node 127.0.0.1:7379: OK Connecting to node 127.0.0.1:8379: OK Connecting to node 127.0.0.1:9379: OK >>> Performing hash slots allocation on 3 nodes... Using 3 masters: 127.0.0.1:7379 127.0.0.1:8379 127.0.0.1:9379 M: c923041b0bd608f2626ccc2de3d5cefd58d10869 127.0.0.1:7379 slots:0-5460 (5461 slots) master M: f3464abdacaf24e002897fd7985890b04b603f63 127.0.0.1:8379 slots:5461-10922 (5462 slots) master M: 31339c56231f01ef2f9f844e891d48bf72b20c44 127.0.0.1:9379 slots:10923-16383 (5461 slots) master Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node 11254:M 16 Sep 11:45:24.740 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH 11257:M 16 Sep 11:45:24.741 # configEpoch set to 2 via CLUSTER SET-CONFIG-EPOCH 11265:M 16 Sep 11:45:24.741 # configEpoch set to 3 via CLUSTER SET-CONFIG-EPOCH >>> Sending CLUSTER MEET messages to join the cluster 11254:M 16 Sep 11:45:24.814 # IP address for this node updated to 127.0.0.1 11257:M 16 Sep 11:45:24.914 # IP address for this node updated to 127.0.0.1 11265:M 16 Sep 11:45:24.915 # IP address for this node updated to 127.0.0.1 Waiting for the cluster to join. >>> Performing Cluster Check (using node 127.0.0.1:7379) M: c923041b0bd608f2626ccc2de3d5cefd58d10869 127.0.0.1:7379 slots:0-5460 (5461 slots) master M: f3464abdacaf24e002897fd7985890b04b603f63 127.0.0.1:8379 slots:5461-10922 (5462 slots) master M: 31339c56231f01ef2f9f844e891d48bf72b20c44 127.0.0.1:9379 slots:10923-16383 (5461 slots) master [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
8.redis cluster 설정(master 3개, slave 3개 1:1)
src/redis-trib.rb create --replicas 1 127.0.0.1:7379 127.0.0.1:8379 127.0.0.1:9379 127.0.0.1:7380 127.0.0.1:8380 127.0.0.1:9380
9.redis client 실행
src/redis-cli -p 7379 -c 127.0.0.1:7379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:3 cluster_size:3 cluster_current_epoch:3 cluster_my_epoch:1 cluster_stats_messages_sent:109 cluster_stats_messages_received:109 127.0.0.1:7379> cluster nodes c923041b0bd608f2626ccc2de3d5cefd58d10869 127.0.0.1:7379 myself,master - 0 0 1 connected 0-5460 f3464abdacaf24e002897fd7985890b04b603f63 127.0.0.1:8379 master - 0 1442371582367 2 connected 5461-10922 31339c56231f01ef2f9f844e891d48bf72b20c44 127.0.0.1:9379 master - 0 1442371581363 3 connected 10923-16383 127.0.0.1:7379> flushall OK 127.0.0.1:7379> keys * (empty list or set) 127.0.0.1:7379> get 5 -> Redirected to slot [9974] located at 127.0.0.1:8379 "5" 127.0.0.1:8379>
10 java maven pom.xml 추가
redis.clients jedis 2.7.2 jar compile
11.Java jUnit jedisClusterTest Source
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.Assert; import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisCluster; public class jedisClusterTest { @SuppressWarnings("deprecation") @Test public void test() { SetclusterNodes = new HashSet (); clusterNodes.add(new HostAndPort("127.0.0.1", 7379)); JedisCluster cluster = new JedisCluster(clusterNodes); List clusterHostAndPortList = new ArrayList (); clusterHostAndPortList.add(new HostAndPort("127.0.0.1", 7379)); clusterHostAndPortList.add(new HostAndPort("127.0.0.1", 8379)); clusterHostAndPortList.add(new HostAndPort("127.0.0.1", 9379)); HostAndPort nodeInfo1 = clusterHostAndPortList.get(0); HostAndPort nodeInfo2 = clusterHostAndPortList.get(1); HostAndPort nodeInfo3 = clusterHostAndPortList.get(2); Jedis node1 = new Jedis(nodeInfo1.getHost(), nodeInfo1.getPort()); node1.connect(); node1.flushAll(); Jedis node2 = new Jedis(nodeInfo2.getHost(), nodeInfo2.getPort()); node2.connect(); node2.flushAll(); Jedis node3 = new Jedis(nodeInfo3.getHost(), nodeInfo3.getPort()); node3.connect(); node3.flushAll(); for(int i=0 ; i < 100; i++){ cluster.set(Integer.toString(i), Integer.toString(i)); } for(int i=0 ; i < 100; i++){ System.out.println("["+i+"]------- get --------" + cluster.get(Integer.toString(i))); } // get cluster nodes System.out.println("------- cluster nodes --------"+cluster.getClusterNodes().values().size()); } }
ps: cluster node 변경시
rm -f 7379/nodes.conf 7379/appendonly.aof rm -f 8379/nodes.conf 8379/appendonly.aof rm -f 9379/nodes.conf 9379/appendonly.aof