sinatra使用mysql做为数据库

sinatra,一个轻量级的ruby web框架。如果要写一个不怎么复杂的web小应用,使用这个就在适合不过了。

最近蚊子就自己尝试着写一个小应用,结果在使用mysql这块犯了愁,正常情况下,ruby程序调用mysql还是很容易的,只需要这样做就行了

Continue reading “sinatra使用mysql做为数据库”

FreeBSD下安装mysql-zrm客户端[技术]

这两天蚊子手下有个freebsd的机器跑mysql,需要对mysql的数据进行备份,自然就想到了使用mysql-zrm,mysql-zrm的备份端已经安装起来了,只需要在freebsd上把客户端装出来就行了。

由于FreeBSD的ports中不包含mysql-zrm,所以只能通过源码的方式安装,下载地址

http://www.zmanda.com/downloads/community/ZRM-MySQL/2.2/Source/MySQL-zrm-2.2.0-release.tar.gz

解压下载的包,此软件包包含了服务端和客户端

tar zxvf MySQL-zrm-2.2.0-release.tar.gz

会在当前目录下产生var usr etc三个目录,由于我们只需要客户端部分,所以我们做如下操作

1,安装xinetd,mysql-zrm的客户端是通过xinetd控制启动的

cd /usr/ports/security/xinetd
make install clean
mkdir –p /usr/local/etc/xinetd.d

编辑xinetd.conf,vim /usr/local/etc/xinetd.conf,加入如下内容

includedir /usr/local/etc/xinetd.d

 

2,拷贝mysql-zrm客户端所需软件

mkdir –p /usr/share/mysql-zrm/plugins/
mkdir -p /var/log/mysql-zrm
mkdir –p /usr/lib/mysql-zrm/ZRM/

cp usr/share/mysql-zrm/plugins/lvm-snapshot.pl /usr/share/mysql-zrm/plugins/
cp usr/share/mysql-zrm/plugins/socket-copy.pl /usr/share/mysql-zrm/plugins/
cp usr/share/mysql-zrm/plugins/socket-server.pl /usr/share/mysql-zrm/plugins/
cp usr/share/mysql-zrm/plugins/ssh-copy.pl /usr/share/mysql-zrm/plugins/
cp usr/share/mysql-zrm/plugins/zfs-snapshot.pl /usr/share/mysql-zrm/plugins/
cp usr/lib/mysql-zrm/ZRM/SnapshotCommon.pm /usr/lib/mysql-zrm/ZRM/
cp var/log/mysql-zrm/mysql-zrm.log /var/log/mysql-zrm/
cp etc/xinetd.d/mysql-zrm-socket-server /usr/local/etc/xinetd.d

3,启动xinetd

/usr/local/etc/rc.d/xinetd onerestart

使用socket -4l查看端口情况

USER     COMMAND    PID   FD PROTO  LOCAL ADDRESS         FOREIGN ADDRESS     
mysql    mysqld     76827 10 tcp4   192.168.224.106:3306  *:*
root     xinetd     71583 0  tcp4   192.168.224.106:25300 *:*
root     sshd       2888  3  tcp4   192.168.224.106:22    *:*
root     syslogd    2772  6  udp4   192.168.224.106:514   *:*

看到红色标注内容,说明,mysql-zrm已经启动了。

到此mysql-zrm客户端在freebsd上安装就完毕了。

解决mysql中文乱码问题

今天蚊子在做blog空间切换,将原有空间的数据库内容导入到新的空间中,结果出现页面显示乱码的问题,wordpress的配置检查了,基本没有问题,那问题就出在了数据库上

通过show variables like ‘character%’查看mysql默认字体都是latin1,于是乎,使用vi打开/etc/my.cnf文件

在[mysqld]下添加

default-character-set = utf8
character_set_server = utf8
collation-server=utf8_general_ci

在[client]下添加

default-character-set = utf8

保存退出重启数据库,通过网页访问,乱码问题解决。

mysql主从复制错误解决一例

蚊子今天下午搭了一主三从的mysql复制,结果所有服务器都配置好后,发现从上报如下的错误

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

意思就是从上的server_id和主的一样的,经查看发现从上的/etc/my.cnf中的server_id=1这行我没有注释掉(在下面复制部分我设置了server_id),于是马上把这行注释掉了,然后重启mysql,发现还是报同样的错误。

使用如下命令查看了一下server_id

mysql> show variables like ‘server_id’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| server_id     | 1     |
+—————+——-+
1 row in set (0.00 sec)

发现,mysql并没有从my.cnf文件中更新server_id,既然这样就只能手动修改了

mysql> set global server_id=2;   #此处的数值和my.cnf里设置的一样就行

mysql> slave start;

如此执行后,slave恢复了正常。

不过稍后蚊子使用/etc/init.d/mysqld restart重启了mysql服务,然后查看slave状态,发现又出现了上面的错误,然后查看server_id发现这个数值又恢复到了1。

之后蚊子又重新查看了一下/etc/my.cnf的内容,确认应该不是这个文件的问题,于是去google查了一下,看到mysql在启动的时候会查找/etc/my.cnf、DATADIR/my.cnf,USER_HOME/my.cnf。

于是我执行了

find / -name "my.cnf"

居然在/usr/local/mysql这个目录下发现了my.cnf文件,于是蚊子将这个文件删除了,然后再重启mysql服务,发现一切恢复了正常。如果有人也出现类似的问题,不妨试试这个办法吧。

drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据(第2版)[原创]

DRBD是一种块设备的实现,与heartbeat的搭配,被广泛用于linux下的高可用(HA)方案中,蚊子的这篇文章是建立在上一篇《drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据》之上的,对于上一篇中不足和潜在问题予以改正。如果有需要在线操作的请以这篇为准。

此篇文章还是介绍如何在已经含有数据的分区或硬盘上搭建drbd和heartbeat高可用的mysql服务。

在对含有数据的分区或硬盘建立drbd高可用的时候,请确认以下三件事。

1,所在分区或硬盘可以扩容,比如使用lvm
2,所在分区或硬盘上的文件系统支持shrinking
3,如果以上两条都不能满足,请使用外部metadata

