Centos7系统中将Mysql置换为Mariadb了;Mariadb是Mysql数据库被Oracle公司收购之后Mysql之前的开发者基于mysql开发的开源数据库,完全兼容mysql;更详细的纠葛请自行google。
Mysql的主从复制是指从服务器向主服务器索取二进制binlog文件,在从服务器上把日志文件重新执行,从而获取主服务器数据,保证从服务器和主服务器的数据保持同步。但由于是异步的复制,从服务器在一定程度上落后于主服务器,刚写入到主服务器上的数据可能服务在从服务器上查询得到。
复制原理过程
- 从服务器创建I/O线程连接主数据库,向主数据请库服务器求二进制日志文件(binlog)
- 主服务器上启动Binlog Dump,将二进制日志文件发送给I/O线程,I/O线程获取数据后将数据卸载从库的中继日志中(relay log)
- SQL线程读取中继日志并执行
日志方式
- statement:基于语句级别的binlog,记录修改数据的sql语句。
- row: 基于行级别的binlog逐行记录数据的变更。
- mixed:由Mysql数据库自动选择哪种方式记录binlog。
raw格式下日志文件会很大,会影响磁盘的I/O,在传输过程中也会影响带宽,根据情况自行选择。
集群环境搭建
系统:Centos7 x64
软件:Mariadb 10.2 stable
保持服务器时间同步
1 | timedatectl set-timezone Asia/Shanghai |
安装Mariadb软件
配置yum源
参考https://downloads.mariadb.org/mariadb/repositories/
vim /etc/yum.repos.d/MariaDB.repo
1 | # MariaDB 10.2 CentOS repository list - created 2017-07-27 03:36 UTC |
安装
1 | yum -y install MariaDB-server MariaDB-client |
启动服务,并设置开机启动
1 | systemctl start mariadb.service |
初始化服务器
1 | 可以初始化过程中设置密码 |
配置主服务器
将以下配置添加到my.cnf中[mysqld]下
1 | server-id=102 #服务器ID号(取值范围为1到2的32次方-1的整数,建议使用ip地址最后一位,保持唯一性),写成server_id 不生效 |
给slave开相应的权限
1 | GRANT REPLICATION SLAVE ON *.* TO ‘repl’@‘192.168.6.103’ IDENTIFIED BY ‘123456’; |
配置从服务器
将以下配置添加到my.cnf中[mysqld]下
1 | server-id=103 #服务器ID号(取值范围为1到2的32次方-1的整数,建议使用ip地址最后一位,保持唯一性) |
Mysql版本从5.1.7以后开始就不支持“master-host”类似的参数;
在从库上执行如下命令;
1 | change master to master_host='192.168.6.102', master_user='repl', master_password='123456'; #好像不需要master_log_file和master_log_pos也可以; |
测试
在主服务器上新建数据库,建表,插入数据;在从库上查询;
1 | mysql -uroot -pffffff |
在从库上查询;
1 | mysql -uroot -pffffff |
可以在主库上看到连接的从库信息(一主多从很有用)
1 | MariaDB [test_repl]> show slave hosts; |
问题记录
Q1:
Q:Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’
A:
1 | MariaDB [test_repl]> stop slave; |
Q2:
Q:Could not execute Update_rows event on table mysql.user; Can’t find record in ‘user’, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event’s master log mariadb-bin.000003, end_log_pos 1749
A:
1 | MariaDB [test_repl]> stop slave; |
Q3:
Q:
Last_SQL_Errno: 1146
Last_SQL_Error: Unable to load replication GTID slave state from mysql.gtid_slave_pos: Table ‘mysql.gtid_slave_pos’ doesn’t exist
A:
主从的版本是一样是,不清楚为什么会出现这样的问题,使用mysql_upgrade升级修复了一下好了;
1 | mysql_upgrade -uroot -pffffff |
扩展阅读
Mysql默认的复制是异步的,Mysql(5.5以后版本)半同步复制
参考链接:
https://linux.cn/article-5491-1.html
http://joelhy.github.io/2015/02/06/mariadb-master-slave-replication/
http://www.cnblogs.com/gomysql/p/3662492.html