Rootop 服务器运维与web架构

2015-03-18
发表者 Venus
vmware workstation桥接网络虚拟机无法获取IP已关闭评论

vmware workstation桥接网络虚拟机无法获取IP

昨天在vmware中实验kvm虚拟机,创建的Guest虚拟机始终无法ping通外部网络,但是能ping通宿主机。查不出问题很是恼火。
(vmware->centos6->kvm->centos6)
软件            宿主机 虚拟软件 Guest系统

一直找不到解决办法,昨天的实验过程放弃了,今天在vmware中安装startos,结果还是无法获取ip,遂启动了一个centos6和centos7测试,都无法获取IP。
这次直接怀疑是网络或者vmware的问题,登陆防火墙看dhcp池资源都够,并且我本地物理机改成dhcp也可以获取,排除防火墙。开始查vmware。
最后在 编辑-虚拟网络编辑器 发现问题。(vmware 版本为 11.0.0 build-2305329)

vmnet0属于桥接模式,应该桥接到物理网卡。但是我这里为自动。最根本原因是之前测试lvs的windows客户端,创建了一个loopback网卡,
可能桥接到loopback网卡上了,所以获取不了IP(手动指定也不行)。


手动改为物理机网卡型号,确定,虚拟机重启下网络服务,ip获取了。一切正常了。

2015-03-16
发表者 Venus
利用percona-toolkit实现mysql一致性检查及同步已关闭评论

利用percona-toolkit实现mysql一致性检查及同步

在mysql主从复制中,mysql5.1版本出现错误的次数比较高,如主库宕机或者从库宕机,日志损坏都会导致复制异常,通常需要手动修复或者重新同步。
如果数据不一致,会直接导致经济损失(电商),所以就利用pt-table-checksum工具来检查主从的一致性,以及通过pt-table-sync来同步未同步的数据。

服务器信息:
master:192.168.0.171
slave   :192.168.0.178
数据库版本:mysql-5.1
数据库名称:test (安装完成后自带)

安装配置主从:
Master:

[root@localhost ~]# yum install -y mysql mysql-server perl perl-devel perl-Time-HiRes
[root@localhost ~]# service mysqld start
[root@localhost ~]# mysql
mysql> use mysql;
mysql> update user set password=password('root') where user = 'root';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql> flush privileges;

Slava:

[root@localhost ~]# yum install -y mysql mysql-server perl perl-devel perl-Time-HiRes
[root@localhost ~]# service mysqld start
[root@localhost ~]# mysql
mysql> use mysql;
mysql> update user set password=password('root') where user = 'root';
mysql> grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
mysql> flush privileges;

master:
编辑/etc/my.cnf添加或修改:

log-bin=mysql-bin
server-id=1
binlog-do-db=test
binlog-ignore-db=mysql
binlog_format=ROW

重启mysql服务。

show一下master信息:

[root@localhost ~]# mysql -uroot -proot

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | test | mysql |
+------------------+----------+--------------+------------------+

slave:
编辑/etc/my.cnf添加或修改:

master-port=3306
master-connect-retry=60
replicate-do-db=test
replicate-ignore-db=mysql
server-id=2

重启mysql服务。

配置从库同步:

[root@localhost ~]# mysql -uroot -proot
mysql> stop slave;
mysql> reset slave;
mysql> change master to master_host='192.168.0.171', master_user='root', master_password='root', master_log_file='mysql-bin.000001', master_log_pos=106;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
 Slave_IO_State: Waiting for master to send event
 Master_Host: 192.168.0.171
 Master_User: root
 Master_Port: 3306
 Connect_Retry: 60
 Master_Log_File: mysql-bin.000001
 Read_Master_Log_Pos: 106
 Relay_Log_File: mysqld-relay-bin.000002
 Relay_Log_Pos: 251
 Relay_Master_Log_File: mysql-bin.000001
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

必须看到两个Yes为配置成功。

在主库上创建表:

create table teacher(
 id int(3) auto_increment not null primary key,
 name char(10) not null,
 address varchar(50) default 'qingdao',
 year date
);

这里我用SQLyogEnt客户端工具往主数据库插入数据。

查看从库表结构及第一条数据已经同步过去。

在从库上查看校验信息:

