zoukankan      html  css  js  c++  java
  • Mysql+keepalived双主

    搭建环境说明:

    master1:192.168.175.210   主
    
    master2:192.168.175.211

    keepalived的vip: 192.168.175.11(注意这是虚拟IP,无需存在这台主机,只要保证这个ip是没有人用的即可)

    一、MySQL数据库安装(两台主机都要操作)

    本次笔者是在Centos7上安装的是mysql的,如果有其他需求可以自行下载。

    1、下载安装包,如果下载不了请自己到官网下载相匹配的rpm,我下载的不需要安装其他依赖,如果去官网下载可能要安装一些依赖包,依次安装即可。这种形式安装后是通过生成yum源的形式,然后通过yum形式安装。

    wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

    2、安装mysql源

    yum -y localinstall mysql57-community-release-el7-11.noarch.rpm

    3、mysql安装

    yum -y install mysql-community-server

    在安装mysql时有较多的东西需要安装,稍等片刻即可。

    4、启动mysql

    启动前请关闭selinux,有两种方式关闭

    方式一,临时关闭,下次开机启动后会重启

    setenforce 0

    方式二、永久关闭,通过设置配置文件的方式,将 SELINUX改为disabled的形式,如下:

    vim /etc/selinux/config

     

    开始启动mysql服务:

    systemctl start mysqld

    可以将其设置为开机启动:

    [root@localhost ~]# systemctl enable mysqld
    [root@localhost ~]# systemctl daemon-reload

    登入mysql,注意第一次登入需要先找到mysql的root用户的密码,一般情况下root用户密码存放在/var/log/mysqld.log下,如果不在该目录下可以通过 find / -name mysqld.log查找该文件

    我的是在该目录下,所以直接查看:

    [root@localhost ~]# vi /var/log/mysqld.log
    mysql -uroot -p
    

    输入密码即可登入。

    二、关于备份数据库问题。

    mysql的双机高热,需要对那些需要备份的数据库的数据进行同步,所以需要我们先将主库的数据进行数据同步,如果是两个新建的数据库进行数据备份,无需做这一步 。不过笔者听别人说

    可以不进行同步,可以指定到具体位置就可以实现自动同步,但是这种情况笔者认为,对应数据库的高可用这方面是行不通的。假设其中一台机器宕机,另一台机器进行服务的时候就会因为

    数据的不同步而出现问题,所以笔者认为还是有必要进行数据同步的。

    一般情况下数据库备份分为多种,有压缩文件的形式,有直接写sql文件的形式,若想了解这方面的情况,可以自行在网上搜索,笔者在这里就不进行整理。

    第一步:锁定数据库,防止有新的数据进行写入,造成数据不完全同步。所以一般情况下,如果是在公司搭建,会在下班时间进行搭建。(192.168.175.210操作)

    mysql>flush tables with read lock; 

    第二步:将需要同步的数据库进行sql文件输出。

    mysqldump -uroot -p --databases test1 test2 test3>master.sql

    这时会在当前目录下创建一个master.sql文件,当然也可以指定路径,不过如果仅仅是用一次,同步完毕删除即可。

    第三步:生成的sql文件远程复制到备份机上,随意指定

    scp master.sql master2_mysql:/tmp/

    第四步:在备份机上进行数据同步(192.168.175.211)操作

    mysql -uroot -p <back.sql

    第五步:检查一下,看看在备份机上有没有数据,如果有数据同步完成。

    三、数据库热备

    数据库热备的定义在这里就不进行赘述,网上有很多这方面的原理解读。这里采用的是通过记录数据库操作,备份数据库读取这些操作,从而达到热备的效果。

    第一步:分别在两个数据库中创建用于备份是时的用户并授权

    在192.168.175.210上进行操作:

    mysql>create user 'replicate'@'192.168.175.211' identified by 'qwe123';   # 192.168.175.211是备份机的ip
    Query OK, 0 rows affected (0.09 sec)
    mysql
    >grant replication slave on *.* to 'replicate'@'192.168.175.211';
    Query OK, 0 rows affected (0.09 sec)
    mysql
    >flush privileges;
    Query OK, 0 rows affected (0.09 sec)

    在192.168.175.211上进行操作:

    mysql>create user 'replicate'@'192.168.175.210' identified by 'qwe123';   # 192.168.175.211是备份机的ip
    Query OK, 0 rows affected (0.09 sec)
    
    mysql>grant replication slave on *.* to 'replicate'@'192.168.175.210';
    Query OK, 0 rows affected (0.09 sec)
    
    mysql>flush privileges; 
    Query OK, 0 rows affected (0.09 sec)

    分别在两台主机上用备份用户进行访问

    # 在192.168.175.210 (操作)
    mysql -h192.168.175.211 -ureplicate -pqwe123
    
    # 在192.168.175.211 (操作)
    mysql -h192.168.175.210 -ureplicate -pqwe123

    如果都能够进入mysql 说明操作成功

    第二步:配置数据库的配置文件

    一般情况下,mysql的配置文件路径是在 /etc/my.cnf  如果你的没有可以用  find / -name my.cnf  的方式查找, 如果查不到,可以查看/usr/share/mysql目录下的.cnf文件,应该是mysql开头,对其负责一份到/etc/下,并改名为my.cnf即可。

    注意:在修改my.cnf之前,先对其进行备份,不要直接修改

    cp my.cnf my.cnf.bak

    第三步:修改数据库配置(注意这了的配置是关于热备的主要配置,其他数据库配置需要自己添加)

    在192.168.175.210上配置

    vim /etc/my.cnf
    [mysqld]
    server-id=1 # 唯一id
    innodb_flush_log_at_trx_commit=2  # 默认为1,防止数据丢失
    log-bin=mysql-bin-1    #binlog日志文件名(可以任意命名)
    binlog-do-db=test # 记录日志的数据库(如果没有此项,表示同步所有的库)
    binlog-ignore-db=mysql     # 不需要同步的数据库
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys log
    -slave-updates=ON relay_log=mysql-relay-bin slave_skip_errors=1062 # 跳过1062错误 auto_increment_increment=2 auto_increment_offset=1
    # 注意
    # bind_address = 127.0.0.1 若在配置文件中有这一项,需要将其注释,不然在同步数据时,的连接数据库情况会出错

    在192.168.175.211上配置:

    vim /etc/my.cnf
    [mysqld]
    server-id=2 # 唯一id
    innodb_flush_log_at_trx_commit=2  # 默认为1,防止数据丢失
    log-bin=mysql-bin-2   #binlog日志文件名(可以任意命名)
    binlog-do-db=test # 记录日志的数据库(如果没有此项,表示同步所有的库)
    binlog-ignore-db=mysql     # 不需要同步的数据库
    binlog-ignore-db=information_schema
    binlog-ignore-db=performance_schema
    binlog-ignore-db=sys
    log-slave-updates=ON
    relay_log
    =mysql-relay-bin
    slave_skip_errors
    =1062 # 跳过1062错误 auto_increment_increment=1 auto_increment_offset=1
    # 注意
    # bind_address = 127.0.0.1 若在配置文件中有这一项,需要将其注释,不然在同步数据时,的连接数据库情况会出错

    第四步:重启数据库,主备都需要重启

    systemctl restart mysqld 或 service mysqld restart

    第五步:登入数据库查看状态

    在192.168.175.210上登入数据库,执行操作

    mysql> show master statusG;
    *************************** 1. row ***************************
                File: mysql-bin-1.00001   # 记住这个值,后面有用
            Position: 154                 # 记住这个值,后面有用
        Binlog_Do_DB: test
    Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    ERROR: 
    No query specified

    在192.168.175.211上登入数据库,执行操作

    mysql> show master statusG;
    *************************** 1. row ***************************
                File: mysql-bin-2.00001   # 记住这个值,后面有用
            Position: 154                 # 记住这个值,后面有用
        Binlog_Do_DB: test
    Binlog_Ignore_DB:mysql,information_schema,performance_schema,sys
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    ERROR: 
    No query specified

    在192.168.175.210上登入数据库,执行操作

    mysql>unlock tables;  # 必须执行,否则就会报错
    Query OK, 0 rows affected (0.09 sec)
    mysql>stop slave; # 停止slave服务线程
    mysql>change master to
    mysql>master_host='192.168.175.211', # 备用ip
    mysql>master_user='replicate', # 前面创建的user
    mysql>master_password='qwe123', # 密码
    mysql>master_log_file='mysql-bin-2.000001', # show master 上得出
    mysql>master_log_pos=154;
    mysql>start slave;    # 重启线程

    在192.168.175.211上登入数据库,执行操作

    mysql>unlock tables;  # 必须执行,否则就会报错
    Query OK, 0 rows affected (0.09 sec)
    mysql>stop slave;     # 停止slave服务线程
    mysql>change master to
    mysql>master_host='192.168.175.210',  # 备用ip
    mysql>master_user='replicate',                # 前面创建的user
    mysql>master_password='qwe123',        # 密码
    mysql>master_log_file='mysql-bin-1.000001', # show master 上得出
    mysql>master_log_pos=154;   
    mysql>start slave;    # 重启线程

    第七步:show slave statusG查看状态

    两台机器上都执行:

    show slave statusG;

    若如下都为两个yes则标识热备成功,有时可能出现一个是connecting状态,可以稍等片刻。如长时间不为yes,则检查防火墙,主要问题可能就是数据库连接问题。如有其它情况可以查看日志进行解决。

    四、keepalived原理及安装

      keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

    虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

      keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。vrrp模块是来实现VRRP协议的。

      这里仅仅是对keepalived进行了一个简单的介绍,方便大家理解,若需要深入了解,可以参考官方文档。

    五、keepalived的安装和配置

    第一步:依赖安装

    yum install -y openssl-devel
    yum install -y libnfnetlink-devel
    yum install -y libnl libnl-devel
    yum install -y ipvsadm

    第二步:keepalived安装

    cd /usr/local/src/
    wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
    tar -zvxf keepalived-1.3.5.tar.gz
    cd keepalived-1.3.5
    ./configure --prefix=/usr/local/keepalived
    make && make install
    cp /usr/local/src/keepalived-1.3.5/keepalived/etc/init.d/keepalived /etc/rc.d/init.d/
    cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
    mkdir /etc/keepalived/
    cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
    cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
    echo "/etc/init.d/keepalived start" >> /etc/rc.local

    复制配置文件:

    [root@master1 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    [root@master1 ~]# vim /etc/keepalived/keepalived.conf 

    keepalived两台机器都得安装:

    第三步:修改配置文件

    在192.168.175.210上编辑

    ! Configuration: command not found
    global_defs {  # 全局配置,关于邮箱的问题
    notification_email {
    wallace.wang@tbs.cn
    }
    
    notification_email_from wallace.wang@tbs.cn
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id MASTER-HA
    }
    vrrp_instance HA_2 {
        state MASTER     # 设置主节点的标识
        interface em1    # 设置实例绑定的网卡
        virtual_router_id 51   # 唯一标识id主从必须一致
        priority 101     # 优先级 这个和下面的权重结合使用
        advert_int 1
        nopreempt        # 非抢占式,在主节点上不需要设置
        authentication { # 主从必须一致
            auth_type PASS    # 认证方式
            auth_pass 1111      # 认证密码
        }
        virtual_ipaddress {
        192.168.175.11     # 虚拟的ip
        }
    }
    
    virtual_server 192.168.175.11 3306 {
         delay_loop 2
         lb_algo wrr   # lvs调度算法 有rr|wrr|lc|wlc|lblc|sh|dh等
         lb_kind DR    # 负载均衡转发规则NAT|DR|RUN
         persistence_timeout 60  # 从新连接的时间
         protocol TCP              # 协议名称
         real_server 192.168.175.210 3306 { # 真实的ip地址
             weight 3   # 权重
             notify_down /opt/script/chk_mysql.sh  # 检测脚本
             TCP_CHECK {
                 connect_timeout 10   # 连接时长
                 nb_get_retry 3       # 重复次数
                 delay_before_retry 3 # 
                 connect_port 3306

    在192.168.175.211上编辑

    ! Configuration: command not found
    global_defs {  # 全局配置,关于邮箱的问题
    notification_email {
    wallace.wang@tbs.cn
    }
    
    notification_email_from wallace.wang@tbs.cn
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id MASTER-HA
    }
    vrrp_instance HA_2 {
        state BACKUP    # 设置从节点的标识
        interface em1    # 设置实例绑定的网卡
        virtual_router_id 51   # 唯一标识id主从必须一致
        priority 101     # 优先级 这个和下面的权重结合使用
        advert_int 1
        nopreempt        # 非抢占式,在主节点上不需要设置
        authentication { # 主从必须一致
            auth_type PASS    # 认证方式
            auth_pass 1111      # 认证密码
        }
        virtual_ipaddress {
        192.168.175.11     # 虚拟的ip
        }
    }
    
    virtual_server 192.168.175.11 3306 {
         delay_loop 2
         #lb_algo wrr   # 这里在从节点上不需要设置否则会出现从节点无法连接上vip的情况
         #lb_kind DR    # 这里也无需设置
         persistence_timeout 60  # 从新连接的时间
         protocol TCP              # 协议名称
         real_server 192.168.175.211 3306 { # 真实的ip地址
             weight 3   # 权重
             notify_down /opt/script/chk_mysql.sh  # 检测脚本
             TCP_CHECK {
                 connect_timeout 10   # 连接时长
                 nb_get_retry 3       # 重复次数
                 delay_before_retry 3 # 
                 connect_port 3306

    第四步:编写chk_mysql.sh脚本

    vim /opt/script/chk_mysql.sh
    #!/bin/bash
    killall keepalived

    第五步:启动keepalived

    两台机器通过ip addr的形式查看一下:我的主节点在210上,所以这里会多一个虚拟ip 

     

    到这里为止所有的配置就已经完成,老铁们可以进行测试了。在测试之前先创建一个账号,这个账号对外有权限:

    分别在两个数据库上进行创建:

    grant all on *.* to test@'%' identified by "qwe123";
    flush privileges;

    然后通过这个进行测试:

    mysql -h 192.168.175.11 -utest -pqwe123

    注意在高可用这一点上,若通过虚拟IP 进行连接时,主节点宕机,在连接从节点时可能会需要几秒钟的时间,可以设置连接次数解决。其实keepalived和mysql热备无关,所以不用担心数据缺失的问题。

    关于priority 和weight的权重选择问题可以看一下下面的连接文章。

    https://blog.csdn.net/hzsunshine/article/details/62041036

    最后希望大家帮忙点个赞和添加关注,小编会继续写一下通俗易懂的文章来和大家一起分享,最后送大家一句话:当你的能力撑不起你的野心时,就安静下来学习吧!!!!!!!!!!

  • 相关阅读:
    2020.12.15
    2020.12.14
    2020.12.13
    2020.12.11
    2020.12.10
    语音合成标记语言(SSML)
    Skyline查询
    win10 VMware 安装 Linux 虚拟机
    图像梯度计算
    Harris Corner Detection
  • 原文地址:https://www.cnblogs.com/tashanzhishi/p/10006705.html
Copyright © 2011-2022 走看看