Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198804
  • 博文数量: 43
  • 博客积分: 366
  • 博客等级: 一等列兵
  • 技术积分: 427
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-17 14:03
文章分类

全部博文(43)

文章存档

2018年(2)

2017年(5)

2016年(2)

2015年(3)

2014年(9)

2013年(5)

2012年(8)

2011年(9)

我的朋友

分类: Mysql/postgreSQL

2011-12-26 15:39:54

参考:(Heartbeat Drbd Mysql 构建高可用的MYSQL数据库服务

redhat1(master):172.31.1.73
redhat2(slave):172.31.1.71
VIP:172.31.1.77

一、准备工作
1、保证有未格式化的,或者未分区的磁盘空间
2、修改两机hostname:
 1)两机修改:/etc/hosts文件,加入如下2行(使服务器可通过别名访问)
     172.31.1.71   slave
     172.31.1.73   master
 2)两机修改: /etc/sysconfig/network,把HOSTNAME改为master或者slave
 3)两机执行:hostname master 或者 hostname slave
 4)两机测试:ping master;ping slave,若都能ping通,则说明设置正确
3、更新源并yum update
4、安装mysql(我安装的是64位的二进制版),不设置开机启动

二、安装并配置drbd
1、两机执行:yum -y install drbd83 kmod-drbd83
   安装后,执行lsmod | grep drbd
   有类似如下显示,则证明安装成功
   drbd                  228528  3
   如果发现正常安装无法加载drbd模块,则要通过"uname -a"检查系统是否处于xen内核模式下,如果是,修改/boot/grub/grub.conf,修改默认启动内核为不带"xen"版本的
2、两机修改:/etc/drbd.conf
   #
   # please have a a look at the example configuration file in
   # /usr/share/doc/drbd83/drbd.conf
   #
   global { usage-count yes; }
   common { syncer { rate 10M; } }
   resource r0{
    protocol C;
    startup{
           degr-wfc-timeout 120;
    }
    disk{
           on-io-error detach;
    }
    net{
    }
    syncer{
           rate 10M;
    }
    on master{
           device          /dev/drbd0;
           disk            /dev/vdb1; // 因情况而异
           address         172.31.1.73:7788; 
           meta-disk       internal;
    }
    on slave{
           device          /dev/drbd0;
           disk            /dev/vdb1; // 因情况而异
           address         172.31.1.71:7788;
           meta-disk       internal;
    }
   }
  // 再创建一个资源,为二进制日志做准备
   resource r1{
    protocol C;
    startup{
           degr-wfc-timeout 120;
    }
    disk{
           on-io-error detach;
    }
    net{
    }
    syncer{
           rate 10M;
    }
    on master{
           device          /dev/drbd1;
           disk            /dev/vdb2; // 因情况而异
           address         172.31.1.73:7789; // 端口号需不同,否则报错 
           meta-disk       internal;
    }
    on slave{
           device          /dev/drbd1;
           disk            /dev/vdb2; // 因情况而异
           address         172.31.1.71:7789; // 端口号需不同,否则报错
           meta-disk       internal;
    }
   }

3、两机执行:for i in $(seq 0 15) ; do mknod /dev/drbd$i b 147 $i ; done
   建立设备文件,不过貌似有drbd0就够了,上面的语句会创建0-15
4、初始化meta-data area
   两机执行drbdadm create-md r0, drbdadm create-md r1
   如果这步出了error,很有可能是配置中指定的分区已经被格式化过,或曾经格式化过(我删除分区重建也不行),则执行:dd if=/dev/zero bs=1M count=1 of=/dev/vdb1; sync,然后重新执行drbdadm create-md r0, drbdadm create-md r1
5、两台主机执行:/etc/init.d/drbd start;
   1)测试:netstat -ant | grep $PORT:7788,显示如下,则正确:
      tcp     0   0 172.31.1.73:7788      0.0.0.0:*       ESTABLISHED
   2)cat /proc/drbd,会发现如Secondary/Secondary字样,证明两台都是备机状态
   3)在相当做主机的设备上执行:
      drbdsetup /dev/drbd0 primary -o,drbdsetup /dev/drbd1 primary -o
      cat /proc/drbd,则会发现正在执行同步,并且状态变为Primary/Secondary
6、同步完成后,则可开始对drbd分区任意格式化(从这里开始,一切对/dev/vdb1的操作,都变为对/dev/drbd0操作),如"mkfs.ext3 /dev/drbd0",
   然后可以"mount /dev/drbd0 /home/Db/","mount /dev/drbd1 /home/log"
