Bonding two Ethernet devices to increase bandwidth and provide redundancy

In this recipe we will learn how to combine the features of multiple network interfaces as a single device in an arrangement known as channel bonding with the intention of improving the overall performance of your server.

If your server has more than one Ethernet device, the process of channel bonding allows you to bind these interfaces together into a single channel in order to increase bandwidth and provide redundancy. It may sound complicated and finding the best settings will require some experimentation on your behalf or the support of specific network-based hardware, but it is the purpose of this recipe to provide a suitable starting point that enables you to take control and discover a network configuration that suits you best.

Getting ready

To complete this recipe, you will require a working installation of the CentOS 6 operating system with root privileges, a console-based text editor of your choice, and a connection to the Internet in order to facilitate the download of additional packages. In addition to this, it is assumed that one or more Ethernet devices are currently configured to use a static IP address, and that you have created a backup of your existing configuration files.

How to do it...

Before we begin this recipe, we will be required to download a series of packages that will enable us to complete the process of making a bond and testing our configuration.

  1. To do this, log in as root and download the following packages:
    yum –y install bind-utils ethtool
    
  2. Having installed the necessary packages, we shall begin by creating a new file called bond0 that will become the bonding master. To do this, return to your console and type:
    vi /etc/sysconfig/network-scripts/ifcfg-bond0
    
  3. Now add the following lines by substituting the relevant values marked as XXX.XXX.XXX.XXX with something more appropriate to the needs of your server:
    DEVICE="bond0"
    NAME="System bond0"
    NM_CONTROLLED="no"
    USERCTL=no
    ONBOOT=yes
    TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    PEERDNS=no
    PEERROUTES=yes
    IPV4_FAILURE_FATAL=yes
    IPV6INIT=no
    IPADDR=XXX.XXX.XXX.XXX
    NETMASK=XXX.XXX.XXX.XXX
    BROADCAST=XXX.XXX.XXX.XXX
  4. When ready, save and close the file before proceeding to modify your existing Ethernet configuration files:
    vi /etc/sysconfig/network-scripts/ifcfg-eth0
    
  5. Again, make the relevant changes but as a point of reference, here is an example of a single NIC:
    DEVICE="eth0"
    NM_CONTROLLED="no"
    ONBOOT=yes
    HWADDR=XX:XX:XX:XX:XX:XX
    UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
    TYPE=Ethernet
    BOOTPROTO=none
    NAME="System eth0"
    USERCTL=no
    MASTER=bond0
    SLAVE=yes
  6. Now repeat this step for each Ethernet device by substituting the appropriate values before continuing to the next step.
  7. When the process of Ethernet device configuration is complete, the next step is to create the bonding module configuration file by typing the following command:
    vi /etc/modprobe.d/bonding.conf
    
  8. Now add the following lines:
    alias bond0 bonding
    options bond0 mode=5 miimon=100
  9. Save and close the file before proceeding to register the bonding module with CentOS as a device. To do this, type:
    modprobe bonding
    
  10. And finally, to complete our configuration you should reboot or type:
    service network restart
    
  11. Well done. The process of channel bonding is now complete and you can test your new network settings by running the following command:
    ifconfig
    

How it works...

In this recipe you have been provided with a walkthrough of the necessary steps involved in implementing channel bonding. Channel bonding (also known as Ethernet bonding) is a computer networking arrangement in which two or more network interfaces on a host computer are combined in order to provide redundancy or increased throughput. Of course, to get the best out of this arrangement some additional experimentation with the bonding values will be required but overall, this introduction has served to show you that creating a channel bond may not be as complicated as it was originally thought.

So what have we learned from this experience?

Having started this recipe by installing the appropriate packages, we then proceeded to create the bonding master at /etc/sysconfig/network-scripts/ifcfg-bond0, which would maintain the following range of settings:

DEVICE="bond0"
NAME="System bond0"
NM_CONTROLLED="no"
USERCTL=no
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=no
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
IPADDR=XXX.XXX.XXX.XXX
NETMASK=XXX.XXX.XXX.XXX
BROADCAST=XXX.XXX.XXX.XXX

By doing this, we have created a new device. This device is known as the bonding master that will use our real Ethernet cards as slaves. If a slave device fails, this type of configuration will ensure that the other slave will take over thereby reducing the margin of error.

In the next step, we then made some changes to our existing Ethernet devices:

DEVICE="eth0"
NM_CONTROLLED="no"
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
TYPE=Ethernet
BOOTPROTO=none
NAME="System eth0"
USERCTL=no
MASTER=bond0
SLAVE=yes

From your initial experience of building a static IP address, you will notice that the first eight lines of both configuration files show that nothing of significance has changed. We have removed what is now considered to be redundant information, but this is because much of the information we have removed is now contained in /etc/sysconfig/network-scripts/ifcfg-bond0.

On the other hand, you will notice that the final three lines have not only declared that non-root users are not allowed to control the device, but they have agreed to confirm that the master is known as bond0, while the Ethernet device is considered to be a slave.

For example, the configuration file for a second Ethernet device may look like this:

DEVICE="eth1"
NM_CONTROLLED="no"
ONBOOT=yes
HWADDR=XX:XX:XX:XX:XX:XX
UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
TYPE=Ethernet
BOOTPROTO=none
NAME="System eth1"
USERCTL=no
MASTER=bond0
SLAVE=yes

So having made some basic changes to the current Ethernet configuration files (now known as slaves), the recipe then required us to register the bonding module as a device. This was achieved by creating a new file called bonding.conf in/etc/modprobe.d with the following preferences:

alias bond0 bonding
options bond0 mode=5 miimon=100

The previous settings indicate the type of bond we are trying to build and this is something you may wish to experiment with at a later date.

In all, there are six modes thereby giving you plenty of scope to reconfigure this recipe for your own needs. However, for the purposes of simplicity, we have used mode=5, a function that conforms to a process of adaptive transmit load balancing, a basic configuration path that does not require any specific type of network switch support.

The consequence of this modification is to allow the outgoing traffic to be distributed according to the current load on each slave (Ethernet) device and if one device fails the other device assumes responsibility for continuing with the task in hand.

Note

In this configuration, the miimon value is used to confirm just how often (in milliseconds) the links will be checked for failure.

To finalize this process we then proceeded to register the module and restart the network service.

Of course, there is always much more detail that could be provided but don't forget, any changes to the mode type or miimon value found in /etc/modprobe.d/bonding.conf is something that you can alter at your leisure if you want to improve the overall performance of your server.

There's more...

As a fallback it may be worth considering adding an additional setting to /etc/sysconfig/network-scripts/ifcfg-bond0 that will serve to provide balance to the system. Channel bonding can be used in such a way that multiple devices can carry different configurations, but before you begin experimenting it is suggested that we finalize the main recipe by enabling both Ethernet cards to carry the same options until you have the time to test your configuration and improve it.

Note

Remember, there are six modes in total and although some of these modes will require specific hardware support, the aim of this recipe is to provide a starting point from which you can begin testing your server's performance by changing both the mode type or miimon settings to suit your environment.

To begin, open ifcfg-bond0 in your favorite text editor like so:

vi/etc/sysconfig/network-scripts/ifcfg-bond0

Now add the following line at the bottom of the file:

BONDING_OPTS="miimon=100 mode=balance-tlb"

Alternatively, if you are currently using mode=6, you can use the following settings:

BONDING_OPTS="miimon=100 mode=balance-alb"

When you have finished, run the following command to restart the network:

service network restart