Please Donate to Bitcoin Address : [[address]]

Donation of [[value]] BTC Received. Thank You.
[[error]]

HA Network ihtiyacı olanlara çözümler – LACP Bonding

Merhabayın.

Bu blog yazısında high-available network ihtiyacı olanlara kernel seviyesinde ağ arayüzlerini nasıl yüksek erişilebilir olarak yapılandırabileceklerinden bahsedeceğim.

Bu günlerde otu boku clusterlamakla uğraştığımdan, bugüne kadar clusterlamadığım tek bir mekanizma olduğu gerçeği kafama dank etti. O da ağ erişilebilirliğinin kendisi.

Cluster mı? HA mı? Ne diyosun diyenlere bir özet geçeyim.

Sistemcilerin büyük dertlerinden biri de verdikleri servislerin failover mekanizmalarının olması ve bu servisleri çeşitli felaket senaryolarına göre ayarlamaktır. Yani bugüne kadar adam akıllı sistem yöneticisi olarak çalışmış herkes bir servis grubunu yüksek bulunur ve otomatik failover mekanizmalarıyla beraber kümelemeye çalışmıştır. Bir senaryo örneği vereceğim basitçe. Bir web servisi koşturuyorsunuz, uygulamanız da veritabanı olarak arkada herhangi bir SQL ve/veya NoSQL veritabanı kullanıyor. Gün geldi oldu ya, web servisinin koştuğu makine bir anda kapandı. Ya da SQL sunucunuzun koştuğu makineye herhangi bir sebepten dolayı ağ üzerinden erişilemez duruma geldi. Ya da oldu ya talih bu, işinizi iyi yapmadınız ve sunucunuzda kök dosya sisteminin bağlı olduğu fiziksel disk doldu sizden habersiz, işletim sisteminiz de I/O gerçekleştirebilecek alan bulamadığından web servisiniz çalışamaz duruma geldi. Bu durumların hepsinde de servis kesintisine uğradınız. Müşteriler mutsuz, patron mutsuz, herkes mutsuz.

İşte bu gibi senaryoları en kısa servis kesintisiyle atlatmak sistem yöneticilerinin en önemli görevlerinden biri. E bunu nasıl yapıyoruz? Benim gözlemlediğim, günümüzde her uygulamanın ya kendi failover mekanizmaları yazılımın kendi içersinde geliştiriliyor ya da bu işi yapmak üzere tasarlanmış, koşturduğunuz uygulamadan bağımsız üçüncü parti clustering ve HA fonksiyonlarını sisteminize entegre edebileceğiniz bir dizi yazılımı düzgün bir şekilde ayarlayarak bu işi yapabiliyoruz. Yukarıdaki senaryo için her bir servis bileşeninizi ayrı-ayrı yüksek bulunur ve failover edebilecek şekilde ayarlamalısınız demek oluyor bu. Yani atıyorum nginx koşturuyorsanız, nginx servislerinizi yine atıyorum 3 ayrı makineye yayıp, öne bir HAProxy, corosync+pacemaker ile bu 3 nginx web servisi için HA ve failover sağlayabilirsiniz. Ya da arkadaki nosql veritabanınız atıyorum mongodb ise, mongodb’nin failover ve HA mekanizmaları için yazılımın kendi içersinde deployment metodları (replika setleri vs) ve bir dizi ayarlar serisi gerektiren bir iş yükünüz var demek oluyor bu. Her bir bileşenin, projenizin sistem ayağında pros/cons değerlendirmesi ve kullanacağınız mekanizmaları seçmek de sizin işiniz bu arada.  Better safe than sorry demişler. İşleri en baştan sağlam tutmak her zaman en iyisidir.

