配置Master服务

设置my.cnf配置文件

主要需要修改的是以下几个属性:
server-id:服务节点的唯一标识。需要给集群中的每个服务分配一个单 独的ID。
log_bin:打开Binlog日志记录,并指定文件名。
log_bin-index:Binlog日志文件

  1. server-id=4
  2. #开启binlog
  3. log_bin=master-bin
  4. log_bin-index=master-bin.index
  5. skip-name-resolve
  6. # 设置连接端口
  7. port=3306
  8. # 设置mysql的安装目录
  9. basedir=/var/lib/mysql
  10. # 设置mysql数据库的数据的存放目录
  11. datadir=/var/lib/mysql/mysql-files
  12. # 允许最大连接数
  13. max_connections=200
  14. # 允许连接失败的次数。
  15. max_connect_errors=10
  16. # 服务端使用的字符集默认为UTF8
  17. character-set-server=utf8
  18. # 创建新表时将使用的默认存储引擎
  19. default-storage-engine=INNODB
  20. # 默认使用“mysql_native_password”插件认证
  21. #mysql_native_password
  22. default_authentication_plugin=mysql_native_password

修改MySQL密码

  1. $ vim /etc/my.cnf
  2. # 新增以下这行,用于跳过授权表
  3. skip-grant-tables
  4. $ systemctl restart mysqld.service
  5. $ mysql -u root -p
  6. # 无需输入密码直接回车
  7. mysql>use mysql;
  8. mysql>update mysql.user set authentication_string=password('Abc123!_') where user='root';
  9. mysql>flush privileges;
  10. mysql>quit;

需要给root用户分配一个replication slave的权限。在实际生产环境中,通常不会直接使用root用户,而会创建一个拥有全 部权限的用户来负责主从同步。

  1. # 查询host登录的权限是不是%,如果是localhost只能允许本地登录
  2. mysql> select host,user from user;
  3. mysql> update user set host = '%' where user = 'root';
  4. mysql> GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
  5. mysql> flush privileges;
  6. #查看主节点同步状态:
  7. mysql> show master status;

image.png
这个指令结果中的File和Position记录的是当前日志的binlog文件以及文件中的索 引。 而后面的Binlog_Do_DB和Binlog_Ignore_DB这两个字段是表示需要记录binlog 文件的库以及不需要记录binlog文件的库。目前我们没有进行配置,就表示是针对全库记录日志。
开启binlog后,数据库中的所有操作都会被记录到datadir当中,以一组 轮询文件的方式循环记录。而指令查到的File和Position就是当前日志的 文件和位置。而在后面配置从服务时,就需要通过这个File和Position通 知从服务从哪个地方开始记录binLog。
image.png

配置slave服务

设置my.cnf

主要需要关注的几个属性:
server-id:服务节点的唯一标识
relay-log:打开从服务的relay-log日志。
log-bin:打开从服务的bin-log日志记录。

#主库和从库需要不一致 server-id=5 #打开MySQL中继日志 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin #打开从服务二进制日志 log-bin=mysql-bin #使得更新的数据写进二进制日志中 log-slave-updates=1 # 设置3306端口 port=3306 # 设置mysql的安装目录 basedir=/var/lib/mysql # 设置mysql数据库的数据的存放目录 datadir=/var/lib/mysql/mysql-files # 允许最大连接数 max_connections=200 # 允许连接失败的次数。 max_connect_errors=10 # 服务端使用的字符集默认为UTF8 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 默认使用“mysql_native_password”插件认证 #mysql_native_password default_authentication_plugin=mysql_native_password

设置slave同步状态

启动mysqls的服务,并设置他的主节点同步状态。

  1. #设置同步主节点:
  2. mysql> CHANGE MASTER TO MASTER_HOST='192.168.40.4', MASTER_USER='root', MASTER_PASSWORD='Abc123!_', MASTER_LOG_FILE='master-bin.000005',MASTER_LOG_POS=1393;
  3. #开启slave
  4. mysql> start slave;
  5. #查看主从同步状态
  6. mysql> show slave status;
  7. 或者用 show slave status \G; 这样查看比较简洁

注意,CHANGE MASTER指令中需要指定的MASTERLOG_FILE和 MASTER_LOG_POS必须与主服务中查到的保持一致。 并且后续如果要检查主从架构是否成功,也可以通过检查主服务与从服 务之间的File和Position这两个属性是否一致来确定。
image.png
我们重点关注其中红色方框的两个属性,与主节点保持一致,就表示这个主从同 步搭建是成功的。 从这个指令的结果能够看到,有很多Replicate
开头的属性,这些属性指 定了两个服务之间要同步哪些数据库、哪些表的配置。只是在我们这个 示例中全都没有进行配置,就标识是全库进行同步。后面我们会补充如 何配置需要同步的库和表。

验证主从同步

主从同步失败

这个主从架构是有可能失败的,如果在slave从服务上查看slave状 态,发现Slave_SQL_Running=no,就表示主从同步失败了。这有可能 是因为在从数据库上进行了写操作,与同步过来的SQL操作冲突了,也 有可能是slave从服务重启后有事务回滚了。 如果是因为slave从服务事务回滚的原因,可以按照以下方式重启主从同 步:

  • 如果是因为slave从服务事务回滚的原因,可以按照以下方式重启主从同步:

    1. mysql> stop slave ;
    2. mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    3. mysql> start slave ;
  • 另一种解决方式就是重新记录主节点的binlog文件消息,但是这种方式要注意binlog的文件和位置,如果修改后和之前的同步接 不上,那就会丢失部分数据。所以不太常用。

    1. mysql> stop slave ;
    2. mysql> change master to .....
    3. mysql> start slave ;