[root@localhost ~]# pt-table-checksum --user=root --password=root --host=192.168.0.171 --P=3306 --d=test --recursion-method=processlist --no-check-binlog-format --nocheck-replication-filters --replicate=test.checksums --set-vars innodb_lock_wait_timeout=50

解释:
TS             :完成检查的时间。
ERRORS :检查时候发生错误和警告的数量。
DIFFS      :0表示一致,1表示不一致。当指定–no-replicate-check时,会一直为0,当指定–replicate-check-only会显示不同的信息。
ROWS      :表的行数。
CHUNKS :被划分到表中的块的数目。
SKIPPED :由于错误或警告或过大,则跳过块的数目。
TIME        :执行的时间。
TABLE     :被检查的表名。

pt-table-checksum参数解释:

--nocheck-replication-filters :不检查复制过滤器,建议启用。后面可以用--databases来指定需要检查的数据库。
--no-check-binlog-format : 不检查复制的binlog模式,要是binlog模式是ROW,则会报错。
--replicate-check-only :只显示不同步的信息。
--replicate= :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。
更多参数可以 pt-table-checksum --help查看

继续往主库插入2条数据,查看从库是否同步。如果同步完成,把从库的最后两条数据(id=2 id=3)删除。

在从库上再查看校验信息:

看到DIFFS为1,说明数据不一致。需要同步。

pt-table-sync可以做单向和双向同步的表数据。可以同步单个表,也可以同步整个库。但它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

[root@localhost ~]# pt-table-sync --execute --replicate test.checksums --sync-to-master h=192.168.0.178,P=3306,u=root,p=root --print


解释:
–replicate=   :指定通过pt-table-checksum得到的表
–databases= :指定执行同步的数据库,多个用逗号隔开
–tables=        :指定执行同步的表,多个用逗号隔开
–sync-to-master :通过show processlist或show slave status 去自动的找主
h=192.168.0.178 :Slave的地址
u=root     :用户名
p=root     :密码
–print     :打印信息,但不执行命令
–execute :执行命令

再通过SQLyogEnt查看两台机器数据同步完成了。

2015-03-12
发表者 Venus
heartbeat3.0与drbd8.4.1整合已关闭评论

heartbeat3.0与drbd8.4.1整合

heartbeat安装参考:https://www.rootop.org/pages/3263.html
drbd安装参考         : https://www.rootop.org/pages/3295.html

注意这两篇文章种的主机名不一样,现统一用node1node2

其次需要配置的地方就是修改haresources文件,让heartbeat管理drbd状态、挂载操作。

[root@node1 ~]# vi /etc/ha.d/haresources

node1 IPaddr::192.168.0.177/24/eth0 drbddisk::r0 Filesystem::/dev/drbd1::/db::ext3

创建drbddisk脚本:
提供本站下载地址:https://www.rootop.org/rs/drbddisk
[root@node1 ~]# vi /etc/ha.d/resource.d/drbddisk

#!/bin/bash
#
# This script is inteded to be used as resource script by heartbeat
#
# Copright 2003-2008 LINBIT Information Technologies
# Philipp Reisner, Lars Ellenberg
#
###

DEFAULTFILE="/usr/local/drbd"
DRBDADM="/sbin/drbdadm"

if [ -f $DEFAULTFILE ]; then
	. $DEFAULTFILE
fi

if [ "$#" -eq 2 ]; then
	RES="$1"
	CMD="$2"
else
	RES="all"
	CMD="$1"
fi

## EXIT CODES
# since this is a "legacy heartbeat R1 resource agent" script,
# exit codes actually do not matter that much as long as we conform to
# http://wiki.linux-ha.org/HeartbeatResourceAgent
# but it does not hurt to conform to lsb init-script exit codes,
# where we can.
# http://refspecs.linux-foundation.org/LSB_3.1.0/
#LSB-Core-generic/LSB-Core-generic/iniscrptact.html
####

