Pythontr

husonet | Tarih: 28.04.2019

Docker üzerinde Redis kurgusu

Docker üzerinde Redis konteyner'lar üzerinden load balance işlemi

Bu senaryo aynı sunucu üzerinde sanallaştırma tarzı ama Docker Container'lardan yararlanarak Redis için Loadbalance yapmayı örneklemeye çalışacağım.


Kullanılacak Uygulamalar;
  • HaProxy
  • Docker

Örnek oluşturması açısından Dockerfile dosyamızı aşağıdaki gibi yapılandırdım. Debian Stable versiyonu üzerinde Redis kurulumu yapacağız ve Redis default 6379 portu yerine 6380 numaralı portu kullanacağız.


# Pull base image.
FROM debian:stable

# Install Redis.
RUN \
apt-get update && \
apt-get -y install apt-utils gcc make wget telnet && \
cd /tmp && \
wget http://download.redis.io/redis-stable.tar.gz && \
tar xvzf redis-stable.tar.gz && \
cd redis-stable && \
make && \
make install && \
cp -f src/redis-sentinel /usr/local/bin && \
mkdir -p /etc/redis && \
cp -f *.conf /etc/redis && \
rm -rf /tmp/redis-stable* && \
sed -i 's/6379/6380/g' /etc/redis/redis.conf && \
sed -i 's/protected-mode yes/protected-mode no/g' /etc/redis/redis.conf && \
sed -i 's/^\(bind .*\)$/# \1/' /etc/redis/redis.conf && \
sed -i 's/^\(daemonize .*\)$/# \1/' /etc/redis/redis.conf && \
sed -i 's/^\(dir .*\)$/# \1\ndir \/data/' /etc/redis/redis.conf && \
sed -i 's/^\(logfile .*\)$/# \1/' /etc/redis/redis.conf

# Define mountable directories.
VOLUME ["/data"]

# Define working directory.
WORKDIR /data

# Define default command.
CMD ["redis-server", "/etc/redis/redis.conf"]

# Expose ports.
EXPOSE 6380

Bu Dockerfile üzerinde herhangi bir değişiklik yapabilme olasılığına karşı Github üzerinde yayınlamaya karar verdim oradan takip edebilirsiniz..

https://github.com/huseyinozdemir/RedisDocker

Docker Image Oluşturma


Dockerfile dosyamızı oluşturduğumuz path içinde olmaya dikkat edelim.


docker image build -t redis-6380 .

Docker Hub'a Gönderme


Burada önemli olan nokta kullanıcı adını göndereceğimiz dosyanın uzantısına eklemek. Gönderdiğimiz Image'ları daha sonra kullanım için erişmemize kolaylık sağlayacak.


docker image push husonet/redis-6380:latest

https://cloud.docker.com/repository/docker/husonet/redis-6380

Imagelarımız hazır olduğuna göre Docker Container oluşturabilir ve sistemi ayağa kaldırabiliriz.


Ip verme işlemiyle uğraşmamak adına ve alians üzerinden kendi içlerinde erişim ihtiyacım ileride oluşabileceği olasılığına karşı Redis adında bir Network oluşturmaya karar verdim.


docker network create redis

Evet şimdi ikitane Docker Container oluşturalım.


docker container run -d  -it --network redis --network-alias rediscache --sysctl net.core.somaxconn=511 husonet/redis-6380
docker container run -d -it --network redis --network-alias rediscache --sysctl net.core.somaxconn=511 husonet/redis-6380

Container'larımızı listeleyelim.


docker conteyner ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5a557e27a051 husonet/redis-6380 "redis-server /etc/r…" 16 seconds ago Up 14 seconds 6380/tcp amazing_williams
46a8684b747d husonet/redis-6380 "redis-server /etc/r…" 18 seconds ago Up 16 seconds 6380/tcp stupefied_mestorf

Evet Container'larımız ayakta ve çalışıyor. Şimdi yapacağımız isteklerimizi yönlendirebileceğimiz bir HaProxy üzerinden yönlendirme işlemini yapalım. Docker kısmını basitleştirmek için HaProxy'i Docker üzerinden çalıştırmayacam local üzerinden çalıştıracam bu yüzden çalışan Container'ların ip bilgilerine erişmem lazım.


docker container inspect amazing_williams
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.2",
docker container inspect stupefied_mestorf
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.3",

Şimdi HaProxy kurulumunu ve yapılandırmasını yapalım.

su -
apt install haproxy

Yapılandırma için


vim /etc/haproxy/haproxy.cfg

defaults REDISCLUSTER
mode tcp
timeout connect 4s
timeout server 30s
timeout client 30s

frontend frontend_redis
bind 127.0.0.1:6380 name redis
default_backend backend_redis

backend backend_redis
option tcp-check
tcp-check send PING\r\n
tcp-check expect string +PONG
tcp-check send info\ replication\r\n
tcp-check expect string role:master
tcp-check send QUIT\r\n
tcp-check expect string +OK
maxconn 20000
retries 3
server R1 172.18.0.2:6380 check inter 1s
server R2 172.18.0.3:6380 check inter 1s