一。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.iniserver-id = 1 #数据库表示 默认是开启的
log-bin=mysql-bin #开启日志记录 默认是开启的 如果改行被注释 不可能是master show master status肯定是空
auto_increment_increment=2 #自动增长的步长 解决多个主机自动增长出现重复问题 这个主机使用奇数值 另外一个主机使用偶数值
auto_increment_offset=1 #自动增长的起始数值
启动mariadbservice 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.cnfserver-id = 2 # 149配置为 2 150配置为3
#log-bin=mysql-bin 这个日志默认是关闭的不用开启 server-id必须是一个唯一表示 和 147默认的1 不同
启动mariadbservice 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
查看所有日志文件 登录mysqlshow 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
开始或者关闭slavestart|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.iniserver-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=位置 ;
启动slaveslave 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从机无法查询到最新数据了