概论

image.png
Mysql 实现主从复制

主从复制可以实现Mysql数据库的灾备,当主节点异常的时候(比如磁盘损坏),从节点虽然不会自动切换(除非装sentinal),但是主节点的数据不会丢失,从节点有一份完整的备份。
Mysql的读写分离的前提就是 主从复制,只有配置好了主从复制,才可以使用中间件(sharding-jdbc)来执行代码层面方便安全的读写分离。
下面的例子演示的一主一从的配置(一个windows ,一个linux 虚拟机),Mysql的版本 5.7.19,配的过程有很多坑,一个个迈,不过最终还是成功了。

Mysql 从复制的配置过程

从数据库IP地址: 192.168.29.129
主数据库IP地址: 192.168.29.1

  1. 主服务器给从服务器授权: 授权用户 synchzs /123456
    登录mysql以后执行授权命令(授权了 SLAVE权限和File权限)
  1. GRANT REPLICATION SLAVE ON *.* to 'synchzs'@'192.168.29.129' identified by '123456';
  2. GRANT ALL PRIVILEGES ON *.* to 'synchzs'@'192.168.29.129' identified by '123456' WITH GRANT OPTION;
  3. FLUSH PRIVILEGES;
  1. 配置主服务器(在 %datadir%/binlog文件夹下面生成 mysql-bin.0001一些列日志)
  1. [mysqld]
  2. server-id=1
  3. log-bin=./binlog/mysql-bin
  4. binlog_format=mixed
  5. binlog-do-db=testsync
  6. binlog-ignore-db=eedu
  1. 重启主服务器(可能需要权限 windows)
  • 停止:net stop mysql
  • 启动:net start mysql
  • 登录mysql: show master status; 查看是否配置成功,查看 bin-log的文件名和index下标
  1. 在从数据库创建对应的准备主从复制的数据库
  2. 修改从数据库的配置文件:一定要有 server-id 的字段
  1. [mysqld]
  2. server-id=129
  3. port = 3306
  4. user = mysql
  5. basedir=/usr/share/mysql
  6. datadir=/var/lib/mysql
  7. tmpdir=/tmp
  1. 配置从数据库
  • 先关闭slave(如果你以前配置过主从的话,一定要先关闭)
  • 通过命令的形式指定 主从关系
  • 再按照新的配置 启动slave
  1. stop slave;
  2. change master to master_host='192.168.29.1',master_port=3306,master_user='synchzs',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=800;
  3. start slave;

参数解释:

  • MASTER_HOST : 设置要连接的主服务器的ip地址
  • MASTER_USER : 设置要连接的主服务器的用户名
  • MASTER_PASSWORD : 设置要连接的主服务器的密码
  • MASTER_LOG_FILE : 设置要连接的主服务器的bin日志的日志名称,即第3步得到的信息
  • MASTER_LOG_POS : 设置要连接的主服务器的bin日志的记录位置,即第3步得到的信息,(这里注意,最后一项不需要加引号。否则配置失败)
  1. 从服务器通过 show slave status \G; 命令,查看自己和主服务器的链接情况
    如果show slave status显示 Slave_IO_Running: NO Slave_SQL_Running: No 的话,重启一下主从服务器,等都显示Yes的时候,主从复制就成功了
  2. 在主数据库 创建一张 student表,并且插入一条数据。插入之后,通过从服务器读取,可以读取成功。

注意事项

  1. Slave授权、file授权,最好都做
  2. 测试网络是否正常,所以在从服务器可以先尝试通过命令远程连接主服务器,从而排除网络的问题,和file权限的问题
  1. 远程连接尝试
  2. mysql -usynchzs -p123456 -h 192.168.29.1
  3. show databases //查看授权过了的数据库
  1. 排查问题的时候,可以尝试阅读日志文件,默认mysql的日志文件在dataDir配置的路径下面
  2. 其实可以在从服务器设置 read-only=1 ,来避免普通用户直接往 从库里面插入数据,但是root用户仍然有权限插入数据,除非锁住全部的表
  3. 如果从库的数据库名称和主库不一样,需要在从库的my.cnf里面配置别名
  1. //主库的eedu 从库的别名是eedu_hbk2 这个库
  2. replicate-rewrite-db = eedu -> eedu_hbk2