6月1日任务:
17.1 MySQL主从介绍
17.2 准备工作
17.3 配置主
17.4 配置从
17.5 测试主从同步
扩展部分
不停库不锁表在线主从配置
http://seanlook.com/2015/12/14/mysql-replicas/
主从不同步
http://www.rfyy.net/archives/2309.html
http://blog.51cto.com/storysky/259280
主主
关于 auto_increment https://blog.csdn.net/leshami/article/details/39779509
http://www.cnblogs.com/ygqygq2/p/6045279.html
mysql-proxy 实现读写分离
http://blog.51cto.com/zzclinux/1980487
mysql-proxy类似的产品有:
mycat 基于阿里的开源软件cobar,官网 www.mycat.io
https://my.oschina.net/ruoli/blog/1789370
mycat实现分库分表
https://www.cnblogs.com/joylee/p/7513038.html
atlas 出自于360,不维护不更新了 https://blog.csdn.net/AnPHPer/article/details/80566385
mysql环形主从
http://ask.apelearn.com/question/11437
mysql架构演变 http://www.aminglinux.com/bbs/thread-8025-1-1.html
MHA架构
http://blog.51cto.com/xiaoshuaigege/2060768
比较复杂的mysql集群架构 http://ask.apelearn.com/question/17026
17.1 MySQL主从介绍
1,简介
- MySQL主从又叫做Replication、AB复制。
- 简单讲就是A和B两台机器做主从后。
- 在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的。
- MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
2,主从过程大致有3个步骤
- 1)主将更改操作记录到binlog里
- 2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里
- 3)从根据relaylog里面的sql语句按顺序执行
3,主从的原理
- 主上有一个log dump线程,用来和从的I/O线程传递binlog。
- 从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog。
- 另外一个SQL线程用来把relaylog里面的sql语句落地
4,MySQL主从原理图
5,mysql主从的应用场景
- 1,用作数据备份。来对抗各种事故,比如服务器宕机等。
- 2,分流读取压力。不仅可以从主上读,也可以在从上读。
17.2 准备工作
安装sql的简单步骤
- 下载一个二进制包
- 解压
- 把解压目录移动到/usr/local/mysql下。
- 移动目录时可能出现的问题:mysql目录已存在。所以移动目录前要确认目标目录的情况。
- 初始化./scripts/myssql_install_db --user=mysql --datadir=/data/mysql
- 初始化时注意事项:mysql用户已建立,/data/mysql目录已存在
- 更改/etc/my.cnf.把datadir和mysql.sock文件都指定好。
- 把启动脚本复制到/etc/init.d下名字叫mysqld
- 启动服务/etc/init.d/mysqld start
- 加入开机启动chkconfig mysqld on
关于mysql启动报错的一种可能性
- /data/mysql目录下的文件或目录所有者不属于mysql用户造成的。
- 解决方法chown -R mysql:mysql /data/mysql
17.3 配置主
1,修改my.cnf
- 在[mysqld]下添加server-id=101和log_bin=xymysql1
- 修改完毕后要重启mysql
/etc/init.d/mysqld restart
- 这时/data/mysql/目录下应该出现了以xymysql1为前缀的文件。
- xymysql1.index为文件的索引。xymysql1.数字的文件为binlog。
- 主从同步就是依靠这些文件来进行的。
2,制做一个测试用的库
- zrlog库里有一些内容。
- 所以,我们把这个库里的内容恢复到一个新建的库里,用来实验
- 备份zrlog库
mysqldump -uroot -p79823871 zrlog > /tmp/zrlog.sql
- 新建实验用库
mysql -uroot -p79823871 -e "create database xytest"
- 将备份的zrlog.sql内容导入xytest库中
mysql -uroot -p79823871 xytest < /tmp/zrlog.sql
- 这样就得到了两个相同的库
3,创建一个负责主从同步的用户
- 进入mysql 输入以下语句
grant replication slave on *.* to 'repl'@slave_ip identified by 'password';
flush tables with read lock;
show master status;
- replication slave就是同步权限
- repl就是同步用户
- slave_ip就是从服务器的ip
- flush tables with read lock;锁表,后就不会继续写入内容了。
- 输入show master status;后记录File和Position的内容。后边有用
4,备份数据库
- 把除了mysql以外的数据库都做一个备份
mysqldump -uroot -p79823871 mysql2 > /tmp/mysql2.sql
mysqldump -uroot -p79823871 xytest > /tmp/xytest.sql
mysqldump -uroot -p79823871 zrlog > /tmp/zrlog.sql
- 后边会将会用到这三个库
17.4 配置从
1,修改my.cnf文件
- 在[mysqld]下添加server-id=102,要求和主不一样
- 从不需要配置log_bin
- 修改完配置文件后,启动或者重启mysqld服务
2,把备份的库导入从数据库
- 用scp命令把备份文件复制过来
scp 192.168.19.101:/tmp/*.sql /tmp/
- 创建备份过的库
mysql -uroot -p79823871 -e "create database mysql2"
mysql -uroot -p79823871 -e "create database xytest"
mysql -uroot -p79823871 -e "create database zrlog"
- 使用备份文件恢复这几个库
mysql -uroot -p79823871 mysql2 < /tmp/mysql2.sql
mysql -uroot -p79823871 xytest < /tmp/xytest.sql
mysql -uroot -p79823871 zrlog < /tmp/zrlog.sql
3,启动从服务器的主从同步
- 进入数据库
mysql -uroot
- 停止从
stop slave;
- 创建主从关系
change master to master_host='', master_user='repl', master_password='', master_log_file='', master_log_pos=xx,
- master_host指主服务器ip。这里默认端口3306。如果用了其他端口使用master_port指定
- master_user同步服务使用的mysql用户
- master_password用户密码
- master_log_file和master_log_pos就是在主服务器上执行show master status;显示的内容。
- 启动从
start slave;
- 查看主从状态
show slave stauts\G
查看主从同步是否正常
- 从上执行
mysql -uroot
show slave stauts\G
- 看是否有
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
- 还需关注
Seconds_Behind_Master: 0 //为主从延迟的时间
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
- 这些error一般会提示错误的原因。
Slave_IO_Running: no的原因
- 由于是克隆过来的机器,所以两台机器的mysql的UUID冲突了。
- 这时需要停止mysql服务
- 把/data/mysql/auto.cnf删除或改名
- 启动mysql服务即可
4,解除主服务器的锁表状态
- 在主服务器的mysql里执行
unlock tables
17.5 测试主从同步
1,my.cnf关于主从配置的参数。
- 主服务器:
Binlog-do-db= //仅同步指定的库
Binlog-ignore-db= //忽略指定的库 - 从服务器
replicate_do_db= //仅同步指定的库(不安全)
replicate_ignore_db= //忽略指定的库(不安全)
replicate_do_table= //仅同步指定的表(不安全)
replicate_ignore_table= //忽略指定的表(不安全)
replicate_wild_do_table= //如aming.%, 支持通配符%
replicate_wild_ignore_table= - 尽量避免直接使用do或者ignore,使用wild_do或wild_ignore更安全。
2,测试
- 主上删除表,查看从服务器相同的表是否存在。
主上执行drop table db;
从上执行show tables;和主的show tabels;对比 - 主上清空表,查看从服务器相同的表是否还有内容。
主上执行truncate table db;
从上执行select count(*) from db;
这个命令是查询表内有多少行的,如果行数相同,说明成功。 - 主从同步的原理是在从服务器上重新执行一次在主服务器上的操作。
- 所以,在从服务器上的任何形式的增删改都会导致主从不同步。
- 如果想修复这种情况,只能重新在保证两方数据一致的情况下进行主从同步。
直播笔记
xtrabackup --> innobackupex
- xtrabackup是一种备份方式。
- innobackupex是前者的带innodb引擎备份的支持。
几篇和mysql主从有关的文章 关键词 GTID
https://blog.csdn.net/xiaoyi23000/article/details/80521423
https://blog.csdn.net/u013399093/article/details/70568837
https://www.cnblogs.com/abobo/p/4242417.html
了解几个关键词
- 读写分离
- 分库分表