• 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
     

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

  • 相关阅读:
    meta_value与meta_value_num的区别(排序)
    B:Wordpress不同分类调用不同的模板
    C:Wordpress自定义文章类型(图视频)
    D:Wordpress_AFC插件常用代码
    A:手把手教Wordpress仿站(基础)
    JS之Form表单相关操作
    PHP常用代码汇总
    mysql_fetch_array,mysql_fetch_row,mysql_fetch_assoc区别
    数据库、数据库表的创建与删除
    Android实现智能提示的文本输入框AutoCompleteTextView
  • 原文地址:https://www.cnblogs.com/guowei-Linux/p/11072864.html
Copyright © 2020-2023  润新知