设为首页 收藏本站
查看: 254|回复: 0

[经验分享] 基于drbd的mariaDB 的高可用集群

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-6-4 08:39:11 | 显示全部楼层 |阅读模式

Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。

数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)

DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。

在DRBD中,资源是特指某复制的存储设备的所有方面。包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信).

每个资源有个角色,是Primary或Secondary,下面简称“主”和“备”.

主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。

备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。角色可以改变的;

配置drdb:

确保2个节点的时间必须同步:
# ntpdate 172.16.0.1  (两个节点保持一致)

1)所有节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,
需要保证两个节点上的/etc/hosts文件均为下面的内容:
172.16.8.100   node1.blue.com node1
172.16.8.101   node2.blue.com node2

为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:
NODE1:172.16.8.100
# vim /etc/sysconfig/network
HOSTNAME=node1.blue.com
# hostname node1.blue.com
NODE2:172.16.8.101
# vim /etc/sysconfig/network
HOSTNAME=node2.blue.com
# hostname node2.blue.com

2)设定两个节点可以基于密钥进行ssh通信,这可以通过类似如下的命令实现:
Node1:172.16.8.100
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node2

Node2:172.16.8.101
# ssh-keygen -t rsa
# ssh-copy-id -i ~/.ssh/id_rsa.pub root@node1

NODE1:
配置corosync,(以下命令在node1.magedu.com上执行)
# yum install corosync pacemaker -y :NODE2 做一样的操作;
# rpm -ql corosync  查看生成了那些文件;
# cd /etc/corosync
# ls
# cp corosync.conf.example corosync.conf
# vim corosync.conf
修改:
secauth:on
并设定此配置文件中 bindnetaddr后面的IP地址为你的网卡所在网络的网络地址
bindnetaddr:172.16.0.0  
mcastaddr:239.123.321.99   不要使用默认地址就行;
mcastport: 5405  监听端口;
to_syslog: no

service {
ver: 0版本号
name: pacemaker
# use_mgmtd: yes(有没有这一项都可以)
}
aisexec {可以不用指定,不是关键信息
user: root
group: root
}

生成节点间通信时用到的认证密钥文件:
# corosync-keygen(如果密钥不够,可以下载rpm包来增加密钥的数量)
将Node1:corosync和authkey复制至node2:
# scp -p corosync authkey  node2:/etc/corosync/
NODE2 上进行验证即可, # ll /etc/corosync/
分别为两个节点创建corosync生成的日志所在的目录:
# mkdir /var/log/cluster
# ssh node2  'mkdir /var/log/cluster'

启动corosync(以下命令在node1上执行):
# service corosync start; ssh node2 'service corosync start'
# ss -tnul  5405 的多播地址被打开了;
# cd /var/log/cluster
# ls
# tail -f corosync.log  时时查看 日志信息;
查看corosync引擎是否正常启动:
# grep -e "Corosync Cluster Engine" -e "configuration file" /var/log/cluster/corosync.log

查看初始化成员节点通知是否正常发出:
# grep  TOTEM  /var/log/cluster/corosync.log

检查启动过程中是否有错误产生。下面的错误信息表示packmaker不久之后将不再作为corosync的插件运行,因此,建议使用cman作为集群基础架构服务;此处可安全忽略。
# grep ERROR: /var/log/cluster/corosync.log | grep -v unpack_resources

查看pacemaker是否正常启动:
# grep pcmk_startup /var/log/cluster/corosync.log
安装crmsh
# cd
# lftp 172.16.0.1/pub
# cd Sources/6.x86_64/corosync> mget crmsh-2.1-1.6.x86_64.rpm
# cd Sources/6.x86_64/crmsh> mget pssh-2.3.1-2.e16.x86_64.rpm

# yum --nogpgcheck localinstall crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm

节点二 也做安装即可;
# scp crmsh-2.1-1.6.x86_64.rpm pssh-2.3.1-4.1.x86_64.rpm node2:/root
# crm   是一个模式化shell
crm(live)# help
crm(live)# help status  查看命令的用法;

