corosync+drbd+mysql(实现mysql服务器的高可用性群集)

drbd+corosync+pacemaker

实现mysql服务器的高可用性群集

实验环境:

node1 node1.a.com 192.168.10.10

node2node2.a.com 192.168.10.20

vip:192.168.50.100

实验步骤:

修改群集中各节点的网络参数

node1

[root@node1 ~]# vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=node2.a.com

[root@node1 ~]# vim /etc/hosts

127.0.0.1 localhost.localdomain localhost

::1 localhost6.localdomain6 localhost6

192.168.10.10 node1.a.com node1

192.168.10.20 node2.a.com node2

[root@node1 ~]# hostname

node1.a.com

同步群集中各节点的时间:

[root@node1 ~]# hwclock -s

node2

[root@node2 ~]# vim /etc/sysconfig/network

NETWORKING=yes

NETWORKING_IPV6=no

HOSTNAME=node2.a.com

[root@node2 ~]# vim /etc/hosts

127.0.0.1 localhost.localdomain localhost

::1 localhost6.localdomain6 localhost6

192.168.10.10 node1.a.com node1

192.168.10.20 node2.a.com node2

[root@node2 ~]# hostname

node2.a.com

[root@node2 ~]# hwclock -s

在各个节点上面产生密钥实现无密码的通讯

node1

产生一个rsa的非对称加密的私钥对:

[root@node1 ~]# ssh-keygen -t rsa

拷贝到node2节点:

[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2

15

The authenticity of host 'node2 (192.168.10.20)' can't be established.

RSA key fingerprint is f8:b2:a1:a2:27:51:b2:86:c9:d6:c9:74:a4:e3:e5:93.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'node2,192.168.10.20' (RSA) to the list of known hosts.

root@node2's password: 123456

Now try logging into the machine, with "ssh 'root@node2'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

node2

[root@node2 ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):

Enter same passphrase again:

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

ea:25:f1:47:37:28:26:6a:75:57:1c:46:81:a8:41:6b [email protected]

[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub node1

15

The authenticity of host 'node1 (192.168.10.10)' can't be established.

RSA key fingerprint is f8:b2:a1:a2:27:51:b2:86:c9:d6:c9:74:a4:e3:e5:93.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'node1,192.168.10.10' (RSA) to the list of known hosts.

root@node1's password: 123456

Now try logging into the machine, with "ssh 'node1'", and check in:

.ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

在各个节点上面配置好yum客户端

node1

[root@node1 ~]# vim /etc/yum.repos.d/rhel-debuginfo.repo

[rhel-server]

name=Red Hat Enterprise Linux server

baseurl=file:///mnt/cdrom/Server

enabled=1

gpgcheck=1

gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release

[rhel-cluster]

name=Red Hat Enterprise Linux cluster

baseurl=file:///mnt/cdrom/Cluster

enabled=1

gpgcheck=1

gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release

[rhel-clusterstorage]

name=Red Hat Enterprise Linux clusterstorage

baseurl=file:///mnt/cdrom/ClusterStorage

enabled=1

gpgcheck=1

gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-redhat-release

[root@node1 ~]# scp /etc/yum.repos.d/rhel-debuginfo.repo node2:/etc/yum.repos.d/

rhel-debuginfo.repo 100% 319 0.3KB/s 00:00

将下载好的rpm包上传到linux上的各个节点

[root@node1 ~]# ll

total 162332

drwxr-xr-x 2 root root 4096 Mar 19 23:34 Desktop

-rw------- 1 root root 1330 Feb 9 00:27 anaconda-ks.cfg

-rw-r--r-- 1 root root 271360 May 13 16:41 cluster-glue-1.0.6-1.6.el5.i386.rpm

-rw-r--r-- 1 root root 133254 May 13 16:41 cluster-glue-libs-1.0.6-1.6.el5.i386.rpm

-rw-r--r-- 1 root root 170052 May 13 16:41 corosync-1.2.7-1.1.el5.i386.rpm

-rw-r--r-- 1 root root 158502 May 13 16:41 corosynclib-1.2.7-1.1.el5.i386.rpm

-rw-r--r-- 1 root root 221868 May 13 16:41 drbd83-8.3.8-1.el5.centos.i386.rpm

-rw-r--r-- 1 root root 165591 May 13 16:41 heartbeat-3.0.3-2.3.el5.i386.rpm

-rw-r--r-- 1 root root 289600 May 13 16:41 heartbeat-libs-3.0.3-2.3.el5.i386.rpm

-rw-r--r-- 1 root root 35236 Feb 9 00:27 install.log

-rw-r--r-- 1 root root 3995 Feb 9 00:26 install.log.syslog

-rw-r--r-- 1 root root 125974 May 13 16:41 kmod-drbd83-8.3.8-1.el5.centos.i686.rpm

-rw-r--r-- 1 root root 60458 May 13 16:41 libesmtp-1.0.4-5.el5.i386.rpm

-rw-r--r-- 1 root root 162247449 May 13 16:41 mysql-5.5.15-linux2.6-i686.tar.gz

-rw-r--r-- 1 root root 207085 May 13 16:41 openais-1.1.3-1.6.el5.i386.rpm

-rw-r--r-- 1 root root 94614 May 13 16:41 openaislib-1.1.3-1.6.el5.i386.rpm

-rw-r--r-- 1 root root 796813 May 13 16:41 pacemaker-1.1.5-1.1.el5.i386.rpm

-rw-r--r-- 1 root root 207925 May 13 16:41 pacemaker-cts-1.1.5-1.1.el5.i386.rpm

-rw-r--r-- 1 root root 332026 May 13 16:41 pacemaker-libs-1.1.5-1.1.el5.i386.rpm

-rw-r--r-- 1 root root 32818 May 13 16:41 perl-TimeDate-1.16-5.el5.noarch.rpm

-rw-r--r-- 1 root root 388632 May 13 16:41 resource-agents-1.0.4-1.1.el5.i386.rpm

[root@node1 ~]# yum localinstall *.rpm -y --nogpgcheck

[root@node1 ~]# scp *.rpm node2:/root

[root@node2 ~]# yum localinstall *.rpm -y --nogpgcheck

在各节点上增加一个大小类型都相关的drbd设备(sdb1)

node1

需要添加一块小硬盘:

[root@node1 ~]# fdisk /dev/sdb

Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel

Building a new DOS disklabel. Changes will remain in memory only,

until you decide to write them. After that, of course, the previous

content won't be recoverable.

The number of cylinders for this disk is set to 1044.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

(e.g., DOS FDISK, OS/2 FDISK)

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-1044, default 1):

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): +1G

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.

