MySQL主主模式+Keepalived高可用

今天闲来无事 , 打算搭建一个MySQL的高可用架构 , 采用的是MySQL的主主结构 , 再外加Keepalived , 对外统一提供虚IP 。 先来说说背景吧 , 现在的项目为了高可用性 , 都是避免单节点的存在的 , 比如 , 我们的应用程序 , 都是部署多个节点 , 通过Nginx做负载均衡 , 某个节点出现问题 , 并不会影响整体应用 。 那么数据库层如何搭建高可用的架构呢?今天我们就来看看 。
整体架构MySQL采用主主结构 , 我们使用两台机器就够了 , 然后再这两台机器上再安装Keepalived , 使用vrrp技术 , 虚拟出一个IP 。 两台机器如下:

  • 192.168.73.141:MySQL(主1)、Keepalived(MASTER)
  • 192.168.73.142:MySQL(主2)、Keepalived(BACKUP)
  • 192.168.73.150:虚IP
整体架构图如下:
MySQL主主模式+Keepalived高可用文章插图
MySQL主主搭建我们分别在两台机器上安装MySQL , 使用yum方式安装 , 首先从MySQL官网下载rpm包 , 选择对应的系统 , 在这里 , 我们选择CentOS7的prm包 , mysql80-community-release-el7-3.noarch.rpm 。 然后将rpm文件分别上传到两台机器上 , 接下来我们就是用yum来安装MySQL 。
在192.168.73.141(主1)执行如下命令 ,
# 使用yum安装rpm包yum install mysql80-community-release-el7-3.noarch.rpm# 安装MySQL社区版 时间较长 耐心等待yum install mysql-community-server?#启动MySQL服务service mysqld start到这里 , MySQL就安装完成 , 并且正常启动了 。 然后 , 我们用root账号登录MySQL , 并创建一个可用的账号 。
# 从MySQL的日志中 找到root账号的临时密码grep 'temporary password' /var/log/mysqld.log?# 使用root账号登录 输入临时密码 登录成功mysql -uroot -p?# 修改root账号的密码 使用MYSQL_NATIVE_PASSWORD的加密方式 这种方式大多数客户端都可以连接ALTER USER 'root'@'localhost' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'MyNewPass4!';?# 创建MySQL账号CREATE USER 'USER'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'USER_PWD';# 对USER账号授权GRANT ALL ON *.* TO 'USER'@'%';# 刷新权限FLUSH PRIVILEGES;好了 , 到这里 , 在192.168.73.141上安装MySQL成功 , 并且创建了USER账户 , 我们可以使用NAVICAT等客户端连接 。
在192.168.73.142(主2)上也执行上面的命令 , 这样我们在两台机器上都安装了MySQL 。 接下来 , 我们就要配置MySQL的主主结构了 。
首先 , 我们修改192.168.73.141(主1)上的my.cnf文件 。
vim /etc/my.cnf??datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock?log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid?# 配置server-id 每个MySQL实例的server-id都不能相同server-id=1# MySQL的日志文件的名字log-bin=mysql_master# 作为从库时 更新操作是否写入日志 on:写入其他数据库以此数据库做主库时才能进行同步log-slave-updates=on?# MySQL系统库的数据不需要同步 我们这里写了3个更加保险# 同步数据时忽略一下数据库 但是必须在使用use db的情况下才会忽略;如果没有使用use db 比如create user数据还是会同步的replicate-ignore-db=information_schemareplicate-ignore-db=mysqlreplicate-ignore-db=performance_schemareplicate-ignore-db=sys# 使用通配符忽略MySQL系统库的表这样在create user时也不会进行同步了replicate_wild_ignore_table=information_schema.%replicate_wild_ignore_table=mysql.%replicate_wild_ignore_table=performance_schema.%replicate_wild_ignore_table=sys.%# MySQL系统库的日志不计入binlog 这样更加保险了binlog-ignore-db=information_schemabinlog-ignore-db=mysqlbinlog-ignore-db=performance_schemabinlog-ignore-db=sys在192.168.73.142(主2)上也修改my.cnf文件 , 我们直接复制过去 , 只需要修改其中的两个地方 , 如下:
# 配置server-id=2server-id=2# MySQL的日志文件的名字 不改名字也可以 这里主要为了区分log-bin=mysql_slave配置文件都已经修改好了 , 我们分别在192.168.73.141(主1)和192.168.73.142(主2)上重启MySQL服务 ,
service mysqld restart下面我们就要配置主从了 , 其实主主模式就是配置两个主从 , 先配置192.168.73.141(主1)->192.168.73.142(主2)的主从 , 然后再反过来配置192.168.73.142(主2)->192.168.73.141(主1)的主从 , 这样主主的模式就配置好了 。
我们先来配置192.168.73.141(主1)->192.168.73.142(主2)的主从
先登录192.168.73.141(主1)的数据库 , 并执行如下命令:
【MySQL主主模式+Keepalived高可用】# 创建备份的账号 使用MYSQL_NATIVE_PASSWORD的方式加密mysql> CREATE USER 'repl_master'@'%' IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'password';# 对repl_master授予备份的权限mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl_master'@'%';# 刷新权限mysql> FLUSH PRIVILEGES;?# 查看MySQL主节点的状态mysql> SHOW MASTER STATUS;?+-------------------+---------+--------------+---------------------------------------------+------------------+| File| Position | Binlog_Do_DB | Binlog_Ignore_DB| Executed_Gtid_Set |+-------------------+---------+--------------+---------------------------------------------+------------------+| mysql_master.000001 |516 || information_schema,mysql,performance_schema,sys ||+-------------------+---------+--------------+---------------------------------------------+------------------+1 row in set