应用场景:需要高并发且无间断访问数据库时,可使用双主多从数据库集群


实验架构:

图片.png

实验环境:

            关闭firewalld和selinux防火墙

    操作系统版本:CentOS7

    DB1:192.168.1.104

    DB2:192.168.1.45

    DB3:192.168.1.73

    DB4:192.168.1.90


实验步骤:

               注意:整个实验过程都是在重复配置Mysql主从,只是主从顺序不一样罢了

    01.登录到DB1-DB4,安装mariadb、mariadb-server

#安装Mariadb
yum install mariadb-server mariadb -y
#设置Mariadb开机自动启动服务
systemctl enable mariadb
#启动Mariadb服务
systemctl start mariadb
#查看Mariadb服务是否正常运行
systemctl status mariadb


    02.分别配置DB1-DB4四台服务器的/etc/my.cnf文件,并重启Mariadb服务。

        DB1:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

server-id=1
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%

#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
log-slave-updates = true 

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

        DB2:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

server-id=2
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%

#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
log-slave-updates = true 


[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

        DB3:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

server-id=3
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%


[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

        DB4:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

server-id=4
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%


[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

    03.分别以DB1-DB2、DB1-DB3、DB2-DB1、DB2-DB4做主从配置,下面以DB1-DB3做主从配置为例作讲解

        A.登录到DB1服务器,进入到mysql终端,配置主数据库相关配置。(Mariadb默认密码为空)

[root@DB1 ~]# mysql -u root -p

图片.png

MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.1.73';
MariaDB [(none)]> flush privileges;

图片.png

MariaDB [(none)]> SHOW MASTER STATUS;

图片.png

        B.登录到DB3服务器,进入到mysql终端,配置从数据库相关配置。(Mariadb默认密码为空)

[root@DB3 ~]# mysql -u root -p

图片.png

MariaDB [(none)]> CHANGE MASTER TO 
    -> MASTER_HOST='192.168.199.104',
    -> MASTER_USER='root',
    -> MASTER_PASSWORD='',         
    -> MASTER_LOG_FILE='mysql-bin.000014',
    -> MASTER_LOG_POS=452;

图片.png

MariaDB [(none)]> start slave; 
MariaDB [(none)]> show slave status\G;

图片.png

        至此代表DB1-DB3的数据库主从配置OK,依次处理剩余的主从配置即可。











#!/usr/bin/perl -w
use DBI
use DBD::mysql;

#CONFIG VARIABLES
$SBM = 120;
$db = "ixdba";
$host = $ARGV[0];
$sport = 3306;
$user = "root";
$pw = "XXXXXXXX";

#SQL query
$query = "show slave status";
$db = DBI->connect("DBI:mysql:$db:$host:$port",$user,$pw,{ RaiseError => 0,PrintError => 0});

if (!defined($dbh)) {
exit 1;
}

$sqlQuery = $dbh->prepare($query);
$sqlQuery->execute;

$Slave_IO_Running = "";
$Slave_SQL_Running = "";
$Slave_Behind_Master = "";

while (my $ref = $sqlQuery->fetchrow_hashref()) {
    $Slave_IO_Running = $ref->{'Slave_IO_Running'};
    $Slave_SQL_Running = $ref->{'Slave_SQL_Running'};
    $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'};
}

$sqlQuery->finish;
$dbh->disconnect();



if ($Slave_IO_Running eq "NO") || ($Slave_SQL_Running eq "NO") {
exit 1;
}    else {
if ( $Seconds_Behind_Master > $SBM ) {
exit 1;
    } else {
    exit 0;
    }
}