一主多从,实现数据库高可用

  • 一、准备环境
  • 1.先做一主双从
  • 192.168.131.80配置:
  • 192.168.131.81配置:
  • 192.168.131.82配置:
  • 2.模拟A库故障,B库替换为主
  • 192.168.131.81配置:
  • 192.168.131.82配置:
  • 总结


一、准备环境

系统

主机ip

应用

centos7

192.168.131.80 A

mariadb mariadb-server 主

centos7

192.168.131.81 B

mariadb mariadb-server 从

centos7

192.168.131.82 C

mariadb mariadb-server 从

注意:我这里做的是一主二从,首先实现主从的功能,然后模拟A 主库故障,实现B库 由从库替换为主库。从而达到一个高可用的效果

1.先做一主双从

192.168.131.80配置:
首先关闭防火墙:
       systemctl stop firewalld
       setenforce 0
安装数据库:
       yum -y install mariadb mariadb-server
编辑配置文件:
       vim /etc/my.cnf
在[mysqld]里面添加一下内容:
       server-id=1
       log-bin=mysql-bin
保存退出
启动数据库: 
       systemctl start mariadb
进入数据库:
       mysql
创建一个用户并授权
       grant replication slave on *.* to tom@'%' identified by '123';

MariaDB [(none)]> show master status;    //查看主服务器状态
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 |      381 |              |                  |
+------------------+----------+--------------+------------------+
192.168.131.81配置:
首先关闭防火墙:
       systemctl stop firewalld
       setenforce 0
安装数据库:
       yum -y install mariadb mariadb-server
编辑配置文件:
       vim /etc/my.cnf
在[mysqld]里面添加以下内容:
       server-id=2
       relay-log=mysql-relay
保存退出
启动数据库: 
       systemctl start mariadb
进入数据库:
       mysql
       stop slave;     //停掉主从
       change master to  master_host='192.168.131.80', master_user='tom', master_password='123', master_log_file='mysql-bin.000003', master_log_pos=381;
       MariaDB [(none)]> change master to
----------------------------------------------
    -> master_host='192.168.131.80',         /【master的ip地址】
    -> master_user='tom',                     /【登录主使用的用户】
    -> master_password='123',                  /【登录主使用的密码】
    -> master_log_file='mysql-bin.000003',      /【当前写入的二进制日志文件】
    -> master_log_pos=381;                       /【位置】
开启主从
       start slave;    
MariaDB [(none)]> show slave status \G;   //双YES为正常
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.80
                  Master_User: tom
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 381
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
192.168.131.82配置:
首先关闭防火墙:
       systemctl stop firewalld
       setenforce 0
安装数据库:
       yum -y install mariadb mariadb-server
编辑配置文件:
       vim /etc/my.cnf
在[mysqld]里面添加一下内容:
       server-id=3
       relay-log=mysql-relays
保存退出
启动数据库: 
       systemctl start mariadb
进入数据库:
       mysql
       stop slave;     //停掉主从
       change master to  master_host='192.168.131.80', master_user='tom', master_password='123', master_log_file='mysql-bin.000003', master_log_pos=381;
       MariaDB [(none)]> change master to
----------------------------------------------
    -> master_host='192.168.131.80',         /【master的ip地址】
    -> master_user='tom',                     /【登录主使用的用户】
    -> master_password='123',                  /【登录主使用的密码】
    -> master_log_file='mysql-bin.000003',      /【当前写入的二进制日志文件】
    -> master_log_pos=381;                       /【位置】
开启主从
       start slave;    
MariaDB [(none)]> show slave status \G;   //双YES为正常
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.80
                  Master_User: tom
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 381
               Relay_Log_File: mysql-relay.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.模拟A库故障,B库替换为主

首先模拟A库故障(停掉192.168.131.80的数据库)

192.168.131.81配置:
在从库的/etc/my.cnf文件
            添加log-bin=mysql-bin
            重启MySQL
            stop slave;
            reset master;
            reset slave all;
            show binary logs;     
MariaDB [(none)]> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       245 |
+------------------+-----------+
1 row in set (0.00 sec)
在从库授权一个账号
            grant replication slave on *.* to tom@'%' identified by '123';
192.168.131.82配置:
mysql
          stop slave;    //停掉主从同步
          change master to  master_host='192.168.131.81',master_user='tom',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=245;
          start slave;    //开启主从同步
          MariaDB [(none)]> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.131.81
                  Master_User: tom
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 381
               Relay_Log_File: mysql-relays.000002
                Relay_Log_Pos: 665
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

在81的机器创建一个库进行测试

mysql 主从 自动切换 数据库主从自动切换_数据库


在82的数据库查看 有没有刚刚创建的库

mysql 主从 自动切换 数据库主从自动切换_mysql_02

总结

mysql主从机制主要是在主机意外情况中断服务(比如断电、宕机等)的情况下,能够将业务转向备机。
在当前方案下,没有中间代理层,需要业务手动修改mysql的IP和Port才能切换到备机上去,所以业务需要具有灵活配置Mysql 地址的能力。
不过现在基本上都不用这种方法了,不是很适用,一般用MHA来实现数据库高可用,实现主挂掉从自动替换为主。