Gelelim konumuza, her şeyi ayarladık bütün servislerimiz ayrı-ayrı kendi içersinde failover ediyor çok güzel, yüksek de bulunuyorlar. Ya ortaya çıkacak problem işletim sistemi kapsamında değil de, atıyorum donanımda olursa? Atıyorum production sunucularımdan birinin ağ kartı yandı? Bütün üretim ortamım içersinde, kritik sunucularımdan birine giden ethernet kablosu arıza yaptı ve sonucunda ağ bağlantısı kesildi? İkna olmadın tamam geçtim hadi bunu da, bütün production ortamınızın koştuğu sanallaştırma sunucusunun ağ arayüzüne ulaşamıyorsunuz bir sebepten. Bütün sunucularınızın internet bağlantısı gitti. Ne yapacaksınız? Do not jinx yourself, but always be prepared!

Benim kendime sorduğum sorular ve cevaplar şöyle oldu :

Acaba ağ erişilebilirliğini de kümelemenin bir yolu var mı? İki tane NIC taksam alete? İki farklı ağ arayüzü demek bu, e bunları tek bir linkte birleştirmem gerekir. Nasıl yapıcaz? Linux kerneli çok süper bi alet, ekstra gıcık cisco, juniper vs donanımına gerek olmadan bu işin bir yolu yordamı kernel’ın kendi içersinde var mıdır? Doğru düşünüyor muyum acaba? Bu işe başlamadan okuma yapmam gerekiyor mu ki, network işi bu öf, acaba teknik bilgi eksikliğim/bir şeyleri yanlış bildiğim var mı? Bu düşündüklerim bence problemimin çözümüne giden yol için güzel bir başlangıç noktası yine de. Sorunumu çözer mi? Bakıcaz.

Sonrası bir iki gecelik araştırma, kişisel kendini tatmin etme mesaisi ve laboratuar testleri… Hıııııııııımmmmlamalar hııııımlamalar…

Bu kafamdaki sorulara bu blog yazısının teknik kısmında cevap vermeyi umuyorum. Buraya kadar anlamadıysanız, benimle aynı sayfada değilsiniz demektir, devamını okumanıza gerek yok.

GNU/Linux Tabanlı İşletim Sistemlerinde LACP Bonding Ayarlamak

Bonding, aynı zamanda port trunking ya da link aggregation olarak geçen bu ifadeler bütün problemimizin çözümüne yön veren teknik terminolojiler.

Lütfen devam etmeden önce wikipedia içeriğini okuyun.
Bu da güzel, bunu da okuyun.
Şu da çok lezzetli. Yukarıdakileri okuyan bunu da okur.

Bütün bu bonding işini yani iki farklı ağ arayüzünü tek bir single linkte gruplama işini (Link Aggregation Groups) Linux kernel’inin bonding modülünü kullanarak yaptım. Süper bir modül. Bir sürü de modu var. Çünkü bu iş özelinde tek dert HA olmayabilir; load-balancing, performans artırımı, maximum throughput ya da bunların ortaya karışık bileşimini de istiyor olabilirsiniz. Bu yüzden bu modülü önemli görüyorum ve bu yazıyı bu yüzden yazıyorum.

Ben bir Ubuntu GNU/Linux 16.04 (Xenial) LTS işletim sistemi, sürüm 4.4.0-31-generic Ubuntu Linux çekirdeği üzerinde bir QEMU/KVM sanal makinede aşağıdaki deneylerimi yaptım.

LACP ayarlamak için, ilk iş ifenslave paketinin kurulu olduğuna emin olun, bu tool’un ne işe yaradığını da aşağıda şeyettim :

