• 2 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之MySql的搭建


    preface

    上一节我们讲了DRBD的原理,以及如何部署DRBD,那么现在在上一节的基础上部署Mysql

    安装并启动Mysql

    为了方便,我一般采用yum安装Mysql。命令如下:
    在172.16.22.81和172.16.22.136上安装

    [root@dbmaster81 ~]# yum -y install mysql mysql-server mysql-devel mysql-test mysql-bench
    

    然后在172.16.22.81上挂载datadir(使用的DRBD的drbd0)

    [root@dbmaster81 ~]# service  drbd status
    drbd driver loaded OK; device status:
    version: 8.4.7-1 (api:1/proto:86-101)
    GIT-hash: 3a6a769340ef93b1ba2792c6461250790795db49 build by mockbuild@Build64R6, 2016-01-12 13:27:11
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C     # 首先确保drbd目前是primary状态,如果不是,运行drbdadm primary r0=
    [root@dbmaster81 ~]# mount /dev/drbd0 /database/
    [root@dbmaster81 ~]# mkdir /database/mysql
    [root@dbmaster81 ~]# cp -Rp /var/lib/mysql/ /database/mysql/   # 复制数据库文件的时候,要保持mysql数据库文件的属组属主属性。
    [root@dbmaster81 ~]# chown -R mysql.mysql /database/mysql/  # 确保属于mysql用户
    [root@dbmaster81 ~]# vim /etc/my.cnf 
    datadir=/database/mysql
    [root@dbmaster81 ~]# ln -s /etc/init.d/mysqld /etc/ha.d/resource.d/mysqld  # 用于heartbeat管理mysqld。
    

    修改配置文件
    两个db服务器一定要一模一样的配置除了server-id

    [root@dbmaster81 ~]# cat /etc/my.cnf 
    [mysqld]
    datadir=/database/mysql/        # 这里使用drbd的挂载的目录
    socket=/var/lib/mysql/mysql.sock
    user=mysql
    server-id=1          # server-id必须不一样。
    log-bin          # 开启二进制日志。
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    [mysqld_safe]
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    

    启动mysql服务
    只在172.16.22.81上启动,172.16.22.136的不起,因为没有挂载数据库datadir。

    [root@dbmaster81 ~]# service  mysqld start
    MySQL Daemon failed to start.
    Starting mysqld:                                           [FAILED]  
    

    卧槽,什么情况,启动失败啊?查看下mysql日志,发现

    [root@dbmaster81 ~]# cat /var/log/mysqld.log 
    /usr/libexec/mysqld: Table 'mysql.plugin' doesn't exist
    161121 14:45:35 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
    161121 14:45:36 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
    161121 14:45:36 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
    

    因为我之前第一次启动的时候datadir是/var/lib/mysql,更改配置文件后,重新启动时找不到对应 库文件,虽然我已经把/var/lib/mysql/* 复制到了/database/mysql下面

    解决方法就是重新执行mysql_install_db来解决问题。

    [root@dbmaster81 ~]# mysql_install_db --user=mysql
    

    Mysql主从配置

    Mysql的复制是异步复制,即从一个Mysql实例或者端口(成为master)复制到另一个Mysql实例或者端口(成为slave)。复制操作有3个进程实现的,其中两个进程(Sql进程和IO进程)在Slave上,另一个进程在master(binlog dump)上。
    要向实现复制,必须打开Master端的log-bin功能,这是因为整个复制实际上是slave从Master端获取该更新操作的日志,将其传输到本地并写到本地文件中,然后在读取本地内容执行日志中所记录的更新操作。如图所示:
    image

    不同版本Mysql二进制日志在某些语句上有些差别,因此最好是Master和Slave的Mysql版本相同。或者Master版本不高于Slave版本。

    下面就开始配置Mysql-master

    1. Master开启二进制日志并且创建同步需要的账户
    修改/etc/my.cnf配置文件

    [root@dbmaster81 ~]# vim /etc/my.cnf 
    [mysqld]
    server-id=1     # 与slave不能相同。
    log-bin
    [root@dbmaster81 ~]# service  mysqld restart
    [root@dbmaster81 ~]# mysql -uroot -p   # 登陆mysql后授权
    mysql> grant replication slave on *.* to 'rep'@'172.16.22.0/24' identified by '123456';      # 授权给专门用来主从复制的用户
    mysql> flush privileges;
    

    2. Master备份数据库
    首先要进行锁表,防止打包数据的时候还有数据写入:

    mysql> flush tables with read lock; #锁表不要退出这个终端,在其他终端完成下面的打包和scp的动作。
    mysql> reset master;
    [root@dbmaster81 mysql]# cd /database/mysql
    [root@dbmaster81 mysql]# tar zcvf mysqlsql`date +%F`.tar.gz ib* mysql* test/  #直接打包文件,也可以选择通过mysqldump导出数据库。
    [root@dbmaster81 mysql]# scp mysqlsql2016-11-21.tar.gz root@172.16.22.134:/var/lib/mysql/
    [root@dbmaster81 mysql]# scp mysqlsql2016-11-21.tar.gz root@172.16.22.142:/var/lib/mysql/
    [root@dbmaster81 mysql]# scp mysqlsql2016-11-21.tar.gz root@172.16.22.136:/var/lib/mysql/
    mysql> unlock tables;
    

    查看master状态:

    mysql> show master status;
    +-------------------+----------+--------------+------------------+
    | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +-------------------+----------+--------------+------------------+
    | mysqld-bin.000001 |      106 |              |                  |
    +-------------------+----------+--------------+------------------+
    

    3. 设置slave主机

    1. 安装好mysql-server
    [root@dbrepslave134 ~]# yum -y install mysql mysql-server mysql-devel mysql-test mysql-bench
    
    1. 然后把解压数据库文件到/etc/my.cnf指定的datadir目录下
    [root@dbrepslave134 mysql]# tar zxf mysqlsql2016-11-21.tar.gz 
    
    1. 配置mysql,启动数据库
    [root@dbrepslave134 mysql]# vim /etc/my.cnf 
    [mysqld]
    server-id = 4
    
    [root@dbrepslave134 mysql]# service  mysqld start
    Starting mysqld:                                           [  OK  ]
    
    1. 做slave与master同步的动作。
    [root@dbrepslave134 mysql]# mysql -uroot -p -e "change master to master_host='172.16.22.81',master_user='rep',master_password='123456',master_log_file='mysqld-bin.000001',master_log_pos=106;"   
    [root@dbrepslave134 mysql]#  mysql -uroot -p -e "start slave ;"
    

    需要说的是:此时先和DRBD Primary(172.16.22.81)连接,因为还没搭建heartbeat服务,所以没有VIP,等下面我们搭建好heartbeat的时候,就连接VIP

    1. 确认同步状态
    [root@dbrepslave134 mysql]# mysql -uroot -p -e "show slave statusG;"
    Enter password: 
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 172.16.22.81
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysqld-bin.000001
              Read_Master_Log_Pos: 106
                   Relay_Log_File: mysqld-relay-bin.000003
                    Relay_Log_Pos: 252
            Relay_Master_Log_File: mysqld-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    

    注意 Slave_IO_Running和Slave_SQL_Running:,如都是显示yes,那么说明同步正确。

    注意的问题

    1. 如果在my.cnf中定义了log-bin,relay-log参数,那么要保证这些定义与主机名无关,因为如果这两类log的文件名和主机名有关,切换过程会导致slave主机不能够继续同步,例如可以如下设置:
    log-bin = mysql-bin
    relay-log = mysql-relay-bin
    

    保证两台主机上两个文件的名字一样。
    2. 最好把my.cnf文件也放入DRBD分区的数据目录中,这样进行配置更改时,另一台也保持同步,避免由于修改配置文件导致后配置不一样。要把my.cnf文件放入DRBD分区的数据目录中,需要修改/etc/init.d/mysqld启动脚本中my.cnf文件的路径。
    3. 如果不是通过rpm安装的mysql,那么自己要写一个mysql的启动脚本,脚本能够接受start,stop,status三个参数。默认heartbeat采用LSB(linux standard base)风格。返回值包含OK或者running则表示资源正常。返回值表示stopped或者No表示资源不正常。
    4. 不要设置mysqld在机器重启动时自动启动,mysqld服务作为heartbeat的一项资源会统一管理。

  • 相关阅读:
    区块链中的随机数 nonce
    SaaS(软件即服务)、PaaS(平台即服务)、IaaS(基础架构即服务)、BaaS(区块链即服务)
    程序插桩简介
    侧链技术
    闪电/雷电网络
    Ubuntu16.04安装/升级openssl到1.1版本
    Ubuntu16.04升级Python3及其pip3并切换为默认版本
    Python——/usr/bin/env: ‘python(3) ’: No such file or directory
    TCP通信功能 (agent功能)
    gin框架web操作数据库
  • 原文地址:https://www.cnblogs.com/liaojiafa/p/6118705.html
Copyright © 2020-2023  润新知