目的
1.数据实时备份,在主节点出现故障时能够迅速进行故障转移
2.可以用于负载均衡,过将读写请求分配到两个主节点上,可以减轻单个节点的压力,提高整个数据库系统的处理能力和稳定性。
原理
通过开启二进制日志功能,通过日志将主节点的数据变化,通过有相应权限的账户同步到从节点的服务器上
实现
注意事项
建议部署前用空表,以保证两台服务器上的数据一致,不是必须的,但数据一定要一致,否则会出错无法同步,
以下部署以8.X.X MYSQL版本为例,如果是部署在容器里,有些版本在部署时可能因为功能被阉割不支持语法。
以下以部署双向热备为例
一.修改配置文件
mysql配置文件,windows系统下配置文件为my.ini,linux系统下配置文件为my.conf
在配置文件[mysqld]下面添加或修改信息
因为当前部署的是双向同步,所以两台服务器即是主也是从,配置信息的server-id不能相同外,其他信息一样即可
log-bin=mysql-bin #开启二进制日志以及文件名称
binlog_format=mixed
server-id = 85 #mysql唯一服务器标识
slave-skip-errors = 1032 #可有可无,主要是用来跳过一些不重要的出错类型
relay_log = mysql-relay-bin #中继日志文件文件名
log_slave_updates = 1
read_only = 0 # 需要读写分离则这里填1,只读
replicate-do-db = db_1
replicate-do-db = db_2
replicate-do-db = db_3 #例这里有3个库要做数据同步
expire_logs_days = 10 #二进制日志自动删除的天数。默认值为0,表示“没有自动删除”此方法需要重启mysql
二.添加账户
在主服务器上添加有相应权限的用户名及密码,以便从服务器用该账户进行同步数据
因为是双向同步,所以所有服务器都要添加同步账号
#创建一个用户名和密码用于复制
CREATE USER 'copy_user'@'%' IDENTIFIED BY 'password';
#对创建的用户授权
GRANT REPLICATION SLAVE ON *.* TO 'copy_user'@'%';
三.查询二进制日志位置
输入以下指令
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000xxx | xxxxxxxx | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
记录File和Position的数值,这里要注意,因为是双向同步,所以每台服务器都要查看,且不能乱了
为了方便对比和理解,假设A主机File的值为mysql-bin.000001,Position的值为10000
B主机File的值为mysql-bin.000002,Position的值为20000
四.配置复制功能
在A主机输入以下指令
CHANGE MASTER TO MASTER_HOST='B主机的ip地址或域名', MASTER_USER='copy_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=2000;
在B主机输入以下指令
CHANGE MASTER TO MASTER_HOST='A主机的ip地址或域名', MASTER_USER='copy_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1000;
也就是在当前主机里配置另一台主机的信息,达到复制另主机上的数据为目的
五.启动复制
在每台主机上输入启动复制服务
START SLAVE;
输入以下指令可查看服务运行状态
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 10.0.0.80
Master_User: copy_user
Master_Port: 5150
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 100000
Relay_Log_File: mysql-relay-bin.000006
Relay_Log_Pos: 2663387
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: db_1,db_2,db_3
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 36066555
Relay_Log_Space: 2663766
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 80
Master_UUID: 0d521a2d-bb74-11ef-872e-0242ac120004
Master_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
Master_public_key_path:
Get_master_public_key: 0
Network_Namespace:
1 row in set, 1 warning (0.03 sec)
主要看Slave_IO_Running和Slave_SQL_Running的结果是不是YES,如果不是就要查看原因,排除原因后先停止同步服务(下面指令),重新配置正确后再启动服务
STOP SLAVE;
如果查看失败可能是版本问题,可以输入以下指令看看,区别就是上面的结果以列表形式展现,去掉\G是以表格形式展现
SHOW SLAVE STATUS;
结束语
1.所有主机的server-id配置不能相同
2.同步前两台服务器的数据要一致,推荐先弄成空表,然后把数据复制进来另一个服务器会自动同步过去