Fork me on GitHub
Suzf  Blog

Archive Linux

[译]Glusterfs Quick Start Guide

Step 1 – Have at least two nodes

在这两个节点上系统为 Fedora 22 (or later)这里以 Ubuntu 14.04.4 LTS 为例

主机名称为:

-- 172.16.9.10 eva.suzf.net  eva

-- 172.16.9.20 cali.suzf.net cali

内部网络互连 至少俩块硬盘,一个安装 OS,一个用来做 GlusterFS 的存储(sdb)。你会想从操作系统安装单独的GlusterFS存储,这将模拟真实的部署。 注意: GlusterFS 在 /var/lib/glusterd 下存储它的动态生成的配置文件。如果在任何时候GlusterFS无法写入这些文件(例如,当备份文件已满),它会给您的系统带来异常的行为; 或者更糟,完全把你的系统脱机。明智的做法是对目录创建单独的分区,例如 /var/log 以确保不会发生这种情况。

[译]How-to set up a redundant storage pool with ZFS and Ubuntu

如果您的数据没有冗余,没有备份,它几乎是不存在的。

大公司将处理任何数据量巨大的关键交易数据,采取数据冗余和备份措施确保数据安全。已经成为行业内的标准。但是对于中小型公司、SOHO(小型办公室、家庭办公室)来说,他们无法承受数据丢失所造成的损失。

不像大公司,许多小型企业,SOHO的和个人工作室甚至没有IT部门,更别说CTOs和CIOs了。

我曾亲自处理庞大的数据 – 我有超过6TB的存储。我在家里有一台文件服务器;
上面有我储存的家庭照片和我的所有文档,这是我生命中最重要的部分之一。

这种方法有很多优势:
因为我所有的数据都存储在同一个位置上,我可以很容易地管理,维护和保护它。
这是一个集中式的文件服务器,因此任何人在我的本地网络可以访问这些文件。
我可以在多个设备上工作 – 笔记本电脑,PC,平板电脑,手机,而不用担心他们之间复制文件。
如果我主要的个人电脑或笔记本电脑坏了,我不用担心抢救存储在计算机上的数据。因为没有什么是永远保存在我家这样的设备。

但是,让所有的鸡蛋放在一个篮子里,这不是一个好主意。所以,你必须给它添加冗余,确保有多个物理备份。

ZFS 就是答案

这里有两个优秀的文件系统可以做这个工作:ZFS 和 Btrfs。
BTRFS是非常新的,仍处于开发状态,所以我不建议使用它。
ZFS,在另一方面,是经过时间考验的,稳定的和极其丰富的功能:
它包括存储池(zpool),写入时复制,快照,数据完整性验证,自动修复,保护功能等。
但也有各地的ZFS一些授权问题,我已经写了以前。

起初,我想到了FreeNAS,跑了一段时间,但我更喜欢使用Linux和完全控制我的服务器。所以我选择了ZFS文件系统与Ubuntu。

以下是如何在Ubuntu上开始使用ZFS。
要求:
14.04 Ubuntu server
至少有三个硬盘驱动器。一个最为 Ubuntu系统的,它必须在一个单独的SSD或硬盘驱动器,两个用于存储池进行安装。
内存至少8GB(1GB为Ubuntu,然后每增加1TB数据增加1GB RAM)
任何像样的CPU。

建议:
我强烈建议任何文件服务器上使用 Ubuntu的LTS(长期支持)版本。
要创建RAID-Z,你最少需要两个具有相同的存储容量的SATA硬盘。如果您有不同容量的硬盘,总存储将是较小的硬盘驱动器的大小。
我强烈建议有第三个外部硬盘驱动器,这样你可以把你的数据定期备份。

一旦你有硬盘驱动器,就可以安装ZFS了。虽然ZFS预装在即将到来的Ubuntu16.04的发布,我们需要在14.04安装 PPA.

sudo apt-add-repository ppa:zfs-native/stable

之后更新 Repo

sudo apt-get update

现在安装软件和加载模块:

sudo apt-get install ubuntu-zfs

sudo /sbin/modprobe zfs