如果安装了crmsh,可使用如下命令查看集群节点的启动状态:
[iyunv@node1 ~]# crm status
Last updated: Sun May 31 15:35:28 2015
Last change: Sun May 31 13:35:35 2015
Stack: classic openais (with plugin)
Current DC: node1.blue.com - partition with quorum
Version: 1.1.11-97629de
2 Nodes configured, 2 expected votes
0 Resources configured

Online: [ node1.blue.com node2.blue.com ]
从上面的信息可以看出两个节点都已经正常启动,并且集群已经处于正常工作状态。
配置集群的工作属性,禁用stonith  (node1 域 node2 要做相同的步骤)

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

我们里可以通过如下命令先禁用stonith:
# crm configure property stonith-enabled=false
或者
# crm
crm(live)# configure
crm(live)configure# property stonith-enabled=false
crm(live)configure# show
node node1.blue.com \
attributes standby=off
node node2.blue.com \
attributes standby=off
property cib-bootstrap-options: \
dc-version=1.1.11-97629de \
cluster-infrastructure="classic openais (with plugin)" \
expected-quorum-votes=2 \
stonith-enabled=false

安装:DRBD:
[iyunv@node1 ~]# lftp 172.16.0.1/pub
cd ok, cwd=/pub                                 
lftp 172.16.0.1:/pub> cd Sources/6.x86_64/drbd/

lftp172.16.0.1:/pub/Sources/6.x86_64/drbd>mget kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm
lftp 172.16.0.1:/pub/Sources/6.x86_64/drbd> bye

# scp drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm node2:/root

在两个主机上准备好,2个磁盘设备;并做成drbd,大小要保持一致;
# fdisk /dev/sda
p   n   p  3  +5G  w

# partx -a /dev/sda
# partx -a /dev/sda
BLKPG: Device or resource busy
error adding partition 3

# rpm -ivh kmod-drbd84-8.4.5-504.1.el6.x86_64.rpm drbd84-utils-8.9.1-1.el6.elrepo.x86_64.rpm

# scp kmod-drbd84-8.4.5-504.1.e16.x86_64.rmp drbd84-utils-8.9.1-1.e16.elrepo.x86_64.rpm node2:/root/

NODE2 与上完成一样的步骤;
# rpm -qa | grep drbd
# rpm -ql drbd84-utils-8.9.1-1.e16.elrepo

# rpm -ql kmod-drbd84-8.4.5-504.1.e16

# vim /etc/drbd.conf

# cd /etc/drbd.d/

# vim /etc/drbd.d/global_common.conf
修改为:
usage-count no; {是否参加用户体验调查,一般NO}

disk {
on-io-error detach;
# fencing resource-only;
}

net {
cram-hmac-alg "sha1";
shared-secret "mydrbdlab";  [可以使用openss-random 来生成随机密钥]
}

syncer {
rate 500M;
}

