美文网首页
Mysql二进制安装及双主高可用部署

Mysql二进制安装及双主高可用部署

作者: 杨丶子 | 来源:发表于2020-11-03 19:32 被阅读0次

    ** MySQL官网:https://dev.mysql.com/downloads/mysql/**
    到mysql官网下载mysql编译好的二进制安装包,在下载页面Select Platform:选项选择linux-generic,然后把页面拉到底部,64位系统下载Linux - Generic (glibc 2.5) (x86, 64-bit),32位系统下载Linux - Generic (glibc 2.5) (x86, 32-bit)

    版本根据需要自主选择

    安装前准备:

    1.先检查Linux中是否存在mysql rpm -qa|grep mysql
    2:如果存在,请先执行卸载命令:rpm -e --nodeps mysql-libs --nodeps代表:可能其他地方有依赖mysql,这里强制卸载
    3:检查各个mysql文件夹是否删除干净

    find / -name mysql
    结果如下:
    /var/lib/mysql
    /usr/local/mysql
    /usr/lib/mysql
    /usr/include/mysql
    命令删除:
    rm -fr /usr/lib/mysql
    rm -fr /usr/include/mysql
    注意:卸载后/var/lib/mysql中的数据及/etc/my.cnf不会删除,如果确定没用后就手工删除
    rm -f /etc/my.cnf
    rm -fr /var/lib/mysql
    删除mysql用户及用户组
    userdel mysql
    groupdel mysql

    4:纯净服务器则不需要

    MySQL正式安装和相关设置(这里以mysql5.7.32为例)

    1.创建压缩包目录
    mkdir /data/soft
    2.上传压缩包到linux
    cd /data/soft
    --下载安装包 
    --建议:在windows上使用迅雷下载,速度很快(我的是1M/s),然后用工具(Xftp)上传到 /data/software
    或者yum install -y lrzsz   rz命令直接拉   再或者在目录下;
    wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.32-linux-glibc2.5-x86_64.tar.gz
    
    3.解压压缩包到目标位置
    解压压缩包:
    tar -xzvf /data/software/mysql-5.7.32-linux-glibc2.5-x86_64.tar.gz
    --移动并修改文件名
    mv /data/software/mysql-5.7.32-linux-glibc2.5-x86_64 /usr/local/mysql
    4.创建数据仓库目录,存储文件
     mkdir /data/mysql         
    5.创建用户及用户组
    # 用户组
    groupadd mysql
    # 用户 (用户名/密码)
    useradd -g mysql mysql
    #授权
    chown -R mysql.mysql /usr/local/mysql/或   chown -R mysql        chgrp -R mysql 
    chown -R mysql /data/mysql/
    5.初始化数据库
    查看当前所在目录
    pwd 若显示/usr/local/mysql-8.0,请继续执行,否则请先进入此目录/usr/local/mysql
    初始化 注意查看是否存在相关目录,若不存在,请新建
    bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql
    

    此处需要注意记录生成的临时密码,上文结尾处的:YLi>7ecpe;YP 登录mysql要用到

    Mysql配置

    以下按需配置:
    vim /etc/my.cnf
    [client]
    port = 3306
    socket = /tmp/mysql.sock
    [mysqld]
    #Mysql服务的唯一编号 每个mysql服务Id需唯一
    server-id = 1
    #服务端口号 默认3306
    port = 3306
    #mysql安装根目录
    basedir = /usr/local/mysql                             不是这个安装目录,则需要修改
    #mysql数据文件所在位置
    datadir = /data/mysql                                    不是这个存储目录,则需要修改
    #pid
    pid-file = /usr/local/mysql/mysql.pid
    #设置socke文件所在目录
    socket = /tmp/mysql.sock
    #设置临时目录
    tmpdir = /tmp
    # 用户
    user = mysql
    # 允许访问的IP网段
    bind-address = 0.0.0.0
    # 跳过密码登录
    #skip-grant-tables
    #主要用于MyISAM存储引擎,如果多台服务器连接一个数据库则建议注释下面内容
    skip-external-locking
    #只能用IP地址检查客户端的登录,不用主机名
    skip_name_resolve = 1
    #事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
    transaction_isolation = READ-COMMITTED
    #数据库默认字符集,主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
    character-set-server = utf8mb4
    #数据库字符集对应一些排序等规则,注意要和character-set-server对应
    collation-server = utf8mb4_general_ci
    #设置client连接mysql时的字符集,防止乱码
    init_connect='SET NAMES utf8mb4'
    #是否对sql语句大小写敏感,1表示不敏感
    lower_case_table_names = 1
    #最大连接数
    max_connections = 400
    #最大错误连接数
    max_connect_errors = 1000
    #TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
    explicit_defaults_for_timestamp = true
    #SQL数据包发送的大小,如果有BLOB对象建议修改成1G
    max_allowed_packet = 128M
    #MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
    #MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
    interactive_timeout = 1800
    wait_timeout = 1800
    #内部内存临时表的最大值 ,设置成128M。
    #比如大数据量的group by ,order by时可能用到临时表,
    #超过了这个值将写入磁盘,系统IO压力增大
    tmp_table_size = 134217728
    max_heap_table_size = 134217728
    #禁用mysql的缓存查询结果集功能
    #后期根据业务情况测试决定是否开启
    #大部分情况下关闭下面两项
    query_cache_size = 0
    query_cache_type = 0
    #数据库错误日志文件
    log_error = /data/mysql/error.log                           不是这个存储目录,需要修改
    #慢查询sql日志设置
    slow_query_log = 1
    slow_query_log_file = slow.log
    #检查未使用到索引的sql
    log_queries_not_using_indexes = 1
    #针对log_queries_not_using_indexes开启后,记录慢sql的频次、每分钟记录的条数
    log_throttle_queries_not_using_indexes = 5
    #作为从库时生效,从库复制中如何有慢sql也将被记录
    log_slow_slave_statements = 1
    #慢查询执行的秒数,必须达到此值可被记录
    long_query_time = 8
    #检索的行数必须达到此值才可被记为慢查询
    min_examined_row_limit = 100
    #mysql binlog日志文件保存的过期时间,过期后自动删除
    expire_logs_days = 5
    

    建立MySQL服务

    cd /usr/local/mysql
    chmod +x /etc/init.d/mysql 
    chkconfig --add mysql
    # 检查服务是否生效  
    chkconfig --list mysql
    
    pwd
    /usr/local/mysql
    cp -a ./support-files/mysql.server /etc/init.d/mysql
    

    启动Mysql服务

    systemctl start mysql
    --登陆
    
    mysql -hlocalhost -uroot -p
    --如果出现:-bash: mysql: command not found
    --就执行:  ln -s /usr/local/mysql/bin/mysql /usr/bin --没有出现就不用执行
    

    系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,会找不到mysql的相关命令,我们需要做的就是映射一个链接到/usr/bin目录下,相当于建立一个链接文件,首先得知道mysql命令或mysqladmin命令的完整路径,比如mysql的路径是:/usr/local/mysql/bin/mysql,我们则可以这样执行命令ln -s /usr/local/mysql/bin/mysql /usr/bin

    --输入第6步生成的临时密码

    --修改密码

    mysql> set password=password('要修改的密码');
    # 如果想要所有主机都可访问,把localhost改成%
    alter user 'root'@'localhost' identified with mysql_native_password by '密码';        只能在本地登录,
    #设置root账户的host地址(修改了才可以远程连接)
    mysql>grant all privileges on *.* to 'root'@'%' identified by '密码';                          可以远程
    #这里表示赋予该用户所有数据库所有表(*.*表示所有表),%表示所有IP地址。
    # 刷新
    flush privileges;
    

    开启mysql binlog 日志记录

    binlog日志,即binary log,是二进制日志文件。它有两个作用,一是增量备份,即只备份新增的内容;二是用于主从复制等,即主节点维护了一个binlog日志文件,从节点从binlog中同步数据。我们可以通过binlog日志恢复数据。下面就介绍一下开启MySQL binlog日志的过程:

    1、登录MySQL,查看binlog日志的状态
    登录MySQL后,输入 ** show variables like '%log_bin%';**查看到binlog日志为OFF关闭状态;

    image.png image

    2、开启MySQL binlog日志

    使用vi编辑器修改MySQL的my.cnf配置文件

    vim /etc/my.cnf
    server_id=2
     #log日志文件存放位置
    log_bin = /var/bin/mysql/mysql-bin 
    binlog_format = ROW
    expire_logs_days = 30
    
    注意:每次服务器(数据库)重启,服务器会调用flush logs;,新创建一个binlog日志
    进入上面配置的日志存储位置查看日志:
    cd /data/mysql
    ls
    
    image.png
    以上mysql安装已完成

    下面开始MySQL高可用双主实现

    系统 IP 主机名 服务
    Centos 7.6 192.168.100.2 mysql1 MySQL+keepalived
    Centos 7.6 192.168.100.3 mysql2 MySQL+keepalived

    开启二进制日志及中继日志

    主机mysql1配置文件如下:
    [root@mysql1 ~]# cat /etc/my.cnf 
    [mysqld]
    basedir=/usr/local/mysql
    datadir=/data/mysql
    port=3306
    server_id=1          #server_id必须唯一
    socket=/tmp/mysql.sock
    log-error=/data/mysql/error.log
    log-bin=/data/mysql/log_bin            #指定二进制日志文件
    relay-log=/data/mysql/relay-bin        #指定中继日志
    relay-log-index=relay-bin.index
    auto_increment_increment=2
    auto_increment_offset=1
     
    ######主机mysql2配置文件如下:
    [root@mysql2 ~]# cat /etc/my.cnf 
    [mysqld]
    basedir=/usr/local/mysql
    datadir=/usr/local/mysql/data
    port=3306
    server_id=2 
    socket=/usr/local/mysql/mysql.sock
    log-error=/usr/local/mysql/data/mysqld.err
    log-bin=/usr/local/mysql/data/log_bin
    relay-log=/usr/local/mysql/data/relay-bin
    relay-log-index=relay-bin.index
    auto_increment_increment=2
    auto_increment_offset=2
    

    注:mysql1和mysql2只有server-id和auto_increment_offset不同
    mysql中有自增长字段,在做数据库的主主同步时需要设置自增长的两个相关配置:auto_increment_offset和auto_increment_increment。 auto-increment-increment表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数,我这里用到两台服务器,所以值设为2。 auto-increment-offset是用来设定数据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突。
    注:可以在my.cnf文件中添加“binlog_do_db=数据库名”配置项(可以添加多个)来指定要同步的数据库

    3、将mysql2设置为mysql1的从服务器

    1)mysql1上创建授权用户

    [root@mysql1 ~]# mysql -uroot -p123.com
    mysql> grant replication slave on *.* to rep@'192.168.20.%' identified by '123.com'; 
    
    

    2)查看mysql1的当前binlog状态信息

    mysql> show master status\G
    *************************** 1. row ***************************
                 File: log_bin.000001     这个值会用到
             Position: 609         这个值会用到
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    
    

    3)在mysql2上指定mysql1为master,并开启slave功能

    #指定master地址
    mysql> change master to master_host='192.168.100.2',
        -> master_user='rep',
        -> master_password='123.com',
        -> master_log_file='log_bin.000001',    #必须和master上查看到的名字一样
        -> master_log_pos=609;      #同上,这个值也是在master上查看到的
    #启动slave功能
    mysql> start slave;
    #确定配置成功
    mysql> show slave status\G            #查看slave状态
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.100.2
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: log_bin.000001
              Read_Master_Log_Pos: 609
                   Relay_Log_File: relay-bin.000002
                    Relay_Log_Pos: 318
            Relay_Master_Log_File: log_bin.000001
                 Slave_IO_Running: Yes               这个值必须为Yes
                Slave_SQL_Running: Yes             这个值也必须为Yes
    只要上面两个值为yes,则表示主从没有问题,
    #其中,IO线程是去master上面读取二进制日志到本地的中继日志中;
    #SQL线程是将本地的中继日志中的内容转换为sql语句并执行。
    
    

    4、将mysql1设置为mysql2的从服务器

    #主机mysql2上操作如下:
    mysql> grant replication slave on *.* to rep@'192.168.100.%' identified by '123.com';
    mysql> flush privileges;
    mysql> show master status\G          #获取所需的file和Position
    *************************** 1. row ***************************
                 File: log_bin.000002
             Position: 609
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    
    #主机mysql1上操作如下:
    #指定mysql2为master
    mysql> change master to master_host='192.168.100.3',
        -> master_user='rep',
        -> master_password='123.com',
        -> master_log_file='log_bin.000002',
        -> master_log_pos=609;
    mysql> start slave;       #启动slave
    mysql> show slave status\G          #查看slave状态
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.100.3
                      Master_User: rep
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: log_bin.000002
              Read_Master_Log_Pos: 609
                   Relay_Log_File: relay-bin.000002
                    Relay_Log_Pos: 318
            Relay_Master_Log_File: log_bin.000002
                    #确保下面两个值为yes
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes
    
    

    5、测试主主同步

    1)主机mysql1创建测试数据

    
    mysql> create database test;
    mysql> use test
    mysql> create table test1(id int,name varchar(4));
    mysql> insert into t1 values(1,'a'),(2,'b');
    #确认mysql1的数据
    mysql> select * from t1;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | a    |
    |    2 | b    |
    +------+------+
    2 rows in set (0.00 sec)
    
    

    2)确认mysql2已经同步并插入新的数据

    #以下操作在主机mysql2上进行
    mysql> select * from test1;        #确定数据已同步
    +------+------+
    | id   | name |
    +------+------+
    |    1 | a    |
    |    2 | b    |
    +------+------+
    #插入数据测试
    mysql> insert into test1 values(3,'c'),(4,'d');
    mysql> select * from test1;        #确定最新数据
    +------+------+
    | id   | name |
    +------+------+
    |    1 | a    |
    |    2 | b    |
    |    3 | c    |
    |    4 | d    |
    +------+------+
    
    

    3)确定mysql1可以同步mysql2的数据

    #在mysql1上查询,是否同步mysql2主机上的数据
    mysql> select * from test1;
    +------+------+
    | id   | name |
    +------+------+
    |    1 | a    |
    |    2 | b    |
    |    3 | c    |
    |    4 | d    |
    +------+------+
    4 rows in set (0.00 sec)
    
    

    至此,现在任何一台MySQL上更新数据都会同步到另一台MySQL,MySQL同步完成。

    注:若主MySQL服务器已经存在,只是后期业务拓展才搭建从服务器,在配置数据库同步前应先将MySQL服务器的要同步的数据库拷贝到从服务器上(如先在主MySQL上备份数据库,再用备份再从MySQL服务器上恢复)。

    配置keepalived高可用

    1、安装keepalived

    两个节点都需要执行以下命令,以便安装keepalived。

    [root@mysql1 ~]# yum -y install keepalived
    
    

    2、修改主机mysql1的keepalived配置文件

    [root@mysql1 ~]# cat /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    
    global_defs {
       router_id mysql-1      #此处的值必须唯一
    }
    
    vrrp_instance VI_1 {
        state BACKUP       #指定角色为backup,两台MySQL服务器的角色均为backup,设置backup将根据优先级决定主从
    
        interface ens33      #指定承载虚拟IP的网卡
        virtual_router_id 51         #指定组,同一个集群内的值必须一致。并且不可和局域网中的其他组冲突
        priority 100          #优先级范围为:0~100
        advert_int 1     #发vrrp包的时间间隔,即多久进行一次master选举(可认为是健康检查时间间隔)
        nopreempt             #不抢占,即允许一个priority比较低的节点作为master,     
        authentication {          #认证区域
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {         #VIP区域,指定vip地址
            192.168.100.20
        }
    }
    
    virtual_server 192.168.100.100 3306 {    #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
        delay_loop 2         #设置运行情况检查时间,单位是秒
        lb_algo rr      #设置后端调度算法
        lb_kind DR    #设置lvs实现负载均衡的机制,有NAT、TUN、DR三个模式,DR模式效率最高
        persistence_timeout 60     #会话保持时间,单位是秒
        protocol TCP     #指定转发协议类型,有TCP和UDP两种
    
        real_server 192.168.100.2 3306 {          #配置服务节点,这里指定的也就是本机的真实IP
            weight 1     #设置权重
        notify_down /etc/keepalived/bin/mysql.sh    #检测到real_server的MySQL服务宕机后执行的脚本。
        TCP_CHECK {
            connect_port 3306    #健康检查端口
            connect_timeout 3       #连接超时时间
            retry 3    #重试次数
            delay_before_retry 3      #重连间隔时间
         }
       }
    }
    #准备指定的脚本
    [root@mysql01 keepalived]# pwd
    /etc/keepalived
    [root@mysql01 keepalived]# mkdir bin
    [root@mysql01 keepalived]# vim bin/mysql.sh
    #!/bin/bash
    pkill keepalived    #停止keepalived服务
    [root@mysql01 keepalived]# chmod +x bin/mysql.sh    #赋予脚本执行权限
    [root@mysql01 ~]# systemctl start keepalived        #启动keepalived服务
    
    

    3、确定ens33网卡有虚拟Ip

    [root@mysql01 ~]# ip a show ens33 #必须使用ip a命令才可以查看到,ifconfig命令查看不到
    2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c0:39:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.20.2/24 brd 192.168.20.255 scope global noprefixroute ens33
    valid_lft forever preferred_lft forever
    inet 192.168.20.20/32 scope global ens33 #可以看到指定的VIP已经绑定到ens33上
    valid_lft forever preferred_lft forever
    inet6 fe80::659e:9312:318a:e52b/64 scope link noprefixroute
    valid_lft forever preferred_lft forever

    将keepalived的配置文件发送到mysql2主机上

    [root@mysql01 ~]# scp /etc/keepalived/keepalived.conf root@192.168.100.3:/etc/keepalived/

    4、修改主机mysql2的keepalived配置文件

    #修改msyql1发送来的配置文件
    [root@mysql02 keepalived]# cat /etc/keepalived/keepalived.conf 
    ! Configuration File for keepalived
    
    global_defs {
       router_id mysql-2         #更改router_id,此处在热备组中必须要唯一
    }
    
    vrrp_instance VI_1 {
        state BACKUP
        interface ens33
        virtual_router_id 51
        priority 90             #更改优先级
        advert_int 1
        nopreempt
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.100.20
        }
    }
    
    virtual_server 192.168.100.20 3306 {
        delay_loop 2
        lb_algo rr
        lb_kind DR
        persistence_timeout 60
        protocol TCP
    
        real_server 192.168.100.3 3306 {        #更改为本机的IP地址及监听端口
            weight 1
        notify_down /etc/keepalived/bin/mysql.sh
        TCP_CHECK {
            connect_port 3306
            connect_timeout 3
            retry 3
            delay_before_retry 3
         }
       }
    }
    #准备所需脚本
    [root@mysql1 keepalived]# pwd
    /etc/keepalived
    [root@mysql2 keepalived]# mkdir bin
    [root@mysql2 keepalived]# vim bin/mysql.sh
    #!/bin/bash
    pkill keepalived
    [root@mysql2 keepalived]# chmod +x bin/mysql.sh 
    #启动keepalived
    [root@mysql2 ~]# systemctl start keepalived 
    
    

    三 最终总结

    至此,即可实现MySQL的双主效果(只要VIP所在的节点,MySQL服务端口无法连接,
     那么VIP将切换至另一台节点,即使宕机的mysql服务器恢复,也不会对VIP进行抢占)。
     虽然有两台MySQL数据库,但是其使用keepalived提供的虚拟IP地址来对外提供服务,
     不管这个虚拟Ip地址落在哪台服务器上,
     都可以保证数据的一致性,因为它们互为主从,
     并且keepalived的状态都为backup,
     也设置了不抢占(减少VIP的切换次数),
     这样可以大大的避免keepalived的脑裂问题。
    

    相关文章

      网友评论

          本文标题:Mysql二进制安装及双主高可用部署

          本文链接:https://www.haomeiwen.com/subject/vbsmvktx.html