接着运行下面的命令检查在系统上是否有“pools”或硬盘驱动器存在:

sudo zfs list

输出的结果应该是 `no datasets available`。我们知道这里没有创建数据集,但是我们想检验它是否安装正确。 现在是创建磁盘驱动器存储池的时候了。因为您需要在您的系统上识别驱动器。所以第一次运行 lsblk 命令来识别每个驱动器。

sudo lsblk

记下块设备的名称,它应该是 ‘sda, sdb, sdc,’ 现在,我们需要找到每个驱动器的 ID, 我们将在驱动器的“池”中使用它。

sudo ls -l /dev/disk/by-id/

这个命令将会给你一段很长的输出。这是我的系统的一个例子(在我的Ubuntu系统中,我已删除输出的驱动器 SDA。在我的情况下,我将池中使用两个驱动器SDC和SDD):

swapnil@nas:~$ sudo ls -l /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root 9 Feb 20 17:48 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E0318132 -> ../../sdc
lrwxrwxrwx 1 root root 9 Feb 20 17:48 ata-WDC_WD40EFRX-68WT0N0_WD-WCC4E4LRJ111 -> ../../sdd
lrwxrwxrwx 1 root root 9 Feb 20 17:48 wwn-0x50014ee20922e8a8 -> ../../sdc
lrwxrwxrwx 1 root root 9 Feb 20 17:48 wwn-0x50014ee20b453ec7 -> ../../sdd

From this output note down the IDs that start with ‘wwn’, so in my case it was ‘wwn-0x50014ee20922e8a8’ and ‘wwn-0x50014ee20b453ec7’

现在让我以这种格式创建 zpool:

zpool create -f -o ashift=12 -m <mount_point> <pool_name> raidz <ID_of_the_first_drive> <id_of_the_second_drive>

在我的这种情况下,挂在点是 ‘/mnt/bank’, pool 是 ‘swapool’

zpool create -f -o ashift=12 -m /mnt/bank swapool raidz wwn-0x50014ee20922e8a8 wwn-0x50014ee20b453ec7

一旦做检查状态,这可能需要一段时间。

sudo zfs list

这一次,你会得到一些输出,这意味着你的 pool 创建成功。现在这两个硬盘将镜像文件。为了进一步增加冗余,你可以添加更多的驱动器。 在开始将文件复制到 pool 之前,您还有更多的工作要做。您必须创建 “数据集”,并将这些数据存储在这些数据集内。数据集是ZFS的功能创建的像目录或文件夹一样。您可以为不同的文件类型创建一些数据集或只创建一个数据集。一旦创建了一个数据集,您就可以在里面创建普通的目录或文件了。 这是创建数据集的命令:

sudo zfs create <pool_name>/directory_name

这里是在我的系统中的例子,我对不同类型的文件创建了不同的数据集:

sudo zfs create swapool/images
sudo zfs create swapool/music
sudo zfs create swapool/movies
sudo zfs create swapool/documents
sudo zfs create swapool/ebooks

这样,你将为您的数据有一个非常有组织的结构。 一旦创建了所有所需的数据集,您就需要在池中更改文件权限,以便正常的系统用户可以对其进行写入。

sudo chown -R user_name:group_name /path_of_pool

Example:

sudo chown -R swapnil:users /mnt/bank/

现在您的所有配置都配置完毕。开始将您的文件存储在新创建的冗余文件存储中。在后续的文章中,我将涉及到此存储的定期维护,如何自动备份驱动器上的数据,并通过本地网络访问此存储,将其变成一个文件服务器。

源文:How-to set up a redundant storage pool with ZFS and Ubuntu

相关链接:

http://open-zfs.org/wiki/System_Administration

https://www.freebsd.org/doc/zh_CN.UTF-8/books/handbook/filesystems-zfs.html

[译] Couchbase 使用 cbrestore 恢复数据

恢复使用 cbbackup 命令备份的 bucket 数据,使用 cbrestore 命令 恢复数据到一个 新的群集的bucket中。

当恢复数据的时候,你不得不根据你正在执行的还原类型选择一个合适的还原序列。恢复群集数据的方法 取决于备份群集的方式。