蚊子这里使用的是第一种方法,具体请接着往下看

测试环境:

Vmware6.0
             linux01 192.168.211.128  /dev/VG/data分区,存放数据库文件,320M
             linux02 192.168.211.129 /dev/VG/data分区,存放数据库文件,320M

mysql数据路径/data/mysql
因为没有合适的mysql数据所以使用wordpress的数据,wordpress2.8.5
nginx version: nginx/0.8.20
PHP 5.2.11 (cli) (built: Oct 23 2009 21:01:40)

一,准备工作

linux01上完成的内容

1,heartbeat的安装

yum –y install heartbeat heartbeat-devel

2,drbd的安装

tar zxvf drbd-8.3.4.tar.gz
cd drbd-8.3.4
make all
make install
make install-tools

3,准备一个含有mysql数据的硬盘分区

蚊子这里没有现成的mysql数据,就使用wordpress的数据库内容了,mysql的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[[email protected] ~]# mkfs.ext3 /dev/VG/data

挂载分区
[[email protected] ~]# mount /dev/VG/data  /data/

初始化数据库

[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql
Installing MySQL system tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK
Filling help tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK

在此处安装wordpress,将wordpress数据库安装到blog库中,如下
[[email protected] mysql]# ll /data/mysql/
total 20572
drwx—— 2 mysql mysql     4096 Oct 27 17:26 blog
-rw-rw—- 1 mysql mysql 10485760 Oct 27 17:25 ibdata1
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile0
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile1
-rw-rw—- 1 mysql root      1247 Oct 27 17:25 linux01.err
-rw-rw—- 1 mysql mysql        5 Oct 27 17:25 linux01.pid
drwx—— 2 mysql root      4096 Oct 27 17:25 mysql
drwx—— 2 mysql root      4096 Oct 27 17:25 test

卸载/data分区
[[email protected] ~]# umount /data/

4,备份分区前1M空间

[[email protected] mysql]# dd if=/dev/VG/data of=/root/back bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.049084 seconds, 21.4 MB/s

5,计算metadata容量并扩展分区,计算近似值如下公式

计算出来的近似值是1M左右,因为蚊子环境的lvm最小PE-size就是32Mb,所以扩展一个pe就行了

lvextend –l +1 /dev/VG/data

6,清空分区前1M空间

[[email protected] mysql]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0131647 seconds, 79.7 MB/s

7,创建drbd.conf文件,内容如下

global {

    usage-count yes;
}

common {
  syncer { rate 10M; }
}

resource r0 {

  protocol C;

  handlers {
    pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

    fence-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";

  }

  disk {
    on-io-error   detach;
  }

  net {

    after-sb-0pri disconnect;

    after-sb-1pri disconnect;

    after-sb-2pri disconnect;

    rr-conflict disconnect;

  }

  syncer {
    rate 10M;
    al-extents 257;

  }

  on linux01 {
    device     /dev/drbd0;
    disk       /dev/VG/data;
    address    192.168.211.128:7788;
    flexible-meta-disk  internal;
  }

  on linux02 {
    device    /dev/drbd0;
    disk      /dev/VG/data;
    address   192.168.211.129:7788;
    meta-disk internal;
  }
}

8,初始化drbd磁盘

[[email protected] mysql]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] mysql]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

