Loading... 一般主从复制是主服务器数据库可读可写,从服务器数据库只读,而双机热备是主从服务器的数据库双向复制,从服务器数据库可读也可写。 说到主从复制不得不说--读写分离,此介绍请看这一篇 [一文浅谈“读写分离”技术](https://www.51cto.com/article/745430.html) 双机热备的概念简单说一下,就是要保持两个数据库的状态自动同步。对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致。 这样做的好处多。 1. 可以做灾备,其中一个坏了可以切换到另一个。 2. 可以做负载均衡,可以将请求分摊到其中任何一台上,提高网站吞吐量。 对于异地热备,尤其适合灾备。 ## 主从复制原理 当主服务器上的数据发生变化的时候,主服务器会把这些变化记录到一个日志文件中,然后通知从服务器,从服务器会拉取这个日志文件中的变化信息,然后做出相应的数据变化。 ## 主从复制配置和启动 可以参考这一篇[高性能Mysql主从架构的复制原理及配置详解](https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247505367&idx=2&sn=8eaf87e3d8d108fbee06799ff9f80cbd&chksm=e918b0cbde6f39dd540ac9758c5fe1b15c7abd47b2245c8c6d446a67a266170d3de0c316e712&token=2008553341&lang=zh_CN#rd)。 **实现步骤如下:** 1. 确定主从:确定主从复制服务器。 2. 创建主服务器复制用户:在主服务器上创建用于复制的用户,并为其授予适当的权限,用来给从服务器复制。 3. 配置主服务器:在每台服务器上配置主服务器的 my.cnf 文件。 4. 配置从服务器:在每台服务器上配置从服务器的 my.cnf 文件。 5. 在从服务器启动复制:启动复制进程,并确保数据正常传输。 ### 简略实现过程: #### 配置主从服务器的my.cnf 其中主服务器的my.cnf修改 ```bash log-bin=mysql-bin server-id = 1 ``` 从服务器的my.cnf修改,要指定从服务器同步的博客数据库 ```bash log-bin=mysql-bin binlog_format=mixed server-id = 2 relay_log = mysql-relay-bin log_slave_updates = 1 read_only = 0 # 需要读写分离则这里填1,只读 replicate-do-db = myblog_db ``` 主从服务器都重启下mysql。 #### 创建主服务器复制用户 在主服务器上操作 ```bash mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup1@'从服务器ip' IDENTIFIED BY 'ErTu2QSGzs1'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show master status; +------------------+-----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+-----------+--------------+------------------+-------------------+ | mysql-bin.000024 | 734078947 | | | | +------------------+-----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) ``` #### 在从服务器启动复制 在从服务器上操作 ```bash mysql> CHANGE MASTER TO MASTER_HOST='主服务器ip', MASTER_USER='backup1', MASTER_PASSWORD='ErTu2QSGzs1', MASTER_LOG_FILE='mysql-bin.000024', MASTER_LOG_POS=0; Query OK, 0 rows affected, 2 warnings (0.03 sec) mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G ``` ## 主从复制常见的问题 1、server-id重复 ```bash Last_IO_Errno: 1593 Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it). ``` 2、数据库的键值重复 ```bash Last_Errno: 1062 Last_Error: Error 'Duplicate entry '166127' for key 'PRIMARY'' on query. Default database: 'xxx'. Query: 'INSERT INTO xxx' ``` 解决方法: 1、重新导入主从数据库,保持一致,并且设置LOG_POS为最新的。 ```bash 1.1 导入主从数据库 命令行(不是在 MySQL)执行导出博客数据表结构。 mysqldump -u your_username -p --no-data your_database_name > structure.sql 在这个命令中: -u your_username 是你的数据库用户名 -p 表示需要输入密码 --no-data 选项表示只导出结构,不包含数据 your_database_name 是你的数据库名称 > structure.sql 表示将导出的内容保存到 structure.sql 文件中 1.2 设置LOG_POS为最新的 首先在主库上查看 mysql> show master status; +------------------+-----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+-----------+--------------+------------------+-------------------+ | mysql-bin.000022 | 372102960 | | | | +------------------+-----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 在从库上操作 START SLAVE;STOP SLAVE; CHANGE MASTER TO MASTER_HOST='主服务器ip', MASTER_USER='backup1', MASTER_PASSWORD='ErTu2QSGzs1', MASTER_LOG_FILE='mysql-bin.000024', MASTER_LOG_POS=372102960; #从372102960行后开始复制 mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G ``` 3、主服务器数据库连接失败 ```bash Last_IO_Errno: 2003 Last_IO_Error: error connecting to master ... ``` 排查: (1) 在配置文件中排查了与bindaddress和skip-networking与相关参数后,均没有配置; (2) 于是排查服务器的防火墙,发现防火墙处于开启状态 (3) 关闭防火墙后,重新执行start slave;发现主从配置成功。 配置没错大多是防火墙问题,没有放行mysql的3306端口 ## 双机热备 **实现步骤如下:** 1. 在两台服务器上配置主从复制:每台服务器既是主服务器又是从服务器。 2. 创建复制用户:在两台服务器上创建用于复制的用户,并为其授予适当的权限。 3. 配置主服务器:在每台服务器上配置主服务器的 my.cnf 文件。 4. 配置从服务器:在每台服务器上配置从服务器的 my.cnf 文件。 5. 启动复制:启动复制进程,并确保数据正常传输。 在主从复制的基础上,修改主服务器 my.cnf 文件(主服务器也当成从服务器,即让主服务器复制从服务器)。 ```bash relay_log = mysql-relay-bin log_slave_updates = 1 read_only = 0 replicate-do-db = myblog_db ``` ### 配置主服务器复制从服务器 步骤跟主从复制一样 在从服务器上操作 ```bash mysql> GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup2@'主服务器ip' IDENTIFIED BY 'ErTu2QSGzs2'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000022 | 2747685 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) ``` 在主服务器上操作 ```bash mysql> CHANGE MASTER TO MASTER_HOST='从服务器ip', MASTER_USER='backup2', MASTER_PASSWORD='ErTu2QSGzs2', MASTER_LOG_FILE='mysql-bin.000022', MASTER_LOG_POS=0; Query OK, 0 rows affected, 2 warnings (0.03 sec) mysql> START SLAVE; mysql> SHOW SLAVE STATUS\G ``` 以上配置完毕。 ## 参考: [一文浅谈“读写分离”技术](https://www.51cto.com/article/745430.html) [Mysql-Master-Slave主从配置(1)](https://www.jianshu.com/p/d815084cd8ec) [高性能Mysql主从架构的复制原理及配置详解](https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247505367&idx=2&sn=8eaf87e3d8d108fbee06799ff9f80cbd&chksm=e918b0cbde6f39dd540ac9758c5fe1b15c7abd47b2245c8c6d446a67a266170d3de0c316e712&token=2008553341&lang=zh_CN#rd) [mysql 双主从复制原理(双机热备)](https://blog.csdn.net/l192168134/article/details/75601773) 最后修改:2024 年 06 月 12 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