一.简介
MariaDB的默认工作模式为异步工作,
从服务器通过IO thread(向主服务器请求二进制日志中的时间)和SQL thread(从中继日志读取时间并在本地执行)工作
主服务器通过binlogdump(将从服务器的IO thread请求的时间发送给对方)
二.工作架构
从服务器有且只能有一个主服务器(MariaDB-10之前),MariaDB-10:支持多主模型,多源复制
一主多从是可以理想状态
读写分离:主从模型下,让前端分发器能够识别读/写。并且按需调度至目标主机
双主模型:master-master
1.必须设定双方的自动增长属性,以避免冲突
auto_increment=# 定义自动增长字段起始值
auto_increment_offset = 2 设定步长
2.数据不一致
功用:均衡读请求,写请求双方一样
三、主从复制的配置
1.环境如下
ip地址 | 数据版本 | 系统版本 | |
master | 192.168.1.111 | MariDB5.5.36 | centos6.5 |
slave | 192.168.1.112 | MariDB5.5.36 | centos6.5 |
2.版本:双方的版本要一致,如果不一致,主的要低于从的
时间:两台服务器的时间应该同步
3.从哪儿开始复制
①、都从0开始
②、主服务器已经运行一段时间,并且存在不小的数据量
4.从0开始的配置过程
①、主服务器
修改配置文件
server-id = 1 服务器通过server-id来判断是否是本机已经执行过的命令 log-bin= /mydata/logs/master-bin 建议将二进制文件不要和数据文件放在同一个目录中 innodb_file_per_table = ON 将innodb的表分开存放 sync_binlog = 1 确保主从复制时的事务安全
创建有复制权限的账号
MariaDB [(none)]> grant replication slave,replication client on *.* to 'wangfeng7399'@'192.168.1.112' identified by 'wangfeng7399'; 授权用户复制权限 MariaDB [(none)]> flush privileges; 通知数据库重读授权库
②、从服务器
修改配置文件
#log-bin=mysql-bin 注释掉从服务器上的二进制文件日志,因为从服务器不会发生写操作,所有不需要开启二进制文件日志 server-id = 12 修改从服务器上的server-id,一定不要跟主服务器一样 innodb_file_per_table = ON 将innodb的表分开存放 relay_log = /mydata/logs/slave-bin 开启中继日志, read-only=ON 仅能复制那也不具有super权限的用户无法执行写操作 sync_binlog = 1 确保主从复制时的事务安全
连接主服务器
使用格式 CHANGE MASTER TO option [, option] ... option: MASTER_BIND = 'interface_name' | MASTER_HOST = 'host_name' 主服务器地址 | MASTER_USER = 'user_name' 授权复制的用户名 | MASTER_PASSWORD = 'password' 授权复制的密码 | MASTER_PORT = port_num 主服务器的端口 | MASTER_CONNECT_RETRY = interval 探测主服务器的时间 | MASTER_HEARTBEAT_PERIOD = interval 连接重试的时间 | MASTER_LOG_FILE = 'master_log_name' 复制开始的文件 | MASTER_LOG_POS = master_log_pos 复制开始的节点 命令 MariaDB [(none)]> change master to master_host='192.168.1.111',master_user='wangfeng7399',master_password='wangfeng7399'; Query OK, 0 rows affected (0.06 sec)
启动复制线程
使用格式 START SLAVE [thread_types] START SLAVE [SQL_THREAD] UNTIL MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos START SLAVE [SQL_THREAD] UNTIL RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos thread_types: [thread_type [, thread_type] ... ] thread_type: IO_THREAD | SQL_THREAD 命令 MariaDB [(none)]> start slave; Query OK, 0 rows affected (0.00 sec)
查看从服务器状态
MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.1.111 主服务器的ip地址 Master_User: wangfeng7399 授权用户 Master_Port: 3306 Connect_Retry: 60 更新时间 Master_Log_File: master-bin.000009 主服务器的二进制日志 Read_Master_Log_Pos: 507 主服务器的当前节点 Relay_Log_File: slave-bin.000002 从服务器的中继日志 Relay_Log_Pos: 8473 从服务器的当前节点 Relay_Master_Log_File: master-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes
③、测试
在主服务器上创建数据
MariaDB [(none)]> use hellodb; Database changed MariaDB [hellodb]> create table t2(name char(20)); Query OK, 0 rows affected (0.05 sec) MariaDB [hellodb]> insert into t2 values ('zhangsan'),('lisi'); Query OK, 2 rows affected (0.05 sec) Records: 2 Duplicates: 0 Warnings: 0
在从服务器上查看
MariaDB [hellodb]> show tables; +-------------------+ | Tables_in_hellodb | +-------------------+ | classes | | coc | | courses | | scores | | students | | t1 | | t2 | | teachers | | toc | +-------------------+ 9 rows in set (0.00 sec) MariaDB [hellodb]> select * from t2; +----------+ | name | +----------+ | zhangsan | | lisi | +----------+ 2 rows in set (0.01 sec)
我们可以看到在从上面已经可以看到主上添加的数据了
5.服务器运行一段时间,并且存在不小的数据集
应该把主服务器备份,然后在从服务器上恢复,从主服务器上备份处的位置开始复制,在连接主服务器的时候要指定MASTER_LOG_FILE = 'master_log_name' 和MASTER_LOG_POS =master_log_pos ,本处不在给出测试结果,关于如何备份恢复数据库,请移步本人的相关博客http://wangfeng7399.blog.51cto.com/3518031/1394996
切记要将主服务器的二进制日志和从服务器的中继日志的属主和属组改为mysql
6.复制过滤器
主服务器上可以通过以下来限制
binlog_do_db 用来定义白名单
binlog_ignore_db 用来定义黑名单
从服务器上可以通过以下来限制
replicate_do_db 数据库白名单
replicate_ignore_db 数据库黑名单
replicate_do_table = db_name.table_nmae 表的白名单
replicate_ignore_table = db_name.table_nmae 表的黑名单
replicate_wild_do_table 表的白名单还支持正则表达式
replicate_wild_ignore_table 表的黑名单还支持正则表达式