MySQL5.6+Centos7.6集群搭建

作者: 旋哥 | 来源:发表于2020-12-14 22:15 被阅读0次

    1、单节点搭建

    1.1 准备

    需要的软件:ssh客户端,filezilla,centos7,mqsql5.6

    $ mkdir sfm         # 在根目录下创建自己的文件夹
    

    使用FTP上传MySQL5.6二进制文件下载地址到sfm文件夹下。

    1.2 添加用户和组

    $ groupadd mysql 
    $ useradd -g mysql mysql
    

    1.3 mysql安装包解压

    $ cd sfm/
    $ ll              # 查看数据库文件
    -rw-r--r--. 1 root root 343082156 11月  3 17:07 mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz
    
    
    $ tar -xvf mysql-5.6.48-linux-glibc2.12-x86_64.tar.gz      # 解压
    $ mv mysql-5.6.48-linux-glibc2.12-x86_64 mysql             # 重命名
    $ cd /sfm/mysql
    $ chown -R mysql .           # 指定文件的拥有者改为指定的用户或组
    $ chgrp -R mysql .      
    

    1.4 安装 autoconf

    在线安装:

    $ yum -y install autoconf
    

    离线安装:

    # 参考第四节
    

    1.5 安装MySQL

    1.5.1 安装

    $ /sfm/mysql/scripts/mysql_install_db --user=mysql --basedir=/sfm/mysql --datadir=/sfm/mysql/data
    

    1.5.2 复制配置文件

    $ cp /sfm/mysql/support-files/my-default.cnf /etc/my.cnf
    

    1.5.3 修改配置文件

    $ vim /etc/my.cnf
    
    [client]
    port = 3306
    socket = /sfm/mysql/mysql.sock
    default-character-set = utf8
    [mysqld]
    skip-name-resolve
    user = mysql
    basedir = /sfm/mysql
    datadir = /sfm/mysql/data
    port = 3306
    server_id = 10
    socket = /sfm/mysql/mysql.sock
    pid-file = /sfm/mysql/mysql.pid
    log-error = /sfm/mysql/data/mysql.err
    log-bin = /sfm/mysql/data/mysql-bin
    character-set-server = utf8
    

    1.5.4 设置系统服务

    $ cp /sfm/mysql/support-files/mysql.server /etc/init.d/mysqld
    $ vim /etc/init.d/mysqld
    # 将所有/user/local 路径改为 /sfm
    

    1.5.5 配置环境变量

    $ echo 'export PATH=/sfm/mysql/bin:$PATH' >> /etc/profile
    $ source /etc/profile
    

    1.6 启动测试

    1.6.1 启动

    $ service mysqld start
    

    1.6.2 修改mysql密码

    $ mysqladmin -u root password '123456'
    

    提示:如果后面开启远程连接,请把密码设置复杂一点。很重要!!!!!!!!!!!!!!!

    1.6.3 登陆mysql

    $ mysql -uroot -p
    [root@localhost /]# mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 5
    Server version: 5.6.42-log MySQL Community Server (GPL)
    
    Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    $ mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    4 rows in set (0.00 sec)
    

    1.6.4 配置远程连接

    慎重开启,如果处于公网环境,强烈建议不开启。

    > use mysql;
    > update user set Host='%' where user ='root' limit 1;
    select Host,user,password from user where User='root';
    update user set Host='%' where user ='root' and Host='localhost';
    delete from user where Host='localhost' and User='';
    > flush privileges;
    > exit
    $ service mysqld restart
    

    防火墙放行:

    $ systemctl start firewalld                     # 启动friewall
    $ systemctl status firewalld                     # 查看firewall启动情况
    $ firewall-cmd --zone=public --add-port=3306/tcp --permanent   # 开启3306端口
    $ firewall-cmd --reload                                       #  重启 
    $ firewall-cmd --query-port=3306/tcp              # 查看3306端口是否开启
    

    1.6.5 开机启动配置

    $ touch /usr/lib/systemd/system/mysql.service
    $ vim /usr/lib/systemd/system/mysql.service
    
    [Unit]
    Description=MySQ
    Documentation=man:mysqld(8)
    Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    User=mysql
    Group=mysql
    ExecStart=/sfm/mysql/bin/mysqld --defaults-file=/etc/my.cnf
    LimitNOFILE = 5000
    #Restart=on-failure
    #RestartPreventExitStatus=1
    #PrivateTmp=false
    
    $ systemctl start mysql
    $ systemctl enable mysql  # 开启开机启动
    

    2、主从MySQL主从集群搭建

    前一台主机IP地址为:192.168.1.104,作位主机master

    另外在新建一台主机:192.168.1.102,作位从机slave

    2.1 开启master上的log-bin功能:

    # 192.168.1.104 操作
    $ cat /etc/my.cn
    
    # 输出
    ---
    server_id = 10
    log-bin = /usr/local/mysql/data/mysql-bin
    ----
    

    代表已经开启log-bin功能

    登陆mysql在master服务器上建立账户,并授权slave功能

    $ mysql -uroot -p
    > grant replication slave on *.* to 'mysql'@'%' identified by 'mysql';
    > flush privileges;
    > show master status;
    # 输出
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000035 |   180708 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    
    # 主库上当前的二进制日志名和偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复.
    

    2.2 从库操作

    2.2.1 修改从数据库的配置文件

    注意 server-id的值必须是唯一的,不能和主数据库的配置相同,如果有多个从数据库服务器,每个从数据库服务器必须有自己唯一的 server-id值。

    $ vim /etc/my.cnf
    
    # 修改如下:server_id必须唯一
    server_id = 11
    
    # 重启服务
    $ serivce mysqld restart
    

    2.2.2 开启复制

    MASTER_HOST:主机IP

    MASTER_PORT:主机端口

    MASTER_USER:主机用户

    MASTER_PASSWORD:主机密码

    MASTER_LOG_FILE:主机的日志文件

    MASTER_LOG_POS:偏移量。如果输入1,全部复制,有可能密码也会被复制过来

    $ mysql -uroot -p
    
    > CHANGE MASTER TO MASTER_HOST='192.168.1.104',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='youxuan' ,MASTER_LOG_FILE='mysql-bin.000035',MASTER_LOG_POS=180708;
    
    > start slave;            # 开启复制
    > show processlist\G;     # 命令将显示类似如下的进程:
    
    *************************** 1. row ***************************
         Id: 1
       User: root
       Host: localhost
         db: NULL
    Command: Query
       Time: 0
      State: init
       Info: show processlist
    *************************** 2. row ***************************
         Id: 4
       User: root
       Host: 192.168.1.109:63170
         db: sfm
    Command: Sleep
       Time: 332
      State:
       Info: NULL
    *************************** 3. row ***************************
         Id: 5
       User: root
       Host: 192.168.1.109:63173
         db: sfm
    Command: Sleep
       Time: 355
      State:
       Info: NULL
    *************************** 4. row ***************************
         Id: 6
       User: system user
       Host:
         db: NULL
    Command: Connect
       Time: 457
      State: Waiting for master to send event
       Info: NULL
    *************************** 5. row ***************************
         Id: 7
       User: system user
       Host:
         db: NULL
    Command: Connect
       Time: 317
      State: Slave has read all relay log; waiting for the slave I/O thread to update it
       Info: NULL
    5 rows in set (0.00 sec)
    
    ERROR:
    No query specified
    

    在主机上修改下数据查看数据库也会被同步更新。

    > stop slave    # 停止复制
    

    3、主从MySQL双主集群搭建

    之前的采取的主从结构:

    主机IP地址为:192.168.1.104,作位主机master

    新建一台主机:192.168.1.102,作位从机slave

    想要实现的结构:

    主机IP地址为:192.168.1.104,作位主机master1,slave2

    新建一台主机:192.168.1.102,作位从机slave1,master2

    在192.168.1.102(作为master2)执行以下操作:

    # 进入Mysql交互式环境
    $ mysql -uroot -p
    > grant replication slave on *.* to 'mysql'@'%' identified by 'mysql';      # 授权
    > flush privileges;
    > show master status;    # 查看主机master2状态
    #输出
    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000020 |      372 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    在192.168.1.104(作为slave2)执行以下操作:

    $ mysql -uroot -p
    
    > CHANGE MASTER TO MASTER_HOST='192.168.1.102',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='youxuan' ,MASTER_LOG_FILE='mysql-bin.000020',MASTER_LOG_POS=372;
    
    > start slave            # 开启复制
    > show processlist\G     # 命令将显示类似如下的进程:
    

    双主结构同步完成。

    4、配置MySQL+keepalived 高可用环境

    利用keepalived实现mysql数据库的高可用,Keepalived+Mysql双主来实现MYSQL-HA,我们必须保证两台mysql数据库的数据完全一致,实现方法是两台mysql互为主从关系,通过keepalived配置VIP,实现当其中的一台mysql数据库宕机后,应用能够自动切换到另外一台mysql数据库上去,保证系统的高可用。

    4.1 安装Keepalived

    4.1.1 依赖包安装

    在线安装:

    $ yum install -y gcc openssl-devel popt-devel
    

    离线安装:

    • 确保有一台电脑可以连接互联网

    • 执行指令,其中xxx是你要安装的软件名,根据需要自行修改。/tmp/rpm是下载后保存的路径,也可以选其它路径存放下载的安装包文件:

      $ yum install -y gcc openssl-devel popt-devel  --downloadonly --downloaddir /tmp/rpm
      
    • 如果下载正常,下载完成后就可以在本机/tmp/rpm路径下找到安装包。

    • 分发rpm包到其它机器

    • 进入/tmp/rpm路径下,执行指令

      $ rpm -ivh *.rpm --force --nodeps
      

      通过以上步骤即可离线安装软件。

    4.1.2 下载编译Keepalived和killall

    Keepalived,对外统一提供虚IP,并且可以自动切换。killall主要是监听数据库端口的功能。

    在线安装:

    $ yum install -y keepalived
    $ yum install -y psmisc.x86_64
    

    离线安装:参看上面的

    4.2 Keepalived配置

    4.2.1 配置文件修改

    先查看网卡:

    $ ip addr
    
    # 输出如下
    [root@localhost ~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 2c:f0:5d:19:aa:1e brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute dynamic eno1
           valid_lft 6375sec preferred_lft 6375sec
        inet6 fe80::4ede:da95:8fd4:f89c/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
        link/ether 02:42:19:d9:8c:f8 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
           valid_lft forever preferred_lft forever
    

    其中,第二项为服务器的网卡名 eno1

    其中virtual_ipaddress为提供外部访问的IP地址,这里使用192.168.1.111,必须保持两台机器virtual_ipaddress相同。

    修改192.168.1.102(master1)配置文件:

    操作如下:

    $ vim /etc/keepalived/keepalived.conf
    

    配置如下:

    # 全局配置 不用动  只需注释掉vrrp_strict
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1  # 邮件服务器,暂时没用到,随便填 
       smtp_connect_timeout 30
       router_id LVS_DEVEL        # 两台服务器必须唯一
       vrrp_skip_check_adv_addr
       #必须注释掉 否则报错
       #vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    # 检查mysql服务是否存活的脚本
    vrrp_script chk_mysql {
        script "/usr/bin/killall -0 mysqld"
    }
    # vrrp配置虚IP
    vrrp_instance VI_1 {
        # 状态:MASTER  另外一台机器为BACKUP
        state MASTER
        # 绑定的网卡
        interface eno1
        # 虚拟路由id  两台机器需保持一致
        virtual_router_id 51
        # 优先级 MASTER的值要大于BACKUP
        priority 100      # MASTER节点高于BACKUP节点
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        # 虚拟IP地址 两台keepalived需要一致
        virtual_ipaddress {
            192.168.1.111           # 向外提供的IP,两台机器相同
        }
        # 检查脚本 vrrp_script的名字
        track_script {
            chk_mysql
        }
    }
    
    ###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的  这里用不到
    ###
    

    修改192.168.1.104(master2)配置文件:

    查看网卡:eno1

    # 全局配置 不用动  只需注释掉vrrp_strict
    global_defs {
       notification_email {
         acassen@firewall.loc
         failover@firewall.loc
         sysadmin@firewall.loc
       }
       notification_email_from Alexandre.Cassen@firewall.loc
       smtp_server 192.168.200.1  # 邮件服务器,暂时用到,随便填 
       smtp_connect_timeout 30
       router_id LVS_DEVEL        # 两台服务器必须唯一
       vrrp_skip_check_adv_addr
       #必须注释掉 否则报错
       #vrrp_strict
       vrrp_garp_interval 0
       vrrp_gna_interval 0
    }
    
    # 检查mysql服务是否存活的脚本
    vrrp_script chk_mysql {
        script "/usr/bin/killall -0 mysqld"
    }
    # vrrp配置虚IP
    vrrp_instance VI_1 {
        # 状态:MASTER  另外一台机器为BACKUP
        state BACKUP
        # 绑定的网卡
        interface eno1
        # 虚拟路由id  两台机器需保持一致
        virtual_router_id 51
        # 优先级 MASTER的值要大于BACKUP
        priority 90     
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        # 虚拟IP地址 两台keepalived需要一致
        virtual_ipaddress {
            192.168.1.111           # 向外提供的IP,两台机器相同
        }
        # 检查脚本 vrrp_script的名字
        track_script {
            chk_mysql
        }
    }
    
    ###后边的virtual_server全部注释掉 它是和LVS做负载均衡用的  这里用不到
    ###
    

    killall命令脚本。killall -0并不是杀掉进程,而是检查进程是否存在,如果存在则返回0,如果不存在则返回1。当返回1时,keepalived就会切换主备状态。

    4.2.2 启动keepalived

    关闭防火墙或者开启组播:选择其中一项执行到两台服务器

    关闭防火墙:

    $ sudo systemctl stop firewalld      # 临时关闭
    
    $ sudo systemctl disable firewalld   # 永久关闭
    
    $ sudo systemctl status  firewalld   # 查看防火墙状态。
    

    开启组播:

    $ firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eno1 --destination 224.0.0.18 --protocol vrrp -j ACCEPT;
    $ firewall-cmd --reload;
    

    eno1 为服务器网卡名称 使用命令 ip addr 查看,224.0.0.18为默认组播地址。

    开启keepalived:

    # 两台机器同时开启
    $ service keepalived start
    # 查看开启状态
    $ service keepalived status
    

    使用ip addr查看是否生成虚拟IP:192.168.1.111

    [root@localhost keepalived]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host
           valid_lft forever preferred_lft forever
    2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        link/ether 2c:f0:5d:19:aa:31 brd ff:ff:ff:ff:ff:ff
        inet 192.168.1.102/24 brd 192.168.1.255 scope global noprefixroute dynamic eno1
           valid_lft 4957sec preferred_lft 4957sec
        inet 192.168.1.111/32 scope global eno1
           valid_lft forever preferred_lft forever
        inet6 fe80::bb62:4fd:d2f3:ac81/64 scope link noprefixroute
           valid_lft forever preferred_lft forever
    3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
        link/ether 02:42:5c:7a:b1:08 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
           valid_lft forever preferred_lft forever
    

    成功开启

    4.3 测试MySQL高可用

    # master1 关闭mysqld服务 查看master1和maste2的ip地址
    $ service mysqld stop
    $ ip addr
    # 正确的情况是:
    # master1机器虚拟ip消失,master2机器出现虚拟ip
    
    # master1 开启mysqld服务 查看master1和maste2的ip地址
    $ service mysqld start
    $ ip addr
    # 正确的情况是:
    # master1机器出现虚拟ip, master2机器虚拟ip消失
    
    1、# master1和master2同时关闭mysqld服务 查看master1和maste2的ip地址
    
    $ service mysqld stop      # master1机器操作
    $ service mysqld stop      # master2机器操作
    $ ip addr
    # 正确的情况是:
    # master1和master2机器虚拟ip消失
    
    2、# 开启master2的mysqld服务
    $ service mysqld start      # master2机器操作
    $ ip addr                   # master2机器操作
    # 正确的情况是:
    # master2机器虚拟ip出现
    
    3、# 开启master1的mysqld服务
    $ service mysqld start      # master1机器操作
    $ ip addr  
    # 正确的情况是:
    # master1机器出现虚拟ip, master2机器虚拟ip消失
    

    MySQL高可用环境搭建完成。

    相关文章

      网友评论

        本文标题:MySQL5.6+Centos7.6集群搭建

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