# apt-cache show ifenslave
Package: ifenslave
Priority: optional
Section: net
Installed-Size: 87
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Guus Sliepen <guus@debian.org>
Architecture: all
Version: 2.7ubuntu1
Replaces: ifenslave-2.6 (<< 1.1.0-22) Depends: ifupdown (>= 0.7.46), iproute2
Recommends: net-tools
Breaks: ifenslave-2.6 (<< 1.1.0-22)
Filename: pool/main/i/ifenslave/ifenslave_2.7ubuntu1_all.deb
Size: 13362
MD5sum: b338c00954e6c787a3fe21f1d6a95678
SHA1: ada47a55e66947b947da342191001d4080aabdab
SHA256: bd0ca60e914a284acbe14744b603cc92925fff02dac0187317b299751b2f4c1d
Description-en: configure network interfaces for parallel routing (bonding)
This is a tool to attach and detach slave network interfaces to a bonding
device. A bonding device will act like a normal Ethernet network device to
the kernel, but will send out the packets via the slave devices using a simple
round-robin scheduler. This allows for simple load-balancing, identical to
"channel bonding" or "trunking" techniques used in switches.
.
The kernel must have support for bonding devices for ifenslave to be useful.
This package supports 2.6.x kernels and the recent 3.x.x kernels.
Description-md5: 74732f22bb89d876029092ddddb4e653
Multi-Arch: foreign
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Origin: Ubuntu
Supported: 5y
Task: cloud-image, server

# apt-get install ifenslave

networking servisini durdurup, Linux çekirdeğinde bonding modülünün aktif olduğundan emin olun :


# echo "bonding" >> /etc/modules # systemctl stop networking # modprobe bonding

/etc/network/interfaces dosyası içersinde bonding arayüzünü ve slave olarak ayarlayacağınız fiziksel ağ arayüzlerini örneğin aşağıdaki şekilde ayarlayın :


# vim /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto ens3 iface ens3 inet manual bond-master bond0 bond-primary ens3 auto ens8 iface ens8 inet manual bond-master bond0 auto bond0 iface bond0 inet static address 192.168.10.238 gateway 192.168.10.1 netmask 255.255.255.0 bond-mode active-backup bond-miimon 100 bond-slaves ens3 ens8

Bu dosyada ne işler çevirdiğimi açıklayacak olursam, iki adet aynı sanallaştırma teknolojisiyle sanallaştırılmış sanal ağ kartımı (ens3 ve ens8), bond0 adını verdiğim ağ arayüzüne, slave arayüzler olacak şekilde ve aynı zamanda bonding mekanizmamı high-availability olsun istediğim için de bond-mode’u active-backup olarak sanal ağ arayüzlerimi ayarlıyorum. active-backup modunu kısaca şöyle açıklamaya çalışayim : bond0 arayüzünde aktif bir tane primary slave seçiyorsunuz (benim durumumda bu slave arayüzün adı ens3 bkz: bond-primary) diğer slave (ens8) sadece ve sadece primary slave olarak ayarladığım bu ens3 ağ arayüzünün başına bir şey geldiğinde (fail olduğunda, ulaşılamadığında) devreye girip makinenin ağ bağlantısını devam ettirmenize olanak sağlıyor.

Daha detaylı bilgiler ve bonding modları için şu official linux kernel dokümantasyon sayfasını okuyun. Süper bir doküman.

Ayarlamayı yaptıktan sonra, networking servisini tekrar başlatın :


# systemctl restart networking

Servis başladıktan sonra aşağıdaki şekilde ağ arayüzlerini kontrol edin :

# ip -d addr show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 52:54:00:55:6e:96 brd ff:ff:ff:ff:ff:ff promiscuity 0
bond_slave state ACTIVE mii_status UP link_failure_count 0 perm_hwaddr 52:54:00:55:6e:96 queue_id 0
3: ens8: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 52:54:00:55:6e:96 brd ff:ff:ff:ff:ff:ff promiscuity 0
bond_slave state BACKUP mii_status UP link_failure_count 0 perm_hwaddr 52:54:00:e3:a5:78 queue_id 0
7: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 52:54:00:55:6e:96 brd ff:ff:ff:ff:ff:ff promiscuity 0
bond mode active-backup active_slave ens3 miimon 100 updelay 0 downdelay 0 use_carrier 1 arp_interval 0 arp_validate none arp_all_targets any primary ens3 primary_reselect always fail_over_mac none xmit_hash_policy layer2 resend_igmp 1 num_grat_arp 1 all_slaves_active 0 min_links 0 lp_interval 1 packets_per_slave 1 lacp_rate slow ad_select stable tlb_dynamic_lb 1
inet 192.168.10.238/24 brd 192.168.10.255 scope global bond0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe55:6e96/64 scope link
valid_lft forever preferred_lft forever