确认drbd是否启动
[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将当前机器上的drbd设为primary
[[email protected] mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

9,恢复分区第一分区,这也是保证数据还在的关键一步

[[email protected] mysql]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.113655 seconds, 9.2 MB/s

10,重启drbd服务

[[email protected] mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

到此为止,linux01上的准备工作就做好了,下面看下linux02上的操作

因为linux02是备份用的,基本不用怎么设置,如果分区里面含有数据的话,就直接执行下面的操作就行

1,heartbeat的安装

yum –y install heartbeat heartbeat-devel

2,drbd的安装

tar zxvf drbd-8.3.4.tar.gz
cd drbd-8.3.4
make all
make install
make install-tools

3,初始化drbd

拷贝linux01上/etc/drbd.conf到linux02上的/etc下

[[email protected] ~]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0141756 seconds, 74.0 MB/s

扩展分区
[[email protected] ~]# lvextend –l +1 /dev/VG/data

创建metadata
[[email protected] ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[[email protected] ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:33
0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r—-
    ns:0 nr:184320 dw:184320 dr:0 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:405448
        [=====>…………..] sync’ed: 32.0% (405448/589768)K
        finish: 0:00:34 speed: 11,696 (10,240) K/sec

现在两台机器上的准备工作都完毕了,进入到下面一个阶段

二,drbd,Heartbeat和mysql整合工作

两台机器上的公共操作

编辑ha.cf文件,内容如下

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 5
warntime 10
initdead 10
ucast eth0 192.168.211.129    #在两台机器上的内容是不一样的,都是指向对方的ip地址
auto_failback on
node    linux01
node    linux02
ping 192.168.211.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

编辑authkeys文件,内容如下

auth 1
1 crc

修改此文件权限为600

编辑haresources,内容如下

linux01 drbddisk::r0 Filesystem::/dev/drbd0::/data 192.168.211.120 mysqld

第一个字段是主机名,是uname -n得到的
第二个字段作用是当前主机设置为primary
第三个字段作用将/dev/drbd0 mount到/data目录上
第四个字段作用是启动VIP
第五个字段启动mysql进程

这个文件在启动的时候是由左往右启动,停止就是相反的由右往左停止。

分配权限:

chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta

三,启动测试阶段

到现在,全部配置就已经完成了,可以进行测试了

现在两台机器上都启动heartbeat,可以看到第一台机器的状态

VIP已经启动
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:71:2E:11 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0×2000

mysql已经顺利启动
2845 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux01.pid
2945 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux01.err –pid-file=/data/mysql/linux01.pid –socket=/tmp/mysql.sock –port=3306

drbd0设备mount上了
/dev/drbd0            567M   38M  501M   8% /data

这时停止linux01上的heartbeat,看下linux02上的状态

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:50:E4:62 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0×2000

[[email protected] ~]# ps ax|grep mysql|grep -v grep
2582 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux02.pid
2682 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux02.err –pid-file=/data/mysql/linux02.pid –socket=/tmp/mysql.sock –port=3306

[[email protected] ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG-root    6919612   1866388   4696056  29% /
/dev/sda1               101086     12072     83795  13% /boot
tmpfs                   127772         0    127772   0% /dev/shm
/dev/drbd0              580540     38872    512180   8% /data

这时如果在linux02上也启动nginx的话,使用vip是可以正常访问wordpress的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

使用以上方法,蚊子已经成功把公司线上两台数据库成功做成drbd+heartbeat高可用的方式了,目前稳定运行一周了。

drbd+heartbeat(v1)+mysql搭建高可用数据库并保留原有硬盘数据[原创]

随着两篇drbd相关文章的完成,蚊子对drbd的理解更进了一层,本篇文章就在前两篇的基础上结合了Heartbeat来搭建一个mysql高可用的应用,并保留原有mysql数据的内容。

先来介绍一下蚊子的环境吧

Vmware6.0
             linux01 192.168.211.128
             linux02 192.168.211.129

mysql数据路径/data/mysql
因为没有合适的mysql数据所以使用wordpress的数据,wordpress2.8.5
nginx version: nginx/0.8.20
PHP 5.2.11 (cli) (built: Oct 23 2009 21:01:40)

一,准备工作

linux01上完成的内容

1,准备一个含有mysql数据的硬盘分区

蚊子这里没有现成的mysql数据,就使用wordpress的数据库内容了,mysql的版本不限,可以是二进制解压用的,也可以是源码编译的,蚊子这里是用的二进制的,操作如下

清空分区内容
[[email protected] ~]# mkfs.ext3 /dev/VG/data

挂载分区
[[email protected] ~]# mount /dev/VG/data  /data/

初始化数据库

[[email protected] mysql]# /usr/local/mysql/scripts/mysql_install_db –user=mysql –datadir=/data/mysql
Installing MySQL system tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK
Filling help tables…
091025 19:33:53 [Warning] option ‘thread_stack’: unsigned value 65536 adjusted to 131072
OK

在此处安装wordpress,将wordpress数据库安装到blog库中,如下
[[email protected] mysql]# ll /data/mysql/
total 20572
drwx—— 2 mysql mysql     4096 Oct 27 17:26 blog
-rw-rw—- 1 mysql mysql 10485760 Oct 27 17:25 ibdata1
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile0
-rw-rw—- 1 mysql mysql  5242880 Oct 27 17:25 ib_logfile1
-rw-rw—- 1 mysql root      1247 Oct 27 17:25 linux01.err
-rw-rw—- 1 mysql mysql        5 Oct 27 17:25 linux01.pid
drwx—— 2 mysql root      4096 Oct 27 17:25 mysql
drwx—— 2 mysql root      4096 Oct 27 17:25 test

卸载/data分区
[[email protected] ~]# umount /data/

2,备份分区第一扇区

[[email protected] mysql]# dd if=/dev/VG/data of=/root/back bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.049084 seconds, 21.4 MB/s

3,清空分区第一扇区

[[email protected] mysql]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0131647 seconds, 79.7 MB/s

4,创建drbd.conf文件,内容如下

global {

    usage-count yes;
}

common {
  syncer { rate 10M; }
}

resource r0 {

  protocol C;

  handlers {
    pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";

    local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";

    fence-peer "/usr/lib/heartbeat/drbd-peer-outdater -t 5";

  }

  disk {
    on-io-error   detach;
  }

  net {

    after-sb-0pri disconnect;

    after-sb-1pri disconnect;

    after-sb-2pri disconnect;

    rr-conflict disconnect;

  }

  syncer {
    rate 10M;
    al-extents 257;

  }

  on linux01 {
    device     /dev/drbd0;
    disk       /dev/VG/data;
    address    192.168.211.128:7788;
    flexible-meta-disk  internal;
  }

  on linux02 {
    device    /dev/drbd0;
    disk      /dev/VG/data;
    address   192.168.211.129:7788;
    meta-disk internal;
  }
}

5,初始化drbd磁盘

[[email protected] mysql]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] mysql]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ].

确认drbd是否启动
[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

将当前机器上的drbd设为primary
[[email protected] mysql]# drbdsetup /dev/drbd0 primary –o

查看当前状态

[[email protected] mysql]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:53
0: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r—-
    ns:0 nr:589768 dw:589768 dr:0 al:0 bm:36 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

6,恢复分区第一分区,这也是保证数据还在的关键一步

[[email protected] mysql]# dd if=/root/back of=/dev/drbd0
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.113655 seconds, 9.2 MB/s

7,重启drbd服务

[[email protected] mysql]# /etc/init.d/drbd restart
Restarting all DRBD resources: .

到此为止,linux01上的准备工作就做好了,下面看下linux02上的操作

因为linux02是备份用的,基本不用怎么设置,如果分区里面含有数据的话,就直接执行下面的操作就行

拷贝linux01上/etc/drbd.conf到linux02上的/etc下

[[email protected] ~]# dd if=/dev/zero of=/dev/VG/data bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0141756 seconds, 74.0 MB/s

[[email protected] ~]# drbdadm create-md r0
Writing meta data…
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

[[email protected] ~]# /etc/init.d/drbd start        
Starting DRBD resources: [ d(r0) ].

查看一下状态

[[email protected] ~]# cat /proc/drbd
version: 8.3.4 (api:88/proto:86-91)
GIT-hash: 70a645ae080411c87b4482a135847d69dc90a6a2 build by [email protected], 2009-10-22 21:01:33
0: cs:SyncTarget ro:Secondary/Secondary ds:Inconsistent/UpToDate C r—-
    ns:0 nr:184320 dw:184320 dr:0 al:0 bm:11 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:405448
        [=====>…………..] sync’ed: 32.0% (405448/589768)K
        finish: 0:00:34 speed: 11,696 (10,240) K/sec

现在两台机器上的准备工作都完毕了,进入到下面一个阶段

二,drbd,Heartbeat和mysql整合工作

两台机器上的公共操作

yum -y install heartbeat heartbeat-devel

编辑ha.cf文件,内容如下

debugfile /var/log/ha-debug
logfacility     local0
keepalive 2
deadtime 5

warntime 10
initdead 10
ucast eth0 192.168.211.129    #在两台机器上的内容是不一样的,都是指向对方的ip地址
auto_failback on
node    linux01
node    linux02
ping 192.168.211.2
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

编辑authkeys文件,内容如下

auth 1
1 crc

修改此文件权限为600

编辑haresources,内容如下

linux01 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext3 192.168.211.120 mysqld

第一个字段是主机名,是uname -n得到的
第二个字段作用是当前主机设置为primary
第三个字段作用将/dev/drbd0以ext3格式mount到/data目录上
第四个字段作用是启动VIP
第五个字段启动mysql进程

这个文件在启动的时候是由左往右启动,停止就是相反的由右往左停止。

分配权限:

chgrp haclient /sbin/drbdsetup
chmod o-x /sbin/drbdsetup
chmod u+s /sbin/drbdsetup
chgrp haclient /sbin/drbdmeta
chmod o-x /sbin/drbdmeta
chmod u+s /sbin/drbdmeta

三,启动测试阶段

到现在,全部配置就已经完成了,可以进行测试了

现在两台机器上都启动heartbeat,可以看到第一台机器的状态

VIP已经启动
eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:71:2E:11 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0x2000

mysql已经顺利启动
2845 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux01.pid
2945 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux01.err –pid-file=/data/mysql/linux01.pid –socket=/tmp/mysql.sock –port=3306

drbd0设备mount上了
/dev/drbd0            567M   38M  501M   8% /data

这时停止linux01上的heartbeat,看下linux02上的状态

eth0:0    Link encap:Ethernet  HWaddr 00:0C:29:50:E4:62 
          inet addr:192.168.211.120  Bcast:192.168.211.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:169 Base address:0x2000

[[email protected] ~]# ps ax|grep mysql|grep -v grep
2582 ?        S      0:00 /bin/sh ./bin/mysqld_safe –datadir=/data/mysql –pid-file=/data/mysql/linux02.pid
2682 ?        Sl     0:00 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/data/mysql –user=mysql –log-error=/data/mysql/linux02.err –pid-file=/data/mysql/linux02.pid –socket=/tmp/mysql.sock –port=3306

[[email protected] ~]# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VG-root    6919612   1866388   4696056  29% /
/dev/sda1               101086     12072     83795  13% /boot
tmpfs                   127772         0    127772   0% /dev/shm
/dev/drbd0              580540     38872    512180   8% /data

这时如果在linux02上也启动nginx的话,使用vip是可以正常访问wordpress的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

cacti性能优化笔记(面向大规模集群的监控管理)[转]

目标:

单台Cacti服务器,同时监控1000+ Server,50000+ RRD 文件. 保证图表数据的连续和流畅,每一轮数据采集时间控制在3分钟之内。

硬件环境:

Intel(R) Xeon(R) CPU           E5420  @ 2.50GHz  4 cores

4G memory

normal sata disk

优化步骤:

1,优化数据库schema,建立合理的索引

cacti默认的cacti.sql建立的数据库模型,竟然一个Index都没有建。每次执行poller.php的时候,主要的时间,都花费在数据库查询上。使用下面的sql语句,建立一系列索引,弥补默认的cacti.sql中缺乏index的缺点。可以有效的提高poller.php执行的效率,缩短更新RRD文件所需的时间

2,使用spine替代默认的cmd.php来采集数据

wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.7e.tar.gz

tar zxvf cacti-spine-0.8.7e.tar.gz

cd cacti-spine-0.8.7e

wget http://www.cacti.net/downloads/spine/patches/snmp_v3_fix.patch
wget http://www.cacti.net/downloads/spine/patches/mysql_client_reconnect.patch
wget http://www.cacti.net/downloads/spine/patches/ping_reliability.patch
patch -p1 -N < snmp_v3_fix.patch
patch -p1 -N < mysql_client_reconnect.patch
patch -p1 -N < ping_reliability.patch

./configure –prefix=cacti_install_dir

make

make install

然后编辑cacti_install_dir/etc/spine.conf

修改DB_HOST DB_DATABASE DB_USER DB_PASSWORD几个参数

最后,在cacti的setting->poller页面里,将poller type设置成spine,同时设置spine的Maximum Threads per Process, Number of PHP Script Servers, Script and Script Server Timeout Value几个参数。

通常会把Maximum Threads per Process设置成cpu * 2。在这里,我们设置成8.

3, 重构rra文件的目录结构,为每个device建立单独的rra目录

首先在crontab里禁用poller.php,然后执行cacti_install_dir/cli目录下的 structure_rra_paths.php,它会将所有的RRD文件按照device重新分配目录,并修改数据库中的RRD路径,成功执行后,再恢复poller.php的crontab就可以了。

按照上面3个步骤,710台服务器,24000个RRD文件,完成一次poller.php的时间,缩短到50 seconds。实现了最初的目的。

TODO:

在执行poller.php的时候, 监控服务器的load达到了3,通过vmstat查看,显示负载主要在I/O。在目前的情况,如果再出现瓶颈,可以考虑安装Boost插件来进一步提供性能。

cacti主要通过snmp来采集数据,可以引入collected等客户端,提供数据采集的可靠性。

原文:http://zys.8800.org/index.php/archives/391

ZRM for MySQL备份远程mysql数据库[技术]

书接上回,上次蚊子就介绍了ZRM备份本地数据库的方法了,这次来介绍一下用ZRM备份远程的mysql数据库的方法,按照ZRM的官方介绍,ZRM远程备份数据库有两种方法
1,使用远程socket连接
2,使用SSH连接
由于蚊子这边实际环境中mysql没有编译成支持ssh,所以这次我主要来讲解使用socket的方式,先来看下远程备份的结构

远程mysql服务器上需要安装的软件:MySQL-zrm-client-2.1-1.noarch.rpm,下载地址:http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/RPM/MySQL-zrm-client-2.1-1.noarch.rpm
备份服务器上安装软件: MySQL-zrm-2.1-1.noarch.rpm,下载地址:http://www.zmanda.com/downloads/community/ZRM-MySQL/2.1/RPM/MySQL-zrm-2.1-1.noarch.rpm
同时,备份服务器上需要两个perl程序:perl-XML-Parser和perl-DBI,可以使用yum安装

yum -y install perl-XML-Parser perl-DBI

备份工作时,需要使用到msyqladmin等程序,所以mysql-devel套件需要,这个也可以使用yum进行安装

yum -y install mysql-devel

在安装MySQL-zrm-2.1-1.noarch.rpm这个包的时候,需要备份机上有mysql的用户

groupadd mysql
useradd mysql -g mysql -s /nonexistent

远程mysql服务器的配置:

安装MySQL-zrm-client-2.1-1.noarch.rpm

# rpm -ivh MySQL-zrm-client-2.1-1.noarch.rpm
warning: MySQL-zrm-client-2.1-1.noarch.rpm: Header V3 DSA signature: NOKEY, key ID 3c5d1c92
Preparing…                ########################################### [100%]
   1:MySQL-zrm-client       ########################################### [100%]
Aug  6 2009 14:55:17: Reloading xinetd configuration…Reloading configuration: [  OK  ]

然后看下端口是否启动了,默认的zrm-client端口是25300

netstat –ln

tcp        0      0 0.0.0.0:25300               0.0.0.0:*                   LISTEN  

接下来是在mysql中添加备份用户

mysql> grant select,insert,update,create,drop,reload,shutdown,alter,super,lock tables,replication client on *.* to ‘backup_user’@’192.168.211.129’ identified by ‘backup_password’;

这里有一点需要注意,用户密码最好别用特殊字符比如‘$’,不然在做远程备份的时候会报错,具体原因我也不清楚为啥,另外就是如果你的数据库中有show view的操作,那还需要给这个用户赋予show view的权限,不然备份也会报错。

备份服务器:

安装MySQL-zrm-2.1-1.noarch.rpm的方法和上次蚊子那篇文章里一样,同样很多参数的配置,这里就不在详细叙述,需要的请看《ZRM for MySQL学习笔记01》,这里只说配置远程备份需要编辑的部分

1,先在/etc/mysql-zrm/目录下创建远程主机或者ip的目录,比如

mkdir –p /etc/mysql-zrm/211.128

2,编辑/etc/mysql-zrm目录下的mysql-zrm.conf文件,这个文件我们把他当成一个全局文件,一些全局信息主要由这个文件提供,看一下我的配置

backup-mode=logical                        //备份模式

destination=/data/dbbackup             //备份目录

retention-policy=8W                           //备份保存时间,这里设置的是8周

compress=1                                       //表示备份完成后压缩

compress-plugin=/usr/bin/gzip

user="backup_user"                         //远程备份mysql需要的用户名

password="backup_password"     //远程备份mysql用户的密码

mysql-binpath="/usr/bin"                 //备份机上需要执行的程序的路径

mysql-binlog-path="/data/db/mysql"       //远程mysql服务器上binlog的路径

copy-plugin=/usr/share/mysql-zrm/plugins/socket-copy.pl            //执行远程拷贝的脚本

remote-mysql-binpath="/usr/local/mysql/bin"

socket-remote-port="25300"         //远程client的端口,跟远程数据库上启动的端口一致

有了这份全局配置后,之后再对不同的远程mysql做备份时有些信息就不需要配置了。

3,拷贝一份默认的mysql-zrm.conf文件到我们刚建的211.128目录下,并修改如下

destination=/data/dbbackup       //设置备份路径,如果跟全局中的一样这里也同样需要设置,不然之后执行mysql-zrm-reporter的时候会报错

retention-policy=8W                    //针对这个远程服务器设置一个保存策略

databases=Account SNS mysql              //远程mysql数据库需要被备份的库

host="192.168.211.128"          //远程mysql的ip地址,当然也可以使用域名或主机名

4,现在就可以进行测试了

# mysql-zrm-scheduler –now –backup-level 0 –backup-set 211.128
schedule:INFO: ZRM for MySQL Community Edition – version 2.1
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
backup:INFO: ZRM for MySQL Community Edition – version 2.1
211.128:backup:INFO: START OF BACKUP
211.128:backup:INFO: PHASE START: Initialization
211.128:backup:INFO: The quick backup-type is supported only for snapshot backups. Setting backup-type to ‘regular’
211.128:backup:INFO: backup-set=211.128
211.128:backup:INFO: backup-date=20090806152712
211.128:backup:INFO: mysql-server-os=Linux/Unix
211.128:backup:INFO: backup-type=regular
211.128:backup:INFO: host=192.168.211.128
211.128:backup:INFO: backup-date-epoch=1249543632
211.128:backup:INFO: mysql-zrm-version=ZRM for MySQL Community Edition – version 2.1
211.128:backup:INFO: mysql-version=5.1.34-log
211.128:backup:INFO: backup-directory=/data/dbbackup/211.128/20090806152712
211.128:backup:INFO: backup-level=0
211.128:backup:INFO: backup-mode=logical
211.128:backup:INFO: PHASE END: Initialization
211.128:backup:INFO: PHASE START: Running pre backup plugin
211.128:backup:INFO: PHASE END: Running pre backup plugin
211.128:backup:INFO: PHASE START: Flushing logs
211.128:backup:INFO: PHASE END: Flushing logs
211.128:backup:INFO: PHASE START: Creating logical backup
211.128:backup:INFO: logical-databases=Account SNS mysql
211.128:backup:INFO: PHASE END: Creating logical backup
211.128:backup:INFO: PHASE START: Calculating backup size & checksums
211.128:backup:INFO: next-binlog=mysql-bin.000101
211.128:backup:INFO: backup-size=354.56 MB
211.128:backup:INFO: PHASE END: Calculating backup size & checksums
211.128:backup:INFO: PHASE START: Compression/Encryption
211.128:backup:INFO: compress=/usr/bin/gzip
211.128:backup:INFO: backup-size-compressed=11.83 MB
211.128:backup:INFO: PHASE END: Compression/Encryption
211.128:backup:INFO: read-locks-time=00:00:07
211.128:backup:INFO: flush-logs-time=00:00:01
211.128:backup:INFO: compress-encrypt-time=00:00:57
211.128:backup:INFO: backup-time=00:00:13
211.128:backup:INFO: backup-status=Backup succeeded
211.128:backup:INFO: Backup succeeded
211.128:backup:INFO: PHASE START: Running post backup plugin
211.128:backup:INFO: PHASE END: Running post backup plugin
211.128:backup:INFO: PHASE START: Cleanup
211.128:backup:INFO: PHASE END: Cleanup
211.128:backup:INFO: END OF BACKUP
/usr/bin/mysql-zrm started successfully

到此可以看到远程备份已经成功了,关于reporter等工具的查看可以参考我上一篇的文章,这里就不在赘述了

对于远程备份的几点想法:

1,关于ssh和使用socket方式,我认为,如果纯内网环境的话,使用socket是没有任何问题的,使用ssh反而会增加机器的负担
2,对于数据库的备份策略一定要想好,尽量选择在不繁忙的时候,因为raw方式再回复的时候需要保证mysql的版本一致,所以在选择备份策略上也需要考虑
3,关于备份文件的保存策略也需要考虑,如果需求很细致的话,可以考虑建立不同的目录,放置不同的mysql-zrm.conf文件

ZRM for MySQL学习笔记01[技术]

mysql数据库现在应用越来越广了,所以mysql数据库的数据也是一个企业中相当重要的,对于mysql的备份与恢复就成为了一项很关键的任务。蚊子再一次mysql经销商过来做售前咨询的时候认识了Zmanda这款软件,这里要介绍的是ZRM for MySQL,这款软件业分为商业版和free版,free的版本是ZRM for MySQL Community Edition这个,下载地址http://www.zmanda.com/download-zrm.php

这款软件的主要功能包括:

根据需要设定备份计划
从ZRM server集中的备份管理
获得mysql数据库备份的报告
在本地备份数据库同时也在远程服务器上备份
可以直接把备份存储在NAS/SAN的存储上

下面的图显示了在本机运行的ZRM for MySQL备份两台mysql-server上多个mysql数据库

接下来来介绍一下这款软件的功能。

备份的功能

ZRM for MySQL可以备份被mysql服务器管理的多个数据库
可以备份多台mysql服务器上的多个数据库
可以备份单个数据库中的表
可以对数据库进行热备
根据MySQL表使用的不同的存储引擎支持多种不同的备份方式
具有两种级别的备份:全备份和对数据库的增量备份
可以使用mysqldump,mysqlhotcopy,snapshots(Linux LVM/Solaris ZFS)和MySQL replication作为不同的备份方式
它可以创建保持一致的数据库备份而不管数据库表使用的哪种存储引擎
它支持本机ZRM for MySQL端和远端MySQL服务器之间的SSL认证连接,从而允许通过网络或穿过防火墙进行安全的备份。
它还能够验证备份数据镜像
使用标准的工具如gzip,GPG等可以对备份镜像进行压缩或者加密
系统管理员可以终止备份任务
把snapshots当做备份镜像来看待,并在之后把这种备份转化成真实的备份

恢复的功能

ZRM for MySQL使得恢复备份的数据变得很容易
它支持使用备份的检索,这个检索存储了每个备份运行的信息
它还有一个reporting工具用来浏览备份的索引
它还可以恢复全备份和增量备份
它选择做增量恢复是根据binary日志的位置或者时间点。这个允许回复数据库操作失误
这个点可以是一个时间点或者数据库binary日志中的一个点
ZRM for MySQL提供了一个很容易的方法来虑进/滤出binary日志中的数据库事件
这个可以帮助决定哪些被恢复,哪些不被恢复
根据你所做的备份的类型,可以使用备份在本机恢复或者在不同的机器上进行恢复

报告和计划任务能力

ZRM for MySQL可以立即执行备份计划或者按天/按周/按月做备份计划任务
它可以自动生成备份报告
它具有预先设定的备份报告也有用户自定义的备份报告
它可以报告任何备份的统计或者这些统计的合并
它支持HTML或者Text格式的报告
它可以发送email告知备份的运行状态
它还可以通过RSS feed的方式提供备份报告

插件

ZRM for MySQL提供了一套plugins扩展
Plugins允许管理员根据自己的环境调整备份进程
它提供了模板使得创建plugins更容易
预先日程plugin
预先备份plugin
在备份之后plugin
拷贝plugin
binary日志解析plugin
快照plugin

ZRM for MySQL套件是使用perl写的,所以使用环境必须支持perl,这个套件支持MySQL的版本有4.0.x(4.0.24或以上版本),4.1.x,5.0.x和5.1.x

在安装ZRM for MySQL时首先需要检查下列事项:
1,MySQL的版本是否是被ZRM for MySQL支持的
2,确认ZRM服务器和mysql服务器上存在mysql用户和组。同时MySQL服务进程是使用相同的用户和组启动的
3,在MySQL服务器和ZRM服务器上的mysql用户的uid和gid要相同
4,ZRM for MySQL需要用到MySql客户端的命令列在了下面,这些命令需要安装在ZRM for MySQL运行的服务器上
5,这些命令被ZRM服务器需要,尽管ZRM for MySQL是备份远程的mysql服务器
mysqladmin
mysqlhotcopy
mysqldump
mysqlbinlog
mysql
6,MySQL ZRM必须的perl模块
perl-DBI
MySQL-perl-DBD
perl-XML-Parser

以上基本准备完毕就可以安装ZRM for MySQL了,安装方法超级简单,下载完rpm包之后直接用

rpm -ivh MySQL-zrm-2.1-1.noarch.rpm

安装即可,如果过程中有报错,请查看相应提示。

包安装好后会在本机的/etc目录下生成mysql-zrm目录,这下面就保存着zrm的配置文件

我的环境vmware6.0,centos5.3,mysql5.1.24,因为是本机测试,我就直接使用mysql的root用户,备份需要的数据300MB左右。下面看我的配置

1,编辑/etc/mysql-zrm/mysql-zrm.conf,请确保这个文件的权限,因为这个文件保存了数据库用户名密码

# Backup level. It can be full or incremental
# Use 0 for full and 1 for incremental backups
# This parameter is optional and default value is full backup.
#
backup-level=0      //我们进行全备份# Backup method
# Values can be “raw” or “logical”. Logical backup are backups using
# mysqldump(1) tool
# This parameter is optional and default value is “raw”.
#
backup-mode=logical  //备份方式使用logical

# Specifies the type of backup
# Values can be “regular” or “quick”.
# Quick backup type uses the snapshot itself as the backup
# without copying the data from the snapshot volume
backup-type=regular    //备份类型使用regular

# Directory to which backups are done. All backups are stored under this
# directory.  This parameter is optional and the default
# value is “/var/lib/mysql-zrm”
#
destination=/data/backup   //将备份放到的目录

# Specifies how long the backup should be retained. The value can be
# specified in days (suffix D), weeks (suffix: W), months (suffix: M) or
# years (suffix Y). 30 days in a month and 365 days in a year are assumed
# This parameter is optional and the default is the backups are retained
# forever.
#
retention-policy=10D     //备份文件保留时间,10天

# This parameter should be set to 1 if backups should be compressed. If this
# parameter is set, gzip(1) command is used by default. If different
# compression algorithm should be used, it must be set in “compress-plugin”
# parameter. Default: There is no data compression.
compress=1   //备份完毕是否压缩,这里选择压缩

# This specifies the program to be used for compression. The “compression”
# parameter must be set for this parameter to be used. The compression
# command should also support -d option for uncompress backup images. If
# value is not specified then gzip(1) is used for compression.
compress-plugin=/usr/bin/gzip   //压缩使用的插件

# Databases/Tables in the backup set
#
# One of the “all-databases” or “databases” or “tables”/”database” parameters
# should be specified. If none of the them are specified, “all-databases”
# is assumed.
#

# This parameter should be set to 1 if all databases are part of this backup set
#
#all-databases=1

# List of databases that are part of this backup set. Multiple database
# names are separated by space character. This parameter is ignored if
# “all-databases” is set 1.
#
databases=SNS     //这里选择要备份的数据库

# List of specific tables that are part of this backup set. This parameter
# should not be specified if all tables in the databases in “databases”
# parameter are part of the backup set. Multiple table names should be
# separated by space character. The database to which these tables belong
# to should be specified in “database” parameter.
#
#tables=text user page
#database=”wikidb”

#
# MySQL server parameters
#

# MySQL database user used for backup and recovery of the backup set.
# This parameter is optional. If this parameter is not specified, values from
# my.cnf configuration file.
#
user=”root”     //备份数据库使用的用户名

# MySQL database user password.
# This parameter is optional. If this parameter is not specified, values from
# my.cnf configuration file or no password is used.
#
password=”12345678″       //该用户对应的密码

#Name of Socket file that can be used for connecting to MySQL
#
socket=/tmp/mysql.sock      //mysql的sock文件放置位置

# Directory where MySQL commands can be found. The parameter is optional.
#
mysql-binpath=”/usr/local/mysql/bin”           //mysql可执行文件路径

# Directory where MySQL binary logs can be found. The parameter is optional.
#
mysql-binlog-path=”/usr/local/mysql/var”       //mysql binlog存放路径

以上更改做完后保存退出,接下来就来进行备份等相应工作

现在来执行mysql备份操作

mysql-zrm-scheduler –now –backup-set dailyrun

可以看到如下返回结果

schedule:INFO: ZRM for MySQL Community Edition – version 2.1
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
backup:INFO: ZRM for MySQL Community Edition – version 2.1
dailyrun:backup:INFO: START OF BACKUP
dailyrun:backup:INFO: PHASE START: Initialization
dailyrun:backup:INFO: The quick backup-type is supported only for snapshot backups. Setting backup-type to ‘regular’
dailyrun:backup:INFO: backup-set=dailyrun
dailyrun:backup:INFO: backup-date=20090728191102
dailyrun:backup:INFO: mysql-server-os=Linux/Unix
dailyrun:backup:INFO: backup-type=regular
dailyrun:backup:INFO: host=localhost
dailyrun:backup:INFO: backup-date-epoch=1248779462
dailyrun:backup:INFO: retention-policy=10D
dailyrun:backup:INFO: mysql-zrm-version=ZRM for MySQL Community Edition – version 2.1
dailyrun:backup:INFO: mysql-version=5.1.30-log
dailyrun:backup:INFO: backup-directory=/data/backup/daily/dailyrun/20090728191102
dailyrun:backup:INFO: backup-level=0
dailyrun:backup:INFO: backup-mode=logical
dailyrun:backup:INFO: PHASE END: Initialization
dailyrun:backup:INFO: PHASE START: Running pre backup plugin
dailyrun:backup:INFO: PHASE END: Running pre backup plugin
dailyrun:backup:INFO: PHASE START: Flushing logs
dailyrun:backup:INFO: PHASE END: Flushing logs
dailyrun:backup:INFO: PHASE START: Creating logical backup
dailyrun:backup:INFO: logical-databases=SNS
dailyrun:backup:INFO: PHASE END: Creating logical backup
dailyrun:backup:INFO: PHASE START: Calculating backup size & checksums
dailyrun:backup:INFO: next-binlog=mysql-bin.000041
dailyrun:backup:INFO: last-backup=/data/backup/daily/dailyrun/20090726230115
dailyrun:backup:INFO: backup-size=346.16 MB
dailyrun:backup:INFO: PHASE END: Calculating backup size & checksums
dailyrun:backup:INFO: PHASE START: Compression/Encryption
dailyrun:backup:INFO: compress=/usr/bin/gzip
dailyrun:backup:INFO: backup-size-compressed=11.49 MB
dailyrun:backup:INFO: PHASE END: Compression/Encryption
dailyrun:backup:INFO: read-locks-time=00:00:40
dailyrun:backup:INFO: flush-logs-time=00:00:00
dailyrun:backup:INFO: compress-encrypt-time=00:27:20
dailyrun:backup:INFO: backup-time=00:00:58
dailyrun:backup:INFO: backup-status=Backup succeeded
dailyrun:backup:INFO: Backup succeeded
dailyrun:backup:INFO: PHASE START: Running post backup plugin
dailyrun:backup:INFO: PHASE END: Running post backup plugin
dailyrun:backup:INFO: PHASE START: Cleanup
dailyrun:backup:INFO: PHASE END: Cleanup
dailyrun:backup:INFO: END OF BACKUP
/usr/bin/mysql-zrm started successfully

这里我们运行了一个即时的备份,使用这个命令还可以制作备份计划任务,如

# mysql-zrm-scheduler –add –interval weekly –start-time 00:00 –day-of-week 0
schedule:INFO: ZRM for MySQL Community Edition – version 2.1
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
DONE

通过这个命令我们建立了一个每周的周日的午夜0点执行的计划,使用下面的命令我们可以查询我们创建的备份计划

#mysql-zrm-scheduler –query
schedule:INFO: ZRM for MySQL Community Edition – version 2.1
Logging to /var/log/mysql-zrm/mysql-zrm-scheduler.log
0 0 * * 0 /usr/bin/zrm-pre-scheduler –action backup –backup-set BackupSet1 –backup-level 0 –interval weekly

接下来我们查看一下备份的报告

# mysql-zrm-reporter –where backup-set=dailyrun backup-status-info

REPORT TYPE : backup-status-info

backup_set  backup_date                  backup_level  backup_status         backup_type       comment
—————————————————————————————————————————–
dailyrun  Tue 28 Jul 2009 07:11:02                0  Backup succeeded      regular           —-
PM CST

从这个报告中我们可以看到备份的名字,备份时间,备份级别,备份的状态,再来看下面一个报告

# mysql-zrm-reporter –where backup-set=dailyrun –show backup-performance-info

REPORT TYPE : backup-performance-info

backup_set  backup_date                  backup_level     backup_size  backup_size_compressed     backup_time   backup_type       compress_encrypt_time
—————————————————————————————————————————————————————-
dailyrun  Tue 28 Jul 2009 07:11:02                0       346.16 MB  11.49 MB                   00:00:58      regular           00:27:20

在这份报告中我们能看到备份的大小,压缩后的大小,备份所用时常等等

下面我们来做一下恢复操作,首先进入到数据库,然后删除SNS这个库

mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| HAtest             |
| SNS                |
| ldirectordb        |
| mysql              |
| test               |
| wordpress          |
+——————–+
7 rows in set (0.18 sec)

mysql> drop database SNS;
Query OK, 57 rows affected (2.13 sec)

mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| HAtest             |
| ldirectordb        |
| mysql              |
| test               |
| wordpress          |
+——————–+
6 rows in set (0.00 sec)

现在可以看到SNS库已经被蚊子我删掉了,下面我们就来恢复,首先来决定一下用哪个备份来恢复

# mysql-zrm-reporter –show restore-info –where backup-set=dailyrun

REPORT TYPE : restore-info

backup_set  backup_date                  backup_level  backup_directory                          backup_status         comment
—————————————————————————————————————————————————–
dailyrun  Tue 28 Jul 2009 07:11:02                0  /data/backup/daily/dailyrun/200907281911  Backup succeeded      —-
PM CST                                     02

这个就是我们刚才备份的,下面来从这个恢复我们刚刚删除的库

# mysql-zrm –action restore –backup-set dailyrun –source-directory /data/backup/daily/dailyrun/20090728191102/
restore:INFO: ZRM for MySQL Community Edition – version 2.1
dailyrun:restore:INFO: The quick backup-type is supported only for snapshot backups. Setting backup-type to ‘regular’
dailyrun:restore:INFO: Restored database(s) from logical backup:  SNS
dailyrun:restore:INFO: Restore done in 217 seconds.

恢复完毕再来看下数据库中是否有了这个库了

mysql> show databases;
+——————–+
| Database           |
+——————–+
| information_schema |
| HAtest             |
| SNS                |
| ldirectordb        |
| mysql              |
| test               |
| wordpress          |
+——————–+
7 rows in set (0.08 sec)

mysql> use SNS
Database changed
mysql> show tabases;

+——————————-+
| Tables_in_SNS    |
+——————————-+
| MovieID                   |
| MovieRatings           |
+——————————-+
2 rows in set (0.00 sec)

到此,这一篇的ZRM for mysql蚊子就介绍到这里,这个软件功能还是很强大的,蚊子会在后续继续深入的研究

cacti不出图解决一例[技术]

蚊子在今天遇到了这样一件怪事,公司监控组给我打电话说我们有两台机器down机了,我就说不可能呀,我的cacti上monitor没有报警呀,我说等我上去看看,结果果然登陆不上,我就让他帮我重启系统了。我就开始检查我的cacti,发现cacti不画图已经有了一段时日了,在查看cacti的log,发现了很多的错误,都是数据库的错误,错误如下

于是第一反应是先去备份数据库,结果执行mysqldump命令的时候报一下的错误

mysqldump: Got error: 145: Table ‘./cactidb/poller_item’ is marked as crashed and should be repaired when using LOCK TABLES

这下比较麻烦了,我于是先用mysqladmin停掉了数据库,然后把cactidb的数据库目录拷贝了一份出来,然后执行下面的命令对cacti数据库进行修复

./mysqlcheck -p –auto-repair –databases cactidb

输入密码后可以看到如下结果,很多内容省略了,只抓取主要的

cactidb.user_auth                                  OK
cactidb.user_auth_perms                            OK
cactidb.user_auth_realm
warning  : 1 client is using or hasn’t closed the table properly
status   : OK
cactidb.user_log
warning  : 1 client is using or hasn’t closed the table properly
status   : OK
cactidb.version                                    OK Repairing tables
cactidb.poller_item                                OK

看到红色标注的地方返回的是ok,再次启动mysql数据库,然后过了几分钟查看cacti,图表又可以正常的画出了。

蚊子后来回想了一下,可能跟前几天强行kill msyql有关系,看来这种危险的动作以后真得少做,同时备份一定要做好,还好这次没出问题,不然我又得辛辛苦苦的重复枯燥无聊的机器输入工作了。