实现mysql的高可用性能corosync+pacemaker+mysql+drbd
在操作之前请确保:
1、两台机器的时间同步
2、/etc/hosts文件解析和uname -n给出的主机名的一致性
3、确保双方可以通过节点名称访问。
4、双机要互信
说明:以下内容以“#”开头的,代表是要在命令行执行的命令。
一、构建节点
1、确保将要被配置成节点的主机时间同步,主机名称和IP地址解析服务能够正常工作,且节点的主机名称和“unam -n”命令的结果保持一致。所以节点上的/etc/hosts文件均要提供以下内容:
- 172.16.100.1 db1.magedu.com db1
- 172.16.100.2 db2.magedu.com db2
2、为方便使用命令scp说以建议双机互信,在两个节点上均执行以下命令
- # ssh-****** -t rsa
- # ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
3、在每个节点上都安装如下的软包,这里采用yum安装,可以自动解决依赖关系,并且需要安装的包比较多所以我们将这些包放到一个目录里,然后执行下面的命令
- #yum -y --nopgpcheck localinstall ./*.rpm
4、选取一个节点配置corosycn,这里在db1.magedu.com这个节点上配置
//service定义资源管理,启用pacemaker
//定义运行corosync服务的用户
- 1)cd /etc/corosync
- # cp corosync.conf.example corosync.conf
- 2)编辑corosync.conf添加以下内容
- service {
- ver:0
- name:pacemaker
- }
- aisexec{
- user: root
- group: root
- }
3)编辑corosync.conf修改bindnetaddr为我们的网段内容为下面
- bindnetaddr: 172.16.0.0
4)生成节点之间通信时用到的**
- # corosync-******
5、为了方便,也为了保持一致性,所以我们复制corosync.conf和auchkey到另一个节点db2.magedu.com它的别名是db2.
- # scp -p corosync.conf authkey db2:/etc/corosync/
6、在每个节点的命令行执行以下操作创建集群日志,否则corosync是无法启动的哦
- # mkdir /var/log/cluster
7、在选取一个节点尝试启动crosync并且确保其正常,我们这里先尝试启动db1。
- # service corosync start
1)在/var/log/messages找以下内容,用于确认corosync引擎已经正常启动
- [[email protected] corosync]# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/messages
- Nov 28 15:51:08 db1 corosync[7995]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
- Nov 28 15:51:08 db1 corosync[7995]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
- Nov 28 15:51:08 db1 corosync[7995]: [MAIN ] Corosync Cluster Engine exiting with status 8 at main.c:1397.
- Nov 28 15:51:35 db1 corosync[8017]: [MAIN ] Corosync Cluster Engine ('1.2.7'): started and ready to provide service.
- Nov 28 15:51:35 db1 corosync[8017]: [MAIN ] Successfully read main configuration file '/etc/corosync/corosync.conf'.
- [[email protected] corosync]#
2)确保初始化成员节点通知正常发出:
- [[email protected] corosync]# grep TOTEM /var/log/messages
- Nov 28 15:51:35 db1 corosync[8017]: [TOTEM ] Initializing transport (UDP/IP).
- Nov 28 15:51:35 db1 corosync[8017]: [TOTEM ] Initializing transmit/receive security: libtomcrypt SOBER128/SHA1HMAC (mode 0).
- Nov 28 15:51:35 db1 corosync[8017]: [TOTEM ] The network interface [172.16.16.1] is now up.
- Nov 28 15:51:36 db1 corosync[8017]: [TOTEM ] Process pause detected for 558 ms, flushing membership messages.
- Nov 28 15:51:36 db1 corosync[8017]: [TOTEM ] A processor joined or left the membership and a new membership was formed.
- Nov 28 15:53:31 db1 corosync[8017]: [TOTEM ] A processor joined or left the membership and a new membership was formed.
- [[email protected] corosync]#
3)检查启动过程当中是否有错误发生
- [[email protected] corosync]# grep ERROR: /var/log/messages | grep -v unpack_resources
4)检查pacemaker是否正常启动
- [[email protected] corosync]# grep pcmk_startup /var/log/messages
- Nov 28 15:51:36 db1 corosync[8017]: [pcmk ] info: pcmk_startup: CRM: Initialized
- Nov 28 15:51:36 db1 corosync[8017]: [pcmk ] Logging: Initialized pcmk_startup
- Nov 28 15:51:36 db1 corosync[8017]: [pcmk ] info: pcmk_startup: Maximum core file size is: 4294967295
- Nov 28 15:51:36 db1 corosync[8017]: [pcmk ] info: pcmk_startup: Service: 9
- Nov 28 15:51:36 db1 corosync[8017]: [pcmk ] info: pcmk_startup: Local hostname: db1.magedu.com
8、以上判断中在节点db1上面的corosync是没有任何问题的,接下来就可以启动第二个节点上的corosync了,启动时是在已经启动的节点上,启动其他的节点,所以我们这里是在db1上面启动db2
- # ssh db2 'service corosync start'
9、查看此时节点的状态
- #crm status
二、提供文件同步功能
1、在两个节点上,这里用yum安装drbd内核模块和管理工具,因为我们这里使用的rhel5.8的系统,并且是x86平台,(如果实验的平台内核版本高于2.6.33只需要安装drbd用户管理工具drbd83-8.3.13-2.el5.centos.i386.rpm。)
- yum -y --nogpgcheck localinstall drbd83-8.3.13-2.el5.centos.i386.rpm kmod-drbd83-8.3.13-1.el5.centos.i686.rpm
2、提供配置文件drbd.conf
- cp /usr/share/doc/drbd83-8.3.13/drbd.conf /etc/drbd.conf
3、在Global配置文件/etc/drbd.d/global_common.conf当中定义通用选项,编辑/etc/drbd.d/global_common.conf,进行如下操作
//在disk中添加的一项表示的是如果这个设备出现了问题,就把它移除
//在net中添加的一项表示的使用shal算法对密码进行加密用于数据同步过程中使用,其中这里“mysqldrbd”是密码这个可以随意设定
//在syncer当中的定义使用带宽中的多大带宽用于数据的同步
- disk {
- on-io-error detach;
- }
- net {
- cram-hmac-alg "sha1";
- shared-secret "mysqldrbd";
- }
- syncer {
- rate 200M;
- }
4、定义一个资源/etc/drbd.d/sql.res,注意定义资源一定是以“res”结尾的.
//device 定义的是drbd设备
//disk 指定的是用哪块盘做为drbd的映射
//adress 指定监听的地址和端口号,端口号是7789
//meta-disk 指定元数据存放的位置,我们这里是存放在内部所以是internal
注意:这里的两个节点上提供的disk名称可以不一样即一个是/dev/sa5 另一个是/dev/sda6也是没有问题的,但是大小必须一样,我们这里使用/dev/sda5
- resource sql {
- on db1.magedu.com {
- device /dev/drbd1;
- disk /dev/sda5;
- address 172.16.16.1:7789;
- meta-disk internal;
- }
- on db2.magedu.com {
- device /dev/drbd1;
- disk /dev/sda5
- address 172.16.16.2:7789;
- meta-disk internal;
- }
- }
5、复制配置文件到第二个节点db2上的相应的位置
- # scp /etc/drbd.conf db2:/etc/
- # scp /etc/drbd.d/* db2:/etc/drbd.d/
6、提供构建drbd的设备,上面我们已经定义用/dev/sda5作为drbd,所以我们在两个节点上的分别创建/dev/sda5,注意必须是同样大小的。这里具体的创建过程就不给出了。但是记得在分完区以后记得执行下面的命令同步下。(实在不行就重启reboot(*^__^*) 嘻嘻……)
- partprobe /dev/sda
8、初始化资源sql,即为资源"sql"提供所需要的设备,在db2和db1上执行以下命令:
- # drbdam create-md sql
9、此时可以查看下dev目录下。应该有了我们的drbd设备
- # ls /dev/drbd
10、在两个节点上均启动服务
- # /etc/init.d/drbd start
11、查看启动状态有两种方式,通过下面两条任意一条命令都可以看到
- # cat /proc/drbd
- # drbd-overview
12、将一个节点,提升为主节点,这表示把drbd1提升为主的节点
- # drbdsetup /dev/drbd1 primary -o
13、此时可以用下面的命令来查看同步的过程
- # wathc -nl 'cat /proc/drbd'
- # drbd-overview 查看同步后的状态
14、在“主”节点上对分区进行格式化,并创建挂载点,然后挂载它。我们这里刚刚把"drbd1"提升为主节点,所以在它上面对其格式化,将其挂载至/data/mydata目录下
- # mke2fs -j L DRBD /dev/drbd1
- # mkdir -pv /data/mydata
- # mount /dev/drbd1 /data/mydata
【此时我们拷贝一个文件/etc/passwd到/data/mydata下,用于主被节点切换后查看效果】
补充:如果此时我们想要交换下主被节点,要先卸掉挂载点或者被挂载的设备,并且把当前主动节点降为被动节点,然后在把另一个节点提升为主节点。主被节点的概念是相对于资源来说的,我们这里的资源是"sql"。
在db1上执行:
- # umount /data/mydata
- # drbdadm decondary sql
此时用命令【drbd-overview】查看发现现在两个节点都是处于被动状态
在db2上执行:
- # drbdadm primary sql
- # mkdir -pv /data/mydata
- # mount /dev/drbd1 /data/mydata
【此时我们会看到/data/mydata目录下是有passwd这个文件存在的,这个文件并不是在对方的设备上,而是在自己的设备上,因为在对方存放的时候也会往我们这边的设备/dev/drbd1上面同步一份】
三、提供MySQL服务并且,确保 MySQL 在并未做高可用前,可以基于drbd正常运行
说明:我们建立的/data/mydata就是用来存放Mysql的数据的,所以它的属组和属主我们都应该改为"mysql",并且现在的
1、将我们的主动节点还切换到db1上。并且将/dev/drbd1挂载到/data/mydata目录下
2、在db1上操作,改变/data/mydata/目录的属组和属主
- # chown -R mysql:mysql /data/mydata
3、安装配置mysql这里不在做解释,只是给出步骤
- # tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/
- # ln -sv mysql-5.5.28-linux2.6-i686/ mysql
- # cd mysql
- # chown -R :mysql .
- # scripts/mysql_install_db --user=mysql --datadir=/data/mytada
- # cp support-files/mysql.server /etc/rc.d/init.d/mysqld
- # cp support-files/my-large.cnf /etc/my.cnf
然后编辑配置文件/etc/my.cnf,添加如下行
- # datadir = /data/mydata
4、启动mysql服务并且,确保它在这个节点正常的工作的。
- # service mysqld start
5、退出mysql,停止mysql服务,并且不让其开机自动启动,卸载/data/mydata,并且降级drbd1为被动节点。
- chkconfig mysqld off
6、在db2上操作,将drbd2提升为主节点,让后挂载至/data/mydata,此时在mydata目录可以看到mysql的信息。
- drbdadm primary sql
- mount /dev/drbd2 /data/mydata
7、并且确认两边的mysql用户的id号码是一样的,为db2提供mysql服务,此时记得不要再次初始化mysql了。
- # tar xf mysql-5.5.28-linux2.6-i686.tar.gz /usr/local/
- # ln -sv mysql-5.5.28-linux2.6-i686/ mysql
- # cd mysql
- # chown -R :mysql .
- # scp db1:/etc/rc.d/init.d/mysqld /etc/rc.d/init.d/
- # scp db1:/etc/my.cnf /etc
8、确保mysql服务正常能够运行,并且可以看到在db1操作时候创建的数据库即可。
9、停止drbd和mysqld并且不让它们不能开机自动启动,mysql已经准备好了为了再次db2上的Mysql也是正常工作的,最好再将主节点再切回到db1上面,具体步骤同上次切换)
- # service mysqld stop
- # chkcofig mysqld off
- # service drbd stop
- # chkcofig drbd off
四、实现Mysql的高可用性
1、启动corosync
- # service corosync start
- # ssh db2 'service corosync start'
2、查看节点状态确保有以下信息输出
- # crm status
Online: [ db1.magedu.com db2.magedu.com ] (输出的信息)
3、定义集群的属性
//property stonith-enalbed=flase 禁止使用stonith机制
//no-quorum-policy=ignore 不投票选举,即当quorum票数不小于1/2时,集群依然运行(因为我们就两个节点)
//verify 用于验证上面两条是否有错误.如果没有错误就可以提交了
//commit 提交定义的内容
- [[email protected] /]# crm configure
- crm(live)configure# property stonith-enabled=false
- crm(live)configure# property no-quorum-policy=ignore
- crm(live)configure# verify
- crm(live)configure# commit
4、将drbd定义成资源
//定义格式:资源类型 资源名字 代理资源名称 drbd资源名称 执行的操作
//第一条语句说明用drbd_resource定义一条名为"sql"的drbd资源,因为我们是要将drbd定义为主从资源所以就得先用关键字primitive定义本地资源"my_drbd",这个名字是随便取能够分辨清楚即可
//第二条语句定义主资源用master,主资源的名称“ms_my_drbd”meta用于是定义额外的一些属性,master-max表示一个群集上最多运行几个主资源;master-node-max表示一个节点最多运行几个主资源;clone-max定义一个群集上最多运行几个clone资源;clone-node-max表示一个节点上最多运行几个clone资源;notify用于定义当出现故障时,是否通知对方,这个可以不定义它默认就是ture.
- crm(live)configure# primitive my_drbd ocf:linbit:drbd params drbd_resource='sql' op start timeout=240 op stop timeout=100
- crm(live)configure# master ms_my_drbd my_drbd meta master-max="1" master-node-max="1" clone-max="2" clone-node-max=1 notify="ture"
- crm(live)configure# commint
5、测试当节点切换时资源drbd可以实现主从切换
//crm node standby表示将当前的节点切换成被动节点
//crm node online 为了查看效果,我们还得让这个节点上线
//drbd-overview查看节点以及资源当前的状态。看是否实现了转移.记得主动被动查看的时候前面的现实的是自己后面显示的对方的。
- [[email protected] ~]# crm node standby
- [[email protected] ~]# crm node online
- [[email protected] ~]# drbd-overview
6、定义Filsystem,Filesystem直接的说就是定义了数据存储结构,所以一般的定义资源的时候她 是一定要定义的,而其在这里它一定要和drbd的主节点运行在一起。因为当drbd是主节点时候它才可以挂载数据。
//primitive定义一个名为"my_fs“的ext3文件系统资源
//colocation定义它的位置关系,inf关键字表示它和资源ms_my_drbd的主节点在其一起的意愿是百分百。order定义哪个资源先运行,my_fs这个资源运行在ms_my_drbd这个资源之后
//verify 检验
//commit 提交
- crm(live)configure# primitive my_fs ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/data/mydata" fstype="ext3" op start timeout=60 op stop timeout=60
- crm(live)configure# colocation my_fs_on_ms_my_drbd inf: my_fs ms_my_drbd:Master
- crm(live)configure# order my_fs_after_ms_my_drbd mandatory: ms_my_drbd my_fs:start
- crm(live)configure#verify
- crm(live)configure#commit
7、将MySQL服务定义成资源
//定义一个名字为my_sql的资源
//colocation定义它一定要和文件系统的资源my_fs运行在同一个节点上
//order定义它和文件系统资源启动的先后顺序,这里文件系统资源my_fs先于my_sql资源。
- crm(live)configure# primitive my_sql lsb:mysqld
- crm(live)configure# colocation my_sql_with_my_fs inf:my_sql my_fs
- crm(live)configure# order my_sql_after_my_fs mandatory:my_fs my_sql
8、将IP定义成资源.
//这个名为my_ip的资源和ms_mydrbd的主资源运行在一起
//检验
//提交
- crm(live)configure# primitive my_ip ocf:heartbeat:IPaddr2 params ip="172.16.16.100"
- crm(live)configure# colocation my_ip_with_ms_my_drbd_master inf:my_ip ms_my_drbd:Master
- crm(live)configure#verify
- crm(live)configure#commit
总结:记得在drbd中的disk名字要定义成一样的,否则在下面定义资源的时候没法定义啦(看粉色) 即primitive my_fs ocf:heartbeat:Filesystem params device="/dev/drbd1" directory="/data/mydata" fstype="ext3" op start timeout=60 op stop timeout=60
转载于:https://blog.51cto.com/leggo/1074462