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/RedisDockerDocker 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