반응형

'개발/Redis'에 해당되는 글 5건

반응형

리눅스에 설치할 분들은 https://github.com/sasanrose/phpredmin 를 참고하시면 됩니다.

리눅스 설치 시 apm 설치는 http://comet42.tistory.com/27 (YUM으로 모든걸 설치) 

 

윈도우에서 설치 시에 약간 건드려야 하는 부분이 있어서 정리함

 

1. APM을 설치한다. (최신 버전인 APMSETUP7을 권장. 최신버전이라도 Apache, php등 버전은 매우 낮은편) 

http://www.apmsetup.com/download.php  

 - 로컬에 80, 3306 포트를 이용하는 것이 있다면, 다른 포트로 Listening해주도록 바꾸어주도록 하던지, 사용하지 않으면 없애버린다. 

   (그 작업이 귀찮은 분들은 APMSetup말고, Apache, php 바이너리를 받아서 직접 설치하는 것도 좋음)

 - 사용하고 있는 포트 및 PID확인은 netstat -a -o로 확인 

 

2. PhpRedis를 설치해준다. (PHPRedmin이 PhpRedis에 의존적이기 때문에)

https://github.com/nicolasff/phpredis/downloads 

 - PhpRedis는 위 링크에서 받을 수 있으며, windows버전은 dll로 제공이 된다.

 - php버전을 확인하여, 알맞은 버전으로 다운로드 받아서, php폴더의 ext폴더에 넣어준다.

 - php.ini파일을 열어 extension=php_redis.dll를 추가해준 뒤, apache를 재시작 한다.

 - phpinfo()로 redis 모듈이 정상적으로 추가되었는지 확인한다. 

 

3. PHPRedmin 설치 (git bash 등으로 clone만 해두면 된다.) 

 - git clone https://github.com/sasanrose/phpredmin.git

 

4. httpd-userdir.conf 설정 변경  

Alias /phpredmin "C:\phpredmin\public"

<Directory "C:\phpredmin">
   AllowOverride All 
   Allow from all
</Directory>

 

5. httpd.conf 설정 변경 (Include httpd-userdir.conf가 주석되어 있을텐데, 주석을 풀어준다.)

 

6. 아파치 재시작

 

7. http://localhost/phpredmin으로 접속

 

phpredmin폴더에 있는 config.php를 편집하여, redis 장비에 대한 연결을 설정이 가능하다.

linux 환경에서 설치하면 상단의 configuration 버튼이 잘 눌러지는거 같던데, windows는 왜 안되는지...-_-

그냥 귀찮으니 안되면 config.php로 들어가서 편집하자. 

반응형

'개발 > Redis' 카테고리의 다른 글

[Redis] 3.0.2 Cluster 구성  (0) 2016.06.11
[Jedis] Cluster Configuration  (0) 2016.06.11
[Redis] Copy Key  (0) 2016.06.11
[Redis Cluster] FailOver 테스트  (0) 2016.06.11
,
반응형

Redis 3.0에서 Cluster 기능을 기본으로 지원한다는 얘기를 2달전엔가 들었던 것 같은데,

R&D할 시간이 나오지 않아서, 인수인계 시점을 기점으로 시작해보았다.


클러스터 구성은 Redis 공식홈에 있는 튜토리얼만으로 충분할 것 같아서,

Redis 공식홈의 Cluster Tutorial 부분을 참고하였다.

