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从机无法查询到最新数据了

原文地址:https://www.cnblogs.com/liaomin416100569/p/9331166.html