一. 单个数据库服务器的缺点
数据库服务器存在单点问题
数据库服务器资源无法满足增长的读写请求
高峰时数据库连接数经常超过上限
二. 如何解决单点问题
增加额外的数据库服务器,组建数据库集群
同一集群中的数据库服务器需要具有相同的数据
集群中的任一服务器宕机后,其它服务器可以取代宕机服务器
三. MySQL主从复制架构
1. 主库将变更写入到主库的binlog中
一些MySQL版本并不会开启二进制日志,所以一定要检查是否开启
如果刚开始没有开启,后面再进行开启的话,需要重启数据库才能生效,而且数据库的重启往往会对业务造成很大的影响
尽管二进制日志对性能有稍许的影响,所以还是建议大家无论是否使用复制功能,都要开启Mysql二进制日志,因为增量备份也需要二进制日志
2. 从库的IO线程在指定位置读取主库binlog内容存储到本地的中继日志(Relay Log)中
要完成二进制日志的传输过程,MySQL会在从服务器上启动一个工作线程,称为IO线程,这个IO线程会跟主数据库建立一个普通的客户端连接,然后在主服务器上启动一个特殊的二进制转储线程称为binlogdown线程
从库上的IO线程通过这个二进制转储线程来读取主库上的二进制事件,如果该事件追赶上主库,则会进入sleep状态,直到主库发起信号通知有新事件产生时,才会被唤醒,relay log的格式和binlog格式是完全相同的,
可以使用mysqlbinlog 来读取relay log中的内容
3. 从库的SQL线程读取Relay Log日志中的内容,并在从库中重放
sql线程所执行的事件,我们可以通过配置选项来决定是否要写入到从服务器的二进制日志中
目前mysql支持两种复制类型
基于二进制日志点的复制
基于GTID的复制(Mysql>=5.7推荐使用)
四. MySQL主从配置步骤
1. 配置主从数据库服务器参数
有些参数配置后需要数据库重启才能生效,为了不影响数据库的正常使用,我们最好在服务器上线的同时就把参数都配置好
特别是master服务器的参数,更应该作为服务器初始参数来进行配置
master服务器
log_bin = /data/mysql/sql_log/mysql-bin # 指定mysql的binlog的存放路径 /data/mysql/sql_log,以及日志文件名前缀mysql-bin ,
# 如果只是为了启用binlog,可以不指定存放路径,默认会存放到mysql的data目录下,也就是会把日志和数据文件存放在一起
# 之所以指定路径分开存放,是为了提高IO性能,所以还是建议日志文件和数据文件分开存放
server_id = 100 # mysql的复制集群中通过server_id的值区分不同的服务器,建议使用服务器ip的后一段或后两段的值进行配置,比如192.168.2.100,就设置为100或2100
slave 服务器
log_bin = /data/mysql/sql_log/mysql-bin
server_id = 101
relay_log = /data/mysql/sql_log/relay-bin # 指定relay_log日志的存放路径和文件前缀 ,不指定的话默认以主机名作为前缀
read_only = on # 使所有没有server权限的用户,在从服务器上不能执行写操作,不论这个用户是否拥有写权限 (mysql5.7 可以使用 super_read_only = on ,限制super用户也不能在从服务器上执行写操作)
skip_slave_start = on # 在slave服务器重启时,不会自动启动复制链路。默认情况下slave服务器重启后,mysql会自动启动复制链路,如果这个时候存在问题,则主从链路会中断,所以正常情况下,我们应该在服务器重启后检查是否存在问题,然后再手动启动复制链路
# 下面两个参数是把主从复制信息存储到innodb表中,默认情况下主从复制信息是存储到文件系统中的,如果从服务器宕机,很容易出现文件记录和实际同步信息不同的情况,存储到表中则可以通过innodb的崩溃恢复机制来保证数据记录的一致性
master_info_repository = TABLE
relay_log_info_repository = TABLE
2. 在master服务器上创建用于复制的数据库账号
用于IO线程连接master服务器获取binlog日志
需要* REPLICATION SLAVE** 权限
create user 'repl'@'ip段' identified by 'password';
grant replication slave on *.* to 'repl'@'ip段';
3. 备份master服务器上的数据并初始化 slave服务器数据
建议主从数据库服务器采用相同的MySQL版本
建议使用全库备份的方式初始化slave数据
采用相同版本的好处
我们可以使用全备的方式来初始化slave数据,还可以避免不同版本之间的差异造成数据库同步失败的问题
如果我们使用的主从复制的服务器mysql版本不同,则一定要注意master上的版本一定要低于slave服务器,不然同步的时候就可能出现错误
由于我们演示过程中的mysql服务器都是使用的mysql5.7
所以我们可以使用全备的方式进行
mysqldump --master-data=2 -uroot -p -A --single-transaction -R --triggers
4. 启动基于日志点的复制链路
在slave服务器上运行