Syncing disks.

[root@node1 ~]# partprobe /dev/sdb

[root@node1 ~]# cat /proc/partitions

major minor #blocks name

8 0 20971520 sda

8 1 104391 sda1

8 2 2096482 sda2

8 3 10482412 sda3

8 16 8388608 sdb

8 17 987966 sdb1

node2与node1一样

配置drbd

node1

复制样例配置文件为即将使用的配置文件:

[root@node1 ~]# cp /usr/share/doc/drbd83-8.3.8/drbd.conf /etc/

[root@node1 ~]# cd /etc/drbd.d/

将文件global_common.conf 备份:

[root@node1 drbd.d]# cp global_common.conf global_common.conf.bak

[root@node1 drbd.d]# vim global_common.conf

global {

usage-count no;

}

common {

protocol C;

handlers {

}

startup {

wfc-timeout 120;

degr-wfc-timeout 120;

}

disk {

on-io-error detach;

}

net {

cram-hmac-alg "sha1";

shared-secret "mydrbdlab";

}

syncer {

rate 100M;

}

}

定义mysql的资源:

[root@node1 drbd.d]# vim mysql.res

resource mysql {

on node1.a.com {

device /dev/drbd0;

disk /dev/sdb1;

address 192.168.10.10:7789;

meta-disk internal;

}

on node2.a.com {

device /dev/drbd0;

disk /dev/sdb1;

address 192.168.10.20:7789;

meta-disk internal;

}

}

将以上的drbd.*文件都拷贝到node2上面:

[root@node1 drbd.d]# scp -r /etc/drbd.* node2:/etc/

drbd.conf 100% 133 0.1KB/s 00:00

global_common.conf.bak 100% 1418 1.4KB/s 00:00

global_common.conf 100% 1548 1.5KB/s 00:00

mysql.res 100% 241 0.2KB/s 00:00

node1初始化定义的mysql的资源并启动相应的服务:

[root@node1 drbd.d]# drbdadm create-md mysql

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

[root@node1 drbd.d]# service drbd start

Starting DRBD resources: [ n(mysql) ]..........

***************************************************************

DRBD's startup script waits for the peer node(s) to appear.

- In case this node was already a degraded cluster before the

reboot the timeout is 120 seconds. [degr-wfc-timeout]

- If the peer was available before the reboot the timeout will

expire after 120 seconds. [wfc-timeout]

(These values are for resource 'mysql'; 0 sec -> wait forever)

To abort waiting enter 'yes' [ 25]:

使用drbd-overview命令来查看启动状态:

[root@node1 drbd.d]# drbd-overview

0:mysql Connected Secondary/Secondary Inconsistent/Inconsistent C r----

node2

[root@node2 ~]# drbdadm create-md mysql

Writing meta data...

initializing activity log

NOT initialized bitmap

New drbd meta data block successfully created.

[root@node2 ~]# service drbd start

[root@node2 drbd.d]# drbd-overview

0:mysql Connected Secondary/Secondary Inconsistent/Inconsistent C r----

从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary,这里将node1设置为主节点

[root@node1 drbd.d]# drbdadm -- --overwrite-data-of-peer primary mysql

[root@node1 drbd.d]# drbd-overview

0:mysql SyncSource Primary/Secondary UpToDate/Inconsistent C r----

[=======>............] sync'ed: 40.5% (592824/987896)K delay_probe: 24

[root@node2 ~]# drbd-overview

0:mysql Connected Secondary/Primary UpToDate/UpToDate C r----

[root@node2 ~]# cat /proc/drbd

version: 8.3.8 (api:88/proto:86-94)

GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16

0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----

ns:0 nr:987896 dw:987896 dr:0 al:0 bm:61 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0

查看同步过程:

[root@node1 drbd.d]# watch -n 1 'cat /proc/drbd' (Ctrl+c退出)

创建文件系统(只可以在primary节点上进行):

[root@node1 drbd.d]# mkfs -t ext3 /dev/drbd0 格式化

mke2fs 1.39 (29-May-2006)

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

123648 inodes, 246974 blocks

12348 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=255852544

8 block groups

32768 blocks per group, 32768 fragments per group

15456 inodes per group

Superblock backups stored on blocks:

32768, 98304, 163840, 229376

