1.1. MySQL的Master和Slave配置
MySQL主从同步是目前使用比较广泛的数据库架构,技术比较成熟,配置也不复杂,特别是对于负载比较大的网站,主从同步能够有效缓解数据库读写的压力。
1.1.1. MySQL主从同步的机制
1. Slave 上面的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2. Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 BinaryLog 中的位置;
3. Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的RelayLog文件(MySQL-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的高速Master“我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我”
4. Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave端执行了同样的 Query,所以两端的数据是完全一样的。1.1.2. MySQL主从同步的作用
Ø 可以作为一种备份机制,相当于热备份
Ø 可以用来做读写分离,均衡数据库负载
1.1.3. MySQL主从同步的步骤
1.1.3.1. 准备操作
Ø 主从数据库版本一致,建议版本5.5以上
Ø 主从数据库数据一致
Ø 主从数据库所在的服务器能够相互ping通,即能够互联互通
Ø 确保从数据库能够连接主数据库,root用户能够远程访问数据库
1.1.3.1. 主数据库master修改
Ø 修改MySQL配置
修改/etc/mysql/my.cnf文件,找到下面的注释行,将注释打开:
server-id =1 88
log_bin =/var/log/mysql/mysql-bin.log 89
Ø 重启mysql,创建用于同步的账户:
进入MySql的命令行,执行:如下命令
grant replication slave on*.* to 'user'@'ip' identified by 'password';
命令解释:
*.*:所有数据库的所有权限,可以根据需要设置
user:用于从数据库同步数据的账号
ip:从数据库的ip地址,可以设置为“%”即允许所有的ip
password:用于从数据库同步数据账号的密码
然后执行mysql>flush privileges;更新数据库权限,使上面的命令生效。
Ø 查询master的状态
执行show master status;语句会输出:
注:记住自己上面红色圈起来的值,在后面会用到。执行完这个步骤后不要再操作主数据库了,防止主数据库状态值变化。
1.1.3.2. 从数据库slave修改
Ø 修改MySQL配置:
修改/etc/mysql/my.cnf文件,找到下面的注释行,将注释打开:
server-id = 2
注:server-id的值必须保证没有被别的MySQL服务所使用。
重启mysql;
Ø 执行同步命令:
进入MySql的命令行,设置主数据库ip,同步帐号密码,同步位置,如下:
change master to master_host='192.168.3.135', master_user='repl',master_password='123456', master_log_file='mysql-bin.000002', master_log_pos=336;
注:master_log_file='mysql-bin.000002',master_log_pos=336,这两个属性的值,就是上面截图中,红色圈起的值。
继续执行命令:start slave;开启同步功能。
Ø 检查从数据库状态:
执行命令:show slave status\G;得到以下输出,输出的部分截图:
注:1. 将上面所有命令中的红色字体修改为自己实际的值。
2. Slave_IO_Running及Slave_SQL_Running进程必须正常运行,即YES状态,否则说明同步失败。
3. 在配置从数据库是,如果出现了ERROR1201 (HY000): Could not initialize master info structure;这个错误,则是之前曾做过主从复制,解决方案是:运行命令 stop slave;成功执行后继续运行 reset slave;然后继续运行GRANT命令重新设置主从复制。如果是别的错误,请到搜索引擎搜索自己的错误及解决方案。如果没有出现错误,请忽略此项。
1.1.3.1. 其他可能用到的相关参数
Ø master端:
在MySQL的安装目录下找到my.ini的配置文件,在最后加入如下配置:
# 不同步哪些数据库
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = information_schema
# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db = game
# 日志保留时间
expire_logs_days = 10
# 控制binlog的写入频率。每执行多少次事务写入一次
# 这个参数性能消耗很大,但可减小MySQL崩溃造成的损失
sync_binlog = 5
# 日志格式,建议mixed
# statement 保存SQL语句
# row 保存影响记录数据
# mixed 前面两种的结合
binlog_format= mixed
1.2. 读写分离
完成MySQL的主从配置,实现数据的实时同步,采用架构的方式实现MySQL的读写分离。
统一认证平台完成数据的增删改的操作,保存数据到MySQL的Master的数据库中,Salve数据库从Master数据库中实时同步数据,应用系统从Salve数据库中读取书据。