概念
环境准备
两个控制节点
host: controller1
IP: 192.168.0.20
host: controller2
IP: 192.168.0.21
hosts文件
分别在controller1和controller2节点的hosts文件中添加如下
192.168.0.20 controller1
192.168.0.21 controller2
ssh互信
在controller1节点执行如下
# ssh-keygen -t rsa -P ''
# ssh-copy-id -i /root/.ssh/id_rsa.pub controller2
在controller2节点执行如下
# ssh-keygen -t rsa -P ''
# ssh-copy-id -i /root/.ssh/id_rsa.pub controller1
时间同步
# apt-get install ntp
安装和配置 corosync+pacemaker
安装 corosync+pacemaker
# apt-get install pacemaker
# apt-get install corosync
配置 corosync+pacemaker
配置文件两个
配置文件:/etc/corosync/corosync.conf
# /etc/corosync/corosync.conf
totem { #心跳信息传递层
version: 2 #版本
secauth: on #认证信息 一般on
threads: 0 #线程
interface { #定义心跳信息传递的接口
ringnumber: 0
bindnetaddr: 172.16.0.0 #绑定的网络地址,写网络地址
mcastaddr: 226.94.1.1 #多播地址
mcastport: 5405 #多播的端口
ttl: 1 #生存周期
}
}
logging { #日志
fileline: off
to_stderr: no #是否输出在屏幕上
to_logfile: yes #定义自己的日志
to_syslog: no #是否由syslog记录日志
logfile: /var/log/cluster/corosync.log #日志文件的存放路径
debug: off
timestamp: on #时间戳是否关闭
logger_subsys {
subsys: AMF
debug: off
}
}
amf {
mode: disabled
}
service {
ver: 0
name: pacemaker # pacemaker作为corosync的插件进行工作
}
aisexec {
user: root
group: root
}
把节点controller1的配置文件copy到controller2中
# scp /etc/corosync/corosync.conf controller2:/etc/corosync/
认证文件
节点controller1上的操作
# corosync-keygen
注意:
Corosync Cluster Engine Authentication key generator.
Gathering 1024 bits for key from /dev/random.
Press keys on your keyboard to generate entropy (bits = 152).
遇到这个情况,表示电脑的随机数不够,各位朋友可以不停的随便敲键盘,或者安装软件也可以生成随机数
把认证文件也复制到controller2主机上
# scp /etc/corosync/authkey controller2:/etc/corosync/
开启服务和查看集群中的节点信息 (在controller1和controller2上的操作)
开启集群
# service corosync start
查看集群状态
# crm status
注意:
如果启动corosync时无反应也不报错,修改/etc/default/corosync文件,把START=no改为START=yes
安装和配置drbd
安装drbd
# apt-get install drbd8-utils
注意:
在 ubuntu 14.04 下运行 service drbd start 很可能会出现如下错误.
node already registered
* Starting DRBD resources
DRBD module version: 8.4.5
userland version: 8.4.4
you should upgrade your drbd tools!
这是由于 linux 内核版本升级到, 而于自带的 drbd 软件不兼容导致的. 可以通过 ppa 来安装第三方提供的高版本的 drbd 解决, 命令如下:
# apt-get install -y python-software-properties
# add-apt-repository ppa:icamargo/drbd
# apt-get update
# apt-get install -y drbd8-utils
之后应该就可以启动 drbd 了
# service drbd start
配置drbd
配置文件两个
全局配置文件: /etc/drbd.d/global_common.conf
资源配置文件: /etc/drbd.d/mydata.res (没有需要自己创建)
全局配置文件: /etc/drbd.d/global_common.conf
# /etc/drbd.d/global_common.conf
global {
usage-count no; # 是否参加DRBD使用者统计,默认是yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C; # DRBD支持三种协议,默认是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/drbd/crm-fence-peer.sh";
# split-brain "/usr/lib/drbd/notify-split-brain.sh root";
# out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
# before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
# after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
}
startup {
#wfc-timeout 120; # 启动时连接其他节点的超时时间
#degr-wfc-timeout 120;
}
disk {
on-io-error detach; # 当磁盘有错误时,不连接
#fencing resource-only;
}
net {
cram-hmac-alg "sha1"; # 该选项可以用来指定HMAC算法来启用对等节点授权。drbd强烈建议启用对等节点授权机制。可以指定/proc/crypto文件中识别的任一算法。必须在此指定算法,以明确启用对等节点授权机制。
shared-secret "mydrbdlab"; # 该选项用来设定在对待节点授权中使用的密码,最长64个字符
}
syncer {
rate 1000M; # 设置主备节点同步时的网络速率最大值
}
}
资源配置文件: /etc/drbd.d/mydata.res
# /etc/drbd.d/mydata.res
resource mydata { # 资源组的名称,mydata
on controller1 { # 节点主机名
device /dev/drbd0; # 今后使用的设备
disk /dev/sda3; # # 该节点上的用于存放数据的分区号,配置的先前已经创建的分区,sda3修改为创建的分区
address 192.168.0.20:7789; # 该节点的IP地址
meta-disk internal; # meta data信息存放的方式
}
on controller2 { # 节点主机名
device /dev/drbd0; # 今后使用的设备
disk /dev/sda3; # # 该节点上的用于存放数据的分区号,配置的先前已经创建的分区,sda3修改为创建的分区
address 192.168.0.21:7789; # 该节点的IP地址
meta-disk internal; # meta data信息存放的方式
}
}
在controller1节点上操作
创建drbd的资源
# drbdadm create-md mydata # mydata前面创建的资源组名称
(如果出现如下错误:
md_offset21467942912
al_offset21467910144
bm_offset21467254784
Foundext3 filesystem
20964792kB data area apparently used
20964116kB left usable by current configuration
Devicesize would be truncated, which
wouldcorrupt data and result in’access beyond end of device’ errors.
You needto either
useexternal meta data (recommended)
shrinkthat filesystem first
zeroout the device (destroy the filesystem)
Operationrefused.
Command ‘drbdmeta 1 v08 /dev/sdb1 internal create-md’terminated with exit code 40
drbdadm create-md r0exited with code 40 )
执行如下命令:
# dd if=/dev/zero bs=1M count=1of=/dev/sdb1;sync
再次执行drbdadm create-md r0看到success则表示成功。
启动服务
# service drbd start
在controller2节点上操作
创建drbd的资源
# drbdadm create-md mydata # mydata前面创建的资源组名称
启动服务
# service drbd start
在controller1上执行,设置controller1为drbd的主节点
# drbdadm primary --force mydata
在controller2上执行,设置controller2为drbd的备用节点
# drbdadm secondary mydata #把此节点改为drbd的备用节点
查看同步进度
# cat /proc/drbd
此命令可以动态的查看同步进度
# watch -n1 'cat /proc/drbd'
在controller1上,格式化drdb分区并挂载drbd的分区
格式化分区
# mke2fs -t ext4 /dev/drbd0
创建挂载的文件
# mkdir /mnt/mysqldata
挂载文件
# mount /dev/drbd0 /mnt/mysqldata
修改文件权限
# chown -R mysql:mysql /mnt/mysqldata/
安装和配置mysql
安装(同时在controller1和controller2上执行)
# apt-get install mysql-server
配置(同时在controller1和controller2上执行)
配置文件两个
/etc/mysql/my.cnf
vim /etc/apparmor.d/usr.sbin.mysqld
配置文件/etc/mysql/my.cnf
datadir 目录指向预挂载 drbd0目录
# /etc/mysql/my.cnf
... ...
datadir = /mnt/mysqldata/data
... ...
配置文件 vim /etc/apparmor.d/usr.sbin.mysqld
#/var/lib/mysql/ r,行修改为如下
/mnt/mysqldata/data/ r,
#/var/lib/mysql/** rwk,,行修改为如下
/mnt/mysqldata/data/** rwk,
初始化mysql数据库(只在controller1上执行)
# /usr/bin/mysql_install_db --user=mysql --datadir=/mnt/mysqldata/data/ --basedir=/usr
启动mysql数据库(只在controller1上执行)
# service mysql start
设置mysql管理员密码(只在controller1上执行)
# /usr/bin/mysqladmin -u root password 'root'
整体测试
由以上步骤可以得到mysql数据库在controller1节点上可以正常运行,现在关闭controller1上的数据库,将启动controller2上的数据库。
在controller1上执行如下
停止controller1上的数据库
# service mysql stop
卸载drbd0的挂载点
# umount /dev/drbd0
将controller1改为备用节点
# drbdadm secondary mydata
在controller2上执行
将controller2改为主节点
# drbdadm primary mydata
创建挂载的文件
# mkdir /mnt/mysqldata
挂载文件
# mount /dev/drbd0 /mnt/mysqldata
修改文件权限
# chown -R mysql:mysql /mnt/mysqldata/
开启controller2上的mysql数据库
# service mysql start
进入数据库,查看是否一样
# mysql -uroot -proot
> show databases;