Mysql主从复制

简介

MySQL 作为世界上使用最为广泛的数据库之一,免费是其原因之一。但不可忽略的是它本身的功能的确很强大。随着技术的发展,在实际的生产环境中,由单台MySQL数据库服务器不能满足实际的需求。此时数据库集群就很好的解决了这个问题了。采用MySQL分布式集群,能够搭建一个高并发、负载均衡的集群服务器。在此之前我们必须要保证每台MySQL服务器里的数据同步。数据同步我们可以通过MySQL内部配置就可以轻松完成,主要有主从复制和主主复制。

主从复制原理

1、主数据库有个bin-log二进制文件,记录了所有增删改Sql语句。(binlog线程)
2、从数据库把主数据库的bin-log文件的sql语句复制过来。(io线程)
3、从数据库的relay-log重做日志文件中在执行一次这些sql语句。(Sql执行线程)

上图主从复制分了五个步骤进行:

步骤一:主库的更新事件(updateinsertdelete)被写到binlog

步骤二:从库发起连接,连接到主库。

步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库。

步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log

步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db

配置主节点Mysql

# 编辑Mysql的配置文件
vim /usr/my.cnf
# 在[mysqld]下添加
# 指定master主机的id,不可为0,否则拒绝所有slave连接。不可和从节点重复
server-id=1
# 指定bin-log文件前缀名称,开启binlog日志
# log-bin=mysql_bin
# 需要同步的数据库名称
binlog-do-db=zhucongtb
# 保留10天的bin_log日志,防止日志太多占用磁盘空间
expire_logs_days = 10
# 限制每个bin_log日志大小最大为100M。
max_binlog_size = 100M
# 指定最大连接数
max_connections=600
# 等待超时
wait_timeout=5

# 重启mysql

查看是否配置成功:

配置从节点Mysql

# 编辑Mysql的配置文件
vim /usr/my.cnf
# 在[mysqld]下添加
server-id=2


# 重启mysql

# 通过命令连接mysql
mysql -uroot -p
# 输入数据库连接密码

# 配置连接master的相关信息配置
change master to
master_host='127.0.0.1', # 主节点Mysql地址
master_user='root',      # 主节点Mysql用户名
master_password='123456',# 主节点Mysql密码
master_port=3306,         # 主节点Mysql端口号
master_log_file='mysql-bin.000034',# 对应主节点中的File
master_log_pos=154;     # 对应主节点中的Position

# 将master连接信息配置写在一行。
mysql>change master to master_host='192.168.1.1',master_user='repl',master_password='123',master_log_file='mysql-bin.000034',master_log_pos=154;

启动和停止从节点

# 开启从节点
start slave;
# 查看从节点
show slave status\G
# 停止从节点
stop slave;

测试

我们在主节点Mysql上面创建一个表,在打开从节点就会看到刚刚在主节点上面创建的表。

问题

如果出现Connecting,则代表连接主节点失败。

解决方案:
使用Mysql连接工具尝试使用之前设置从节点连接主节点服务器账号和密码登录,如果发现不能登录则需要开启root外网可登录权限。

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你自己root的密码'
# 刷新配置;
flush privileges;