Writing inode tables: done

Creating journal (4096 blocks): mkdir done

Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 22 mounts or

180 days, whichever comes first. Use tune2fs -c or -i to override.

[root@node1 drbd.d]# mkdir /mysqldata

[root@node1 drbd.d]# mount /dev/drbd0 /mysqldata/

[root@node1 drbd.d]# cd /mysqldata/

[root@node1 mysqldata]# touch f1 f2

[root@node1 mysqldata]# ll /mysqldata/

total 16

-rw-r--r-- 1 root root 0 May 13 18:24 f1

-rw-r--r-- 1 root root 0 May 13 18:24 f2

drwx------ 2 root root 16384 May 13 18:23 lost+found

[root@node1 mysqldata]# cd

[root@node1 ~]# umount /mysqldata/

将node1设置为secondary节点:

[root@node1 ~]# drbdadm secondary mysql

[root@node1 ~]# drbd-overview

0:mysql Connected Secondary/Secondary UpToDate/UpToDate C r----

将node2设置为primary节点:

[root@node2 ~]# drbdadm primary mysql

[root@node2 ~]# drbd-overview

0:mysql Connected Primary/Secondary UpToDate/UpToDate C r----

[root@node2 ~]# mkdir /mysqldata

[root@node2 ~]# mount /dev/drbd0 /mysqldata/

[root@node2 ~]# ll /mysqldata/

total 16

-rw-r--r-- 1 root root 0 May 13 18:24 f1

-rw-r--r-- 1 root root 0 May 13 18:24 f2

drwx------ 2 root root 16384 May 13 18:23 lost+found

[root@node2 ~]# umount /mysqldata/

mysql的安装和配置

添加用户和组:

[root@node1 ~]# groupadd -r mysql

You have new mail in /var/spool/mail/root

[root@node1 ~]# useradd -g mysql -r mysql

由于主设备才能读写,挂载,故我们还要设置node1为主设备,node2为从设备:[root@node2 ~]# drbdadm secondary mysql

You have new mail in /var/spool/mail/root

node1

[root@node1 ~]# drbdadm primary mysql

[root@node1 ~]# drbd-overview

0:mysql Connected Primary/Secondary UpToDate/UpToDate C r----

挂载drbd设备:

[root@node1 ~]# mount /dev/drbd0 /mysqldata/

[root@node1 ~]# mkdir /mysqldata/data

data目录要用存放mysql的数据,故改变其属主属组:

[root@node1 ~]# chown -R mysql.mysql /mysqldata/data/

查看:

[root@node1 ~]# ll /mysqldata/

total 20

drwxr-xr-x 2 mysql mysql 4096 May 13 18:52 data

-rw-r--r--1 root root 0 May 13 18:35 f1

-rw-r--r--1 root root 0 May 13 18:35 f2

drwx------2 root root 16384 May 13 18:34 lost+found

安装mysql

[root@node1 ~]# tarzxvf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local/

[root@node1 ~]# cd /usr/local/

[root@node1 local]# ln -sv mysql-5.5.15-linux2.6-i686/ mysql

create symbolic link `mysql' to `mysql-5.5.15-linux2.6-i686/'

[root@node1 local]# cd mysql

[root@node1 mysql]# chown -R mysql.mysql .

初始化mysql数据库:

[root@node1 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mysqldata/data

[root@node1 mysql]# chown -R root .

为mysql提供主配置文件:

[root@node1 mysql]# cp support-files/my-large.cnf /etc/my.cnf

并修改此文件中thread_concurrency的值为你的CPU个数乘以2,比如这里使用如下行:

[root@node1 mysql]# vim /etc/my.cnf

thread_concurrency = 2

另外还需要添加如下行指定mysql数据文件的存放位置

datadir = /mysqldata/data

为mysql提供sysv服务脚本,使其能使用service命令:

[root@node1 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

node2上的配置文件,sysv服务脚本和此相同,故直接复制过去:

[root@node1 mysql]# scp /etc/my.cnf node2:/etc/

my.cnf 100% 4691 4.6KB/s 00:00

[root@node1 mysql]# scp /etc/rc.d/init.d/mysqld node2:/etc/rc.d/init.d/

mysqld 100% 10KB 10.4KB/s 00:00

添加至服务列表:

[root@node1 mysql]# chkconfig --add mysqld

确保开机不能自动启动,我们要用CRM控制:

[root@node1 mysql]# chkconfig mysqld off

而后就可以启动服务测试使用了:

[root@node1 mysql]# service mysqld start

Starting MySQL...... [ OK ]

测试之后关闭服务:

[root@node1 mysql]# service mysqld stop

Shutting down MySQL.. [ OK ]

[root@node1 mysql]# ls /mysqldata/data/

ib_logfile0 ib_logfile1 ibdata1 mysql mysql-bin.000001 mysql-bin.index node1.a.com.err performance_schema test

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,这里还需要进行如下步骤:

输出mysql的man手册至man命令的查找路径

[root@node1 mysql]# vim /etc/man.config

添加如下行即可

MANPATH /usr/local/mysql/man

输出mysql的头文件至系统头文件路径/usr/include,,这可以通过简单的创建链接实现:

[root@node1 mysql]# ln -sv /usr/local/mysql/include /usr/include/mysql

create symbolic link `/usr/include/mysql' to `/usr/local/mysql/include'

输出mysql的库文件给系统库查找路径:(文件只要是在/etc/ld.so.conf.d/下并且后缀是.conf就可以):

[root@node1 mysql]# echo '/usr/local/mysql/lib/'> /etc/ld.so.conf.d/mysql.conf

让系统重新载入系统库:

[root@node1 mysql]# ldconfig

修改PATH环境变量,让系统所有用户可以直接使用mysql的相关命令:

PATH=$PATH:/usr/local/mysql/bin

重新读取环境变量:

[root@node1 mysql]# vim /etc/profile

[root@node1 mysql]# . /etc/profile

[root@node1 mysql]# echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin

[root@node1 mysql]# umount /mysqldata/

node2

[root@node2 ~]# groupadd -r mysql

[root@node2 ~]# useradd -g mysql -r mysql

由于主设备才能读写,挂载,故我们还要设置node2为主设备,node1为从设备:

[root@node1 mysql]# drbdadm secondary mysql

[root@node2 ~]# drbdadm primary mysql

[root@node2 ~]# mount /dev/drbd0 /mysqldata/

[root@node2 ~]# ls /mysqldata/

data f1 f2 lost+found

[root@node2 ~]# tar -zxvf mysql-5.5.15-linux2.6-i686.tar.gz -C /usr/local/

[root@node2 ~]# cd /usr/local/

[root@node2 local]# ln -sv mysql-5.5.15-linux2.6-i686/ mysql

create symbolic link `mysql' to `mysql-5.5.15-linux2.6-i686/'

[root@node2 local]# cd mysql

[root@node2 mysql]# chown -R root:mysql .

[root@node2 mysql]# cp support-files/my-large.cnf /etc/my.cnf

cp: overwrite `/etc/my.cnf'? n

[root@node2 mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

cp: overwrite `/etc/rc.d/init.d/mysqld'? n

[root@node2 mysql]# chkconfig --add mysqld

[root@node2 mysql]# chkconfig mysqld off

[root@node2 mysql]# service mysqld start

Starting MySQL...... [ OK ]

[root@node2 mysql]# ls /mysqldata/data/

ib_logfile0 ibdata1 mysql-bin.000001 mysql-bin.index node2.a.com.err performance_schema

ib_logfile1 mysql mysql-bin.000002 node1.a.com.err node2.a.com.pid test

[root@node2 mysql]# service mysqld stop

Shutting down MySQL.. [ OK ]

为了使用mysql的安装符合系统使用规范,并将其开发组件导出给系统使用,

这里还需要进行一些类似node1上的操作,由于方法完全相同,不再阐述!

卸载设备:

[root@node2 mysql]# umount /dev/drbd0

corosync+pacemaker的安装和配置

node1

[root@node1 ~]# cd /etc/corosync/

[root@node1 corosync]# cp corosync.conf.example corosync.conf

[root@node1 corosync]# vim corosync.conf

compatibility: whitetank

totem { //这是用来传递心跳时的相关协议的信息

version: 2

secauth: off

threads: 0

interface {

ringnumber: 0

bindnetaddr: 192.168.2.0 //我们只改动这里就行啦

mcastaddr: 226.94.1.1

mcastport: 5405

}

}

logging {

fileline: off

to_stderr: no //是否发送标准出错

to_logfile: yes //日志

to_syslog: yes //系统日志(建议关掉一个),会降低性能

logfile: /var/log/cluster/corosync.log //需要手动创建目录cluster

debug: off // 排除时可以起来

timestamp: on //日志中是否记录时间

//******以下是openais的东西,可以不用代开*****//

logger_subsys {

subsys: AMF

debug: off

}

}

amf {

mode: disabled

}

//*********补充一些东西,前面只是底层的东西,因为要用pacemaker ******//

service {

ver: 0

name: pacemaker

use_mgmtd: yes

}

//******虽然用不到openais ,但是会用到一些子选项********//

aisexec {

user: root

group: root

}

创建cluster目录:

[root@node1 corosync]# mkdir /var/log/cluster

为了便面其他主机加入该集群,需要认证,生成一authkey:

[root@node1 corosync]# corosync-keygen

Corosync Cluster Engine Authentication key generator.

Gathering 1024 bits for key from /dev/random.

Press keys on your keyboard to generate entropy.

Press keys on your keyboard to generate entropy (bits = 888).

Press keys on your keyboard to generate entropy (bits = 952).

Press keys on your keyboard to generate entropy (bits = 1016).

Writing corosync key to /etc/corosync/authkey.

[root@node1 corosync]# ll

total 28

-rw-r--r-- 1 root root 5384 Jul 28 2010 amf.conf.example

-r-------- 1 root root 128 May 13 20:50 authkey

-rw-r--r-- 1 root root 556 May 13 20:49 corosync.conf

-rw-r--r-- 1 root root 436 Jul 28 2010 corosync.conf.example

drwxr-xr-x 2 root root 4096 Jul 28 2010 service.d

drwxr-xr-x 2 root root 4096 Jul 28 2010 uidgid.d

将node1节点上的文件拷贝到节点node2上面(记住要带-p)

[root@node1 corosync]# scp -p authkey corosync.conf node2:/etc/corosync/

authkey 100% 128 0.1KB/s 00:00

corosync.conf 100% 556 0.5KB/s 00:00

[root@node1 corosync]# ssh node2 'mkdir /var/log/cluster'

在node1和node2节点上面启动corosync 的服务:

[root@node1 corosync]# service corosync start

Starting Corosync Cluster Engine (corosync): [ OK ]

[root@node2 ~]# service corosync start

Starting Corosync Cluster Engine (corosync): [ OK ]

验证corosync引擎是否正常启动了

[root@node1 corosync]# grep -i -e "corosync cluster engine" -e "configuration file" /var/log/messages

Feb 8 16:33:15 localhost smartd[2928]: Opened configuration file /etc/smartd.conf

Feb 8 16:33:15 localhost smartd[2928]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

Feb 8 16:45:09 localhost smartd[3395]: Opened configuration file /etc/smartd.conf

Feb 8 16:45:09 localhost smartd[3395]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

Feb 8 17:13:11 localhost smartd[3386]: Opened configuration file /etc/smartd.conf

Feb 8 17:13:11 localhost smartd[3386]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

Mar 19 23:33:34 localhost smartd[3385]: Opened configuration file /etc/smartd.conf

Mar 19 23:33:34 localhost smartd[3385]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 6 09:12:46 localhost smartd[3377]: Opened configuration file /etc/smartd.conf

May 6 09:12:46 localhost smartd[3377]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 6 15:37:51 localhost smartd[3408]: Opened configuration file /etc/smartd.conf

May 6 15:37:51 localhost smartd[3408]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 8 09:31:06 localhost smartd[3416]: Opened configuration file /etc/smartd.conf

May 8 09:31:06 localhost smartd[3416]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 8 09:47:42 node1 smartd[3353]: Opened configuration file /etc/smartd.conf

May 8 09:47:42 node1 smartd[3353]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 8 12:10:18 node1 corosync[7838]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.

May 8 12:10:18 node1 corosync[7838]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.

查看初始化成员节点通知是否发出

[root@node1 corosync]# grep -i totem /var/log/messages

May 8 12:10:18 node1 corosync[7838]: [TOTEM ] Initializing transport (UDP/IP).

May 8 12:10:18 node1 corosync[7838]: [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).

May 8 12:10:19 node1 corosync[7838]: [TOTEM ] The network interface [192.168.10.10] is now up.

May 8 12:10:24 node1 corosync[7838]: [TOTEM ] Process pause detected for 899 ms, flushing membership messages.

May 8 12:10:24 node1 corosync[7838]: [TOTEM ] A processor joined or left the membership and a new membership was formed.

May 8 12:10:24 node1 corosync[7838]: [TOTEM ] A processor failed, forming new configuration.

May 8 12:10:24 node1 corosync[7838]: [TOTEM ] A processor joined or left the membership and a new membership was formed.

May 8 12:10:32 node1 corosync[7838]: [TOTEM ] A processor failed, forming new configuration.

May 8 12:10:32 node1 corosync[7838]: [TOTEM ] A processor joined or left the membership and a new membership was formed.

May 8 12:12:03 node1 corosync[7838]: [TOTEM ] A processor failed, forming new configuration.

May 8 12:12:03 node1 corosync[7838]: [TOTEM ] A processor joined or left the membership and a new membership was formed.

May 8 12:12:15 node1 corosync[7838]: [TOTEM ] A processor joined or left the membership and a new membership was formed.

检查过程中是否有错误产生

[root@node1 corosync]# grep -i error: /var/log/messages |grep -v unpack_resources

Feb 8 17:03:46 localhost kernel: sd 1:0:0:0: SCSI error: return code = 0x00010000

检查pacemaker时候已经启动了

[root@node1 corosync]# grep -i pcmk_startup /var/log/messages

May 8 12:10:23 node1 corosync[7838]: [pcmk ] info: pcmk_startup: CRM: Initialized

May 8 12:10:23 node1 corosync[7838]: [pcmk ] Logging: Initialized pcmk_startup

May 8 12:10:23 node1 corosync[7838]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295

May 8 12:10:23 node1 corosync[7838]: [pcmk ] info: pcmk_startup: Service: 9

May 8 12:10:23 node1 corosync[7838]: [pcmk ] info: pcmk_startup: Local hostname: node1.a.com

node2

查看初始化成员节点通知是否发出:

[root@node2 ~]# grep -i totem /var/log/messages

May 8 12:12:16 node2 corosync[7817]: [TOTEM ] Initializing transport (UDP/IP).

May 8 12:12:16 node2 corosync[7817]: [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).

May 8 12:12:16 node2 corosync[7817]: [TOTEM ] The network interface [192.168.10.20] is now up.

May 8 12:12:18 node2 corosync[7817]: [TOTEM ] A processor joined or left the membership and a new membership was formed.

查看corosync的状态:

[root@node2 ~]# service corosync status

corosync (pid 7817) is running...

验证corosync引擎是否正常启动了:

[root@node2 ~]# grep -i -e "corosync cluster engine" -e "configuration file" /var/log/messages

Feb 8 16:33:15 localhost smartd[2928]: Opened configuration file /etc/smartd.conf

Feb 8 16:33:15 localhost smartd[2928]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

Feb 8 16:45:09 localhost smartd[3395]: Opened configuration file /etc/smartd.conf

Feb 8 16:45:09 localhost smartd[3395]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

Feb 8 17:13:11 localhost smartd[3386]: Opened configuration file /etc/smartd.conf

Feb 8 17:13:11 localhost smartd[3386]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

Mar 19 23:33:34 localhost smartd[3385]: Opened configuration file /etc/smartd.conf

Mar 19 23:33:34 localhost smartd[3385]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 6 09:18:50 localhost smartd[3379]: Opened configuration file /etc/smartd.conf

May 6 09:18:50 localhost smartd[3379]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 8 09:50:25 node2 smartd[3357]: Opened configuration file /etc/smartd.conf

May 8 09:50:26 node2 smartd[3357]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices

May 8 12:12:16 node2 corosync[7817]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.

May 8 12:12:16 node2 corosync[7817]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.

检查过程中是否有错误产生:

[root@node2 ~]# grep -i error: /var/log/messages |grep -v unpack_resources

Feb 8 17:03:46 localhost kernel: sd 1:0:0:0: SCSI error: return code = 0x00010000

检查pacemaker时候已经启动了:

[root@node2 ~]# grep -i pcmk_startup /var/log/messages

May 8 12:12:17 node2 corosync[7817]: [pcmk ] info: pcmk_startup: CRM: Initialized

May 8 12:12:17 node2 corosync[7817]: [pcmk ] Logging: Initialized pcmk_startup

May 8 12:12:17 node2 corosync[7817]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295

May 8 12:12:17 node2 corosync[7817]: [pcmk ] info: pcmk_startup: Service: 9

May 8 12:12:17 node2 corosync[7817]: [pcmk ] info: pcmk_startup: Local hostname: node2.a.com

node1

在任何一个节点上 查看集群的成员状态:

[root@node1 corosync]# crm status

============

Last updated: Tue May 8 13:08:41 2012

Stack: openais

Current DC: node1.a.com - partition with quorum

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

2 Nodes configured, 2 expected votes

0 Resources configured.

============

Online: [ node1.a.com node2.a.com ]

配置群集的工作属性

corosync默认启用了stonith,而当前集群并没有相应的stonith设备,因此此默认配置目前尚不可用,这可以通过如下命令先禁用stonith:

[root@node1 corosync]# crm configure property stonith-enabled=false

对于双节点的集群来说,我们要配置此选项来忽略quorum,即这时候票数不起作用,一个节点也能正常运行:

[root@node1 corosync]# crm configure property no-quorum-policy=ignore

定义资源的粘性值,使资源不能再节点之间随意的切换,因为这样是非常浪费系统的资源的。

资源黏性值范围及其作用:

0:这是默认选项。资源放置在系统中的最适合位置。这意味着当负载能力“较好”或较差的节点变得可用时才转移资源。此选项的作用基本等同于自动故障回复,只是资源可能会转移到非之前活动的节点上;

大于0:资源更愿意留在当前位置,但是如果有更合适的节点可用时会移动。值越高表示资源越愿意留在当前位置;

小于0:资源更愿意移离当前位置。绝对值越高表示资源越愿意离开当前位置;

INFINITY:如果不是因节点不适合运行资源(节点关机、节点待机、达到migration-threshold 或配置更改)而强制资源转移,资源总是留在当前位置。此选项的作用几乎等同于完全禁用自动故障回复;

-INFINITY:资源总是移离当前位置;

我们这里可以通过以下方式为资源指定默认黏性值:

[root@node1 corosync]# crm configure rsc_defaults resource-stickiness=100

定义集群服务及资源(node1)

查看当前集群的配置信息,确保已经配置全局属性参数为两节点集群所适用

[root@node1 corosync]# crm configure show

node node1.a.com

node node2.a.com

primitive webip ocf:heartbeat:IPaddr \

params ip="192.168.10.100"

primitive webserver lsb:httpd

group web webip webserver

property $id="cib-bootstrap-options" \

dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \

cluster-infrastructure="openais" \

expected-quorum-votes="2" \

stonith-enabled="false" \

no-quorum-policy="ignore"

rsc_defaults $id="rsc-options" \

resource-stickiness="100"

将已经配置好的DRBD设备/dev/drbd0定义为集群服务;

[root@node1 corosync]# service drbd stop

Stopping all DRBD resources: .

[root@node1 corosync]# chkconfig drbd off

[root@node1 corosync]# drbd-overview

drbd not loaded

[root@node1 corosync]# ssh node2 "service drbd stop"

Stopping all DRBD resources: .

[root@node1 corosync]# ssh node2 "chkconfig drbd off"

[root@node1 corosync]# drbd-overview

drbd not loaded

配置drbd为集群资源:

提供drbd的RA目前由OCF归类为linbit,其路径为/usr/lib/ocf/resource.d/linbit/drbd。我们可以使用如下命令来查看此RA及RA的meta信息:

[root@node1 corosync]# crm ra classes

heartbeat

lsb

ocf / heartbeat linbit pacemaker

stonith

[root@node1 corosync]# crm ra list ocf linbit

drbd

查看drbd的资源代理的相关信息:

[root@node1 corosync]# crm ra info ocf:linbit:drbd

This resource agent manages a DRBD resource

as a master/slave resource. DRBD is a shared-nothing replicated storage

device. (ocf:linbit:drbd)

Master/Slave OCF Resource Agent for DRBD

Parameters (* denotes required, [] the default):

drbd_resource* (string): drbd resource name

The name of the drbd resource from the drbd.conf file.

drbdconf (string, [/etc/drbd.conf]): Path to drbd.conf

Full path to the drbd.conf file.

Operations' defaults (advisory minimum):

start timeout=240

promote timeout=90

demote timeout=90

notify timeout=90

stop timeout=100

monitor_Slave interval=20 timeout=20 start-delay=1m

monitor_Master interval=10 timeout=20 start-delay=1m

drbd需要同时运行在两个节点上,但只能有一个节点(primary/secondary模型)是Master,而另一个节点为Slave;因此,它是一种比较特殊的集群资源,其资源类型为多状态(Multi-state)clone类型,

即主机节点有Master和Slave之分,且要求服务刚启动时两个节点都处于slave状态。

[root@node1 corosync]# crm

crm(live)# configure

crm(live)configure# primitive mysqldrbd ocf:heartbeat:drbd params drbd_resource="mysql" op monitor role="Master" interval="30s" op monitor role="Slave" interval="31s" op start timeout="240s" op stop timeout="100s"

crm(live)configure# ms MS_mysqldrbd mysqldrbd meta master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify="true"

crm(live)configure# show mysqldrbd

primitive mysqldrbd ocf:heartbeat:drbd \

params drbd_resource="mysql" \

op monitor interval="30s" role="Master" \

op monitor interval="31s" role="Slave" \

op start interval="0" timeout="240s" \

op stop interval="0" timeout="100s"

crm(live)configure# show MS_mysqldrbd

ms MS_mysqldrbd mysqldrbd \

meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

crm(live)configure# verify

crm(live)configure# commit

crm(live)configure# exit

bye

[root@node1 corosync]# crm status

============

Last updated: Sun May 13 21:41:57 2012

Stack: openais

Current DC: node1.a.com - partition with quorum

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

2 Nodes configured, 2 expected votes

2 Resources configured.

============

Online: [ node1.a.com node2.a.com ]

Resource Group: web

webip (ocf::heartbeat:IPaddr): Started node1.a.com

webserver (lsb:httpd): Started node1.a.com

Master/Slave Set: MS_mysqldrbd [mysqldrbd]

Slaves: [ node2.a.com node1.a.com ]

[root@node1 corosync]# drbdadm role mysql

Secondary/Secondary

我们实现将drbd设置自动挂载至/mysqldata目录。此外,此自动挂载的集群资源需要运行于drbd服务的Master节点上,

并且只能在drbd服务将某节点设置为Primary以后方可启动。

[root@node1 corosync]# umount /dev/drbd0

umount: /dev/drbd0: not mounted

[root@node2 corosync]# umount /dev/drbd0

umount: /dev/drbd0: not mounted

[root@node1 corosync]# crm

crm(live)# configure

crm(live)configure# primitive MysqlFS ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/mysqldata" fstype="ext3" op start timeout=60s op stop timeout=60s

crm(live)configure# commit

crm(live)configure# exit

bye

开始测试

mysql资源的定义(node1上操作)

先为mysql集群创建一个IP地址资源,通过集群提供服务时使用,这个地址就是客户端访问mysql服务器使用的ip地址:

[root@node1 corosync]# crm configure primitive myip ocf:heartbeat:IPaddr params ip=192.168.50.100

配置mysqld服务为高可用资源

[root@node1 corosync]# crm configure primitive mysqlserver lsb:mysqld

[root@node1 corosync]# crm status

[root@node1 ~]# crm status

============

Last updated: Sat May 12 15:40:57 2012

Stack: openais

Current DC: node1.a.com -partition with quorum

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

2 Nodes configured, 2 expected votes

4 Resources configured.

============

Online: [ node1.a.com node2.a.com ]

Master/Slave Set: MS_mysqldrbd [mysqldrbd]

Masters: [ node1.a.com ]

Slaves: [ node2.a.com ]

MysqlFS(ocf::heartbeat:Filesystem):Started node1.a.com

myip(ocf::heartbeat:IPaddr):Started node2.a.com

配置资源的各种约束:

集群拥有所有必需资源,但它可能还无法进行正确处理。资源约束则用以指定在哪些群集节点上运行资源,以何种顺序装载资源,以及特定资源依赖于哪些其它资源。pacemaker共给我们提供了三种资源约束方法:

1)Resource Location(资源位置):定义资源可以、不可以或尽可能在哪些节点上运行

2)Resource Collocation(资源排列):排列约束用以定义集群资源可以或不可以在某个节点上同时运行

