关闭elasticsearch中index的复制

如果你正在使用elasticsearch服务,同时你又有而且仅有一台elasticsearch服务器的话,那么你会发现你的服务健康状态一直是yellow的,这很有可能是你elasticsearch中的index设置了复制,但你又没有多余的节点可以进行复制。

你可以通过elasticsearch-head插件来确认是否真的是复制的问题。在Overview页能看到很多index shards被标记为“Unassigned”,所以,对于只用一台elasticsearch做服务的话(想必也没人只用一台elasticsearch服务器做production的业务),我们完全可以把index的复制功能关掉。 Continue reading “关闭elasticsearch中index的复制”

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高可用的方式了,目前稳定运行一周了。

Tokyo Tyrant(TTServer)系列-启动参数和配置[转]

ttserver命令可以启动一个数据库实例。因为数据库已经实现了Tokyo Cabinet的抽象API,所以可以在启动的时候指定数据库的配置类型。

支持的数据库类型有:

    * 内存hash数据库
    * 内存tree数据库
    * hash数据库
    * B+ tree数据库,

  命令通过下面的格式来使用,‘dbname’制定数据库名,如果省略,则被视作内存hash数据库。

ttserver [-host name] [-port num] [-thnumnum] [-tout num] [-dmn] [-pid path] [-log path] [-ld|-le] [-ulog path] [-ulim num] [-uas] [-sidnum] [-mhost name] [-mport num] [-rts path] [-ext path] [-extpc nameperiod] [-mask expr] [dbname]

下面来说这些参数的功能:

      -host name :指明服务器的hostname或者ip地址。默认服务器的所有地址都会被绑定。比如:指定127.0.0.1这样的ip,就只是本地可以访问了。

      -port num : 指定服务启动的端口. 默认1978.如果要启动多个数据库实例,端口需要不一样。

      -thnum num : 指定服务工作的线程数。默认8.

      -tout num : 指定每个会话的超时时间。默认永不超时。

      -dmn : 以守护进程方式运行。

      -pid path : 输出进程IP到指定的文件。

      -log path : 输出日志信息到指定文件。

      -ld : 日志中记录debug信息。

      -le :日志中只记录错误信息。

      -ulog path : 指定存放更新日志(update log)的目录.可以用来备份恢复数据库,主从库之间的同步。

      -ulim num : 指定每个更新日志文件的大小限制.

      -uas :使用异步IO记录更新日志。(使用此项可以减少写入日志的IO开销,但是在服务器意外关机,进程被kill时可能会丢失数据。根据经验,一般可以不使用)。

      -sid num : 指定服务的ID号。主从复制的时候通过不同的ID号来识别。

      -mhost name : 指定主从复制模式下的主服务器的IP或域名。

      -mport num : 指定主从模式下主服务器的端口号.

      -rts path : 指定用于主从复制的时间戳存放文件.

      -ext path : 指定扩展脚本语言文件。

      -extpc name period : 指定被周期调用的函数名和间隔时间.

      -mask expr : 指定被禁止的命令名(比如可以禁止使用清空vanish).

      -unmask expr : 指定被允许的命令名.

数据库类型
下面我们再来看下数据库类型的详细配置。

    *     数据库名的命名方式被Tokyo Cabinet的抽象API指定。
    *     如果数据库名为"*",表示内存hash数据库。
    *     如果数据库名为"+"表示内存tree数据库。
    *     如果数据库名为".tch",则数据库为hash数据库。
    *     如果数据库名的后缀为".tcb",数据库将为B+ tree数据库。
    *     如果数据库名的后缀为".tcf"。则数据库将为fixed-length数据库。
    *     如果数据库名的后缀为".tct",则数据将为一个table数据库(有表的概念)。

数据库的调整参数通过数据库名的延伸来指定,通过"#"分开,每个参数通过一个参数名和值来指定,用"="隔开。

内存hash数据库支持"bnum", "capnum", 和 "capsiz"

内存tree数据库支持"capnum" 和 "capsiz"

    capnum指定记录的最大容量,capsiz指定最大的内存使用量(在内存数据库中),记录通过存储的顺序移除。

hash数据库支持"mode", "bnum", "apow", "fpow", "opts", "rcnum", 和 "xmsiz".

    rcnum'指定最大的缓存记录数。如果它不大于零,那么缓存记录不可用。默认不可用。
    xmsiz  指定外部内存的大小。如果不大于0,内存不可用。默认是67108864,即64M。
   
bnum’ 指定bucket存储桶的数量。如果指定的数目不大于0,将会使用默认的数值131071.推荐数量应该在所有需要存储的记录总数的0.4-4倍
    apow' 跟一个key关联的记录数,2的N次方表示.  如果不指定,默认2^4=16.
   
fpow’ specifies the maximum number of elements of the free block pool by power of 2.  默认2^10=1024.
    opts' 指定选项,位或:HDBTLARGE’ 指定数据库的大小通过使用64位数组桶能够超过2G。
                          HDBTDEFLATE'  指定每个记录被Deflate encoding压缩。
                         
