zoukankan      html  css  js  c++  java
  • mysql 主主架构,多入口 互为备份

    ,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题。

    MySQL双主(主主)架构方案思路是:

    1.两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;

    2.masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;

    3.两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);

    4.所有提供服务的从服务器与masterB进行主从同步(双主多从);

    5.建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);

    这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;

    但是也有几个不足的地方:

    1.masterB可能会一直处于空闲状态(可以用它当从库,负责部分查询);

    2.主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,这样可能会造成一定程度的同步延时;

    架构的简易图如下:

    mark

    主主环境(这里只介绍2台主的配置方案):

    1.CentOS 7.3 64位 2台:masterA(192.168.59.132),masterB(192.168.59.133)

    2.官方Mysql5.6版本


    搭建过程:

    1.安装MySQL服务

    1. 下载免编译的二进制包
    # wget http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
    1. 查看并解压:
    # ls
    # tar zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
    1. 移动并重命名; 进入新的目录;
    # mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
    # cd /usr/local/mysql
    1. 增加一个mysql的用户; 创建一个data的目录;
    # useradd mysql
    # mkdir -p /data/mysql
    # chown -R mysql:mysql /data/mysql
    1. 初始化配置;
    # ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql

    在安装上一步中遇到了些错误,要是还没有解决问题。直接google或者baidu吧!

    等待完成后一个非常重要的操作是检查有没有成功~

    # echo $? (0 之外的任何值都是错误)
    1. 配置–拷贝模板到指定目录下并重命名!
    # cp support-files/my-default.cnf /etc/my.cnf
    1. 制作启动脚本
    [root@zhdy-02 mysql]# cp support-files/mysql.server /etc/init.d/mysqld
    
    [root@zhdy-02 mysql]# vi /etc/init.d/mysqld 
    
    vim编辑下面两行basedir和datadir配置
    basedir=/usr/local/mysql
    datadir=/data/mysql
    
    [root@zhdy-02 mysql]# chmod 755 /etc/init.d/mysqld
    1. 启动服务并设为开机启动
    [root@zhdy-02 mysql]# chkconfig --add mysqld
    
    [root@zhdy-02 mysql]# chkconfig --list
    
    [root@zhdy-02 mysql]# /etc/init.d/mysqld start
    或者 :
    [root@zhdy-02 mysql]# service mysqld start
    1. 查看启动状态:
    [root@zhdy-02 mysql]# ps aux |grep mysql
    [root@zhdy-02 mysql]# netstat -lntp |grep mysql

    2. 配置主主同步

    2.1 配置 /etc/my.cnf

    masterA(192.168.59.132) 配置文件

    [root@zhdy-04 mysql]# vim /etc/my.cnf
    
    server-id=132
    log-bin=mysql-bin
    auto-increment-increment=2
    auto-increment-offset=1
    log-slave-updates

    重启mysql:

    [root@zhdy-04 mysql]# /etc/init.d/mysqld restart

    masterB(192.168.59.133) 配置文件

    server-id=133
    log-bin=mysql-bin
    auto-increment-increment=2
    auto-increment-offset=2
    log-slave-updates

    重启:

    [root@zhdy-04 mysql]# /etc/init.d/mysqld restart

    auto-increment 两行的配置,使 masterA字段产生的数值是 奇数1,3,5,7 下面的masterB 产生的是 2,4,6,8 等,这样会避开双主 id 重复的问题。

    2.2 添加主从同步账户

    masterA上:

    [root@zhdy-04 mysql]# export PATH=$PATH:/usr/local/mysql/bin/
    
    [root@zhdy-04 mysql]# vim /etc/profile
    
    [root@zhdy-04 mysql]# source /etc/profile
    
    [root@zhdy-04 mysql]# mysql -uroot
    
    mysql> grant replication slave on *.* to 'repl'@'192.168.59.133' identified by 'zhangduanya';
    
    mysql> flush privileges;

    masterB上:

    [root@zhdy-05 mysql]# export PATH=$PATH:/usr/local/mysql/bin/
    
    [root@zhdy-05 mysql]# vim /etc/profile
    
    [root@zhdy-05 mysql]# source /etc/profile
    
    [root@zhdy-05 mysql]# mysql -uroot
    
    mysql> grant replication slave on *.* to 'repl'@'192.168.59.132' identified by 'zhangduanya';
    
    mysql> flush privileges;

    2.2 查看主库的状态

    masterA上:

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |      208 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    masterB上:

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000001 |      120 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)

    2.3 配置同步信息:

    masterA上:

    mysql> change master to master_host='192.168.59.133',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000001',master_log_pos=120;
    
    mysql> start slave;
    
    mysql> show slave statusG
    
    
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.59.133
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 120
                   Relay_Log_File: zhdy-04-relay-bin.000002
                    Relay_Log_Pos: 283
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes

    masterB上:

    mysql> change master to master_host='192.168.59.132',master_port=3306,master_user='repl',master_password='zhangduanya',master_log_file='mysql-bin.000001',master_log_pos=208;
    
    mysql> start slave;
    
    mysql> show slave statusG
    
    
    *************************** 1. row ***************************
                   Slave_IO_State: Waiting for master to send event
                      Master_Host: 192.168.59.132
                      Master_User: repl
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000001
              Read_Master_Log_Pos: 208
                   Relay_Log_File: zhdy-05-relay-bin.000002
                    Relay_Log_Pos: 283
            Relay_Master_Log_File: mysql-bin.000001
                 Slave_IO_Running: Yes
                Slave_SQL_Running: Yes

    我在开始的时候也说了,我用的是测试环境,可以保证没数据写入,否则需要的步骤是:

    先masterA锁表-->masterA备份数据-->masterA解锁表 -->masterB导入数据-->masterB设置主从-->查看主从。

     

    3.测试主主同步

    3.1 在masterA上创建一个数据库测试同步效果

    mysql> create database asd;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | asd                |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)

    3.2 到masterB查看是否已经同步创建数据库

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | asd                |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)

    已经成功!!!

  • 相关阅读:
    java的构造方法 java程序员
    No result defined for action cxd.action.QueryAction and result success java程序员
    大学毕业后拉开差距的真正原因 java程序员
    hibernate的回滚 java程序员
    验证码 getOutputStream() has already been called for this response异常的原因和解决方法 java程序员
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓 java程序员
    你平静的生活或许会在某个不可预见的时刻被彻底打碎 java程序员
    Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下 java程序员
    poj1416Shredding Company
    poj1905Expanding Rods
  • 原文地址:https://www.cnblogs.com/cocoliu/p/9020853.html
Copyright © 2011-2022 走看看