一.简介
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开始的配置过程
①、主服务器
修改配置文件
1
2
3
4
5
6
7
8
|
server-id =
1
服务器通过server-id来判断是否是本机已经执行过的命令
log-bin= /mydata/logs/master-bin
建议将二进制文件不要和数据文件放在同一个目录中
innodb_file_per_table = ON
将innodb的表分开存放
sync_binlog =
1
确保主从复制时的事务安全
|
创建有复制权限的账号
1
2
3
4
|
MariaDB [(none)]> grant replication slave,replication client on *.* to
'wangfeng7399'
@
'192.168.1.112'
identified by
'wangfeng7399'
;
授权用户复制权限
MariaDB [(none)]> flush privileges;
通知数据库重读授权库
|
②、从服务器
修改配置文件
1
2
3
4
5
6
7
8
9
10
11
12
|
#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
确保主从复制时的事务安全
|
连接主服务器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
使用格式
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)
|
启动复制线程
1
2
3
4
5
6
7
8
9
10
11
12
|
使用格式
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)
|
查看从服务器状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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
|
③、测试
在主服务器上创建数据
1
2
3
4
5
6
7
|
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
|
在从服务器上查看
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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 表的黑名单还支持正则表达式