Mysql 主从/双主同步
主从同步
一、准备阶段:
#共3台服务器,2台安装mysql,1台nginx(主从同步不用nginx,双主需要nginx)
#这里默认mysqlA为主库(有数据),mysqlB为从库(无数据),mysqlA无数据库也是可以的
mysqlA mysqlB nginx
二、登录mysqlA和mysqlB修改 my.cnf 配置
server_id = 1
#这个配置不能 重复,可以随意命名 为了方便顺序起 mysqlA id 1 mysqlA id 2
#开启bin日志
log-bin= mysql-bin
#开启bin日志级别 有三种 我常用 row 行级别 更详细日志
binlog-format=ROW
#忽略 需要同步的表 #也可以配置 只同步的表 replicate-do-db=test
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
#双主都是0,可读写,1是可读
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
##初始id值mysqlA为 1 ,mysqlA为 2
auto-increment-offset=1
##自增步幅度 2,因为负载2台所以这边设置2,根据自己的要求
auto-increment-increment=2
#注意:如果这个参数不同,可能会存在问题
lower_case_table_names=0 #表明区分大小写
lower_case_table_names=1 #表名不区分大小写
#选择增加配置: slave-skip-errors=all #跳过所有错误
完整配置参考:
#mysqlA配置
server_id = 1
log-bin= mysql-bin
binlog-format=ROW
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
#slave-skip-errors=all
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=1
auto-increment-increment=2
#mysqlB配置
server_id = 2
log-bin= mysql-bin
binlog-format=ROW
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
#slave-skip-errors=all
read-only=0
relay_log=mysql-relay-bin
log-slave-updates=on
auto-increment-offset=2
auto-increment-increment=2
三、重启两台数据库
systemctl restart mysql
#在挂载的data目录里面有mysql-bin.index和类似命名mysql-bin.0000001表示开启日志成功
四、开始同步
注意 :开启同步操作必须先优先从库读主库
举例:mysqlA (数据有) mysqlB(数据没有) 则必须先操作B库,去读 A库的日志同步,否侧 数据 会全部丢失
登录 mysqlA
mysql -u root -p
mysql> show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000022 | 55789429 | | | |
+------------------+----------+--------------+------------------+-------------------+
##需要记录,然后登录 mysqlB开启同步操作
file mysql-bin.000022 pos 55789429 #根据实际填写
登录mysqlB
#读取远程bin日志开启同步
mysql> change master to master_host='mysqlA的ip', master_port=3306, master_user='root', master_password='Simple@01!', master_log_file='mysql-bin.000022', master_log_pos=55789429 ;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
#查看是否成功
mysql> show slave status\\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.115
Master_User: simple
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000022
Read_Master_Log_Pos: 45299492
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 55236
Relay_Master_Log_File: mysql-bin.000022
Slave_IO_Running: Yes #看这个状态 yes为成功
Slave_SQL_Running: Yes #看这个状态 yes为成功
Replicate_Do_DB:
Replicate_Ignore_DB: mysql,sys,information_schema,performance_schema
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: 45299492
Relay_Log_Space: 55443
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: 115
Master_UUID: a22728a4-9520-11ec-96f4-0050568d79d0
Master_Info_File: /home/dpan/mysqldata/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave 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:
1 row in set (0.00 sec)
至此主从已经搭建完毕,可以在mysqlA添加删除或者修改一条数据,看mysqlB是否实时更新。
双主同步
需要mysqlA读mysqlB的日志,命令一样这边就不写明了
#在mysqlB读取
mysql> show master status;
#登录mysqlA
mysql> change master to master_host='mysqlB的ip', master_port=3306, master_user='root', master_password='Simple@01!', master_log_file='mysql-bin.000001', master_log_pos=154; #根据实际情况
start slave;
Query OK, 0 rows affected (0.01 sec)
现在双主已经搭建完毕
nginx负载
现在就可以用nginx 做负载,登录nginx服务器修改配置
stream {
upstream mysql {
##负载 下面的 数据库
server mysqlA的ip:3306 max_fails=3 fail_timeout=30s;
server mysqlB的ip:3306 max_fails=3 fail_timeout=30s;
}
server {
## 负载端口
listen 3306;
proxy_connect_timeout 30s;
proxy_timeout 120s;
proxy_pass mysql;
}
}
#重载
nginx -s reload
数据库双主负载搭建成功