drbd_set_role_from_proc_drbd()
{
local out
if ! test -e /proc/drbd; then
ROLE="Unconfigured"
return
fi

dev=$( $DRBDADM sh-dev $RES )
minor=${dev#/dev/drbd}
if [[ $minor = *[!0-9]* ]] ; then
# sh-minor is only supported since drbd 8.3.1
	minor=$( $DRBDADM sh-minor $RES )
fi

if [[ -z $minor ]] || [[ $minor = *[!0-9]* ]] ; then
	ROLE=Unknown
	return
fi



if out=$(sed -ne "/^ *$minor: cs:/ { s/:/ /g; p; q; }" /proc/drbd); then
	set -- $out
	ROLE=${5%/**}
	: ${ROLE:=Unconfigured} # if it does not show up
else
	ROLE=Unknown
fi
}



case "$CMD" in
	start)
# try several times, in case heartbeat deadtime
# was smaller than drbd ping time
try=6
while true; do
$DRBDADM primary $RES && break
let "--try" || exit 1 # LSB generic error
sleep 1
done
;;

	stop)
# heartbeat (haresources mode) will retry failed stop
# for a number of times in addition to this internal retry.
try=3
while true; do
$DRBDADM secondary $RES && break
# We used to lie here, and pretend success for anything != 11,
# to avoid the reboot on failed stop recovery for "simple
# config errors" and such. But that is incorrect.
# Don't lie to your cluster manager.
# And don't do config errors...
let --try || exit 1 # LSB generic error
sleep 1
done
;;

	status)
if [ "$RES" = "all" ]; then
echo "A resource name is required for status inquiries."
exit 10
fi
ST=$( $DRBDADM role $RES )
ROLE=${ST%/**}
case $ROLE in
Primary|Secondary|Unconfigured)
# expected
;;

	*)
# unexpected. whatever...
# If we are unsure about the state of a resource, we need to
# report it as possibly running, so heartbeat can, after failed
# stop, do a recovery by reboot.
# drbdsetup may fail for obscure reasons, e.g. if /var/lock/ is
# suddenly readonly. So we retry by parsing /proc/drbd.
drbd_set_role_from_proc_drbd
esac
case $ROLE in

Primary)
echo "running (Primary)"
exit 0 # LSB status "service is OK"
;;

Secondary|Unconfigured)
echo "stopped ($ROLE)"
exit 3 # LSB status "service is not running"
;;

*)

# NOTE the "running" in below message.
# this is a "heartbeat" resource script,
# the exit code is _ignored_.
echo "cannot determine status, may be running ($ROLE)"
exit 4 # LSB status "service status is unknown"
;;

esac
;;

*)

echo "Usage: drbddisk [resource] {start|stop|status}"
exit 1
;;

esac

exit 0

添加执行权限: chmod 755 /etc/ha.d/resource.d/drbddisk

node1做为heartbeat和drbd的主节点时,/etc/drbd1会自动挂载到/db,当主宕机后,node2接管heartbeat的虚拟IP并自动接管drbd提升为主节点且挂载/etc/drbd1到/db下。

 

2015-03-11
发表者 Venus
centos6.5下drbd-8.4.1的编译安装与配置已关闭评论

centos6.5下drbd-8.4.1的编译安装与配置

Distributed Replicated Block Device(DRBD)是一种基于软件的,无共享,复制的存储解决方案,在服务器之间的对块设备(硬盘,分区,逻辑卷等)进行镜像。DRBD工作在内核当中的,类似于一种驱动模块。

DRBD工作的位置在文件系统的buffer cache和磁盘调度器之间,通过tcp/ip发给另外一台主机到对方的tcp/ip最终发送给对方的drbd,再由对方的drbd存储在本地对应磁盘 上,类似于一个网络RAID-1功能。

在高可用(HA)中使用DRBD功能,可以代替使用一个共享盘阵。本地(主节点)与远程主机(备节点)的数据可以保证实时同步。当本地系统出现故障时,远程主机上还会保留有一份相同的数据,可以继续使用。

系统版本:CentOS6.5_x64
内核版本:2.6.32-431.el6.x86_64

IP规划:
主节点 node1 192.168.0.175
备节点 node2 192.168.0.176

修改主机名:
主节点
[root@node1 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node1
[root@node1 ~]# hostname node1
备节点
[root@node2 ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=node2
[root@node2 ~]# hostname node2

修改两台机器的host:
node1添加
192.168.0.175 node1
192.168.0.176 node2

node2添加
192.168.0.175 node1
192.168.0.176 node2

selinux关闭、iptables关闭

drbd官方网站:http://oss.linbit.com/drbd/

安装编译环境:
[root@node1 ~]# yum install -y gcc gcc-c++ kernel-headers flex
其中还需要一个包,就是内核源码包kernel-devel,这里不通过yum安装,因为yum list出来的版本为2.6.32-504.8.1.el6。
而我系统内核版本为2.6.32-431.el6.x86_64,如果安装了最新的kernel-devel,在执行make KDIR=的时候会报错。
所以选择通过iso镜像中的rpm包安装。提取kernel-devel-2.6.32-431.el6.x86_64.rpm传到服务器中,直接rpm -ivh安装。

下载drbd源码包:
[root@node1 ~]# wget -c http://oss.linbit.com/drbd/8.4/drbd-8.4.1.tar.gz

解压编译:

[root@node1 drbd-8.4.1]# ./configure --prefix=/usr/local/drbd --with-km
[root@node1 drbd-8.4.1]# make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/
[root@node1 drbd-8.4.1]# make install
[root@node1 drbd-8.4.1]# mkdir -p /usr/local/drbd/var/run/drbd
[root@node1 drbd-8.4.1]# cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
[root@node1 drbd-8.4.1]# chkconfig --add drbd
[root@node1 drbd-8.4.1]# chkconfig drbd on

安装内核模块:

[root@node1 drbd-8.4.1]# cd drbd
[root@node1 drbd]# make clean
[root@node1 drbd]# make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/
[root@node1 drbd]# cp drbd.ko /lib/modules/2.6.32-431.el6.x86_64/kernel/lib/
[root@node1 drbd]# depmod

drbd配置:
对两台机器添加新硬盘,这里为/dev/sdb,分区,fdisk /dev/sdb 根据提示操作创建新分区(/dev/sdb1)。

创建挂载点: mkdir /db

配置主配置文件drbd.conf:
[root@node1 ~]# vi /usr/local/drbd/etc/drbd.conf 确认为以下两行

include "drbd.d/global_common.conf";
include "drbd.d/*.res";

配置global_common.conf:
[root@node1 ~]# vi /usr/local/drbd/etc/drbd.d/global_common.conf

common {
	net {

        protocol C;
		}
	}

主要在net段中添加同步协议 protocol C;

配置资源文件:
[root@node1 ~]# vi /usr/local/drbd/etc/drbd.d/r0.res

resource r0 {
  on node1 {
    device    /dev/drbd1;
    disk      /dev/sdb1;
    address   192.168.0.175:7789;
    meta-disk internal;
  }
  on node2 {
    device    /dev/drbd1;
    disk      /dev/sdb1;
    address   192.168.0.176:7789;
    meta-disk internal;
  }
}

创建资源r0:

node1和node2均执行
[root@node1 ~]# modprobe drbd    #载入模块
[root@node1 ~]# lsmod|grep drbd #确认载入
drbd 303444 3
libcrc32c 1246 1 drbd
[root@node1 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=100 #复制些数据,防止create-md时出错
[root@node1 ~]# drbdadm create-md r0 #创建drbd resource
[root@node1 ~]# drbdadm up r0               #启动创建的资源r0

以上编译安装配置操作过程均在node2中同样执行

配置完成后,查看主备资源状态:
主节点

[root@node1 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@primary, 2015-03-10 13:38:08

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:52427148

备节点

[root@node2 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@backup, 2015-03-10 13:38:22

 1: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:52427148

node1和node2状态都是Secondary,现在需要设置一个Primary做为主节点。

把node1做为主节点,在node1上执行:
[root@node1 ~]# drbdadm primary  r0
再看下状态

[root@node1 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@primary, 2015-03-10 13:38:08

 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:484352 nr:0 dw:0 dr:485016 al:0 bm:28 lo:2 pe:9 ua:0 ap:0 ep:1 wo:b oos:51952012
	[>....................] sync'ed:  1.0% (50732/51196)M
	finish: 0:16:23 speed: 52,792 (52,792) K/sec

node2状态

[root@node2 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@backup, 2015-03-10 13:38:22

 1: cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r-----
    ns:0 nr:1522688 dw:1520640 dr:0 al:0 bm:92 lo:3 pe:2 ua:2 ap:0 ep:1 wo:b oos:50906508
	[>....................] sync'ed:  3.0% (49712/51196)M
	finish: 0:11:06 speed: 76,312 (69,120) want: 100,160 K/sec

同步配置完成。

格式化挂载/dev/drbd1(只能在node1上执行):
[root@node1 ~]# mkfs.ext3 /dev/drbd1
[root@node1 ~]# mount /dev/drbd1 /db/
[root@node1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 14G 1.3G 12G 10% /
tmpfs 489M 0 489M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
/dev/drbd1 50G 180M 47G 1% /db

现在在node1的/db下创建文件等操作都会同步到node2的/dev/sdb1中
在/db下创建个测试文件
[root@node1 db]# touch TestWriteFromPrimary

停掉node2的drbd看是否同步过去。因为在drbd启动的时候,备机是无法挂载的。会提示个unknown filesystem type ‘drbd’

[root@node2 ~]# drbdadm down r0
[root@node2 ~]# mount /dev/sdb1 /db
[root@node2 ~]# ll /db/
total 16
drwx——. 2 root root 16384 Mar 11 10:47 lost+found
-rw-r–r–. 1 root root 0 Mar 11 10:48 TestWriteFromPrimary
看到TestWriteFromPrimary已经同步。

测试手动切换主备:
比如把node1改为Secondary,node2改为Primary,首先停掉挂载。

[root@node1 ~]# umount /dev/drbd1      #卸载
[root@node1 ~]# drbdadm secondary r0 #更改角色

[root@node1 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@primary, 2015-03-10 13:38:08

 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:52829360 nr:0 dw:958132 dr:51872669 al:446 bm:3202 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

[root@node2 ~]# drbdadm primary r0

[root@node2 ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@backup, 2015-03-10 13:38:22

 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:829720 dw:829720 dr:664 al:0 bm:54 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

node2挂载/dev/drbd1
[root@node2 ~]# mount /dev/drbd1 /db/
[root@node2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 14G 1.2G 12G 10% /
tmpfs 489M 0 489M 0% /dev/shm
/dev/sda1 485M 33M 427M 8% /boot
/dev/drbd1 50G 180M 47G 1% /db
[root@node2 ~]# cd /db
[root@node2 db]# touch TestWriteFromNode2

去node1停掉drbd,挂载sdb1看是否同步过去。
[root@node1 ~]# drbdadm down r0
[root@node1 ~]# mount /dev/sdb1 /db
[root@node1 ~]# ll /db
total 16
drwx——. 2 root root 16384 Mar 11 10:47 lost+found
-rw-r–r–. 1 root root 0 Mar 11 10:59 TestWriteFromNode2
-rw-r–r–. 1 root root 0 Mar 11 10:48 TestWriteFromPrimary
文件已同步。

关于drbdadm更多的参数可在命令行下直接执行 drbdadm 即可看到。

关于drbd的数据同步协议
drbd有三种数据同步模式:同步,异步,半同步
异步 :指的是当数据写到磁盘上,并且复制的数据已经被放到我们的tcp缓冲区并等待发送以后,就认为写入完成
半同步:指的是数据已经写到磁盘上,并且这些数据已经发送到对方内存缓冲区,对方的tcp已经收到数据,并宣布写入
同步 :指的是主节点已写入,从节点磁盘也写入
drbd的复制模型是靠protocol关键字来定义的:protocol A表示异步;protocol B表示半同步;protocol C表示同步,默认为protocol C。
在同步模式下只有主、从节点上两块磁盘同时损害才会导致数据丢失。在半同步模式下只有主节点宕机,同时从节点异常停电才会导致数据丢失。
注意:drbd的主不会监控从的状态所以有可能会造成数据重传

 

2015-03-10
发表者 Venus
FMS部署边缘服务器已关闭评论

FMS部署边缘服务器

只需要编辑一个配置文件:

C:\Program Files\Adobe\Adobe Media Server 5\conf\_defaultRoot_\_defaultVHost_\Vhost.xml

<Proxy>
<Mode>remote</Mode> #把local改为remote local为源 remote为边缘
<RouteEntry>192.168.0.163:*;192.168.0.156:1935</RouteEntry>
</Proxy>

192.168.0.163为边缘服务器
192.168.0.156为源服务器

包括在linux下配置,也是如此。

重启fms服务即可。
可以通过dns智能解析进行广域网上的调度,或者lvs之类的进行内部调度。
这样在发生数据访问的时候,边缘服务器先去源服务器获取,缓存到本地中。一来实现源服务器安全,二来降低源服务器负载。

至于具体的缓存性能优化参数可直接看配置文件或其它资料。