3)Resource Order(资源顺序):顺序约束定义集群资源在节点上启动的顺序

定义约束时,还需要指定分数。各种分数是集群工作方式的重要组成部分。其实,从迁移资源到决定在已降级集群中停止哪些资源的整个过程是通过以某种方式修改分数来实现的。分数按每个资源来计算,资源分数为负的任何节点都无法运行该资源。在计算出资源分数后,

集群选择分数最高的节点。INFINITY(无穷大)目前定义为1,000,000。加减无穷大遵循以下3个基本规则:

1)任何值+ 无穷大= 无穷大

2)任何值-无穷大= -无穷大

3)无穷大-无穷大= -无穷大

定义资源约束时,也可以指定每个约束的分数。分数表示指派给此资源约束的值。分数较高的约束先应用,分数较低的约束后应用。通过使用不同的分数为既定资源创建更多位置约束,可以指定资源要故障转移至的目标节点的顺序。

我们要定义如下的约束:

[root@node1 ~]# crm

crm(live)# configure

crm(live)configure# colocation MysqlFS_with_mysqldrbd inf: MysqlFS MS_mysqldrbd:Master myip mysqlserver

crm(live)configure# order MysqlFS_after_mysqldrbd inf: MS_mysqldrbd:promote MysqlFS:start

