MySQL-5.7 双主互备+keepalived

VIP : 192.168.56.100

Server 1 : 192.168.56.101

Server 2 : 192.168.56.102

Step 1 : 安装 MySQL(192.168.56.101)

//需删除 linux 系统自带的数据库配置文件/etc/my.cnf,否则安装过程中会默认加载此配置文件

groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql .
bin/mysqld –initialize –user=mysql –basedir=/srv/mysql #如果安装目录不在 /url/local/mysql ,则需要使用 –basedir 指定
bin/mysql_ssl_rsa_setup –datadir=/srv/mysql/data #如果安装目录不在 /url/local/mysql ,则需要使用 –datadir 指定
chown -R root:root .
chown -R mysql:mysql data/
bin/mysqld_safe –user=mysql &
bin/mysqladmin -u root -p password #修改默认密码(注意前两步命令的输出有生成的默认密码)
cp support-files/mysql.server /etc/init.d/mysql.server
vim /etc/init.d/mysql.server #如果不是安装在 /url/local/mysql 目录,则需要编辑一下,指定 basedir 和 datadir
/etc/init.d/mysql.server stop
cp support-files/my-default.cnf my.cnf

 

vim my.cnf #添加或修改以下配置

server-id=101 # 同一集群中的 server id 不能相同,此处使用其ip末段数字
log_bin=mysql-bin
log_error=mysql-bin.err
binlog_ignore_db=mysql # 忽略同步的数据库

 

/etc/init.d/mysql.server start # 启动MySQL并执行以下SQL添加复制账号

CREATE USER ‘slave’@’192.168.56.102’ IDENTIFIED BY ‘password’;GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO ‘slave’@’192.168.56.102’ REQUIRE NONE;

 

Step 2 : 安装 MySQL(192.168.56.102)

//重复 Step 1(将命令中的 101 替换成 102,102 替换成 101)

Step 3 : 配置主从互备

192.168.56.101 ~ MySQL 终端运行如下 SQL 查看此实例作为主库的状态

SHOW MASTER STATUS;

 

192.168.56.102 ~ MySQL 终端运行如下 SQL 配置此实例作为从库需要连接的主库信息

CHANGE MASTER TO
MASTER_HOST=’192.168.56.101′,
MASTER_USER=’slave’,
MASTER_PASSWORD=’password’,
MASTER_LOG_FILE=’mysql-bin.000003′, #这个值对应上条命令输出的 `File` 字段
MASTER_LOG_POS=154; #这个值对应上条命令输出的 `Position` 字段

 

192.168.56.102 ~ MySQL 终端运行如下 SQL 查看此实例作为主库的状态

SHOW MASTER STATUS; # 查看此实例作为主库的状态

 

192.168.56.101 ~ MySQL 终端运行如下 SQL 配置此实例作为从库需要连接的主库信息

CHANGE MASTER TO
MASTER_HOST=’192.168.56.102′,
MASTER_USER=’slave’,
MASTER_PASSWORD=’password’,
MASTER_LOG_FILE=’mysql-bin.000003′, #这个值对应上条命令输出的 `File` 字段
MASTER_LOG_POS=154; #这个值对应上条命令输出的 `Position` 字段

 

最后分别在 101 和 102 两台 MySQL 的终端执行以下命令

START SLAVE; # 启动从库复制
SHOW SLAVE STATUS; # 查看此实例作为从库的状态

 

查看上条命令的输出 Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes 则表示两台实例的互相复制进程已经可用了

以上配置是在两台数据库都是空闲的新实例中配置的 线上的实例不适用以上配置

线上的实例需要锁定数据库库以保证配置的 MASTER_LOG_FILE 和 MASTER_LOG_POS 是正确的

Step 4 : 安装 keepalived(192.168.56.101)

cd keepalived-1.2.23
./configure –prefix=/srv/keepalived && make && make install

 

vim /srv/keepalived/etc/keepalived/keepalived.conf #编辑配置文件如下

! Configuration File for keepalived
global_defs {
   router_id HA_MYSQL
}
vrrp_script chk_mysql {
    script “/etc/init.d/mysql.server status”    !定时检查MySQL状态,MySQL挂掉则将自己下线释放VIP
}
vrrp_instance VI_1 {
    state BACKUP
    interface enp0s8    !网络界面
    virtual_router_id 51
    priority 101    !权重
    advert_int 1
    nopreempt    !自己上线后不抢占当前 master 的位置,即使其权重比自己低
    virtual_ipaddress {
        192.168.56.100    !VIP
    }
    track_script {
        chk_mysql    !启用头部定义的检查MySQL状态的脚本
    }
}
virtual_server 192.168.56.100 3306 {
    delay_loop 3
    lb_algo rr
    lb_kind NAT
    persistence_timeout 60
    protocol TCP    sorry_server 192.168.56.102 3306    ! real_server 挂掉后临时使用 sorry_server 顶上
    real_server 192.168.56.101 3306 {
        weight 1
        TCP_CHECK {
            connect_port    3306
            connect_timeout 3
        }
    }
}

 

Step 5 : 安装 keepalived(192.168.56.102)

重复 Step 4(将配置中的 101 替换成 102,102 替换成 101)

Step 6 : 检验配置

分别启动两台机器上的 keepalived

使用 `ip a` 命令查看哪台机器抢到了 VIP ?

停止抢到 VIP 服务器的 MySQL 实例,去另一台机器看是否接管 VIP ?

重启或关闭抢到 VIP 的 keepalived 服务,去另一台机器看是否接管 VIP ?

直接断掉抢到 VIP 的服务器的网络,去另一台机器看是否接管 VIP ?

这个架构在同一时刻只有一台 MySQL 对外提供写服务,因此不存在混写的状态,不用另外设置自增的规则。


安装 PHP 7 :

./configure --prefix=/srv/php --enable-fpm --disable-ipv6 --with-openssl --enable-bcmath --with-curl --enable-exif --with-gd --enable-gd-native-ttf --with-mhash --enable-mbstring --with-mcrypt --with-mysqli --enable-pcntl --with-pdo-mysql --enable-shmop --enable-sockets --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-mysqlnd && make && make install