Bu senaryo aynı sunucu üzerinde sanallaştırma tarzı ama Docker Container'lardan yararlanarak Redis için Loadbalance yapmayı örneklemeye çalışacağım.
Ö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 [url]http://download.redis.io/redis-stable.tar.gz[/url] && \ 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 [github.com]Dockerfile dosyamızı oluşturduğumuz path içinde olmaya dikkat edelim.
docker image build -t redis-6380 .
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
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",
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
Yorumlar