crm(live)configure# order myip_after_MysqlFS mandatory: MysqlFS myip

crm(live)configure# order mysqlserver_after_myip mandatory: myip mysqlserver

验证是否有错

crm(live)configure# verify

提交:

crm(live)configure# commit

crm(live)configure# exit

bye

查看配置信息:

[root@node1 ~]# crm configure show

node node1.a.com

node node2.a.com

primitive MysqlFS ocf:heartbeat:Filesystem \

params device="/dev/drbd0" directory="/mysqldata" fstype="ext3" \

op start interval="0" timeout="60s" \

op stop interval="0" timeout="60s"

primitive myip ocf:heartbeat:IPaddr \

params ip="192.168.50.100"

primitive mysqldrbd ocf:heartbeat:drbd \

params drbd_resource="mysql" \

op monitor interval="30s" role="Master" \

op monitor interval="31s" role="Slave" \

op start interval="0" timeout="240s" \

op stop interval="0" timeout="100s"

primitive mysqlserver lsb:mysqld

ms MS_mysqldrbd mysqldrbd \

meta master-max="1" master-node-max="1" clone-max="2" clone-node-max="1" notify="true"

colocation MysqlFS_with_mysqldrbd inf: MysqlFS MS_mysqldrbd:Master myip mysqlserver