(http://redis.io/topics/cluster-tutorial)



1. Redis 3.0.2 (포스팅 당시 최신버전) 설치

  - tar.gz 받아서 압축풀고, make, make install만 하면 끝.


2. Redis.conf 작성

port 7000                                          // 클러스터 노드로 구성될 Redis의 포트

cluster-enabled yes                        // 클러스터를 활성화

cluster-config-file nodes.conf        // 클러스터 노드에 대한 정보

cluster-node-timeout 5000            // 접속 타임아웃 (ms)

appendonly yes                               // 데이터 유실 방지를 하기 위해 AOF방식으로 파일을 남길 것인가에 대한 옵션


3. 테스트 환경 구축 (총 6개의 클러스터 노드에 대한 설정)

$ mkdir cluster-test

$ cd cluster-test

$ mkdir 7000, 7001, 7002, 7003, 7004, 7005


4. Redis.conf 파일을 각 노드 폴더에 붙여넣기

 - port부분은 각 노드 포트에 맞게 변경 필요


5. 각 클러스터 노드를 실행시킨다.

$ cd 7000

$ ../../src/redis-server ./redis.conf &

 - 일일히 & 붙이기 귀찮으신 분들은 daemonize옵션을 켜주시면 안붙여도 됨.


6. 이제 각 클러스터 노드들을 redis-trib로 묶어주어야 한다.

※ Tip : 사전에 ruby, gem이 설치가 되어 있어야 하며, 

gem install redis명령어로 ruby에서 사용할 수 있는 redis 라이브러리 설치가 필요함.

redis-trib는 src폴더에 있음.

※ Tip2 : Jedis를 client로 이용하시는 분들은 127.0.0.1로 띄우면 too many redirections exception이 발생함.

해당 머신의 private ip나 public ip로 띄우시는 걸 권장!

이유는 JedisCluster는 순수하게 설정파일에 지정된 아이피 (예를 들면 192.168.0.123)로만 노드를 검색하게 되는데,

실제 cluster가 구성된 trib에서는 127.0.0.1로 되어 있기 때문에, 제대로 찾지 못하는 듯한데.. 아직 jedis가 cluster 기능을 지원한지 얼마 안되서 그런것 같고, 추후 버전에는 수정이 될 것으로 보임.


$ ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

 


7. 임의 노드에 붙어서 데이터 SET GET을 해보자.

※ Tip : redis-cli 실행 시 -c 명령어를 빼도 접속은 가능하나, 대부분 명령어 입력 시 error가 떨어질 것임.

cluster로 구성되어 있는 redis에 접속해서 뭔가를 하려면 -c 옵션을 붙여야 되는 듯 하다.

$ ./redis-cli -c -p 7000

127.0.0.1:7000> SET my "hello"

127.0.0.1:7000> GET my

"hello"


$ ./redis-cli -c -p 7003

127.0.0.1:7003> GET my

-> Redirected to slot [xxx] located at 127.0.0.1:7000     

hello

127.0.0.1:7000>


 - 아무 노드에서나 get을 해도 해당 key가 있는 노드에 가서 데이터를 찾아준다.


8. 개인적인 생각

 - 위 테스트로 유추해볼 수 있는 것은, redis-cluster는 sharding방식으로 동작을 하며, 

sentinel구성을 했을때와 달리 (replication 방식) 데이터, 메모리 사용량에서 이득을 볼 수 있을 것으로 보인다.

 - redis-cluster가 나오면서 zookeeper(장애 모니터링)나 twemproxy (sharding)까지 굳이 붙여서 사용할 필요가 없어질 것으로 보인다.





반응형

'개발 > Redis' 카테고리의 다른 글

[PHPRedmin] Windows 세팅  (0) 2016.06.11
[Jedis] Cluster Configuration  (0) 2016.06.11
[Redis] Copy Key  (0) 2016.06.11
[Redis Cluster] FailOver 테스트  (0) 2016.06.11
,
반응형

https://github.com/xetorthio/jedis#jedis-cluster에 가장 잘 설명되어 있고,

매우 간단하다.


대규모 시스템에는 기본적으로 Pooling도 지원을 해야 되기 때문에

JedisCluster 생성자에 jedisPoolConfig, maxRedirection, timeout 정도만 세팅을 해서 사용을 하면 된다.


<pre style="font-family: 'Source Code Pro'; font-size: 9pt;">@Bean
public JedisCluster jedisCluster() {
Set<HostAndPort> jedisClusterNodes = new HashSet<>();
jedisClusterNodes.add(new HostAndPort("192.168.33.10", 7000));
jedisClusterNodes.add(new HostAndPort("192.168.33.10", 7001));
jedisClusterNodes.add(new HostAndPort("192.168.33.10", 7002));
jedisClusterNodes.add(new HostAndPort("192.168.33.10", 7003));
jedisClusterNodes.add(new HostAndPort("192.168.33.10", 7004));
jedisClusterNodes.add(new HostAndPort("192.168.33.10", 7005));

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(40);
jedisPoolConfig.setMinIdle(10);

return new JedisCluster(jedisClusterNodes, 3000, 3, jedisPoolConfig);
}</pre>


클러스터 노드 추가 시 Host부분이 중요한데.. HostName에 지정된 IP와

redis-trib.rb로 cluster구성 시에 옵션으로 들어가는 각 cluster의 IP String이 같아야 제대로 동작을 한다.


다르면, Jedis가 노드를 찾지 못하여, 엄청나게 Redirection을 하다가 Too Many Redirection Exception을 뱉는다.

귀찮더라도 cluster구성 시에는 private ip나 public ip로 띄우는걸 권장


뭐.. Jedis 추후 버전에서는 해결이 될 만한 문제이기도 하지만, 현재는 잘 안된다.


문제 해결에 도움을 받은 링크

https://github.com/xetorthio/jedis/issues/943

반응형

'개발 > Redis' 카테고리의 다른 글

[PHPRedmin] Windows 세팅  (0) 2016.06.11
[Redis] 3.0.2 Cluster 구성  (0) 2016.06.11
[Redis] Copy Key  (0) 2016.06.11
[Redis Cluster] FailOver 테스트  (0) 2016.06.11
,

[Redis] Copy Key

개발/Redis 2016. 6. 11. 00:34
반응형

Redis에는 기본적으로 특정 key를 다른 key로 copy하는 기능이 없다.


Copy a b 이런거?? 


그래서 이걸 하기 위해서는 아래와 같이 dump, restore 명령어를 이용해야 하는데

데이터가 많아지는 경우 해당 key에 lock이 걸려서 서비스에 영향이 있을 수 있으므로

어느정도 데이터의 량을 파악한 후에 문제가 없다고 판단하면 사용하는게 맞을 것 같다.


# dump명령어를 이용해서 key1에 있는 데이터를 dump파일로 뽑는다.

redis-cli -p 6379 -a {패스워드가 있는 경우 패스워드} dump key1 > key1.dump


# 뽑은 dump파일을 뽑는데 dump로 뽑으면 기본적으로 맨 뒤에 \n이 붙는다고한다. 

# 그래서 이것을 head -c -1 명령어로 제거한 후에 restore한다.

cat key1.dump | head -c-1 | redis-cli -p 6379 -a {패스워드} -x restore key2 0


\n을 지우지 않고 그대로 넣게되면

(error) ERR DUMP payload version or checksum are wrong 이런 에러가 발생한다.

반응형

'개발 > Redis' 카테고리의 다른 글

[PHPRedmin] Windows 세팅  (0) 2016.06.11
[Redis] 3.0.2 Cluster 구성  (0) 2016.06.11
[Jedis] Cluster Configuration  (0) 2016.06.11
[Redis Cluster] FailOver 테스트  (0) 2016.06.11
,
반응형

[테스트 환경]

VM 2개에서 1번 장비에 instance 3개, 2번 장비에 instance 3개 띄우고,

redis-trib replica 옵션의 슬레이브 개수를 1로 설정하여 진행


redis-trib에서 해주는대로 master, slave 구성을 하였고, 1번 머신에 master 2개, slave 1개, 2번 머신에 slave 1개, master 2개로 구성이 됨. (자동 구성이지만, 같은 머신을 기준으로 master, slave 구성을 하지는 않는 것으로 보인다. 나름 고려가 된듯)


슬레이브가 마스터로 승격하는 시간은, conf파일에서 지정 가능함. cluster-node-timeout


[Case]

1. 1번 머신에 있는 master한대를 죽여봄.

 - 2번 머신의 slave가 master가 되어 서비스에 영향 없음 (O)


2. 1번 머신에 있는 slave를 죽여봄.

 - 1번 머신의 slave만 죽은 상태로 유지되며, master가 떠있으므로 서비스에 영향 없음 (O)


3. 1번 머신에 있는 master를 죽이고, 해당 master와 연결된 slave를 죽임.

 - cluster down이라는 메시지가 발생하며, 서비스 불가. 장애 복구가 필요한 시점임. (X)

 > 복구 Case

   1. slave를 먼저 올림. (서비스 불가. 여전히 cluster down이라는 메시지 발생) (X)

   2. master를 먼저 올림. (서비스 가능. master로만 붙어서 데이터 처리를 함) (O)


결론은 master, slave 둘다 떨어졌을 때는, 어플리케이션 단에서 아예 요청을 그쪽으로 보내지 않도록 처리를 해야하고,

복구 할때는 master를 먼저 올리도록 하자.

뭐가 마스터인지는 아무노드 터미널에 들어가서 cluster nodes하면 나옴.


FailOver자체가 머신이 하나 꺼졌을 경우를 대비하는 거라, master, slave둘다 떨어졌다는건 지금 같은 상황에선 머신 2대가 떨어졌다는걸로 판단을 해야 한다.

장비 2대 떨어지는 게 두렵다면, 장비를 더 붙여서 cluster구성을 하는 게 맞을듯.. 가이드문서에도 보면 Master Node는 최소 3개이상 가지고 있어야 된다고 한다. 즉 클러스터를 쓰려면 최소 3대의 머신정도는 구성을 해야, 머신 하나가 죽어도 서비스가 가능하다. 2대로 구성하니 한대만 죽어도 클러스터 다운이라고 에러 메시지를 뱉는다. VM을 3개까지 띄우긴 귀찮아서 여기까지만 하는걸로..

반응형

'개발 > Redis' 카테고리의 다른 글

[PHPRedmin] Windows 세팅  (0) 2016.06.11
[Redis] 3.0.2 Cluster 구성  (0) 2016.06.11
[Jedis] Cluster Configuration  (0) 2016.06.11
[Redis] Copy Key  (0) 2016.06.11
,
반응형