当前位置:Gxlcms > 数据库问题 > 基于drbd的mariaDB 的高可用集群

基于drbd的mariaDB 的高可用集群

时间:2021-07-01 10:21:17 帮助过:10人阅读

镜像块设备内容的存储复制解决方案。

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

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,可使用如下命令查看集群节点的启动状态:

[root@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:

[root@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:

[root@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命令来查看:

[root@node1 ~]# drbd-overview 

 0:mystore/0  Connected Secondary/Secondary Inconsistent/Inconsistent 

 

 

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

Node1:

# drbdadm primary --force mystore

 

此时两个节点在同步数据:

[root@node1 drbd.d]# drbd-overview 

 0:mystore/0  SyncSource Primary/Secondary UpToDate/Inconsistent 

[>....................] sync‘ed:  1.1% (5080/5128)M

 

Node2:

[root@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  把自己提升为 主节点;

 

[root@node2 drbd.d]# mkdir /mydata

[root@node2 drbd.d]# mount /dev/drbd0 /mydata

[root@node2 drbd.d]# cd /mydata

[root@node2 mydata]# ls

issue  lost+foundissue   这里会显示之前,NODE1复制的 文件;

# cp /etc/fstab ./


切换为从节点NODE2:

# umount /dev/drbd0

# drbdadm secondary mystore

[root@node2 ~]# drbd-overview 

 0:mystore/0  Connected Secondary/Secondary UpToDate/UpToDate 


NODE1:升级为主:

[root@node1 ~]# drbdadm primary mystore

[root@node1 ~]# mount /dev/drbd /mnt

mount: you must specify the filesystem type

[root@node1 ~]# mount /dev/drbd0 /mnt

[root@node1 ~]# cd /mnt/

[root@node1 mnt]# ls

fstab  issue  lost+found

 

此时 fstab 文件存在!

此时文件都同步了,按位对齐的;

 

drbd + pacemaker   mysql 的实现;

应该先降级后,在停止服务的;

NODE1:

[root@node1 mnt]# cd

[root@node1 ~]# umount /dev/drbd0

[root@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<

人气教程排行