order MysqlFS_after_mysqldrbd inf: MS_mysqldrbd:promote MysqlFS:start

order myip_after_MysqlFS inf: MysqlFS myip

order mysqlserver_after_myip inf: myip mysqlserver

property $id="cib-bootstrap-options" \

dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \

cluster-infrastructure="openais" \

expected-quorum-votes="2" \

stonith-enabled="false" \

no-quorum-policy="ignore"

rsc_defaults $id="rsc-options" \

resource-stickiness="100

查看运行状态:

[root@node1 ~]# crm status

============

Last updated: Sat May 13 22:49:26 2012

Stack: openais

Current DC: node1.a.com -partition with quorum

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

2 Nodes configured, 2 expected votes

4 Resources configured.

============

Online: [ node1.a.com node2.a.com ]

Master/Slave Set: MS_mysqldrbd [mysqldrbd]

Masters: [ node1.a.com ]

Slaves: [ node2.a.com ]

MysqlFS(ocf::heartbeat:Filesystem):Started node1.a.com

myip(ocf::heartbeat:IPaddr):Started node1.a.com

mysqlserver(lsb:mysqld):Started node1.a.com

可见,服务现在在node1上正常运行:

在node1上的操作,查看mysql的运行状态:

[root@node1 ~]# service mysqld status

