一、主从同复制原理
在主服务器上进行的操作,如:insert,update,会记录在binlog文件中,从服务器就会去读这个binlog文件,解析成自己可以执行的 relaylog ,然后执行。
binlog 是很敏感的,所以在主服务器中必须创建一个 slaver 账号,然后从服务器使用这个账号来连接主服务器。
二、配置
打开 mysql 的配置文件
-
配置服务器id
这么多服务器读写binlog,会很乱,所以需要为每个服务器配置一个id,一般这些服务器是在同一个局域网内的,所以一般是用ip的主机号部分作为id
server-id=201
-
主服务器配置binlog
# 声明二进制日志文件为mysql-bin.xxxx log-bin=mysql-bin # 二进制日志的格式,可以是 mixed(混合),row(磁盘变化),statement(语句) binlog-format=mixed
二进制日志格式:
row:记录磁盘的变化,适用于语句很长,但磁盘变化很小
statement:记录执行的语句,适用于语句很短,但是磁盘变化很大
mixed:混合使用,由系统根据语句来决定用row还是statement
-
从服务器配置relaylog
relay-log=mysql-relay relaylog-format=mixed
最后配置的结果:
主服务器配置:
[mysqld]
...
server-id=201
log-bin=mysql-bin
binlog-format=mixed
...
从服务器配置:
[mysqld]
...
server-id=202
# 一般从服务器也用作备份,或者它后面又跟着从服务器,所以一般从服务器也开启binlog
log-bin=mysql-bin
binlog-format=mixed
relay-log=mysql-relay
...
三、连接
配置完之后打开mysql,
主服务器查看是否拥有master功能:
mysql> show master status;
从服务器查看是否拥有slave功能:
mysql> show slave status;
-
主服务器创建replication账号,并分配权限
mysql> grant replication client, replication slave on *.* to repl@'192.168.1.*' identified by 'repl'; ymsql> flush privileges;
-
从服务器用账号连接
mysql> change master to -> master_host='192.168.201', -> master_port=3306, -> master_user='repl', -> master_password='repl', -> master_log_file='mysql-bin.0001', -> master_log_pos=0; # 开启slave mysql> start slave; # 查看是否开启成功 mysql> show slave status \G;
注意:
master_log_file: 表示主服务器正在使用哪个binlog文件
master_log_pos: 表示主服务器的binlog的指针现在在哪里
在主服务器中用 show master status; 指令查看这两个值
四、其他
主主复制、读写分离
读写分离:
-
在php层面来控制,判断执行的是什么语句,比如:select则发送到从服务器,insert、update则发送到主服务器
-
在mysql层控制,使用集群中间件,比如官方的mysql_proxy,还有国产的中间件amoeba