• Ready check failed 오류 해결 [Redis] :: 마이구미
    Nodejs 2017. 3. 23. 15:18
    반응형

    이번 글은 Redis auth 관련 오류를 다뤄본다.

    여기서 auth의 의미는 Redis에 설정할 수 있는 암호이다.

    기본적인 Redis 관련은 다른 글들에서 다뤘으니 아래 작성된 URL을 참고하길 바란다.


    auth 관련 오류는 대부분 auth 설정 관련 문제로 발생한다.

    하지만 본인의 경우 평상시에는 문제가 없다가 테스트를 할 때 오류가 발생했다.

    테스트 환경은 Mocha 이다. Mocha 관련 글

    auth 설정에 아무 문제가 없는데 오류가 발생한다면, 참고하길 바란다.


    ReplyError: Ready check failed: NOAUTH Authentication required.


    테스트만 하면 auth 가 실패하는 오류가 발생했다.

    본인은 여러개의 db index를 사용하기 위해서는 복잡하고 중복되는 코드를 줄이기 위해 아래와 같이 작성했다.

    수정 전 코드  ->  수정 후 코드 && 테스트 코드


    const redisClient = { db_0: redis.createClient(config.port, config.host), db_1: redis.createClient(config.port, config.host), db_2: redis.createClient(config.port, config.host), init: function(next) { advanced(); const select = redis.RedisClient.prototype.select; require('async').parallel([ select.bind(redisClient.db_0, 0), select.bind(redisClient.db_1, 1), select.bind(redisClient.db_2, 2) ], next); } } function advanced() { const databases = ['db_0', 'db_1', 'db_2']; for(let i in databases) { redisClient[databases[i]].on('error', (err) => { if (err) throw err; console.log(i + ' on'); }) redisClient[databases[i]].auth(config.password, (err) => { if (err) throw err; console.log('auth success'); }) } }


    기본적은 redis의 client는 connection에 관련된 이벤트들이 존재한다.

    ready, error, end, connection, reconnection 등등. 관련 문서


    여기서 ready를 살펴보자.


    client will emit ready once a connection is established. Commands issued before the ready event are queued, then replayed just before this event is emitted.


    ready 이벤트는 연결이 확정되면 발생한다.

    ready 이벤트 전의 발행된 명령어들은 대기 중이다.

    ready 이벤트가 발생하기 전에 대기 중인 명령어들은 실행된다.


    여기서 중요한 점은 redis의 명령어들은 ready 이벤트가 발생하기 전에 실행되어야한다.


    본인의 코드의 경우 client 생성과, auth 호출 시점의 텀이 존재한다.

    다행히도, 일반적인 서버 실행시에는 문제가 되지 않았지만, Mocha의 경우에는 문제가 된다.

    ready 이벤트가 발생하기 전에 Mocha가 완료 될 수 있기 때문에 문제가 발생했다.


    그렇기에, 하나의 묶음으로 생각하여 다시 코드를 작성했다.


    const redisClient = { db_0: createClient(), db_1: createClient(), db_2: createClient(), init: function(next) { const select = redis.RedisClient.prototype.select; require('async').parallel([ select.bind(redisClient.db_0, 0), select.bind(redisClient.db_1, 1), select.bind(redisClient.db_2, 2) ], next); } } function createClient() { const client = redis.createClient(config.port, config.host); client.auth(config.password, (err, reply) => { if (err) throw err; }); client.on('error', (err, reply) => { if (err) throw err; console.log("Error " + reply); }) return client; }


    그냥 만들어져있는 거를 기본 예제만 보고 쓰니 이런 문제가 발생했다.

    뭐든 꼼꼼히 이해하고 쓰는 습관을 가지는 것이 중요하다.


    혹시 잘못됐거나 잘못 이해한 점이 있다면 남겨주시길 바란다.


    • Redis 관련 본인 글
    1. http://mygumi.tistory.com/133
    2. http://mygumi.tistory.com/91
    • 참고 URL Stackoverflow - Ready check failed
    1. http://stackoverflow.com/questions/12977935/why-wont-redis-commands-work-from-within-my-mocha-test-for-coffee-script-files
    2. http://stackoverflow.com/questions/15848707/failing-to-connect-to-hosted-redis-ready-check-failed-err-operation-not-permit


    반응형

    댓글 2

    • Favicon of https://neocool.tistory.com 0cool 2017.03.24 18:44 신고

      파일을 처리하는 서버로 현재 sqllite를 사용하고 있는데 Redis 적용을 긍정적으로 검토 해 볼수 있을까요?
      MariaDB를 사용하기엔 서버 성능이 조악해서.. 고민이네요!

      • Favicon of https://mygumi.tistory.com 마이구미 mygumi 2017.03.25 18:17 신고

        저에게 그런 질문을 해주신 점... 감사드립니다..ㅎㅎ 저보다 훨씬 뛰어나실텐데...
        일단 제가 내부를 자세히 알지 못하니... 제 생각은
        sqlite과 redis 2가지만 본다면, 2개를 비교하는게 의미가 있을까.. 의문이 듭니다. (제가 질문을 잘 이해 못했을 수도 있습니다!)
        redis(서버)와 sqlite(내부 저장소) 이니까요.

Designed by Tistory.