MySQL running (6578) [ OK ]

查看是否自动挂载

[root@node1 ~]# mount

/dev/sda3 on / type ext3 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

/dev/sda1 on /boot type ext3 (rw)

tmpfs on /dev/shm type tmpfs (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

none on /proc/fs/vmblock/mountPoint type vmblock (rw)

/dev/hdc on /media/RHEL_5.4 i386 DVD type iso9660 (ro,noexec,nosuid,nodev,uid=0)

查看目录

[root@node1 ~]# ls /mysqldata/

data f1 f2 lost+found

查看vip的状态

[root@node1 ~]# ifconfig

eth0 Link encap:Ethernet HWaddr 00:0C:29:B2:82:C4

inet addr:192.168.10.10 Bcast:192.168.10.255 Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:feb2:82c4/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:122954 errors:0 dropped:0 overruns:0 frame:0

TX packets:826224 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:12821186 (12.2 MiB) TX bytes:1150412694 (1.0 GiB)

Interrupt:67 Base address:0x2024

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:B2:82:C4

inet addr:192.168.50.100 Bcast:192.168.50.255 Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

Interrupt:67 Base address:0x2024

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:7250 errors:0 dropped:0 overruns:0 frame:0

TX packets:7250 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:2936563 (2.8 MiB) TX bytes:2936563 (2.8 MiB)

继续测试:

在node1上操作,让node1下线:

[root@node1 ~]# crm node standby

查看集群运行的状态:

[root@node1 ~]# crm status

============

Last updated: Sat May 12 15:56:11 2012

Stack: openais

Current DC: node1.a.com -partition with quorum

Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f

2 Nodes configured, 2 expected votes

4 Resources configured.

============

Node node1.a.com: standby

Online: [ node2.a.com ]

Master/Slave Set: MS_mysqldrbd [mysqldrbd]

Masters: [ node2.a.com ]

Stopped: [ mysqldrbd:0 ]

MysqlFS(ocf::heartbeat:Filesystem):Started node2.a.com

myip(ocf::heartbeat:IPaddr):Started node2.a.com

mysqlserver(lsb:mysqld):Started node2.a.com

可见我们的资源已经都切换到了node2上:

查看node2的运行状态:

[root@node2 ~]# service mysqld status

MySQL running (7805) [ OK ]

查看目录

[root@node2 ~]# ls /mysqldata/

data f1 f2 lost+found

ok,现在一切正常,我们可以验证mysql服务是否能被正常访问:

我们定义的是通过VIP:192.168.50.100来访问mysql服务,现在node2上建立一个可以让某个网段主机能访问的账户(这个内容会同步drbd设备同步到node1上):

[root@node2 ~]# mysql

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 1

Server version: 5.5.15-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant all on *.* to test@'192.168.%.%' identified by '123456';

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.06 sec)

mysql> exit

Bye

然后我们通过另一台主机进行访问:

[root@node1 ~]# mysql -u test -h 192.168.50.100

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 3

Server version: 5.5.15-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

你可能感兴趣的:(mysql,服务器,NetWork)