7、可以开始测试,并写入/home/Db分区,在另一边看是否可以同步,在备机查看时,要先停掉drbd服务(service drbd stop),然后"mount /dev/vdb1 /home/Db",看是否同步
8、两机主备切换命令:drbdadm secondary r0  ; drbdadm primary r0 ;前提是,要先把主机drbd停止或降级,然后备机升为primary
9、配置mysql数据目录为/home/Db/mysql

三、安装配置heartbeat(均为两机执行)
1、yum install -y heartbeat(heartbeat可能需要安装2次,暂时是个神奇的问题……)
2、cp /usr/share/doc/heartbeat-2.1.3/haresources /etc/ha.d/
   cp /usr/share/doc/heartbeat-2.1.3/ha.cf /etc/ha.d/
   cp /usr/share/doc/heartbeat-2.1.3/authkeys /etc/ha.d/
   chmod 600 /etc/ha.d/authkeys(注意,这里必须要为600,否则会报错)
3、vi /etc/ha.d/authkeys,去掉以下2行注释
   auth 1
   1 crc
4、vi /etc/ha.d/ha.cf,改后为
   #grep -v "^#" /etc/ha.d/ha.cf
   debugfile /var/log/ha-debug
   logfile /var/log/ha-log
   logfacility     local0
   keepalive 2
   deadtime 10
   warntime 5
   initdead 120
   ucast eth0 172.31.1.71   # 互填对方ip,这里slave写172.31.1.73
   auto_failback off    # 恢复正常后是否需要再自动切换回来,一般都设为off。
   node    master
   node    slave
   ping 172.31.1.67  # 这里放一个两台服务器均应能ping通的第三方节点IP即可,目的是让服务器能自知与外界的连通性
   # 指定和heartbeat一起启动、关闭的进程
   respawn hacluster /usr/lib64/heartbeat/ipfail
   apiauth ipfail gid=haclient uid=hacluster
5、vi /etc/ha.d/resource.d/mysqld_umount(设置heartbeat主从转换时执行的脚本)
   #!/bin/bash
   unset LC_ALL; export LC_ALL
   unset LANGUAGE; export LANGUAGE
  
   prefix=/usr
   exec_prefix=/usr
   . /etc/ha.d/shellfuncs
  
   case "$1" in
   'start')
           drbdadm primary all
           mount /dev/drbd0 /home/Db
           mount /dev/drbd1 /home/log
           drbdadm connect all
   ;;
   'pre-start')
   ;;
   'post-start')
   ;;
   'stop')
           umount /dev/drbd1
           umount /dev/drbd0
           drbdadm secondary all
   ;;
   'pre-stop')
   ;;
   'post-stop')
   ;;
   *)
           echo "Usage: $0 { start | pre_start | post-start | stop | pre-stop |post-stop }"
   ;;
  
   esac
   exit 0
6、chmod x  /etc/ha.d/resource.d/mysqld_umount
7、vi /etc/ha.d/haresource 添加 "master  IPaddr::172.31.1.77/24/eth0:1 mysqld_umount mysql"
8、service heartbeat start,先启动master的heartbeat服务,然后启动slave的。
9、测试
10、设置drbd自动加载,但mysql不自动加载,heartbeat写在rc.local中,保证在drbd之后启动

四、mysql二进制日志及redo日志设置(摘自mysqlops朋友的“Mysql服务器端参数详解和优化建议.pdf”)
innodb_flush_log_at_trx_commit= N:
N=0 --每隔一秒,把事务日志缓存区的数据写到日志文件中,以及把日志文件的数据刷新到磁盘上;
N=1 –每个事务提交时候,把事务日志从缓存区写到日志文件中,并且刷新日志文件的数据到磁盘上;
N=2 –每事务提交的时候,把事务日志数据从缓存区写到日志文件中;每隔一秒,刷新一次日志文件,但不一定刷新到磁盘上,而是取决于操作系统的调度;
sync_binlog = N:
N>0 --每向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上;
N=0 --不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统决定;
推荐配置组合:
N=1,1 ---适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如充值消费系统;
N=1,0 ---适合数据安全性要求高,磁盘IO写能力支持业务不富余,允许备库落后或无复制;
N=2,0或2,m(0N=0,0 ---磁盘IO写能力有限,无复制或允许复制延迟稍微长点能接受,例如:日志性登记业务
阅读(1170) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~