# vim mystore.res定义MYSQL 数据库同步;定义一个资源;
resource mystore {
device    /dev/drbd0;
disk      /dev/sda3;
meta-disk internal;
on node1.blue.com {
address   172.16.8.100:7789;
}
on node2.blue.com {
address   172.16.8.101:7789;
}

# scp -r /etc/drbd.* node2:/etc/

NODE2:进行验证;
# cd /etc/drbd.d/   
# ll
验证完成;

初始化资源,在Node1和Node2上分别执行:
# drbdadm create-md mystore2个节点都进行;

# service drbd start启动服务;(2个节点同时进行);

此时都是Secondary:
[iyunv@node1 ~]# cat /proc/drbd
version: 8.4.5 (api:1/proto:86-101)
GIT-hash: 1d360bde0e095d495786eaeb2a1ac76888e4db96 build by root@node1.magedu.com, 2015-01-02 12:06:20
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:5252056

也可以使用drbd-overview命令来查看:
[iyunv@node1 ~]# drbd-overview
0:mystore/0  Connected Secondary/Secondary Inconsistent/Inconsistent


从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
Node1:
# drbdadm primary --force mystore

此时两个节点在同步数据:
[iyunv@node1 drbd.d]# drbd-overview
0:mystore/0  SyncSource Primary/Secondary UpToDate/Inconsistent
[>....................] sync'ed:  1.1% (5080/5128)M

Node2:
[iyunv@node2 drbd.d]# drbd-overview
0:mystore/0  SyncTarget Secondary/Primary Inconsistent/UpToDate
[=========>..........] sync'ed: 53.1% (2408/5128)M

方法二:
  注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
     # drbdadm -- --overwrite-data-of-peer primary mystore

创建文件系统:所有的操作,只能在主节点上进行;
文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
# mke2fs -t ext4 /dev/drbd0
# mkdir /mydata
# mount /dev/drbd0 /mydata
# cd /mydata
# ls
# cp /etc/issue ./

把对方变为主节点,自己变成从节点
# cd
# umount /dev/drbd0

把自己降为从服务器;
# drbdadm secondary mystore把自己变成从节点;

# drbd-overview  现在双方都是从节点;

NODE2:变成主节点;
# drbdadm primary mystore  把自己提升为 主节点;

[iyunv@node2 drbd.d]# mkdir /mydata
[iyunv@node2 drbd.d]# mount /dev/drbd0 /mydata
[iyunv@node2 drbd.d]# cd /mydata
[iyunv@node2 mydata]# ls
issue  lost+foundissue   ←这里会显示之前,NODE1复制的 文件;
# cp /etc/fstab ./

切换为从节点NODE2:
# umount /dev/drbd0
# drbdadm secondary mystore
[iyunv@node2 ~]# drbd-overview
0:mystore/0  Connected Secondary/Secondary UpToDate/UpToDate

NODE1:升级为主:
[iyunv@node1 ~]# drbdadm primary mystore
[iyunv@node1 ~]# mount /dev/drbd /mnt
mount: you must specify the filesystem type
[iyunv@node1 ~]# mount /dev/drbd0 /mnt
[iyunv@node1 ~]# cd /mnt/
[iyunv@node1 mnt]# ls
fstab  issue  lost+found

此时 fstab 文件存在!
此时文件都同步了,按位对齐的;

drbd + pacemaker   mysql 的实现;
应该先降级后,在停止服务的;
NODE1:
[iyunv@node1 mnt]# cd
[iyunv@node1 ~]# umount /dev/drbd0
[iyunv@node1 ~]# service drbd stop

# chkconfig drbd off

NODE2:
# service drbd stop
# drbd-overview
# chkconfig drbd off

将drbd 配置为corosync 可用的资源; 要使用(特殊的克隆类型,主从类型)克隆资源来使用了;
NODE1:# crm status
# crm
crm(live)# configure
crm(live)configure# primitive mystor ocf:linbit:drbd params drbd_resource="mystore"
op monitor role="Master" interval=10s timeout=20s
op monitor role="Slave" interval=20s timeout=20s
op start timeout=240s op stop timeout=100s

crm(live)configure# ms ms_mystor mystor meta clone-max="2" clone-node-max="1"
master-max="1" master-node-max="1" notify="ture"

crm(live)configure# verify
crm(live)configure# commit

crm(live)configure# cd

crm(live)# status  此时就正常启动了
Masters:[node1.magedu.com]
Slave:[node2.magedu.com]


# crm node standby
# crm status
Masters:[node2.magedu.com]
Stopped:[node1.magedu.com]

NODE2: 自动提升了状态;

# crm node online
Slave:[node1.magedu.com]就变成 从服务了;

还是把Node1变成主服务:
NODE2: # crm node standby
Masters:[node1.magedu.com]
Stopped:[node2.magedu.com]
变成从服务:# crm node online
# crm status
Masters:[node1.magedu.com]
Slave:[node2.magedu.com]

定义一个文件系统资源:
# mkdir /mydataNODE2也一样;

crm(live)configure# delete mydata
crm(live)configure# primitive mydata ocf:heartbeat:Filesystem params
device="/dev/drbd0" directory="/mydata" fstype="ext4"
op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s

crm(live)configure# verify

定义约束:
crm(live)configure# colocation mydata_with_ms_mystor_master inf: mydata ms_mystor:Master
顺序约束:
crm(live)configure# order mydata_after_ms_mystor_master Mandatory: ms_mystor:promote mydata:start
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status

NODE1: # mount
/dev/drbd0 on /mydata type ext4 (rw)


构建成 mariaDB 的高可用集群:
那个节点是主节点就在那个节点上配置: 切记!!!
Node1:
安装配置mariaDB;
# lftp 172.16.0.1/pub
> cd Source/source/mariaDB mget mariadb-5.5.43-linux-x86_64.tar.gz
> bye
# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local

# cd /usr/local/

# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql

# mkdir /mydata/data -pv

# chown -R mysql.mysql /mydata/data
# ll /mydata/data

# ln -sv mariadb-5.5.43-linux-x86_64 mysql

# cd mysql
# ll
# chown -R root.mysql ./*

# scripts/mysql_install_db --user=mysql --datadir=/mydata/data

# ls /mydata/data查看初始化数据是否存在;

# cp support-files/mysql.server /etc/rc.d/init.d/mysqld

# chkconfig --add mysqld
# chkconfig mysqld off

# mkdir /etc/mysql

# cp support-files/my-large.cnf /etc/mysql/my.cnf

# vim /etc/mysql/my.cnf
添加内容为:
datadir = /mydata/data
innodb_file_per_table = on
skip_name_resolve = on

# service mysqld start

# /usr/local/mysql/bin/mysql

> GRANT ALL ON *.* TO 'root'@'172.16.%.%' IDENTIFIED BY 'mageedu';
> FLUSH PRIVILEGES;
> quit

# service mysqld stop


切换主节点为Node2: 来安装mariaDB;
# crm node standby
# crm node online  主要是,把NODE2切换为主节点;
# crm status

Node2: # mkdir /etc/mysql/
Node1:# scp /etc/mysql/my.cnf node2:/etc/mysql

Node2安装mariaDB:
# groupadd -r -g 306 mysql
# useradd -r -g 306 -u 306 mysql

# lftp 172.16.0.1/pub
> cd Source/source/mariaDB mget mariadb-5.5.43-linux-x86_64.tar.gz
> bye

# mkdir /etc/mysql

# ll /mydata/data/

# tar xf mariadb-5.5.43-linux-x86_64.tar.gz -C /usr/local

# cd /usr/local

# ln -sv mariadb-5.5.43-linux-x86_64 mysql

# cd mysql
# ll
# chown -R root.mysql ./*
# ll

# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld off

# service mysqld start

# /usr/local/mysql/bin/mysql

> CREATE DATABASE testdb;
> SHOW DATABASES;
> exit

# service mysqld stop

切换主节点为Node1:
# crm node standby
# crm node online
# crm status

Node1:
# service mysqld start
# /usr/local/mysql/bin/mysql
> SHOW DATABASES;
查看刚刚在NODE2上创建的 testdb 是否存在;存在,说明2者访问的数据库是同一个;
# service mysqld stop

把mysql 定义为高可用集群的资源;文件系统挂载在哪了,mysql就必须运行在哪里;

NODE1:
# crm
crm(live)# configure
crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip='172.16.8.200' op monitor interval=10s timeout=20s

crm(live)configure# verify
crm(live)configure# primitive myserver lsb:mysqld op monitor interval=20s timeout=20s
crm(live)configure# verify

crm(live)configure# colocation myip_with_ms_mystor_master inf: myip ms_mystor:Master
crm(live)configure# colocation myserver_with_mydata inf: myserver mydata
crm(live)configure# show
crm(live)configure# order myserver_after_mydata Mandatory: mydata:start myserver:start
crm(live)configure# show
crm(live)configure# order myserver_after_myip Mandatory: myip:start myserver:start
crm(live)configure# verify
crm(live)configure# commit
crm(live)configure# cd
crm(live)# status



客户端测试Mysql:
# yum install -y mysql

# mysql -uroot -p -h 172.16.8.200

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| testdb             |
+--------------------+
5 rows in set (0.02 sec)


之前在Node2上创建的testdb表还是存在的;

让NODE1成为备节点:
# crm node standby
# crm status

# crm node online

此时客户端访问MYSQL 依然正常;
Node2:# ip addr show
172.16.8.200 已经启动起来了;
# crm node standby
# crm node online

NODE1 成为主节点:
# ip addr show  
172.16.100.27 已经启动了;

客户端访问mariadb 服务依然能够正常使用;

此时基于drbd的mariaDB 的高可用集群 已经搭建完成!!


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-73674-1-1.html 上篇帖子: corosync/pacemaker, 实现高可用的MariaDB 下篇帖子: Linux集群之corosync+pacemaker实现MySQL高可用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表