Linux DRBD集群

Linux DRBD
    存储的类型:
        DAS:direct Attached Storage
            IED,USB,STAT,SCSI,SAS
        NAS:Network Attached Storage
            传输速度慢
        SAN:Storage Area Network
            价格比较贵 
    DRBD:Distributed Replicated Block Device,分布式复制块设备;
        工作于内核中,跨主机的,基于软件实现的,非共享模式的,通过基于网络的镜像方式进行数据同步的块级别的存储设备;
        工作过程:当我们要存数据时,会向内核发起系统调用,通过进程调度器进行调度以后加载相应的文件系统驱动程序,然后就可以获得磁盘上的数据了;DRBD就是在系统调用和驱动程序之间插了一脚,当有写相关的系统调用时,信号到达DRBD以后,会将数据分成两份,其中一份用来调用本机的相关驱动程序,而另一份会通过网卡设备发送到其他DRBD设备,其他DRBD设备通过网卡接收到以后,就会将数据交给自己的DRBD模块,然后由这个模块来讲数据写到自己本机的磁盘中,这个过程就像数据在两个主机之间复制一样;
        DRBD特性:
            实时镜像
            对用户透明
            可以基于同步或异步模式进行工作
        DRBD的三种模式:
            DRBD有三种模式用来确定数据是否已经同步到其他DRBD设备中;其中A模式是:由DRBD模块将数据发送到本机的网卡队列中就认为已经同步到其他DRBD设备中;B模式是:数据到达其他DRBD主机的网卡接收队列时,就认为已经同步到其他DRBD设备中;C模式是:数据到达其他DRBD设备的磁盘中时,才认为已经同步到其他DRBD设备中;
            其中A为异步模式,性能最好,但是可靠性比较差;B为半同步模式,性能和可靠性居中;C为同步模式,性能比较差,但是可靠性最高;
        DRBD设备一般为主从模式,同时只有一台DRBD设备可以读写数据相应的服务进程也只能在同一台主机上运行;
 


        Disk Scheduler(磁盘调度器)实现的功能是将同一方向的操作(比如读和写就使不同方向),合并在一起然后统一进行操作,这样可以增加性能;
        DRBD只是内核中的一段代码,就像iptables一样,如果想使用它就需要对其进行配置,所以我们一会儿会用到相应的客户端软件来完成具体配置;
        工具:
            drbdadm:对用户友好的配置工具;
        DRBD一般都会与集群一起使用,每组DRBD设备都由“drbd resourse”进行定义:
            Resource name:资源名称,使用ASCII命令,且必须唯一;
            DRBD device:DRBD专有的设备文件/dev/drbd#,且主设备号(major)一般为147,次设备号从零开始依次递增;
            Disk configuration:磁盘配置,各个主机上用于组成此drbd设备的磁盘或分区;且磁盘或分区大小应该相同;
            Network configuration:网络配置,DRBD设备是通过网络接口来进行数据同步的,所以为了避免其占用太多的带宽导致其他数据拥塞,所以一般会对其带宽进行限制,并且定义其什么时候同步以及如何同步 ;
        配置案例:关闭防火墙,(iptables -F)
            配置前提:时间同步,基于主机名访问
            安装软件包:
                vim /etc/yum.repos.d/drbd.repo
                    [drbd]
                    name=drbd
                    baseurl=https://elrepo.org/linux/elrepo/el6/x86_64/
                    enabled=1
                    gpgcheck=0
                yum install kmod-drbd84 drbd84-utils
            配置文件:
                /etc/drbd.conf
                /etc/drbd.d/global_common.conf
                    global { }:为全局配置属性,定义DRBD自己的工作特性;
                    common{ }:为通用属性,定义多组DRBD设备通用特性;
                    *.res:资源特有的配置;
            配置过程:
                iptables -F
                fdisk /dev/sdb
                    在各个设备上分别创建一个大小相同的磁盘分区,分区过程略!
                openssl rand -base64 16    生成随机数,作为配置文件中消息校验的密钥;
                vim /etc/drbd.d/global_common.conf
                    disk {
                        on-io-error     detach;  当磁盘IO发生错误时就将其拆除;
                        resync-rate       512M;   设置数据同步速率;
                    }
                    net {
                        cram-hmac-alg "sha1";   做消息校验时使用的算法;
                        shared-secret "c6O0ughi37L8DQoav9DNRA==";  算法所使用的密钥;
                    }
                vim /etc/drbd.d/mystore.res     添加DRBD设备资源;
                    resource mystore {   指定资源名称
                        device /dev/drbd0;   指定drbd设备
                        disk /dev/sdb1;    指定作为drbd设备的分区,根据分区不同,可能会有变化;
                        meta-disk internal;  指定元数据存储在本地磁盘
                        on clone1 {
                            address 192.168.80.131:7789;  指定节点地址
                        }
                        on clone2 {
                            address 192.168.80.134:7789;
                        }
                    }
                scp /etc/drbd.d/* root@clone2:/etc/drbd.d/   将本机的drbd配置文件复制到其他drbd设备上一份;
                drbdadm create-md mystore  使用drbdadm创建drbd设备;
                service drbd start
                cat /proc/drbd
                    version: 8.4.11-1 (api:1/proto:86-101)
                    GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36
                     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:5253020
                    根据输出结果可以得知:现在都是从节点,没有主节点,ds:Inconsistent/Inconsistent表示两个drbd设备中的数据还没有按位对齐;
                drbdadm primary --force mystore   设置本节点为主节点
                cat /proc/drbd
                    version: 8.4.11-1 (api:1/proto:86-101)
                    GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36
                     0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
                    ns:678748 nr:0 dw:0 dr:680608 al:0 bm:0 lo:0 pe:1 ua:2 ap:0 ep:1 wo:f oos:4575132
                    [=>..................] sync'ed: 13.1% (4464/5128)M
                    finish: 0:01:54 speed: 39,872 (39,872) K/sec
                    输出信息显示:已经区分主从节点,并且正在进行数据同步更新;
                    version: 8.4.11-1 (api:1/proto:86-101)
                    GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36
                     0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
                    ns:5253020 nr:0 dw:0 dr:5253692 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
                    上面信息是数据同步完成以后的内容;
                mkfs.ext4 /dev/drbd0
                mount /dev/drbd0 /media/
                cp /etc/issue /media/
                umount /media
                drbdadm secondary mystore   将自己从主节点降为从节点
                drbd-overview    查看DRBD状态
            切换到另一个节点:
                drbdadm primary mystore   将自己从从节点升为主节点
                drbd-overview    查看DRBD状态
                mount /dev/drbd0 /media/
                ls /media/  查看是否有之前复制到DRBD设备中的issue文件
                    Note:这两个文件可不是同一个文件,而是镜像的两个独立的文件;
                Note:因为演示的是主从模式所以DRBD文件系统同时只能让主节点挂载使用,从节点无法进行任何操作;一般主主模式只在集群中使用;
                更多的配置信息可以通过man drbd.conf来查看;
        集群中实现DRBD primary节点故障以后自动切换到从节点,继续通过存储服务:
            当主节点故障以后,从节点将自己升级为主节点,然后在自己本身启动之前的那个主节点上的那个进行写操作的进程;这个过程可以通过pacemaker来自动实现;下面将以mysql为例进行说明;
            service corosync start
            crm(live)ra# info ocf:linbit:drbd   查看集群中配置drbd的帮助信息
                    drbd_resource:指定DRBD设备名
                    start           timeout=240
                    reload          timeout=30
                    promote        timeout=90   DRBD从secondary到primary
                    demote         timeout=90   DRBD从primary到secondary
                    notify           timeout=90
                    stop            timeout=100
                    monitor_Slave    timeout=20 interval=20  相当于secondary
                    monitor_Master  timeout=20 interval=10  相当于primary
            在集群中设置主从资源时,需要首先定义一个primitive资源,然后对这个primitive进行clone,就可以出现多份资源了;并且在定义DRBD资源时还要设置一些meta信息(比如:一共克隆几份,每个节点上能运行几份克隆资源,几主几从等):
                clone-max:设置克隆的最大数量
                clone-node-max:设置单个节点上克隆资源的最大数量
                master-max:设置主资源的最大数量
                master-node-max:设置单个节点上主资源的最大数量
            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
                设置primitive资源
            crm(live)# ms ms_mystor mystor meta clone-max="2" clone-node-max="1" master-max="1" master-node-max="1" notify="true"
                设置clone资源
            crm(live)configure# verify
            crm(live)configure# commit
            crm(live)# status
                2 nodes configured (2 expected votes)
                2 resources configured
                Online: [ clone1 clone2 ]
                Full list of resources:
                 Master/Slave Set: ms_mystor [mystor]
                     Masters: [ clone2 ]
                     Slaves: [ clone1 ]
                资源已经启动
            [root@clone2 ~]# drbd-overview 
                NOTE: drbd-overview will be deprecated soon.
                Please consider using drbdtop.
                 0:mystore/0  Connected Primary/Secondary UpToDate/UpToDate
            现在DRBD可以通过集群自动完成节点之间主从切换了,接下来就是使其自动挂载文件系统了;
            crm(live)configure# primitive mydata ocf:heartbeat:Filesystem params device="/dev/drbd0" directory="/MYDRBD" fstype="ext4" op monitor interval=20s timeout=40s op start timeout=60s op stop timeout=60s
                添加一个文件系统资源
            crm(live)configure# colocation mydata_with_ms_mytor_master  inf: mydata ms_mystor:Master
                配置文件系统资源依赖主从资源中的MASTER节点
            crm(live)configure# order ms_mystor_master_then_mydata Mandatory: ms_mystor:promote mydata:start
                配置当DRBD设备节点故障发生资源转移到其他节点时,首先完成DRBD从节点的提权(也就是从secondary到primary)然后再挂在文件系统;
            crm(live)configure# verify
            crm(live)configure# commit
            crm(live)# status
                2 nodes configured (2 expected votes)
                3 resources configured
                Online: [ clone1 clone2 ]
                Full list of resources:
                 Master/Slave Set: ms_mystor [mystor]
                     Masters: [ clone2 ]
                     Slaves: [ clone1 ]
                 mydata    (ocf::heartbeat:Filesystem):    Started clone2
            crm(live)# node standby clone2
            crm(live)# status
                2 nodes configured (2 expected votes)
                3 resources configured
                Node clone2: standby
                Online: [ clone1 ]
                Full list of resources:
                 Master/Slave Set: ms_mystor [mystor]
                     Masters: [ clone1 ]
                     Stopped: [ clone2 ]
                 mydata    (ocf::heartbeat:Filesystem):    Started clone1
            crm(live)# node online clone2
        Note:这个集群搭建完成以后,就算手动误操作将主节点上的DRBD设备服务停掉(service drbd stop),从节点也会顶替主节点继续提供服务;停掉以后建议的操作是:首先查看DRBD的状态(drbd-overview),如果状态没有发生错误(Secondary/Primary)直接执行 crm node clearstate node_name,将节点的错误信息清理一下即可,防止节点信息错乱发生更复杂的问题;如果发生了更严重的错误(状态为Secondary/Unknown或Primary/Unknown),则可以查看下面的错误总结进行修复;
        接下来是将mariabd加入集群中:
            当前为主节点的主机:clone1
            yum install mysql
            groupadd -r -g 306 mysql
            useradd -r -u 306 -g mysql mysql
            mkdir /MYDRBD/data
            chown -R mysql:mysql /MYDRBD/data/
            tar xf mariadb-5.5.62-linux-x86_64.tar.gz -C /usr/local/
            cd /usr/local/
            ln -sv mariadb-5.5.62-linux-x86_64/ mysql
            cd mysql/
            chown -R root.mysql ./*
            scripts/mysql_install_db --user=mysql --datadir=/MYDRBD/data/
            ls /MYDRBD/data/
            cp support-files/mysql.server /etc/init.d/mysqld
            chkconfig --add mysqld 
            chkconfig mysqld off
            mkdir /etc/mysql
            mv /etc/my.cnf /etc/my.cnf.bak
            cp support-files/my-large.cnf /etc/mysql/my.cnf
            vim /etc/mysql/my.cnf
                datadir = /MYDRBD/data/
                innodb_file_per_table = on
                skip_name_resolve = on
            service mysqld start
            mysql
                mysql>GRANT ALL ON *.* TO 'root'@'192.168.80.%' IDENTIFIED BY 'guowei';
                mysql> FLUSH PRIVILEGES;
            service mysqld stop
            crm node standby  将自己将为从节点
            scp -r /etc/mysql/ root@clone2:/etc/
            当前为主节点的主机:clone2
            yum install mysql
            groupadd -r -g 306 mysql
            useradd -r -u 306 -g mysql mysql
            mkdir /MYDRBD/data
            chown -R mysql:mysql /MYDRBD/data/
            tar xf mariadb-5.5.62-linux-x86_64.tar.gz -C /usr/local/
            cd /usr/local/
            ln -sv mariadb-5.5.62-linux-x86_64/ mysql
            cd mysql/
            chown -R root.mysql ./*
            cp support-files/mysql.server /etc/init.d/mysqld
            chkconfig --add mysqld 
            chkconfig mysqld off
            mkdir /etc/mysql
            mv /etc/my.cnf /etc/my.cnf.bak
            service mysqld start
            mysql
                mysql> CREATE DATABASE TESTDB;  创建了一个名为TESTDB的数据库;
                mysql> SHOW DATABASES;  
            以上配置:mariadb已经共享存储数据库了!
            接下来在集群中添加一个mysql资源:
                crm(live)configure# primitive myip ocf:heartbeat:IPaddr params ip="192.168.80.12" op monitor interval=10s timeout=20s
                    添加一个ip资源,使之作为被外部主机访问的IP地址
                crm(live)configure# primitive myserver lsb:mysqld op monitor interval=20s timeout=20s
                    添加一个msqld资源
                crm(live)configure# colocation myip_with_ms_mystor_master inf: myip ms_mystor:Master
                    设置一个排列约束,使ip地址与DRBD主设备在一起
                crm(live)configure# colocation myserver_with_mydata inf: myserver mydata
                    设置一个排列约束,使mysql和被挂载的文件系统在一起
                crm(live)configure# order mydata_then_myserver Mandatory: mydata myserver
                    设置一个顺序约束,先挂载文件系统,然后再启动mysqld
                crm(live)configure# order myip_then_myserver Mandatory: myip myserver
                    设置一个顺序约束,先设置ip地址,然后再启动mysqld
                crm(live)configure# verify
                crm(live)configure# commit
                    crm(live)# status
                        2 nodes configured (2 expected votes)
                        5 resources configured
                        Online: [ clone1 clone2 ]
                        Full list of resources:
                         Master/Slave Set: ms_mystor [mystor]
                             Masters: [ clone2 ]
                             Slaves: [ clone1 ]
                         mydata    (ocf::heartbeat:Filesystem):    Started clone2
                         myip    (ocf::heartbeat:IPaddr):    Started clone2
                         myserver    (lsb:mysqld):    Started clone2
            大体情况就是:IP地址和被挂载的文件系统会先启动(其中DRBD设备的提权会在挂载文件系统之前),然后启动mysqld;文件系统资源和IP地址会跟DRBD主节点在一起,mysqld服务会跟文件系统资源在一起,当然也就跟DRBD主节点在一起啦!
                mysql -uroot -h192.168.80.12 -p    进入mysql,查看之前创建的数据库TESTDB是否还在;
        错误总结:
            主节点信息:
            [root@clone1 ~]# drbd-overview 
                NOTE: drbd-overview will be deprecated soon.
                Please consider using drbdtop.
                0:mystore/0  StandAlone Primary/Unknown UpToDate/DUnknown /MYDRBD ext4 4.9G 11M 4.6G 1%
            从节点信息:
            [root@clone2 ~]# service drbd status
                drbd driver loaded OK; device status:
                version: 8.4.11-1 (api:1/proto:86-101)
                GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@Build64R6, 2018-09-28 19:18:36
m:res      cs          ro                 ds                 p       mounted  fstype
                0:mystore  StandAlone  Secondary/Unknown  UpToDate/DUnknown  r-----
                本端无法识别对端的DRBD设备时,可以通过重新构建元数据的方式,事双方重新同步数据;
            解决办法:
                从节点操作:
                [root@clone2 ~]# service drbd  stop
                [root@clone2 ~]# drbdadm create-md mystore
                [root@clone2 ~]# drbd-overview
                    NOTE: drbd-overview will be deprecated soon.
                    Please consider using drbdtop.
                     0:mystore/0  SyncTarget Secondary/Secondary Inconsistent/UpToDate 
                        [>....................] sync'ed:  4.9% (4884/5128)M  
                    接下来等待数据同步完成就好停止,然后再进行上面的初始化;
                Note:最好是在先将各个集群节点定
更多信息请查看官网:http://clusterlabs.org/pacemaker/doc/en-US/Pacemaker/2.0/html-single/Pacemaker_Explained/index.html
 

   注:根据马哥视频做的学习笔记,如有错误,欢迎指正;侵删;

原文地址:https://www.cnblogs.com/guowei-Linux/p/11072864.html