|
1、简单拓扑图
2、安装环境 系统环境 | 操作系统 | CentOS 6.6最小化安装 | 系统位数 | 64 | 内核版本 | 2.6.32 | 软件环境 | 软件名称 | 版本 | DRBD | 8.4.6 | drbd-utils | 8.9.2 | Heartbeat | 3.0.4 | Mysql | 5.6.24 | 网络环境 | 主机名 | IP地址 | 镜像硬盘分区 | VIP:由heartbeat虚拟 | 10.0.0.110 |
| Mysql_1 | eth0:10.0.0.101 | /dev/VG/lv_data | Mysql_2 | eth0:10.0.0.102 | /dev/VG/lv_data |
3、部署前准备 1)约定目录 源代码存放路径:/usr/local/src 软件编译安装路径:/usr/local Mysql数据库存放路径:/data 2)设置/etc/hosts文件添加 10.0.0.101 Mysql_1 10.0.0.102 Mysql_2 3)关闭防火墙 # /etc/rc.d/init.d/iptables stop # chkconfig iptables off 4)关闭selinux #setenforce 0 #sed -i 's/SELINUX=enforcing/#SELINUX=enforcing/g' /etc/selinux/config #sed -i 's/SELINUXTYPE=targeted/#SELINUXTYPE=targeted/g' /etc/selinux/config #sed -i '$a SELINUX=disabled' /etc/selinux/config 5)同步时间 #ntpdate time.windows.com 6)设置yum源:这里笔者选择阿里云的epel yum源,用默认yum源也可以。 #mkdir –p /etc/yum.repos.d/repo_bak #mv /etc/yum.repos.d/* /etc/yum.repos.d/repo_bak #yum clean all #yum makecache 4、安装部署 1)DRBD的安装部署 (1)部署前说明:从DRBD 8.4.5开始的版本发生了变化,不再和以前一样只安装DRBD软件包就可以了,笔者推测可能是从liunx 内核 2.6.33 开始DRBD模块被集成到内核中去了,所以从DRBD 8.4.5开始需要编译安装的软件为drbd和drbd-utils。drbd用于编译安装模块,drbd-utils用于管理drbd模块,并提供配置文件。 (2)DRBD的安装 官网下载: #tar -zxf /usr/local/src/drbd-8.4.6.tar.gz -C /usr/local/src
安装依赖软件,注意:如果内核版本有变,安装kernel会更新内核,可能导致其他软件不能正常运行,如果不想更新内核,可以找与本机内核对应的软件(kernel-devel kernel-headers),安装完成后记得重启计算机(重要),否则会出错。 #yum install -y kernel kernel-devel kernel-headers gcc flex libxslt
安装成功后会出现下面目录,记下之,下面要用 #ll -d /usr/src/kernels/2.6.32-504.16.2.el6.x86_64
开始编译安装drbd,和8.4.5之前版本有所不同,这里不用./configure,直接make就可以了 # cd/usr/local/src/drbd-8.4.6 # makeKDIR=/usr/src/kernels/2.6.32-504.16.2.el6.x86_64/ #make install
编译成功模块安装位置 # drbd.ko//lib/modules/2.6.32-504.16.2.el6.x86_64/updates
加载模块 # modprobedrbd #lsmod | grep drbd drbd 365803 0 看到这个加载成功 libcrc32c 1246 1 drbd
(3)drbd-utils的安装 # tar-zxf /usr/local/src/drbd-utils-8.9.2.tar.gz -C /usr/local/src # cd/usr/local/src/drbd-utils-8.9.2
开始编译安装drbd-utils,这里用了--without-83support,因为笔者安装的是8.4以上版本 #./configure --prefix=/usr/local/drbd-utils-8.9.2 --without-83support #make #make install
在make install过程中出现了很多下面内容,但最后echo $? 结果为0的运行中暂没发现有问题 ../shared_prereqs.mk:18: xxxxxx No such file or directory
安装成功后drbd相关的工具(drbdadm,drbdsetup)被安装到/sbin目录下 #cp /usr/local/drbd-utils-8.9.2/etc/rc.d/init.d/drbd /etc/rc.d/init.d/ # chkconfig--add drbd #chkconfigdrbd on
(4)设置drbd.conf配置文件 本次编译安装配置文件位置:/usr/local/drbd-utils-8.9.2/etc/drbd.conf 配置文件主要分为三个部分:global、common、resource # cat/usr/local/drbd-utils-8.9.2/etc/drbd.conf # You can find an example in /usr/share/doc/drbd.../drbd.conf.example include "drbd.d/global_common.conf"; include "drbd.d/*.res"; 可看到,配置文件drbd.conf的配置指向了drbd.d目下的文件 global_common.conf一般用于配置global、common,*.res用于配置resource部分 如果配置资源比较少的也可以将全部内容写到drbd.conf,当配置资源多的时候写到相应文件上更有利于管理,不容易混乱 因为本示例比较简单,所以全部写到drbd.conf下 #include"drbd.d/global_common.conf"; 注释掉 #include "drbd.d/*.res"; 注释掉 global { usage-count no;是否参加DRBD 使用者统计,默认参加 } common { syncer { rate 200M; } 设置主用节点和备用节点同步时的网络速率最大值,单位是字节 } resource r0 { 资源名字为r0 protocol C;使用DRBD 的第三种同步协议(A B C),大多数用C,表示收到远程主机的写入确认后认为写入完成 startup { wfc-timeout 120;在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。 degr-wfc-timeout 120;也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。 }
disk { on-io-error detach;策略:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作 }
net{ timeout 60;如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡 connect-int 10;如果无法立即连接上远程DRBD设备,系统将断续尝试连接 ping-int 10;如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活 max-buffers 2048;该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。 max-epoch-size 2048;该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。大一点好。 cram-hmac-alg "sha1";该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。 shared-secret "Mysql-abcD";用来设定在对待节点授权中使用的密码,最长64个字符。 }
on Mysql_1 { 每个主机的说明以on 开头,后面是hostname device /dev/drbd0;drbd设备名称 disk /dev/VG/lv_data;/dev/drbd0使用的磁盘分区是/dev/VG/lv_data address 10.0.0.101:6666;设置DRBD的监听端口,用于与另一台主机通信 meta-disk internal;DRBD的元数据存放方式 }
on Mysql_2 { device /dev/drbd0; disk /dev/VG/lv_data; address 10.0.0.102:6666;两台主机端口必须一致 meta-disk internal; } }
讲以上配置复制都两台主机相应目录下即可,更多参数说明,可以man drbd.conf 官方参考资料:
(5)镜像硬盘设置 笔者用的LVM,分别在两台主机上创建一个5G的lv_data分区,两主机分区容量最好保持一致。怎么分区在这里就不详说了 如果用的是以使用分区,可以跳过创建分区这一步 # lvcreate-L 5G -n lv_data VG # mke2fs -t ext4 /dev/VG/lv_data 格式化分区 用dd写入点数据,不然可能会出错 #dd if=/dev/zero of=/dev/VG/lv_data bs=1M count=1
创建 drbd resource 名字要对应配置文件中的resource r0 参数 # drbdadmcreate-md r0 过程中会可能会出现应当问题,直接yes ,到最后出现下列信息表示成功 Newdrbd meta data block successfully created.
如果出现下列错误: 'r0' not defined in your config (for this host).检查是否设置hosts文件和配置文件主机名是否一致 Exclusive open failed. Do it anyways 检查是否已经打开drbd服务,先关闭
启动两台主机的drbd服务 # /etc/rc.d/init.d/drbdstart 查看节点的状态: # /etc/rc.d/init.d/drbdstatus 或 cat /proc/drbd 最终同步后的状态: version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build byroot@Mysql_1, 2015-05-14 00:00:27 0: cs:Connectedro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ns:5128124 nr:0 dw:0 dr:5128124 al:0 bm:0lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0 cs:表示连接状态 ro: 表示主从关系 上面的表示都为从 ds:硬盘状态信息 上面表示已经实时同步中,Inconsistent:不一致 同步成功后两台主机会创建出设备/dev/drbd0 设置主从第一次执行 # drbdadm-- --overwrite-data-of-peer primary all 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate Cr----- 之后平时可以执行 drbdadmprimary all 格式化/dev/drbd0 mke2fs-t ext4 /dev/drbd0 镜像创建完成
(6)挂载并同步测试 创建数据库目录 # mkdir/data 在主节点上进行挂载 # mount/dev/drbd0 /data 测试数据同步 在主节点创建数据 # ddif=/dev/zero of=/data/test.tmp bs=1M count=200 #ll /data -rw-r--r--1 root root 209715200 5月 14 19:51 test.tmp 停止主节点drbd服务 #/etc/rc.d/init.d/drbd stop 在从节点上进行挂载 #drbdadm primary all # mount/dev/drbd0 /data #ll /data -rw-r--r--1 root root 209715200 5月 14 19:51 test.tmp
测试成功
2)Mysql的安装部署 #tar –zxf /usr/local/src/mysql-5.6.24.tar.gz –C /usr/local/src
#yum install -y gcc-c++ ncurses-devel cmake
创建用户和用户组 #groupadd mysql #useradd -g mysql mysql -s /bin/false –M
开始编译安装 # cd/usr/local/src/mysql-5.6.24 # mv/etc/my.cnf /etc/my.cnf.bak 编译参数 # cmake. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.6.24 -DMYSQL_UNIX_ADDR=/usr/local/mysql-5.6.24/mysql.sock -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=1 -DMYSQL_USER=mysql -DMYSQL_TCP_PORT=3306 -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc/ #make #make install
设置访问权限 chown-R mysql:mysql /usr/local/mysql-5.6.24
初始数据库 主节点初始化,从节点不用 # /usr/local/mysql-5.6.24/scripts/mysql_install_db-basedir=/usr/local/mysql-5.6.24 -datadir=/data/mysql -user=mysql
设置配置文件my.cnf 主从主机配置文件一致一般数据库初始化生成次文件,如果没拷贝一份到从主机上即可 修改/usr/local/mysql-5.6.24/my.cnf datadir=/data/mysql basedir=/usr/local/mysql #ln –s /usr/local/mysql-5.6.24/my.cnf /etc/my.cnf
设置启动服务 # cp/usr/local/mysql-5.6.24/support-files/mysql.server /etc/rc.d/init.d/mysql
测试是否启动成功 # /etc/rc.d/init.d/mysqlstart # /etc/rc.d/init.d/mysqlstatus 下面来配置heartbeat实现故障自动切换并挂载
3)heartbeat的安装部署 (1)hearteat的安装 这样笔者选择了yum安装,比较方便快捷 注意:如一开始配置了默认yum源的需要先下载三个文件 然后安装heartbeat的必要组件,注意必须写一行安装不然出错 # yum-y install cluster-glue resource-agents pacemaker PyXML #rpm -ivh heartbeat-3.0.4-2.el6.x86_64.rpm heartbeat-devel-3.0.4-2.el6.x86_64.rpmheartbeat-libs-3.0.4-2.el6.x86_64.rpm
如果选用了文章开头的epel yum 源执行下面操作 yuminstall heartbeat
(2)配置heartbeat 主备节点两端的配置文件(ha.cf authkeys haresources)完全相同 hearbeat配置文件目录为 /etc/ha.d/ 脚本存放目录:/etc/ha.d/resource.d/ cp/usr/share/doc/heartbeat-3.0.4/{authkeys,ha.cf,haresources} /etc/ha.d/ authkeys :通信认证方式,3种crc md5 sha1从左到右安全性越来越高,但消耗的资源也越多。 # vim /etc/ha.d/authkeys 这里用第一种 auth 1 1 crc #chmod 600 /etc/ha.d/authkeys
ha.cf /etc/ha.d/ha.cf 修改部分去掉注释 logfile/var/log/ha-log 日志设置 logfacility local0 keepalive2 心跳检测时间 ucasteth0 192.168.1.2 采用单播方式从哪个网卡接口检测对方的IP auto_failbackon 当主节点Primary发生故障切换到Secondary后Primary恢复后是否进行切回操作 nodeMysql_1 nodeMysql_2
haresources /etc/ha.d/haresources 添加下列行 注意:这里是一行写完的不要分两行写,不然会报错 Mysql_1 IPaddr::10.0.0.110/24/eth0 drbddisk::r0Filesystem::/dev/drbd0::/data::ext4 mysqld 解析:主主机名 设置VIP脚本::VIP::子掩码::网卡接口 设置DRBD主从脚本::resource名 主节点资源挂载卸载脚本::挂载设备::要挂载的目录::挂载的文件类型 数据库启动脚本 注意:新版本heartbeat不再提供drbddisk脚本,现在由drbd-utils提供 脚本位置:/root/soft/drbd-utils-8.9.2/scripts/drbddisk
(3)调整脚本 # cp/root/soft/drbd-utils-8.9.2/scripts/drbddisk /etc/ha.d/resource.d/ # ln-s /etc/rc.d/init.d/mysql /etc/ha.d/resource.d/mysqld (4)测试heartbeat [iyunv@Mysql_1~]# /etc/rc.d/init.d/heartbeat status heartbeatOK [pid 1254 et al] is running on mysql_1 [mysql_1]... [iyunv@Mysql_1~] ip addr|grep eth1 inet 10.0.0.101/24 brd 10.0.0.255 scopeglobal eth0 inet 10.0.0.110/24 brd 10.0.0.255 scopeglobal secondary eth0:0
(5)设置开机启动DRBD HeartBeat Mysql 设置DRBD启动脚本:chkconfig: - 70 08 设置HeartBeat启动脚本:chkconfig: - 75 05 设置Mysql启动脚本:chkconfig mysql off 由于要启动HeartBeat前要先启动DRBD,本方法利用了服务的开机和关机优先值进行设置,数字越小优先权越高,这样设置可以达到先开机启动BDRB的目的,关闭先关闭HeartBeat,这个正是我们想要的。其实这里默认就可以,官方已经给我们想好了。这里mysql不启动,由HeartBeat进行控制 也可以另外写脚本来实现
5、模拟故障测试(这里就不详细演示) (1)停掉主节点的heartheat看看是否能正常切换。 (2)启动主节点的heartbeat看看是否能正常切换回来。 (3)停掉主节点的网络或者直接将master系统shutdown,看看能否正常切换。 (4)重新启动主节点看看能否切换正常。 (5)停掉主节点上的mysql,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)。 (6)停掉主节点上的drbd,看看是否切换(因为heartheat不检查服务的可用性,因此需要通过而外的脚本来实现)
|