• mariadb配置双主多从


    一。mariadb介绍

         MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。在存储引擎方面,使用XtraDB(英语:XtraDB)来代替MySQL的InnoDB。 MariaDB由MySQL的创始人Michael Widenius(英语:Michael Widenius)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria的名字

    主从关系表示:主负责写入 从负责备份或者读取 单主机存在单点故障 需要添加一个备份机 也可以写入 但是不允许出现数据不一致的情况 设计如下



    二。双主多从安装

    1》安装mariadb

    yum -y install mariadb-server mariadb
    有些版本 没有远程连接的root用户 登录

    create user root@'%' identified by 'root';
    grant all on *.* to root@'%';
    升级mariadb(不升级主从同步可能出错)
    [root@node1 mysql]# mysql_upgrade -u root -proot
    MySQL upgrade detected
    Phase 1/4: Fixing views from mysql
    Phase 2/4: Fixing table and database names
    Phase 3/4: Checking and upgrading tables
    Processing databases
    information_schema
    db1
    db1.myuser                                         OK
    db2
    db2.myuser                                         OK
    mysql
    mysql.columns_priv                                 OK
    mysql.db                                           OK
    mysql.event                                        OK
    mysql.func                                         OK
    mysql.help_category                                OK
    mysql.help_keyword                                 OK
    mysql.help_relation                                OK
    mysql.help_topic                                   OK
    mysql.host                                         OK
    mysql.ndb_binlog_index                             OK
    mysql.plugin                                       OK
    mysql.proc                                         OK
    mysql.procs_priv                                   OK
    mysql.proxies_priv                                 OK
    mysql.servers                                      OK
    mysql.tables_priv                                  OK
    mysql.time_zone                                    OK
    mysql.time_zone_leap_second                        OK
    mysql.time_zone_name                               OK
    mysql.time_zone_transition                         OK
    mysql.time_zone_transition_type                    OK
    mysql.user                                         OK
    performance_schema
    test
    Phase 4/4: Running 'mysql_fix_privilege_tables'
    OK
    2》主从环境
    192.168.58.147 node1 主
    192.168.58.149 node2 从
    192.168.58.150 node3 从
    192.168.58.151 node4 主备
    3》配置一主多从
    一主一从配置参考我之前的mysql(http://blog.csdn.net/liaomin416100569/article/details/53419296)

    》》主机147 配置

    拷贝完整配置文件

    cp -r /usr/share/mysql/my-large.cnf  /etc/my.cnf
    修改my.ini
    server-id       = 1 #数据库表示 默认是开启的
    log-bin=mysql-bin  #开启日志记录 默认是开启的 如果改行被注释 不可能是master show master status肯定是空
    auto_increment_increment=2        #自动增长的步长 解决多个主机自动增长出现重复问题 这个主机使用奇数值 另外一个主机使用偶数值
    auto_increment_offset=1           #自动增长的起始数值
    启动mariadb
    service mariadb start
    登录mysql

    mysql -uroot -proot
    
    添加同步权限用户

    grant replication slave on *.* to 'slave'@'%' identified by 'test';  
    查看master状态(配置文件配置了log-bin就是master了)

    MariaDB [(none)]> show master status
        -> ;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000002 |      245 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    》》从1 149配置
    拷贝最小配置文件到配置目录

    cp -r /usr/share/mysql/my-small.cnf  /etc/my.cnf
    修改/etc/my.cnf
    server-id       = 2  # 149配置为 2  150配置为3
    #log-bin=mysql-bin 这个日志默认是关闭的不用开启 server-id必须是一个唯一表示 和 147默认的1 不同
    启动mariadb
    service mariadb start
    登录mariadb执行 

    change master to
    master_host='192.168.58.147',
    master_user='slave',
    master_password='test',
    master_log_file='mysql-bin.000002',
    master_log_pos=245 ;
    执行完查看slave状态
    MariaDB [(none)]> change master to
        -> master_host='192.168.58.147',
        -> master_user='slave',
        -> master_password='test',
        -> master_log_file='mysql-bin.000002',
        -> master_log_pos=245 ;
    Query OK, 0 rows affected (0.29 sec)
    
    MariaDB [(none)]> show slave status G
    *************************** 1. row ***************************
                   Slave_IO_State: 
                      Master_Host: 192.168.58.147
                      Master_User: slave
                      Master_Port: 3306
                    Connect_Retry: 60
                  Master_Log_File: mysql-bin.000002
              Read_Master_Log_Pos: 245
                   Relay_Log_File: node2-relay-bin.000001
                    Relay_Log_Pos: 4
            Relay_Master_Log_File: mysql-bin.000002
                 Slave_IO_Running: No
                Slave_SQL_Running: Yes
                  Replicate_Do_DB: 
              Replicate_Ignore_DB: 
               Replicate_Do_Table: 
           Replicate_Ignore_Table: 
          Replicate_Wild_Do_Table: 
      Replicate_Wild_Ignore_Table: 
                       Last_Errno: 0
                       Last_Error: 
                     Skip_Counter: 0
              Exec_Master_Log_Pos: 245
                  Relay_Log_Space: 245
                  Until_Condition: None
                   Until_Log_File: 
                    Until_Log_Pos: 0
               Master_SSL_Allowed: No
               Master_SSL_CA_File: 
               Master_SSL_CA_Path: 
                  Master_SSL_Cert: 
                Master_SSL_Cipher: 
                   Master_SSL_Key: 
            Seconds_Behind_Master: NULL
    Master_SSL_Verify_Server_Cert: No
                    Last_IO_Errno: 1593
                    Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; 
    
    these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this 
    
    does not always make sense; please check the manual before using it).
                   Last_SQL_Errno: 0
                   Last_SQL_Error: 
      Replicate_Ignore_Server_Ids: 
                 Master_Server_Id: 2
    1 row in set (0.00 sec)
    
    启动slave命令
    MariaDB [(none)]> slave start
        -> ;
    Query OK, 0 rows affected (0.00 sec)
    配置过程中为了防止突然的主机数据写入 导致配置主从失败 可以将机器锁定只允许读 注意千万不要将从机配成锁定 否则无法同步数据了

    FLUSH TABLES WITH READ LOCK
    配置完成后解锁

    UNLOCK TABLES
    配置完成后查看日志 (show slave status G)

    最后两个点yes即可
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
    一主多从搭建成功测试数据
    147 创建库 db3  看 149是否都存在
    》》常用的主从操作命令

    常用一些命令 比如需要重新搭建主从 此时可以重置master 重新设置slave
    清空重置master

    reset master
    日志也可以设置一些过期策略比如 保留最近7天的日志 老日志自动清除(my.cnf)
    expire_logs_days = 7 (通过命令 set global expire_logs_days = 10;)
    如果从机同步是和主机出现一个同步错误 已经解决的情况下 可以执行跳过一个错误
    stop slave
    set global sql_slave_skip_counter=1
    start slave
    查看所有日志文件 登录mysql
    show binary logs
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |       245 |
    +------------------+-----------+
    1 row in set (0.00 sec)
    查看日志的内容(非登录)
    mysqlbinlog --no-defaults 路径(一般在/var/lib/mysql)mysql-bin.000001;
    比如我执行了 drop database db4 查看日志 比如

    [root@node1 mysql]# mysqlbinlog --no-defaults  /var/lib/mysql/mysql-bin.000001
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #171119 17:01:19 server id 1  end_log_pos 245   Start: binlog v 4, server v 5.5.56-MariaDB created 171119 17:01:19 at startup
    # Warning: this binlog is either in use or was not closed properly.
    ROLLBACK/*!*/;
    BINLOG '
    XykSWg8BAAAA8QAAAPUAAAABAAQANS41LjU2LU1hcmlhREIAbG9nAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAABfKRJaEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAnBRGBw==
    '/*!*/;
    # at 245
    #171119 17:18:45 server id 1  end_log_pos 329   Query   thread_id=7     exec_time=0     error_code=1548
    SET TIMESTAMP=1511140725/*!*/;
    SET @@session.pseudo_thread_id=7/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    SET @@session.sql_mode=0/*!*/;
    SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
    /*!C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    drop database db4   >>>>>>>>这里就显示了一条日志
    /*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    当然上面也可以指定某个时间段查看 或者某个偏移查看
     指定日期:mysqlbinlog --start-datetime='2017-01-01 00:00:00' --stop-datetime='2017-11-20 23:01:01' -d 指定数据库名称 
    
    /var/lib/mysql/mysql-bin.000001
     指定position
     mysqlbinlog --start-position=2098 --stop-position=2205 -d hadoop /var/lib/mysql/mysql-bin.000001

    登录mysql查看日志内容
    MariaDB [(none)]> show binlog events;
    +------------------+-----+-------------+-----------+-------------+-------------------------------------------+
    | Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                      |
    +------------------+-----+-------------+-----------+-------------+-------------------------------------------+
    | mysql-bin.000001 |   4 | Format_desc |         1 |         245 | Server ver: 5.5.56-MariaDB, Binlog ver: 4 |
    | mysql-bin.000001 | 245 | Query       |         1 |         329 | drop database db4                         |
    +------------------+-----+-------------+-----------+-------------+-------------------------------------------+
    2 rows in set (0.00 sec)
    
    show binlog events in 'mysql-bin.000001' 指定查某个日志文件
    
    删除某个日志文件
    purge binary(如果有主从 使用 master) logs to 'mysql-bin.000001';(删除mysql-bin.000001之前的二进制日志文件)
     purge master logs before ’2007-08-10 04:07:00′(删除该日期之前的日志)
    查看主机的日志文件以及偏移
    MariaDB [(none)]> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000001 |      245 |              |                  |
    +------------------+----------+--------------+------------------+
    1 row in set (0.00 sec)
    查看从机的状态
    show slave status G
    开始或者关闭slave
    start|stop slave
    添加从机到主机
    change master to
    master_host='主机ip',
    master_user='主机用户名',
    master_password='主机密码',
    master_log_file='主机状态显示的当前日志名称 比如mysql-bin.000001',
    master_log_pos=当前日志文件的偏移位置 比如245 ;
    删除从机
    stop slave;
    reset slave all;
    

    》》碰到问题

    测试过程中 创建数据库 主从同步没问题 但是当删除数据库时 出现了主从不同步的问题
    [root@node1 mysql]# tail -f /var/lib/mysql/node1.err
     171119 17:50:15 [ERROR] Incorrect definition of table mysql.event: expected column 'sql_mode' at position 14 to have type 
    
    set
    
    ('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_S
    
    UBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIO
    
    NS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_Z
    
    ERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDE
    
    NCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH'), found type set
    
    ('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_
    
    DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','
    
    MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_A
    错误是说 mysql.event 希望有列sql_mode 在第14列 但是没有 后来查看了一些文章说是 mysql更新mariadb需要升级 
    执行 mysql_upgrade -u root -proot  所有主从都升级 再次测试解决
    》》测试奇偶主键

    测试创建表 (主机147操作) 

    MariaDB [db4]> create table tt(id int primary key auto_increment,name varchar(20));
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [db4]> insert into tt(name) values('134');
    Query OK, 1 row affected (0.01 sec)
    
    MariaDB [db4]> insert into tt(name) values('234');
    Query OK, 1 row affected (0.00 sec)
    查看发现成功 
    MariaDB [db4]> select * from tt;
    +----+------+
    | id | name |
    +----+------+
    |  1 | 134  |
    |  3 | 234  |
    +----+------+
    2 rows in set (0.00 sec)

    这里同时配置 151和150的一主一丛关系 和上面配置一样

    4》配置双主多从
    》》主备机151配置

    因为 151也是主机 只是147的备份机 一旦147挂了 151承担写入
     151需要开启日志 同时拥有一个唯一的主机id 并且是147的从机 需要同步数据
     147和151互为主从 任意机器写入都要互相复制

    151修改

     添加同步用户

    grant replication slave on *.* to 'slave'@'%' identified by 'test';  
     cp -r /usr/share/mysql/my-large.cnf  /etc/my.cnf
    修改my.ini
    server-id       = 4 #数据库表示 默认是开启的
     log-bin=mysql-bin  #开启日志记录 默认是开启的 如果改行被注释 不可能是master show master status肯定是空
     auto_increment_increment=2        #  使用偶数值值主键 2开始每次+2就是偶数
     auto_increment_offset=2           #自动增长的起始数值
     log-slave-updates=on #这个一定要加 只能加两台主机(147 151)上 意思是从其他主机同步过来的中继日志数据是否写入log-bin日志 从机是从
                                  log-bin中同步数据 如果不添加 比如在151插入数据  147能看到 147的从机149 就看不到了
    启动mariadb

    service mariadb start
    找到147的日志文件和位置 (show master status)
    执行从的命令
    change master to
    master_host='192.168.58.147',
    master_user='slave',
    master_password='test',
    master_log_file='日志文件名',
    master_log_pos=位置 ;
    启动slave
    slave start
    查看状态
    show slave status
    Slave_IO_Running: Yes
    Slave_SQL_Running: Yes 
    147修改 (147也需要设置成151的从机)
    修改my.cnf 添加
    log-slave-updates=on
    执行命令

    change master to
    master_host='192.168.58.151',
    master_user='slave',
    master_password='test',
    master_log_file='mysql-bin.000001',
    master_log_pos=245 ;
    
    start slave
    测试从147加入数据  151加入数据
    关闭147 151加入数据 发现 从机149和150都无法同步数据因为两台从机的主机是147 一旦147挂149从机无法查询到最新数据了
    

  • 相关阅读:
    一个cs架构的在线考试系统
    TreeComboBox控件范例
    new和override修饰符的区别
    Hello cnblogs
    MapInfo图层坐标系统转换
    C#调用新浪微博API生成RSS资源文件
    MapInfo图层格式转ArcGIS图层格式
    用ArcGIS的ArcToolbox进行地图切割
    VS2008智能提示消失的解决方法
    【学习笔记】零基础C#窗口程序开发入门
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331166.html
Copyright © 2020-2023  润新知