HDBTBZIP’ 指定每个记录被BZIP2 encoding压缩
                          HDBTTCBS'指定每个记录被 TCBS encoding压缩.

B+ tree数据库支持"mode", "lmemb", "nmemb", "bnum", "apow", "fpow", "opts", "lcnum", "ncnum", 和 "xmsiz".
Fixed-length 数据库 支持 "mode", "width", and "limsiz".
Table 数据库支持 "mode", "bnum", "apow", "fpow", "opts", "rcnum", "lcnum", "ncnum", "xmsiz", 和 "idx"
      "idx"指定表的索引。
    "mode"可以包含 "w" 写, "r" 读, "c" 创建, "t" 截断,"e" 无锁,和"f" 非阻塞锁。默认的的mod为"wc"。

优化性能

    如果使用hash数据库我们可以指定#bnum=xxx来提高性能。xxx大于或等我我们的记录总数。

      如果使用B+ tree数据库我们可以通过指定"#lcnum=xxx#bnum=yyy" 来提高性能.第一个参数指定被缓存的最大叶子节点数,受内存容量限制,第二个参数指定桶的数量,它应该大于总记录数的1/128.

    如果有大量的客户端连接,确保我们的文件描述符够用。系统默认是1024,我们可以用使用“ulimit”来重新设定

  比如下面的单机实例启动脚本(一个正在线上运行的脚本):
#!/bin/sh
ulimit -SHn 51200
ttserver -host 192.168.0.136  -port 11212 -thnum 8 -dmn -pid /data/ttserver/ttserver.pid -log /data/ttserver/ttserver.log -le -ulog /data/ttserver/ -ulim 128m -sid 1 -rts /data/ttserver/ttserver.rts /data/ttserver/database.tch#bnum=10000000#xmsiz=434217728#rcnum=20000
使用hash数据库,最大会缓存20000个记录,最大使用内存434217728bytes(414M),bucket存储桶的数量10000000。

目前的库大小:

-rw-r--r--  1 root root  28G Mar  8 12:19 bbsdatabase.tch

因为使用了64位操作系统,所以文件大小不受2G的限制。

我们再看下读取数据的速度:

当前获取memcache Threads_cdb_threads_tid3565732_displayorder_0 使用时间 0.00054812431335449
以上是程序打印出来的通过memcache协议读取key为memcache Threads_cdb_threads_tid3565732_displayorder_0的数据所花的时间0.00054812431335449(s),可以看到速度还是非常快的。

启动实例

个人推荐通过修改ttservctl来实现启动。下面我们举几个简单的启动例子。

单机启动例子,下面是ttservctl文件的部分:

#! /bin/sh

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------

# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/var/ttserver" #数据库存放的路径,比如改为"/data/mydata"
port="1978" #启动的端口
pidfile="$basedir/pid"
logfile="$basedir/log"
ulogdir="$basedir/ulog"
ulimsiz="256m"
sid=1
dbname="$basedir/casket.tch#bnum=1000000" #上面讲的数据库类型配置
maxcon="65536"
retval=0

双机互为主辅模式,比如两台机器的Ip分别为192.168.1.176和192.168.1.1.177,以下为ttservctl文件的一部分。

176的配置:

#! /bin/sh

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------

# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/data/data/data1"
port="11211"
pidfile="$basedir/pid"
logfile="$basedir/log"
ulogdir="$basedir/"
mhost="192.168.1.177" #主ip即另外机器的ip
ulimsiz="256m"
sid=6#注意要每台机器不一样
dbname="$basedir/casket.tch#bnum=100000000#xmsiz=104857600#rcnum=1000000"
rts="$basedir/ttserver.rts" #在ttservctl基础上增加
maxcon="65536"
retval=0

# locale clear
LANG=C
LC_ALL=C
export LANG LC_ALL

# start the server
start(){
  printf 'Starting the server of Tokyo Tyrant\n'
  ulimit -n "$maxcon"
  mkdir -p "$basedir"
  if [ -f "$pidfile" ] ; then
    pid=
cat "$pidfile"
    printf 'Existing process: %d\n' "$pid"
    retval=1
  else
    $cmd \
      -port "$port" \
      -dmn \
      -pid "$pidfile" \
      -log "$logfile" \
      -ulog "$ulogdir" \
      -ulim "$ulimsiz" \
      -sid "$sid" \
      -mhost "$mhost" \#在ttservctl基础上增加
      -mport "$port" \#在ttservctl基础上增加
      -rts "$rts" \#在ttservctl基础上增加
      "$dbname"
    if [ "$?" -eq 0 ] ; then
      printf 'Done\n'
    else
      printf 'The server could not started\n'
      retval=1
    fi
  fi
}

177的配置:
#! /bin/sh

#----------------------------------------------------------------
# Startup script for the server of Tokyo Tyrant
#----------------------------------------------------------------

