在iSCSI共享盘上使用CLup创建和管理PolarDB
1. 基础知识
1.1 创建PolarDB的要求
安装要求
- 需要有共享盘:盘的大小需要大于等于20GB。我们使用iSCSI提供的共享盘来搭建此环境。
- 操作系统:CentOS7.X
- 内存要求大于等于4GB。机器可以是物理机也可以是虚拟机。
- 共享盘要求有路径:/dev/nvmeXnY
我们使用4台机器搭建此环境。
2. 安装配置
本次需要的机器列表如下:
主机名 | IP | 作用 | 数据目录 |
---|---|---|---|
polardb01 | 192.168.166.115 | 部署clup管理端,部署iSCSI服务端,运行PolarDB | /data/polardata |
polardb02 | 192.168.166.116 | clup-agent 部署clup-agent,部署iSCSI客户端,运行PolarDB | /data/polardata |
polardb03 | 192.168.166.117 | clup-agent 部署clup-agent,部署iSCSI客户端,运行PolarDB | /data/polardata |
polardb04 | 192.168.166.118 | clup-agent 部署clup-agent,部署iSCSI客户端,运行PolarDB | /data/polardata |
其中机器192.168.166.115上有一块硬盘30GB硬盘做为iSCSI盘共享给其它机器使用。
2.1 安装和启动iSCSI服务端程序
在192.168.166.115机器上做下面的操作:
命令:
yum install scsi-target-utils.x86_64
创建配置文件/etc/tgt/conf.d/polardisk.conf,内容如下:
<target iqn.2008-09.polardb.com:target1>
backing-store /dev/disk/by-path/pci-0000:00:09.0-scsi-0:0:0:0
</target>
上面指定的共享盘/dev/disk/by-path/pci-0000:00:09.0-scsi-0:0:0:0
实际是一个链接,执行我们这台上一块给polarDB使用的硬盘/dev/sdb。使用链接文件的好处是这个链接不管机器怎么重启,基本都会保持不变,而/dev/sdb可能不是稳定的,重启后可能变成/dev/sdc,所以我们要配置一个不变的路径。
上面的iqn.2008-09.polardb.com:target1
是iSCSI的target名称,后面在iSCSI的客户端机器上挂盘时会用到这个target名称。
启动iSCSI服务端的服务:
systemctl enable tgtd
systemctl start tgtd
2.2 安装和启动iSCSI客户端程序
在192.168.166.116、192.168.166.117、192.168.166.118机器上做下面的操作:
安装以下包:
yum install iscsi-initiator-utils
启动iSCSI客户端服务:
systemctl start iscsi
挂载iSCSI共享盘:
用下面命令查看iSCSI服务端提供了哪些target名称(target名称你可以认为是一个服务名):
iscsiadm -m discovery -t st -p 192.168.166.115:3260
实际运行的效果如下:
[root@polardb02 ~]# iscsiadm -m discovery -t st -p 192.168.166.115:3260
192.168.166.115:3260,1 iqn.2008-09.polardb.com:target1
如果没有出来上面的效果,通常是前面的iSCSI的服务端的配置不正确,请检查前面的操作后再试。
运行下面的命令把iSCSI共享盘给挂过来:
iscsiadm -m node -T iqn.2008-09.polardb.com:target1 -l
上面的名称执行成功后,用命令iscsiadm -m session -P 3
检查挂载过来的盘:
[root@polardb02 ~]# iscsiadm -m session -P 3
iSCSI Transport Class version 2.0-870
version 6.2.0.874-22
Target: iqn.2008-09.polardb.com:target1 (non-flash)
Current Portal: 192.168.166.115:3260,1
Persistent Portal: 192.168.166.115:3260,1
**********
Interface:
**********
Iface Name: default
Iface Transport: tcp
Iface Initiatorname: iqn.1994-05.com.redhat:4598c6675bbb
Iface IPaddress: 192.168.166.116
Iface HWaddress: <empty>
Iface Netdev: <empty>
SID: 1
iSCSI Connection State: LOGGED IN
iSCSI Session State: LOGGED_IN
Internal iscsid Session State: NO CHANGE
*********
Timeouts:
*********
Recovery Timeout: 120
Target Reset Timeout: 30
LUN Reset Timeout: 30
Abort Timeout: 15
*****
CHAP:
*****
username: <empty>
password: ********
username_in: <empty>
password_in: ********
************************
Negotiated iSCSI params:
************************
HeaderDigest: None
DataDigest: None
MaxRecvDataSegmentLength: 262144
MaxXmitDataSegmentLength: 8192
FirstBurstLength: 65536
MaxBurstLength: 262144
ImmediateData: Yes
InitialR2T: Yes
MaxOutstandingR2T: 1
************************
Attached SCSI devices:
************************
Host Number: 8 State: running
scsi8 Channel 00 Id 0 Lun: 0
scsi8 Channel 00 Id 0 Lun: 1
Attached scsi disk sdb State: running
最后一行中Attached scsi disk sdb State: running
表明挂载过来的盘是/dev/sdb,可以用lsblk
看以下这个iSCSI的共享盘:
[root@polardb02 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 512M 0 part [SWAP]
└─sda2 8:2 0 19.5G 0 part /
sdb 8:16 0 30G 0 disk
sr0 11:0 1 1024M 0 rom
sr1 11:1 1 1024M 0 rom
sr2 11:2 1 1024M 0 rom
sr3 11:3 1 1024M 0 rom
sr4 11:4 1 1024M 0 rom
通常通过iSCSI挂载过来的共享盘与本地盘看起来没有什么区别。
2.3 配置udev规则让共享盘的盘符为/dev/nvme1n1
192.168.166.115机器上,配置文件/etc/udev/rules.d/pfs_disk.rules:
ACTION=="add|change", SUBSYSTEMS=="block", ENV{ID_PATH}=="pci-0000:00:09.0-scsi-0:0:0:0" SYMLINK+="nvme1n1"
上面的配置解释:
- 如果你在本机上的本地的盘有名称为nvme1n1的,上面配置中的nvme1n1这个名称就改成nvme2n1,总之不能与本地已有的盘的名称重复。
- 上面命令中的
ENV{ID_PATH}==
的值是盘的ID_PATH, 即此台机器指定了为PolarDB提供的那块硬盘,在本例中为/dev/sdb,此盘的ID_PATH可用从/dev/disk/by-path获得,如下所示:
[root@polardb01 rules.d]# ls -l /dev/disk/by-path
total 0
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:01.1-ata-1.0 -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 16 2023 pci-0000:00:01.1-ata-1.0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 16 2023 pci-0000:00:01.1-ata-1.0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:01.1-ata-1.1 -> ../../sr0
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-1.0 -> ../../sr1
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-2.0 -> ../../sr2
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-3.0 -> ../../sr3
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-4.0 -> ../../sr4
lrwxrwxrwx 1 root root 9 Mar 15 22:33 pci-0000:00:09.0-scsi-0:0:0:0 -> ../../sdb
从上面的可看出/dev/sdb的ID_PATH为pci-0000:00:09.0-scsi-0:0:0:0
。
192.168.166.116~118机器上,配置文件/etc/udev/rules.d/pfs_disk.rules,内容如下:
ACTION=="add|change", SUBSYSTEMS=="block", ENV{ID_PATH}=="ip-192.168.166.115:3260-iscsi-iqn.2008-09.polardb.com:target1-lun-1" SYMLINK+="nvme1n1"
其中从iSCSI挂过来的盘/dev/sdb的ID_PATH也是可以从/dev/disk/by-path获得:
[root@polardb02 rules.d]# ls -l /dev/disk/by-path
total 0
lrwxrwxrwx 1 root root 9 Mar 15 22:43 ip-192.168.166.115:3260-iscsi-iqn.2008-09.polardb.com:target1-lun-1 -> ../../sdb
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:01.1-ata-1.0 -> ../../sda
lrwxrwxrwx 1 root root 10 Mar 16 2023 pci-0000:00:01.1-ata-1.0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar 16 2023 pci-0000:00:01.1-ata-1.0-part2 -> ../../sda2
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:01.1-ata-1.1 -> ../../sr0
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-1.0 -> ../../sr1
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-2.0 -> ../../sr2
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-3.0 -> ../../sr3
lrwxrwxrwx 1 root root 9 Mar 16 2023 pci-0000:00:08.0-ata-4.0 -> ../../sr4
udev规则配置好后,我们需要用udevadm test /block/sdb
命令触发一下,让其生效:
[root@polardb02 ~]# udevadm test /block/sdb
calling: test
...
...
=== trie on-disk ===
tool version: 219
'scsi_id --export --whitelisted -d /dev/sdb'(out) 'ID_VENDOR=IET'
'scsi_id --export --whitelisted -d /dev/sdb'(out) 'ID_VENDOR_ENC=IET\x20\x20\x20\x20\x20'
'scsi_id --export --whitelisted -d /dev/sdb'(out) 'ID_MODEL=VIRTUAL-DISK'
...
...
...
ACTION=add
DEVLINKS=/dev/disk/by-id/scsi-360000000000000000e00000000010001 /dev/disk/by-id/wwn-0x60000000000000000e00000000010001 /dev/disk/by-path/ip-192.168.166.115:3260-iscsi-iqn.2008-09.polardb.com:target1-lun-1 /dev/nvme1n1
DEVNAME=/dev/sdb
DEVPATH=/devices/platform/host8/session1/target8:0:0/8:0:0:1/block/sdb
DEVTYPE=disk
ID_BUS=scsi
ID_FS_TYPE=
ID_MODEL=VIRTUAL-DISK
ID_MODEL_ENC=VIRTUAL-DISK
ID_PATH=ip-192.168.166.115:3260-iscsi-iqn.2008-09.polardb.com:target1-lun-1
ID_PATH_TAG=ip-10_197_166_115_3260-iscsi-iqn_2008-09_polardb_com_target1-lun-1
...
...
SUBSYSTEM=block
TAGS=:systemd:
USEC_INITIALIZED=661045
Unload module index
Unloaded link configuration context.
执行完后在/dev/目录下就生成了nvme1n1的链接。
2.4 安装clup-server模块
在192.168.166.115机器上:
安装csumdb模块,下载csumdb安装包:
wget https://gitee.com/csudata/clup-community/releases/download/5.0.2/csumdb1.0.0.el7.x86_64.bin
运行:bash csumdb1.0.0.el7.x86_64.bin
:
[root@polardb-01 ~]# bash csumdb1.0.0.el7.x86_64.bin
==== Installation is starting ...
==== Installation is complete.
安装clup-server模块,下载clup-server安装包:
wget https://gitee.com/csudata/clup-community/releases/download/4.4.6/clup4.4.6.el7.x86_64.bin
运行:bash clup4.4.6.el7.x86_64.bin
:
[root@polardb-01 ~]# bash clup4.4.6.el7.x86_64.bin
==== Installation is starting ...
==== Your ip is 192.168.166.115/20
==== register systemd service ...
already register systemd service!
==== register systemd service ok.
==== Installation is complete.
然后我们在浏览器输入 http://192.168.166.115:8090 ,打开WEB界面:
默认的用户名为:admin
默认密码为:cstech
输入后就可以登陆CLup的管理界面了。WEB界面中可以管理的数据库当前都是空的,还需要在数据库主机中安装clup-agent后,才能进一步的操作。
2.5 安装clup-agent
在需要部署数据库的主机上安装clup-agent。在本示例是在polardb-01、polardb-02、polardb-03机器上安装clup-agent。
下载clup-agent安装程序:
wget https://gitee.com/csudata/clup-community/releases/download/4.4.6/clup-agent4.4.6.el7.x86_64.bin
运行:bash clup-agent4.4.6.el7.x86_64.bin
:
[root@polardb-01 ~]# bash clup-agent4.4.6.el7.x86_64.bin
==== Installation is starting ...
==== Your ip is 192.168.166.115/20
Enter Clup Server IP Addr:
输入clup服务端的IP地址:192.168.166.115 然后回车继续:
Enter Clup Server IP Addr: 192.168.166.115
Clup Server ip is 192.168.166.115!
==== register systemd service ...
2023-03-08 10:12:45,17 INFO clup-agent v4.4.6 Copyright (c) 2018-2022 CSUDATA.COM All rights reserved.
already register systemd service!
==== register systemd service ok.
==== Installation is complete.
2.6 安装PolarDB程序
在polardb-01和polardb-02和polardb-03机器上安装PolarDB程序需要的依赖包:
yum install libaio.x86_64 libaio-devel.x86_64
下载中启乘数科技编译好的PolarDB:
wget https://gitee.com/csudata/zqpolardb/releases/download/11.9.2/polardb-11.9.2.20230314.el7.x86_64.tar.xz
解压安装:
tar xf polardb-11.9.2.20230314.el7.x86_64.tar.xz
cd polardb_20230314
./install.sh
实际的安装过程:
[root@polardb-01 polardb_20230314]# ./install.sh
装依赖libssl和libcrypto
安装pfs
install pfsd success!
安装polardb
执行结束
我们这个安装包安装的PolarDB数据库软件的目录在/usr/polardb_pfs目录下。需要把/usr/polardb_pfs/bin目录配置到Clup中。
到CLup的WEB管理界面中,到菜单:系统管理->clup参数设置界面中,找到参数pg_bin_path_string,点击修改:
在上面的界面中,原有的配置中添加,/usr/polardb_pfs/bin
,点保存即可。
2.7 初始化PolarDB共享盘上的文件系统
进入到polardb-01、polardb-02、polardb-03任意一台机器中执行下面的操作即可。在本例中我们进入polardb-01机器中,执行lsblk获得共享磁盘的盘符名称:
[root@polardb-01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:1 0 40G 0 disk
└─nvme0n1p1 259:2 0 40G 0 part /
nvme1n1 259:0 0 40G 0 disk
从上面的可以看出,总共有两块名称以nvme开头的盘,而nvme0n1是操作系统盘的盘符,所以我们的共享盘就是nvme1n1。
执行:
pfs -C disk mkfs nvme1n1
实际执行上面的命令的情况如下:
[root@polardb-01 ~]# pfs -C disk mkfs nvme1n1
pfs tool cmd record:mkfs nvme1n1
[PFS_LOG] Oct 13 17:58:43.952074 INF [1491] pfs build version:libpfs_version_("pfsd-build-desc-fb5114f-Thu Aug 18 14:46:30 CST 2022")
[PFS_LOG] Oct 13 17:58:43.952146 INF [1491] pid: 1125, caller: -bash
[PFS_LOG] Oct 13 17:58:43.952183 INF [1491] pid: 1102, caller: sshd: root@pts/0
[PFS_LOG] Oct 13 17:58:43.952205 INF [1491] pid: 1046, caller: /usr/sbin/sshd -D
[PFS_LOG] Oct 13 17:58:43.952229 INF [1491] open device cluster disk, devname nvme1n1, flags 0x13
[PFS_LOG] Oct 13 17:58:43.952242 INF [1491] disk dev path: /dev/nvme1n1
[PFS_LOG] Oct 13 17:58:43.952245 INF [1491] open local disk: open(/dev/nvme1n1, 0x4002)
[PFS_LOG] Oct 13 17:58:43.952254 INF [1491] ioctl status 0
[PFS_LOG] Oct 13 17:58:43.952257 INF [1491] pfs_diskdev_info get pi_pbdno 0, pi_rwtype 1, pi_unitsize 4194304, pi_chunksize 10737418240, pi_disksize 42949672960
[PFS_LOG] Oct 13 17:58:43.952260 INF [1491] pfs_diskdev_info waste size: 0
[PFS_LOG] Oct 13 17:58:43.952262 INF [1491] disk size 0xa00000000, chunk size 0x280000000
[PFS_LOG] Oct 13 17:58:43.952484 ERR [1491] chunk 0 pfs magic mismatch 0 vs 0x5046534348
[PFS_LOG] Oct 13 17:58:43.952489 INF [1491] mkfs PBD nvme1n1 isn't formatted
Init chunk 0
metaset 0/1: sectbda 0x1000, npage 80, objsize 128, nobj 2560, oid range [ 0, a00)
metaset 0/2: sectbda 0x51000, npage 64, objsize 128, nobj 2048, oid range [ 0, 800)
metaset 0/3: sectbda 0x91000, npage 64, objsize 128, nobj 2048, oid range [ 0, 800)
Init chunk 1
metaset 1/1: sectbda 0x280001000, npage 80, objsize 128, nobj 2560, oid range [ 1000, 1a00)
metaset 1/2: sectbda 0x280051000, npage 64, objsize 128, nobj 2048, oid range [ 800, 1000)
metaset 1/3: sectbda 0x280091000, npage 64, objsize 128, nobj 2048, oid range [ 800, 1000)
Init chunk 2
metaset 2/1: sectbda 0x500001000, npage 80, objsize 128, nobj 2560, oid range [ 2000, 2a00)
metaset 2/2: sectbda 0x500051000, npage 64, objsize 128, nobj 2048, oid range [ 1000, 1800)
metaset 2/3: sectbda 0x500091000, npage 64, objsize 128, nobj 2048, oid range [ 1000, 1800)
Init chunk 3
metaset 3/1: sectbda 0x780001000, npage 80, objsize 128, nobj 2560, oid range [ 3000, 3a00)
metaset 3/2: sectbda 0x780051000, npage 64, objsize 128, nobj 2048, oid range [ 1800, 2000)
metaset 3/3: sectbda 0x780091000, npage 64, objsize 128, nobj 2048, oid range [ 1800, 2000)
Inited filesystem(42949672960 bytes), 4 chunks, 2560 blktags, 2048 direntries, 2048 inodes per chunk
making paxos file
init paxos lease
making journal file
pfs mkfs succeeds!
2.8 使用CLup创建PolarDB高可用集群
进入CLup的WEB管理界面中,在菜单中,点击“HA集群->集群定义”:
在上面的界面中点“创建PolarDB共享存储集群”,出现创建PolarDB的集群界面:
在上面的界面中选择polardb-01机器,操作系统用户名称我们填写postgres(其实也可以填写其它的名称),操作系统用户postgres的UID我们填写701(也可以填写其它值),选择PolarDB软件的安装路径为/usr/polardb_pfs/bin,数据目录我们填写/data/polardata(也可以填写其它的目录),防脑裂命令填写/bin/true,然后点添加
按钮,即把polardb-01机器添加为PolarDB集群中的可读可写的节点(即主库),与此类似,我们再把polardb-02旧机器添加进来,polardb-02机器即做为PolarDB的只读节点,如下图所示:
在上图中点添加
按钮,即把polardb-02机器添加为PolarDB集群中的只读节点了,如下图所示:
在上图中,点下一步
按钮,进入填写集群信息的界面,如下图:
在上面的界面中,我们输入了如下信息:
- 集群名称:polardb-cluster01,可以输入任何一个名称。当创建多个集群时,方便识别是哪一个。
- 数据库端口:5432,我们输入了默认端口5432,也可以输入1025~65535之间的任意主机上没有被使用的一个端口。
- DB中CLup用户:postgres,我们管理PolarDB数据库使用的一个超级用户的名称,创建数据库实例时会自动创建此超级用户
- DB中CLup密码:上面用户的密码
- 流复制用户:postgres, 与“DB中CLup用户”保持相同即可。
- 集群VIP:192.168.166.231,即我们之前在阿里云控制台中创建的虚拟IP。
- pfs_disk_name: 共享盘的名称,我们输入nvme1n1
- polar_datadir:PolarDB数据库在共享盘种PFS的子目录,保持默认就可以了。
- pfsdaemon_params: -w 2,表示指定PFS文件系统的IO服务线程数,设置的越多PFS的性能可能越高,但是消耗的CPU也越高,如果是有很多核的机器我们可以把此值设置高一些,测试环境还是设置的低一些。
上面的pfs_disk_name我们填的是nvme1n1,这不是乱填的,这个名称是我们前面创建的阿里云Nvme盘的在虚拟机中的盘符,我们可以登陆到虚拟机种,允许lsblk命令获得这个盘符:
[root@polardb01 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:1 0 40G 0 disk
└─nvme0n1p1 259:2 0 40G 0 part /
nvme1n1 259:0 0 40G 0 disk
从上面的可以看出,总共有两块名称以nvme开头的盘,而nvme0n1是操作系统盘的盘符,所以我们的共享盘就是nvme1n1。
点检测
按钮,会自动检测主机上是否有nvme1n1的盘,如果没有会报错。如果之前没有用pfs -C disk mkfs nvme1n1
格式化此盘,也会报错。如果没有错误,就进入了下一步:
上面的配置中,保持默认,点下一步即可:
上面的配置中,保持默认,点提交
按钮就可以创建PolarDB高可用集群了:
如果上面的信息中没有报错,PolarDB集群就创建成功了。
我们到CLup的数据库列表界面中,选中PolarDB集群中的主库:
点psql
按钮,就在web界面用psql登陆的此主库:
在上面界面中我们输入select * from pg_stat_replication
检查流复制是否正常。
如果正常说明搭建的PolarDB高可用集群没有问题
到WEB界面中的HA管理
界面中,点上线
,让高可用集群进入正常的工作状态:
集群上线后,但有虚拟机故障后,会自动切换。
到主库的机器192.168.166.115上运行命令ip a
看虚拟VIP是否挂载过来了:
[root@polardb-01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:17:2d:7c brd ff:ff:ff:ff:ff:ff
inet 172.16.195.157/20 brd 172.16.207.255 scope global dynamic eth0
valid_lft 315348643sec preferred_lft 315348643sec
inet 192.168.166.231/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe17:2d7c/64 scope link
valid_lft forever preferred_lft forever
可以看到虚拟IP地址192.168.166.231挂载到这台机器上了。
3. 使用测试
3.1 手工切换测试
当前主库是在polardb-01上,只读节点是在polardb-02上,我们可以把主库切换到polardb-02上,让polardb-01变成只读节点,方法如下:
在WEB管理界面中:HA集群->HA管理,选中要操作的集群,点详情
:
进入集群的详情页中:
点上面界面中的切换,弹出是否切换对话框:
点确定后就把开始切换的动作:
等切换完成,主库切换到polardb-02机器上了,我们到polardb-02机器上,可以看到虚拟IP也切换到此机器了:
[root@polardb-02 polarAll]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:0c:cc:8e brd ff:ff:ff:ff:ff:ff
inet 192.168.166.115/20 brd 172.16.207.255 scope global dynamic eth0
valid_lft 315347507sec preferred_lft 315347507sec
inet 192.168.166.231/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::216:3eff:fe0c:cc8e/64 scope link
valid_lft forever preferred_lft forever