Bonding arayüzünü aşağıdaki dosya içeriğinden kontrol edin :


# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: fault-tolerance (active-backup) Primary Slave: ens3 (primary_reselect always) Currently Active Slave: ens3 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: ens3 MII Status: up Speed: 100 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 52:54:00:55:6e:96 Slave queue ID: 0 Slave Interface: ens8 MII Status: up Speed: 100 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 52:54:00:e3:a5:78 Slave queue ID: 0

Gördüğünüz gibi bonding işlevini fault-tolerance olacak şekilde ayarlamışım ve aktif slave arayüzüm ens3.

Şimdi gelelim test etmeye, çalışıyor mu testi için makineye SSH üzerinden bağlanıp ens3 arayüzünü elle down ettim ve logları inceledim :


# ifdown ens3 meanwhile in syslog : # journalctl -xf .... Mar 01 14:13:44 xenial kernel: bond0: Removing slave ens3 Mar 01 14:13:44 xenial kernel: bond0: Releasing active interface ens3 Mar 01 14:13:44 xenial kernel: bond0: making interface ens8 the new active one ....

SSH bağlantım da kopmadı. Çok güzel, peki ens3 geri gelirse?


# ifup ens3 meanwhile in syslog again : # journalctl -xf ... Mar 01 14:16:37 xenial kernel: bond0: Adding slave ens3 Mar 01 14:16:37 xenial kernel: 8139cp 0000:00:03.0 ens3: link up, 100Mbps, full-duplex, lpa 0x05E1 Mar 01 14:16:37 xenial kernel: bond0: making interface ens3 the new active one Mar 01 14:16:37 xenial kernel: bond0: Enslaving ens3 as an active interface with an up link Mar 01 14:16:37 xenial kernel: bond0: Setting ens3 as primary slave Mar 01 14:16:37 xenial systemd[1]: Reloading OpenBSD Secure Shell server. -- Subject: Unit ssh.service has begun reloading its configuration -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit ssh.service has begun reloading its configuration Mar 01 14:16:37 xenial sshd[2232]: Received SIGHUP; restarting. Mar 01 14:16:37 xenial systemd[1]: Reloaded OpenBSD Secure Shell server. -- Subject: Unit ssh.service has finished reloading its configuration -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit ssh.service has finished reloading its configuration -- -- The result is done. Mar 01 14:16:37 xenial sshd[2232]: Server listening on 0.0.0.0 port 22. Mar 01 14:16:37 xenial sshd[2232]: Server listening on :: port 22.

ens3 tekrar aktif slave olarak otomatik set edilmekle kalmadı, networking servisine depend eden SSH gibi uygulamalarınız varsa koşan, onlar da systemd üzerinden reload edildi.

Çok lezzetli değil mi? Ben orgazm olmuştum nerdeyse ilk keşfettiğimde.

Diğer bonding mode’larıyla oynamayı da sizin hayal gücünüze ve ihtiyaçlarınıza bırakıyorum.

Diyeceklerim bu kadar,

Müsadenizle.

One Comment

  • Merhabalar, çok güzel bir yazı olmuş ellerinize sağlık. Merak ettiğim bir soru var. Ifenslave en fazla kaç network arayüzüne destek veriyor. yani 3 mobil internet, 2 ethernet, 1 wifi gibi 6-7 arayüzü birleştirebiliyormuyuz?

Bir Cevap Yazın

I'm not a freaking robot : Time limit is exhausted. Please reload CAPTCHA.

1 Mart 2017

Posted In: Sistem, Teknik

Etiketler:, , , , , ,

One Comment