随笔 - 8  文章 - 0  评论 - 0  阅读 - 1199

mysql主从复制(基于ubuntu22.04)

mysql主从复制原理:
1、当主节点的数据发生变化时,会将将其写入bin log
2、从节点间隔一定时间对bin log进行探测,若发生数据改变,则从节点生成I/O、SQL两个线程, I/o线程去读取从节点的binlog,并写到relay log
3、主节点则生成log dump线程,用来给从库I/o线程传送binlog
4、SQL线程读取relay log并执行命令,从而实现主从数据一致

设计形式:

作用:
1、数据安全:数据冗余,增强数据的可靠性。即使主服务器发生故障,从服务器也可以提供数据的备份和恢复。
2、故障恢复:主节点出现问题时,可由从节点提供服务,实现故障的快速恢复。
3、提高性能:负载均衡,配合读写分离,可以分担主服务器负载。
主从延迟:主从复制过程中,从库相对于主库的数据同步存在一定的时间滞后。
常见原因:

  1. 主从库之间的网络延迟会导致复制延迟
  2. 慢查询SQL语句,主库需执行了复杂的SQL语句,从库则需要花费更长的时间进行变更。
  3. 硬件性能差异,主从库硬件性能相差较大,导致处理数据发生差异。
  4. 主库读写压力大,当主库面临大量的读写请求时,处理复制数据的速度会受到影响。
    解决方法
  5. 确保主从库之间的网络连接稳定,增加带宽,减少网络延迟。
  6. 优化SQL语句,减少慢查询的数量。
  7. 确保主从库的硬件性能相近
  8. 优化主库的读写性能,可以使用读写分离、增加缓存等方式

部署主从复制
查看Linux版本:lsb_release -a
Description: Ubuntu 22.04.4 LTS
查看mysql版本:mysql --version
mysql Ver 8.0.36-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
一、部署主库:apt install mysql-server
二、修改主库配置文件:vim /etc/mydql/my.cnf
添加配置项:
[mysqld]
server-id=1 # 主数据库的唯一标识符
log-bin=mysql-bin # 启用二进制日志,用于记录主数据库的所有更新操作
binlog-do-db=dbname1 # 指定复制的数据库名称,可指定多个数据库,每行一个
binlog-do-db=dbname2
三、重启主数据库以使配置生效:systemctl restart mysql.service
四、在主数据库上创建一个用于复制的MySQL账户,并授权其从任何主机连接到主数据库。

mysql -uroot -p                                                     #登录mysql
CREATE USER 'liang'@'%' IDENTIFIED BY 'liang123';                   #创建用户并设置密码
GRANT REPLICATION SLAVE ON *.* TO 'liang'@'%' WITH GRANT OPTION;    #对用户授予权限                            
FLUSH PRIVILEGES;                                                   #刷新权限                

五、修改从节点配置文件:vim /etc/mydql/my.cnf
添加配置项:
[mysqld]
server-id=2 # 从数据库的唯一标识符,与主数据库的server-id不同
relay-log=mysql-relay-bin # 启用中继日志,用于在从数据库上复制主数据库的操作
read-only=1 # 设置从数据库为只读,防止在从数据库上直接写入数据
六、重启从数据库以使配置生效:systemctl restart mysql.service
七、登录从库,配置从数据库连接到主数据库

mysql -uroot -p                                  #登录mysql
CHANGE MASTER TO MASTER_HOST='192.168.31.88',    #指向主库             
MASTER_USER='liang',                             #用于复制的MySQL账户
MASTER_PASSWORD='liang123',                      #密码
MASTER_LOG_FILE='mysql-bin.000005',              #主库bin log名称,主库上用SHOW MASTER STATUS查看
MASTER_LOG_POS=157;                              #主库bin log位置,主库上用SHOW MASTER STATUS查看
                      
START SLAVE;                                     #启动从库进程
SHOW SLAVE STATUS\G;                             #显示进程状态

这两个线程状态为yes就说明主从复制已经部署成功了。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

最后测试一下:在主库的test2库创建一个表并写入数据。
mysql> use test2;
Database changed
mysql> CREATE TABLE worker(
-> id INT AUTO_INCREMENT PRIMARY KEY,
-> name VARCHAR(50) NOT NULL,
-> age INT DEFAULT 0
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> insert into worker(id,name,age) values("001","李洋","29");
Query OK, 1 row affected (0.01 sec)

在从库查询一下该表,说明主从复制已经成功
mysql> use test2;
Database changed
mysql> select * from worker;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 李洋 | 29 |
+----+--------+------+
1 row in set (0.00 sec)
mysql>

遇到的一些问题:
1、因为我是用两台虚拟机部署的,主库的配置文件(/etc/mydql/my.cnf)需要修改bind=0.0.0.0,允许用户在其他设备登录吗,不然可能出现从库复制的账号无法登录主库,I/O线程无法读取bin log,一直为no状态。
2、Slave_IO_Running: Connecting,报错为
Last_IO_Error: Error connecting to source 'liang@192.168.31.88:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
AI解答
这个错误信息表明在从服务器(slave)尝试连接到主服务器(master)192.168.31.88 的 MySQL 数据库时遇到了问题。具体来说,认证插件 caching_sha2_password 要求一个安全的连接,但当前的连接可能不是通过 SSL/TLS 加密的。

MySQL 8.0 引入了新的默认认证插件 caching_sha2_password,它要求当通过非本地连接进行身份验证时,必须使用 SSL/TLS 加密连接。

要解决这个问题,你可以采取以下几种方法之一:

配置 SSL/TLS 加密:
在 MySQL 主服务器和从服务器上配置 SSL/TLS 加密,以确保它们之间的连接是安全的。这通常涉及到生成 SSL 证书,并在 MySQL 配置文件中(如 my.cnf 或 my.ini)指定证书的路径。
更改认证插件:
如果你不需要最强的安全设置,或者由于某种原因无法配置 SSL/TLS,你可以考虑将主服务器上的 MySQL 用户(在这个例子中是 liang)的认证插件更改为 mysql_native_password。这可以通过在 MySQL 服务器上执行以下 SQL 语句来完成:
sql

ALTER USER 'liang'@'192.168.31.88' IDENTIFIED WITH 'mysql_native_password' BY 'your_password';  
FLUSH PRIVILEGES;

其中 'your_password' 是该用户的密码。之后,你可能需要重新配置从服务器的复制设置。
允许不安全的连接(不推荐):
虽然这不是一个推荐的做法,因为它会降低安全性,但你可以在从服务器上的 MySQL 配置文件中添加以下设置来允许不安全的连接:

ini
[mysqld]  
[replication]  
ssl-ca=/path/to/ca.pem  
ssl-cert=/path/to/server-cert.pem  
ssl-key=/path/to/server-key.pem  
ssl-cipher=DHE-RSA-AES256-SHA  

允许不安全的连接(不推荐)

require_secure_transport=OFF
但请注意,这样做会使你的连接容易受到中间人攻击(MITM)。
检查网络连接和防火墙设置:
确保主服务器和从服务器之间的网络连接没有问题,并且任何防火墙或安全组规则都允许它们之间的通信。
最后,请确保在修改任何配置或执行任何更改之前备份所有重要数据,并测试任何更改以确保它们不会破坏现有的设置或导致数据丢失。

    • [ ]
posted on   island-lark  阅读(373)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示