如果使用 cbbackup 备份 bucket 数据,你可以恢复数据到相同或者不同配置的群集中去。 这是因为cbbackup存储格式为bucket的数据的信息使其能够被恢复到新的群集上。

注意:如果数据是使用直接拷贝文件的方式备份的, 之后你恢复数据的时候必须恢复到相同群集中。

cbrestore 从使用 cbbackup 命令备份的数据中取信息存储到群集中。群集的配置不必匹配备份数据时所使用的。它可以在灾难恢复的情况下,将数据传送到一个新的群集中。或者是更新或者是扩展现有的群集版本。

因为数据可灵活恢复,它提供了许多不同的方案可以在已经备份的数据上执行:

恢复数据到不同大小和配置的群集中。
在相同 或不同配置的群集中 传输 或者 恢复数据到不同的 bucket。
恢复选定数据到 相同 或不同配置的群集一个不同的 bucket 中。

cbrestore 命令的基本用法:

cbrestore [options] [source] [destination]

Where:

[options]
    Options specifying how the information should be restored into the cluster. Common options include:

        --bucket-source

        Specify the name of the bucket data to be read from the backup data that will be restored.
        --bucket-destination

        Specify the name of the bucket the data will be written to. If this option is not specified, the data will be written to a bucket with the same name as the source bucket.
        --add

        Use --add instead of --set to avoid overwriting the existing items in the destination.

[source]
    The backup directory specified to cbbackup where the backup data was stored.

[destination]
    The REST API URL of a node within the cluster where the information will be restored.

cbrestore 命令一次只能恢复一个单独的bucket的数据。如果你备份了这个群集的bucket,则必须还原每个bucket到集群。所有目的bucket必须已经存在,因为 cbrestore 不会帮你要恢复的节点中创建配置bucket。

举个栗子
恢复一个单独的bucket 到群集中去:

cbrestore \
    /backups/backup-2012-05-10 \
    http://Administrator:password@HOST:8091 \
    --bucket-source=XXX
    [####################] 100.0% (231726/231726 msgs)
    bucket: default, msgs transferred...
    :                total |       last |    per sec
    batch :                  232 |        232 |       33.1
    byte  :             10247683 |   10247683 |  1462020.7
    msg   :               231726 |     231726 |    33060.0
    done

恢复bucket 到 群集中不同的 bucket 中:

cbrestore \
    /backups/backup-2012-05-10 \
    http://Administrator:password@HOST:8091 \
    --bucket-source=XXX \
    --bucket-destination=YYY
    [####################] 100.0% (231726/231726 msgs)
    bucket: default, msgs transferred...
    :                total |       last |    per sec
    batch :                  232 |        232 |       33.1
    byte  :             10247683 |   10247683 |  1462020.7
    msg   :               231726 |     231726 |    33060.0
    done

上面 msg 行统计的信息是恢复到群集中bucket 中文档的数量。

在恢复的时候过滤 key

cbrestore命令包括对于在备份过程中创建的文件过滤 Key 还原到数据库。
这是除了在备份过程中可用的过滤支持的另一方面。

该规范是以一个正则表达式的形式在cbrestore命令提供的一个参数。
例如,将以object开头的key的数据还原到一个bucket中:

cbrestore /backups/backup-20120501 http://HOST:8091 \
    -u Administrator -p password \
    -b default \
    -k '^object.*'
    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_7597_3783_6
    ...
    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_5575_3699_6
    2013-02-18 10:39:09,476: w0 skipping msg with key: sales_7597_3840_6
    [                    ] 0.0% (0/231726 msgs)
    bucket: default, msgs transferred...
    :                total |       last |    per sec
    batch :                    1 |          1 |        0.1
    byte  :                    0 |          0 |        0.0
    msg   :                    0 |          0 |        0.0
    done

只复制匹配到特定前缀的 keys 到默认的 bucket 中。对于跳过的每个键,提供了一个信息消息。
其余的输出显示转移的记录和正常的摘要。

通过拷贝文件恢复数据

要将数据恢复到相同配置的群集中,需要先关闭整个群集。当你恢复完数据之后,你需要将整个群集启动。在这种情况下,您正在用备份的数据文件的备份版本替换整个群集数据和配置,
然后用保存的群集文件的版本重新启动群集。
重要提示: 确保任何恢复的文件数组指定了适当的Couchbase用户。

当在同一个群集中恢复数据时,验证以下过程:
备份和恢复必须使用相同版本的 Couchbase。
整个群集必须包含相同数量的节点。
每个节点必须有相同的IP 或者 在备份的时候配置相同的主机名。
所有的 config.dat 配置文件以及所有数据库文件必须恢复到原来的位置。

完成还原过程所需的步骤是:
在所有节点上停止couchbase服务。
在每个节点上,从你的备份的文件中恢复数据库,stats.json,配置文件config.dat。
在每个节点上重启服务。

Parent topic: Backup and restore

源文: Restoring with cbrestore

 

How to Decrease an LVM Partition

Here we show you how to shrink an LVM volume or partition in Linux by first resizing the file system followed by resizing the logical volume.

See here if you’re instead trying to do the opposite and expand an LVM volume.

 

Note: In this example we are working in CentOS 7, some commands may differ in different Linux distributions. As of CentOS 7 the default file system is XFS which is not currently possible to shrink, this example is working with the ext4 file system.

In this example we will work through shrinking logical volume /var/centos/var from 10GB to 5GB.

Overview of Logical Volume Manager (LVM)

Before working through the resizing process it’s important you first understand some basic concepts around physical volumes, volume groups, logical volumes, and the file system.

  • Physical Volume (PV): This can be created on a whole physical disk (think /dev/sda) or a Linux partition.
  • Volume Group (VG): This is made up of at least one or more physical volumes.
  • Logical Volume (LV): This is sometimes referred to as the partition, it sits within a volume group and has a file system written to it.
  • File System: A file system such as ext4 will be on the logical volume.

[译] Couchbase 使用 cbbackup 备份

cbbackup 工具 是一个灵活的备份命令,使您可以备份本地数据和远程节点和涉及您的集群数据的不同组合:

单节点单buckets 单节点上所有buckets 整个群集上单个buckets 整个群集上所有buckets

备份可以在一个单独的节点直接拷贝文件,也可以通过连接远程群集然后通过数据流的形式保存到备份位置。备份可以运行在运行的节点或集群或脱机节点上执行。

cbbackup 命令可以以一种容易恢复的格式储存数据。当需要恢复的时候使用 cbrestore,你可以还原数据到任何配置的群集。源和目的群集不需要满足你使用 cbbackup 命令时保存的信息。

[译] Couchbase backup and restore

定期备份整个群集的数据,当需要恢复数据的时候可以最小化数据的不一致性。

备份你的数据应该是你的集群上定期的任务,以确保您不会在严重的硬件或安装失败的情况下丢失信息。

有许多用于执行备份的方法:

使用 cbbackup
cbbackup命令,可以在单个节点,单桶,或整个群集备份到一个灵活的备份架构,它可以将数据恢复到相同或不同的集群和水桶。所有的备份可以实时集群或节点上执行。该命令 cbbackup 是最灵活和推荐的备份工具。
使用 文件副本
正在运行的或脱机集群可以通过复制每个节点上的文件进行备份。使用这种方法,你只能还原到相同的配置群集。
注意:
由于Couchbase Server的灵活的特性,不可能创建整个集群的一个完整的即时备份和快照。因为数据总是被更新或修改,这是不可能采取正确的快照。
您必须备份和恢复整个集群,以尽量减少任何数据不一致。Couchbase是每个项目总是一致的,但不保证完全一致集群或顺序持久性。
 相关连接

[faq] Couchbase cant start because of the ip addr nightmare

许久之前,再次打开在本地 VM 创建的 Couchbase 有些异常 服务无法正常运行 查看日志,如下:
# /opt/couchbase/var/lib/couchbase/logs/info.log
[ns_server:warn,2016-08-15T13:47:59.536+08:00,nonode@nohost:dist_manager<0.129.0>:dist_manager:wait_for_address:121]Cannot listen on address `cb1.suzf.net`: eaddrnotavail
[ns_server:info,2016-08-15T13:47:59.536+08:00,nonode@nohost:dist_manager<0.129.0>:dist_manager:wait_for_address:125]Configured address `cb1.suzf.net` seems to be invalid. Giving OS a chance to bring it up.
[ns_server:error,2016-08-15T13:48:00.537+08:00,nonode@nohost:dist_manager<0.129.0>:dist_manager:init:178]Configured address `cb1.suzf.net` seems to be invalid. Will refuse to start for safety reasons.
看起来是说主机名称  cb.suzf.net  无效,以至于服务 无法正常启动。 O 想起来了, 曾经修改过 /etc/hosts 记录
#grep cb /etc/hosts
172.16.9.10     cb1.suzf.net
172.16.9.20     cb2.suzf.net
而当前的IP为
#ifconfig eth1|grep 'inet addr'
          inet addr:172.16.9.11  Bcast:172.16.9.255  Mask:255.255.255.0
下面来更正 hosts 记录
#grep cb /etc/hosts
172.16.9.11     cb1.suzf.net
172.16.9.20     cb2.suzf.net
It worked.

There are several ways you can provide hostnames:

  • When installing a Couchbase Server on a machine.
  • When adding a node to an existing cluster for an online upgrade.
  • Using a REST API call.

Hostname Errors

Provide the hostname and port for the node and administrative credentials for the cluster. The value you provide for hostname must be a valid hostname for the node. Possible errors that can occur:

  • Could not resolve the host name. The host name you provide as a parameter does not resolve to a IP address.
  • Could not listen. The host name resolves to an IP address, but no network connection exists for the address.
  • Could not rename the node because name was fixed at server start-up.
  • Could not save address after rename.
  • Requested name host name is not allowed. Invalid host name provided.
  • Renaming is disallowed for nodes that are already part of a cluster.
节选自: http://developer.couchbase.com/documentation/server/4.1/install/hostnames.html

KVM 网络管理

KVM 客户机网络连接有两种方式,:
用户网络(User Networking):让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机,性能上也需要大的调整。NAT方式。
虚拟网桥(Virtual Bridge):这种方式要比用户网络复杂一些,但是设置好后客户机与互联网,客户机与主机之间的通信都很容易。Bridge方式。

注意:kvm安装后的默认是NAT方式,网桥方式需要手动配置

NAT方式

Bridge方式
Bridge方式原理

Bridge方式即虚拟网桥的网络连接方式,是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。网桥多用作高级设置,特别是主机多个网络接口的情况。

目前版本的NetworkManger 不支持配置桥接网络功能,如何需要配置桥接网络,请停用 NetworkManger 服务,改用network 服务来管理网络!

Bridge方式网络的配置

1 编辑修改网络设备脚本文件,增加网桥设备br0 CentOS发行版配置文件 /etc/sysconfig/network-scripts/ifcfg-br0

DEVICE="br0"
TYPE="Bridge"
BOOTPROTO=static
IPADDR=10.1.83.205
PREFIX=22
GATEWAY=10.1.80.254
DNS1=59.108.119.3
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=br0
ONBOOT=yes
DELAY=0

2 编辑修改网络设备脚本文件,修改网卡设备eth0 CentOS发行版配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE="eth0"
TYPE=Ethernet
NM_CONTROLLED="yes"
BRIDGE="br0"
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME=system-eth0
UUID=611d95bc-0d27-4536-b012-c5d4994c5815
ONBOOT=yes
LAST_CONNECT=1350313129

NM_CONTROLLED这个属性值,根据RedHat公司的文档是必须设置为“no”的(这个值为“yes”表示可以由服务NetworkManager来管理。NetworkManager服务不支持桥接,所以要设置为“no”。),但实际上发现设置为“yes”没有问题。通讯正常。 3、重启网络服务

service network restart

4、校验桥接接口

[root@localhost ~]# brctl show
bridge name bridge id   STP enabled interfaces
br0   8000.003048c68ab0 no    eth0
vnet0
vnet1

注意事项

IP配置在桥接器上,对应的网卡不需要配置IP;
所有桥接器,物理网卡都必须处于running状态;
客户机安装时注意,网络要选择用br0桥接方式;
保证宿主机IP和虚拟机IP处于同一网段

 

KVM 在线迁移

在线迁移(Online Migration)也叫动态迁移(Live Migration)。就是在保证虚拟机上服务正常运行的同时,将一个虚拟机系统从一个物理主机移动到另一个物理主机的过程。该过程不会对最终用户造成明显的影响,从而使得管理员能够在不影响用户正常使用的情况下,对物理服务器进行离线维修或者升级。与静态迁移不同的是,为了保证迁移过程中虚拟机服务的可用,迁移过程仅有非常短暂的停机时间。迁移的前面阶段,服务在源主机的虚拟机上运行,当迁移进行到一定阶段,目的主机已经具备了运行虚拟机系统的必须资源,经过一个非常短暂的切换,源主机将控制权转移到目的主机,虚拟机系统在目的主机上继续运行。对于虚拟机服务本身而言,由于切换的时间非常短暂,用户感觉不到服务的中断,因而迁移过程对用户是透明的。动态迁移适用于对虚拟机服务可用性要求很高的场合。

环境介绍
172.16.5.10   lab.suzf.net
172.16.5.20   lab2.suzf.net

lab.suzf.net ----> lab2.suzf.net

# tree /opt/data/kvm/
/opt/data/kvm/
├── disk
│   └── hello_kvm.qcow2
├── images
│   └── hello_kvm.img
└── iso
└── CentOS-7-x86_64-Minimal-1503-01.iso

3 directories, 3 files

NFS 挂载目录 /opt/data/kvm

1. 迁移需求
确保待迁移主机使用一下协议之一共享存储:
Fibre Channel-based LUNs
iSCSI
FCoE
NFS
GFS2
SCSI RDMA protocols (SCSI RCP)

2. 确保 libvirtd 服务已经启用

3. 配置共享存储
3.1 配置 nfs
echo "/opt/data/kvm 172.16.5.0/24(rw,no_root_squash,sync)" >> /etc/exports

重启服务
systemctl restart nfs-server.service

[[email protected] ~]# exportfs -av
exporting 172.16.5.0/24:/opt/data/kvm

3.2 挂在到目的节点
[root@lab2 ~]# showmount  -e lab.suzf.net
Export list for lab.suzf.net:
/opt/data/kvm 172.16.5.0/24

[root@lab2 ~]# mount -t nfs4 lab.suzf.net:/opt/data/kvm /opt/data/kvm
[root@lab2 ~]# df -Th | grep nfs
lab.suzf.net:/opt/data/kvm nfs4       50G  3.2G   47G   7% /opt/data/kvm

4. 在线迁移

4.1 确保虚拟机为正在运行状态
[root@lab ~]# virsh  list --all
Id    Name                           State
----------------------------------------------------
2     hello_kvm                      running

4.2 开始迁移

[root@lab ~]# virsh migrate --live --verbose hello_kvm qemu+ssh://lab2.suzf.net/system
[email protected]'s password:

[root@lab ~]#

4.3 wait ~

4.4 验证
[root@lab2 ~]# virsh list --all
Id    Name                           State
----------------------------------------------------
2     hello_kvm                      running
虽然 hello_kvm 虚拟机已经在lab2节点上启动了,但是虚拟主机上还没有配置文件。
所以需要创建配置文件并定义虚拟机。
[root@lab2 ~]# find /etc/ -name "hello_kvm*"
[root@lab2 ~]#

创建配置文件
[root@lab2 ~]# virsh dumpxml hello_kvm > /etc/libvirt/qemu/hello_kvm.xml
[root@lab2 ~]# virsh define /etc/libvirt/qemu/hello_kvm.xml
Domain hello_kvm defined from /etc/libvirt/qemu/hello_kvm.xml

到此,kvm虚拟机动态迁移成功。

https://www.chenyudong.com/archives/virsh-kvm-live-migration-with-libvirt.html