# configuration variables
prog="ttservctl"
cmd="ttserver"
basedir="/data/data/data1"
port="11211"
pidfile="$basedir/pid"
logfile="$basedir/log"
ulogdir="$basedir/"
mhost="192.168.1.176" #主ip即另外机器的ip
ulimsiz="256m"
sid=7#注意要每台机器不一样
dbname="$basedir/casket.tch#bnum=100000000#xmsiz=104857600#rcnum=1000000"
rts="$basedir/ttserver.rts" #在ttservctl基础上增加
maxcon="65536"
retval=0

# locale clear
LANG=C
LC_ALL=C
export LANG LC_ALL

# start the server
start(){
  printf 'Starting the server of Tokyo Tyrant\n'
  ulimit -n "$maxcon"
  mkdir -p "$basedir"
  if [ -f "$pidfile" ] ; then
    pid=
cat "$pidfile"`
    printf ‘Existing process: %d\n’ "$pid"
    retval=1
  else
    $cmd \
      -port "$port" \
      -dmn \
      -pid "$pidfile" \
      -log "$logfile" \
      -ulog "$ulogdir" \
      -ulim "$ulimsiz" \
      -sid "$sid" \
      -mhost "$mhost" \#在ttservctl基础上增加
      -mport "$port" \#在ttservctl基础上增加
      -rts "$rts" \#在ttservctl基础上增加
      "$dbname"
    if [ "$?" -eq 0 ] ; then
      printf ‘Done\n’
    else
      printf ‘The server could not started\n’
      retval=1
    fi
  fi
}

原文:http://www.pin5i.com/showtopic.aspx?topicid=23307&page=end

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的页面的,这里蚊子就不上图了。到此这篇文章就全部完成了,需要的朋友可以亲自去试试,切记,如果需要在正式环境中应用并保证原有数据存在,请做好相应的备份工作。

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蚊子就介绍到这里,这个软件功能还是很强大的,蚊子会在后续继续深入的研究

mysql清理binlog[技术]

做了mysql主从也有一段时间了,这两天检查磁盘空间情况,发现放数据库的分区磁盘激增了40多G,一路查看下来,发现从配置好主从复制以来到现在的binlog就有40多G,原来根源出在这里,查看了一下my.cnf,看到binlog的size是1G就做分割,但没有看到删除的配置,在mysql里show了一下variables,

mysql> show variables like ‘%log%’;
查到了
| expire_logs_days                | 0                                     |

这个默认是0,也就是logs不过期,这个是一个global的参数,所以需要执行

set global expire_logs_days=8;

这样8天前的log就会被删除了,如果有回复的需要,请做好备份工作,但这样设置还不行,下次重启mysql了,配置又恢复默认了,所以需在my.cnf中设置

 expire_logs_days = 8

这样重启也不怕了,另外还有一种手动的删除binlog的方法,转自http://www.ourmysql.com/archives/293

想要恢愎数据库以前的资料,执行:show events;
由于数据量很多,查看起来很麻烦,光打开个文件就要闪半天,所以应该适当删除部分可不用的日志。
并且如果使用的时间足够长的话,会把我的硬盘空间都给吃掉

1.登录系统,/usr/bin/mysql
使用mysql查看日志

mysql> show binary logs;

+—————-+———–+

| Log_name       | File_size |

+—————-+———–+

| ablelee.000001 | 150462942 |

| ablelee.000002 | 120332942 |

| ablelee.000003 | 141462942 |

+—————-+———–+

2.删除bin-log(删除ablelee.000003之前的而没有包含ablelee.000003)

mysql> purge binary logs to ‘ablelee.000003′;

Query OK, 0 rows affected (0.16 sec)

3.  查询结果(现在只有一条记录了.)

mysql> show events\G

*************************** 1. row ***************************

   Log_name: ablelee.000003

        Pos: 4

 Event_type: Format_desc

  Server_id: 1

End_log_pos: 106

       Info: Server ver: 5.1.26-rc-log, ver: 4

1 row in set (0.01 sec)

(ablelee.000001和ablelee.000002已被删除)

mysql> show binary logs;

+—————-+———–+

| Log_name       | File_size |

+—————-+———–+

| ablelee.000003 |       106 |

+—————-+———–+

1 row in set (0.00 sec)

(删除的其它格式运用!)

   PURGE {MASTER | BINARY} LOGS TO ‘log_name’
  PURGE {MASTER | BINARY} LOGS BEFORE ‘date’
  用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件

中的清单中被删除,这样被给定的日志成为第一个。
  例如:
  PURGE MASTER LOGS TO ‘mysql-bin.010′;
  PURGE MASTER LOGS BEFORE ‘2008-06-22 13:00:00′;
    清除3天前的
    PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
  BEFORE变量的date自变量可以为’YYYY-MM-DD hh:mm:ss’格式。MASTER和BINARY是同义词。
  如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,

而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从

属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。
  要清理日志,需按照以下步骤:
  1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。
  2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
  3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的

最后一个日志。

  4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)

  5. 清理所有的日志,但是不包括目标日志。