MySQL主从复制

将主数据库中的DDL和DML操作通过二进制日志传输到从数据库上,然后将这些日志重新执行(重做)一遍;从而使得从数据库的数据与主数据库保持一致。
 
1、MySQL 主从复制的基本介绍

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。

MySQL复制是基于主服务器在二进制日志中跟踪所有对数据库的更改。因此,要进行复制,必须在主服务器上启用二进制日志。每个从服务器从主服务器接收主服务器已经记录到日志的数据。

当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,并在本机上执行相同的更新。然后封锁并等待主服务器通知新的更新。从服务器执行备份不会干扰主服务器,在备份过程中主服务器可以继续处理更新。

 
2、什么是主从复制

简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。

MySQL数据库主从复制主要分为三步:
1master将修改数据的操作记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)。
2slave的io线程将master的binary log events拷贝到它的中继日志(relay log)。
3slave的sql线程解析中继日志中的事件并在从库执行,保持与主库的数据一致。

Binary log:主数据库的二进制日志。
Relay log:从服务器的中继日志。
注意:复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。

 
1、从库准备

1从库change master to 时,ip port user password binlog position写入到master.info进行记录。
2从库 start slave 时,会启动IO线程和SQL线程。

 
2、同步的过程

1从库的IO线程,读取master.info信息,获取主库信息并连接主库。
2主库接收从库的链接请求后,会生成一个准备binlog DUMP的线程,来响应从库。
3主库一旦有新的日志生成,会发送“信号”给主库的binlog dump线程,然后binlog dump线程会读取binlog日志的更新。
4通过binlog dump线程j将数据传送给从库的IO线程。
5IO线程将收到的日志存储到了TCP/IP 缓存。
6写入TCP/IP缓存后,立即返回ACK消息给主库 ,此时主库工作完成。
7IO线程更新master.info文件、binlog 文件名和postion定位。
8IO线程将缓存中的数据,存储到relay-log日志文件,此时io线程工作完成。
9从库SQL线程读取relay-log.info文件,获取到上次执行到的relay-log的位置,作为起点。
10从库SQL线程基于从步骤9中获取到的起点,去中继日志relay-log.000001获取后续操作,在从库回放relay-log中继日志之中内从主库复制过来的数据。
11SQL线程回放完成之后,会更新relay-log.info文件,把当前操作的位置记入,作为下一次操作的起点。
12relay-log会有自动清理的功能。

注:在tcp协议中通讯之前都要经过三次握手,请求方发出一个syn信号请求连接,对方收到并接受的时候就会发出ack消息,ack就是回应的意思。

 
3、主从复制的方式
MySQL的主从复制有两种复制方式,分别是异步复制和半同步复制。
 
1、异步复制
我们之前介绍的就是异步复制,即客户端线程提交一个写操作,写入主库的binlog日志后就立即返回,并不需要等待从库完成同步操作,而主库的dump线程会监测binlog日志的变量然后主动将更新推送给从库。

MySQL 主从复制默认是异步的模式。

 
1.1、主从复制实现
要实现主从复制,需要如下几步:
1、在主库上创建一个用于复制的账号。
2、修改主库配置文件,开启主库的Binlog,并设置server-id和重启。
3、导出主库中所有的数据,先导给从库
4、修改从库配置文件并重启
5、配置主从复制
6、开启主从复制

1在主库上创建一个用于复制的账号
 
Bash
 
 
复制代码
 
 
 
 
1
 
mysql> grant replication slave on *.* to 'shanhe'@'%' identified by '123456';
2
 
mysql> flush privileges;
 
 
2修改主库配置文件
 
Bash
 
 
复制代码
 
 
 
 
1
 
[root@mysql-1 ~]# cat /etc/my.cnf 
2
 
[mysqld]
3
 
basedir=/usr/local/mysql
4
 
datadir=/data
5
 
port=3306
6
 
socket=/usr/local/mysql/mysql.sock
7
 
character-set-server=utf8
8
 
log-error=/var/log/mysqld.log
9
 
pid-file=/tmp/mysqld.pid
10
 
11
 
server-id=1        
12
 
log-bin=/data/log-bin/binlog
13
 
sync_binlog=1
14
 
binlog_format=row
15
 
expire_logs_days=7
16
 
max_binlog_size=100m
17
 
binlog_cache_size=4m
18
 
max_binlog_cache_size=512m
19
 
binlog-ignore-db=mysql
20
 
auto-increment-offset=1
21
 
auto-increment-increment=1
22
 
slave-skip-errors=all
23
 
24
 
[mysql]
25
 
socket=/usr/local/mysql/mysql.sock
26
 
27
 
[client]
28
 
socket=/usr/local/mysql/mysql.sock
29
 
30
 
# 重启
31
 
[root@mysql-1 ~]# systemctl restart mysqld
 
 
3导出主库中所有的数据,先导给从库
 
Bash
 
 
复制代码
 
 
 
 
1
 
[root@mysql-1 ~]# mysqldump -uroot -p123456 -A -E -R --triggers --master-data=2 --single-transaction > /tmp/all.sql
 
 
4将数据导入从库
 
Bash
 
 
复制代码
 
 
 
 
1
 
[root@mysql-1 ~]# scp /tmp/all.sql root@192.168.15.62:/tmp/
2
 
root@192.168.15.62''s password: 
3
 
all.sql                            100%  853KB   3.5MB/s   00:00 
4
 
5
 
[root@mysql-2 mysql]# mysql -uroot -p123456 < /tmp/all.sql 
 
 
5修改从库配置文件并重启
 
Bash
 
 
复制代码
 
 
 
 
1
 
[root@mysql-2 mysql]# vim /etc/my.cnf
2
 
[mysqld]
3
 
basedir=/usr/local/mysql
4
 
datadir=/data
5
 
port=3306
6
 
socket=/usr/local/mysql/mysql.sock
7
 
character-set-server=utf8
8
 
log-error=/var/log/mysqld.log
9
 
pid-file=/tmp/mysqld.pid
10
 
11
 
server-id=2
12
 
# 中继日志
13
 
relay-log=mysql-relay-bin
14
 
replicate-wild-ignore-table=mysql.%
15
 
replicate-wild-ignore-table=test.%
16
 
replicate-wild-ignore-table=information_schema.%
17
 
18
 
[mysql]
19
 
socket=/usr/local/mysql/mysql.sock
20
 
[client]
21
 
socket=/usr/local/mysql/mysql.sock
22
 
23
 
[root@mysql-2 mysql]# systemctl restart mysqld
 
 
6配置主从复制
配置主从复制,首先得在MySQL Master节点查出binlog日志状态,然后配置主从复制
在MySQL Master节点查出binlog日志状态
 
Bash
 
 
复制代码
 
 
 
 
1
 
mysql> show master status ;
2
 
+---------------+----------+--------------+------------------+-------------------+
3
 
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
4
 
+---------------+----------+--------------+------------------+-------------------+
5
 
| binlog.000001 |      154 |              | mysql            |                   |
6
 
+---------------+----------+--------------+------------------+-------------------+
7
 
1 row in set (0.00 sec)
 
 
在从库配置主从复制
 
Bash
 
 
复制代码
 
 
 
 
1
 
# 首先测试主库是否连接正常
2
 
[root@mysql-2 mysql]# mysql -uroot -p123456 -h192.168.15.61
3
 
4
 
[root@slave1 ~]# mysql -uroot -p123456 # 登录然后执行
5
 
change master to
6
 
master_host='192.168.15.61',        -- 库服务器的IP
7
 
master_port=3306,                   -- 主库端口
8
 
master_user='shanhe',               -- 主库用于复制的用户
9
 
master_password='123456',           -- 密码
10
 
master_log_file='binlog.000001',    -- 主库日志名
11
 
master_log_pos=154;                 -- 主库日志偏移量,即从何处开始复制
 
 
mysql>change
to
master
host-192.16815.61'
master
master_port-3306,
shanhe
user-'s
master
password-123456
master
masterlogfile-binlog000001
master_log-_pos-154;
QueryOk,orowsaffected,warnings(0.10sec)
mysql>
image.png

查看主从复制结果
mysql>startslavei
开启主从复制
QueryOk,orows
mysqshowstavestatusG
***************************1.row***
***************************
staveIostate:waitingformastertosendevet
MasterHost:192.168.1561
MasterUser:shanhe
MasterPort:3306
ConnectRetry:60
MasterLogFile:bintog,000001
ReadMasterLogPos:154
RelayLogFile:mysql-relay-bin,000002
RelayLogPos:317
LogPLl0:b1n10g000001
staveIo
Running:Yes
staveSOLRunning:Yes
ReplicateDoDB:
两个线程状态都是Yes即为主从复制成功
ReplicateIgnore_DB内
ReplicateDo_Table:
ReplicateIgnore_Table:
tewildDoTable:
Replicate
ReplicatewitdigoreTable:mysqtotionche
lastFrrno?
A
image.png

6
mysqlcreatedatabasedbei;
0.02
in
rowS
sec
set
Queryokrowaffected(0.17sec)
usedbo1:
mysg
Readingtableinformationforcompletionofaleandcolumame
mysqlousedbei;
hturnoffthisfeaturetogetaquickerstartupwith-A
Databasechanged
Youcant
mysgl>createtableti(idint)
Queryokorowsaffected(0.30sec)
Databasechanged
主库
mysgloselectfromti;
mysql>insertintotlvalues(1);
r[AQueryokrowaffected(2.74sec)
id
从库
mysql>insertintotlvalues(2):
Queryoklrowaffected(0.09se
o9sec)
mysqlinsertintoti
values(3):
k1rowaffected(0.01sec)
QueryoK,
0.0日
sec)
rowsinset
mysql>O
mysql
image.png


 
2、半同步复制

介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。

半同步复制超时则会切换回异步复制,正常后则切回半同步复制

在半同步复制时,如果主库的一个事务提交成功了,在推送到从库的过程当中,从库宕机了或网络故障,导致从库并没有接收到这个事务的Binlog,此时主库会等待一段时间(这个时间由rpl_semi_sync_master_timeout的毫秒数决定),如果这个时间过后还无法推送到从库,那MySQL会自动从半同步复制切换为异步复制,当从库恢复正常连接到主库后,主库又会自动切换回半同步复制。

 
2.1、部署半同步复制
半同步模式是作为MySQL5.5的一个插件来实现的,主从库使用的插件不一样。
1先确认主从的MySQL服务器是否支持动态增加插件
 
Bash
 
 
复制代码
 
 
 
 
1
 
mysql> select @@have_dynamic_loading;
2
 
+------------------------+
3
 
| @@have_dynamic_loading |
4
 
+------------------------+
5
 
| YES                    |
6
 
+------------------------+
7
 
1 row in set (0.08 sec)
 
 
2分别在主从库上安装对用插件
 
Bash
 
 
复制代码
 
 
 
 
1
 
-- 主库安装插件
2
 
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
3
 
Query OK, 0 rows affected (0.28 sec)
4
 
5
 
-- 从库安装插件
6
 
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
7
 
Query OK, 0 rows affected (0.20 sec)
 
 
3在主库开启半同步复制
 
Bash
 
 
复制代码
 
 
 
 
1
 
mysql> set global rpl_semi_sync_master_enabled=1;
2
 
Query OK, 0 rows affected (0.09 sec)
3
 
4
 
mysql> set global rpl_semi_sync_master_timeout=30000;
5
 
Query OK, 0 rows affected (0.00 sec)
6
 
7
 
8
 
# 添加到配置文件
9
 
[root@mysql-1 ~]# vim /etc/my.cnf
10
 
rpl_semi_sync_master_enabled=1
11
 
rpl_semi_sync_master_timeout=1000
 
 
4在从库开启半同步复制
 
Bash
 
 
复制代码
 
 
 
 
1
 
mysql> set global rpl_semi_sync_slave_enabled=1;
2
 
Query OK, 0 rows affected (0.07 sec)
3
 
4
 
mysql> stop slave io_thread;
5
 
Query OK, 0 rows affected (0.09 sec)
6
 
7
 
mysql> start slave io_thread;
8
 
Query OK, 0 rows affected (0.06 sec)
9
 
10
 
11
 
# 添加到配置文件之中
12
 
[root@mysql-2 ~]# vim /etc/my.cnf
13
 
rpl_semi_sync_slave_enabled =1
 
 
5在主库上查看半同步复制的状态
 
Bash
 
 
复制代码
 
 
 
 
1
 
-- 主库查看
2
 
mysql> show status like 'Rpl_semi_sync_master_status';
3
 
+-----------------------------+-------+
4
 
| Variable_name               | Value |
5
 
+-----------------------------+-------+
6
 
| Rpl_semi_sync_master_status | ON    |
7
 
+-----------------------------+-------+
8
 
1 row in set (0.00 sec)
9
 
10
 
-- 从库查看
11
 
mysql> show status like 'Rpl_semi_sync_slave_status';
12
 
+----------------------------+-------+
13
 
| Variable_name              | Value |
14
 
+----------------------------+-------+
15
 
| Rpl_semi_sync_slave_status | ON    |
16
 
+----------------------------+-------+
17
 
1 row in set (0.00 sec)
 
 
这两个变量常用来监控主从是否运行在半同步复制模式下。

 
3、多主多从

在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题。

 
3.1、MySQL双主(主主)架构方案思路

1两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用。
2masterA是masterB的主库,masterB又是masterA的主库,它们互为主从。
3两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务)。
4所有提供服务的从服务器与masterB进行主从同步(双主多从)。
5建议采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式)。

这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;但是也有几个不足的地方:

1masterB可能会一直处于空闲状态。
2主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,这样可能会造成一定程度的同步延时。

 
3.2、修改主节点的配置文件
 
Bash
 
 
复制代码
 
 
 
 
1
 
[mysqld]
2
 
basedir=/usr/local/mysql
3
 
datadir=/data
4
 
port=3306
5
 
socket=/usr/local/mysql/mysql.sock
6
 
character-set-server=utf8
7
 
log-error=/var/log/mysqld.log
8
 
pid-file=/tmp/mysqld.pid
9
 
10
 
# 节点ID,确保唯一
11
 
server-id = 1        
12
 

13
 
#开启mysql的binlog日志功能
14
 
log-bin=binlog
15
 
#控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
16
 
sync_binlog=1
17
 
#binlog日志格式
18
 
binlog_format=row
19
 
#binlog过期清理时间
20
 
expire_logs_days=7
21
 
#binlog每个日志文件大小
22
 
max_binlog_size=100m
23
 
#binlog缓存大小
24
 
binlog_cache_size=4m   
25
 
#最大binlog缓存大小
26
 
max_binlog_cache_size=512m         
27
 

28
 
#不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制黏贴下述配置项,写多行
29
 
binlog-ignore-db=mysql 
30
 
# 表中自增字段每次的偏移量
31
 
auto-increment-offset=1
32
 
# 表中自增字段每次的自增量
33
 
auto-increment-increment=2
34
 
#跳过从库错误
35
 
slave-skip-errors=all
36
 
37
 
#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
38
 
log-slave-updates=true
39
 
gtid-mode=on
40
 
41
 
enforce-gtid-consistency=true
42
 
master-info-repository=file
43
 
relay-log-info-repository=file
44
 
sync-master-info=1
45
 
slave-parallel-workers=0
46
 
sync_binlog=0
47
 
binlog-checksum=CRC32
48
 
master-verify-checksum=1
49
 
slave-sql-verify-checksum=1
50
 
binlog-rows-query-log_events=1
51
 
max_binlog_size=1024M
52
 
53
 
# 忽略同步的数据库
54
 
replicate-ignore-db=mysql
55
 
replicate-ignore-db=information_schema
56
 
replicate-ignore-db=performance_schema
57
 
replicate-ignore-db=sys
58
 
59
 
max_connections=3000
60
 
max_connect_errors=30
61
 
62
 
#忽略应用程序想要设置的其他字符集
63
 
skip-character-set-client-handshake
64
 
#连接时执行的SQL                                
65
 
init-connect='SET NAMES utf8'
66
 
#服务端默认字符集
67
 
character-set-server=utf8
68
 
#请求的最大连接时间
69
 
wait_timeout=1800
70
 
#和上一参数同时修改才会生效
71
 
interactive_timeout=1800
72
 
#sql模式
73
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
74
 
75
 
max_allowed_packet=10M
76
 
bulk_insert_buffer_size=8M
77
 
query_cache_type=1
78
 
query_cache_size=128M
79
 
query_cache_limit=4M
80
 
key_buffer_size=256M
81
 
read_buffer_size=16K
82
 
# 禁用反向解析
83
 
skip-name-resolve
84
 
slow_query_log=1
85
 
long_query_time=6
86
 
slow_query_log_file=slow-query.log
87
 
innodb_flush_log_at_trx_commit=2
88
 
innodb_log_buffer_size=16M
89
 
90
 
91
 
92
 
[mysql]
93
 
socket=/usr/local/mysql/mysql.sock
94
 
95
 
[client]
96
 
socket=/usr/local/mysql/mysql.sock
 
 
 
3.3、修改备节点的配置文件
 
Bash
 
 
复制代码
 
 
 
 
1
 
[mysqld]
2
 
basedir=/usr/local/mysql
3
 
datadir=/data
4
 
port=3306
5
 
socket=/usr/local/mysql/mysql.sock
6
 
character-set-server=utf8
7
 
log-error=/var/log/mysqld.log
8
 
pid-file=/tmp/mysqld.pid
9
 
10
 
# 节点ID,确保唯一
11
 
server-id=2      
12
 

13
 
#开启mysql的binlog日志功能
14
 
log-bin=binlog
15
 
#控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
16
 
sync_binlog=1
17
 
#binlog日志格式
18
 
binlog_format=row
19
 
#binlog过期清理时间
20
 
expire_logs_days=7
21
 
#binlog每个日志文件大小
22
 
max_binlog_size=100m
23
 
#binlog缓存大小
24
 
binlog_cache_size=4m   
25
 
#最大binlog缓存大小
26
 
max_binlog_cache_size=512m  
27
 

28
 
#不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制黏贴下述配置项,写多行
29
 
binlog-ignore-db=mysql 
30
 

31
 
# 表中自增字段每次的偏移量
32
 
auto-increment-offset=2
33
 
# 表中自增字段每次的自增量
34
 
auto-increment-increment=2  
35
 
#跳过从库错误
36
 
slave-skip-errors=all
37
 
38
 
#将复制事件写入binlog,一台服务器既做主库又做从库此选项必须要开启
39
 
log-slave-updates=true
40
 
gtid-mode=on
41
 
42
 
enforce-gtid-consistency=true
43
 
master-info-repository=file
44
 
relay-log-info-repository=file
45
 
sync-master-info=1
46
 
slave-parallel-workers=0
47
 
sync_binlog=0
48
 
binlog-checksum=CRC32
49
 
master-verify-checksum=1
50
 
slave-sql-verify-checksum=1
51
 
binlog-rows-query-log_events=1
52
 
max_binlog_size=1024M
53
 
54
 
# 忽略同步的数据库
55
 
replicate-ignore-db=information_schema
56
 
replicate-ignore-db=performance_schema
57
 
replicate-ignore-db=sys
58
 
59
 
max_connections=3000
60
 
max_connect_errors=30
61
 
62
 
#忽略应用程序想要设置的其他字符集
63
 
skip-character-set-client-handshake
64
 
#连接时执行的SQL
65
 
init-connect='SET NAMES utf8'
66
 
#服务端默认字符集
67
 
character-set-server=utf8
68
 
#请求的最大连接时间
69
 
wait_timeout=1800
70
 
#和上一参数同时修改才会生效
71
 
interactive_timeout=1800
72
 
#sql模式
73
 
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
74
 
75
 
max_allowed_packet=10M
76
 
bulk_insert_buffer_size=8M
77
 
query_cache_type=1
78
 
query_cache_size=128M
79
 
query_cache_limit=4M
80
 
key_buffer_size=256M
81
 
read_buffer_size=16K
82
 
83
 
# 禁用反向解析
84
 
skip-name-resolve
85
 
slow_query_log=1
86
 
long_query_time=6
87
 
slow_query_log_file=slow-query.log
88
 
innodb_flush_log_at_trx_commit=2
89
 
innodb_log_buffer_size=16M
90
 
91
 
[mysql]
92
 
socket=/usr/local/mysql/mysql.sock
93
 
94
 
[client]
95
 
socket=/usr/local/mysql/mysql.sock
 
 
 
3.4、两个master阶段都必须重新初始化数据库
 
Bash
 
 
复制代码
 
 
 
 
1
 
[root@mysql-1 ~]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data
2
 
[root@mysql-2 ~]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data
 
 
 
3.5、分别登陆数据库并创建复制账号(每个机器上都必须执行)
 
Bash
 
 
复制代码
 
 
 
 
1
 
-- 使用临时密码登陆数据库
2
 
[root@mysql-2 ~]# mysql -uroot -p'_<r,zjMpG6-.'
3
 
4
 
-- 修改数据库临时密码
5
 
mysql>  alter user   root@localhost   identified  by  'Test123!';
6
 
Query OK, 0 rows affected (0.00 sec)
7
 
8
 
-- 利用数据库临时密码创建登陆
9
 
[root@mysql-2 ~]# mysql -uroot -p'Test123!'
10
 
11
 
-- 创建远程连接账号
12
 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
13
 
Query OK, 0 rows affected, 1 warning (0.08 sec)
14
 
15
 
-- 删除其他默认密码
16
 
mysql> delete from mysql.user where host = 'localhost';
17
 
Query OK, 3 rows affected (0.29 sec)
18
 
19
 
-- 刷新权限
20
 
mysql> FLUSH PRIVILEGES;
21
 
Query OK, 0 rows affected (0.09 sec)
22
 
23
 
-- 重新登陆并创建远程复制账号
24
 
[root@mysql-2 ~]# mysql -uroot -p123456
25
 
mysql> grant replication slave on *.* to 'shanhe'@'%' identified by '123456';
26
 
Query OK, 0 rows affected, 1 warning (0.01 sec)
27
 
28
 
mysql> flush privileges;
29
 
Query OK, 0 rows affected (0.00 sec)
 
 
 
3.6、开始配置主从复制
 
Bash
 
 
复制代码
 
 
 
 
1
 
-- 在master2上执行
2
 
mysql> change master to 
3
 
    -> master_host='192.168.15.61',
4
 
    -> master_port=3306,
5
 
    -> master_user='shanhe',
6
 
    -> master_password='123456',
7
 
    -> master_log_file='binlog.000002',
8
 
    -> master_log_pos=1459;
9
 
Query OK, 0 rows affected, 2 warnings (0.00 sec)
10
 
11
 
-- 在master1上执行
12
 
mysql> change master to 
13
 
    -> master_host='192.168.15.62',
14
 
    -> master_port=3306,
15
 
    -> master_user='shanhe',
16
 
    -> master_password='123456',
17
 
    -> master_log_file='binlog.000002',
18
 
    -> master_log_pos=1459;
19
 
Query OK, 0 rows affected, 2 warnings (0.00 sec)
 
 
 
3.7、查看连接结果
mysglsshowslavestatusG;
row
******本*来本来来素亦木东
staveIostate:waitingformaster
tosendevent
row
MasterHost:192.168.15.61
tosend
event
er
staveiustaternalcingorllase
MasterHost:192.16815.62
miabtcruscrsiame
MasterUser:shanhe
MasterPort:3306
MasterPort:3306
ConnectRetry:60
ConnectRetry:60
MasterLogFilebinlog000002
MasterLogFile:binLog000002
ReadMasterLogPos:1459
ReadMasterLogPos:1459
RelayLogFilemysql-2-relay-bin
RelayLogPos:317
RelayLog_File:mysql--elay-bin
eLayMasterlogFile:hin1og000002
RelayLogPos:317
RelayMasterLogFile:binloq000002
sLaveIoRunning:Yes
staveSOLRunning:Yes
staveIoRunning:Yes
staveSQLRunning:Yes
ReplicateDoDB:
Replicate_IgoreDB:informationschem,emacehm
ReplicateDoDB:
ReplicateIgnoreDB:mysq,ifomtiochemom
eschema,sy
ormance
sys
ReplicateDoTable:
ReplicateIgnoreTable:
ReplicateDoTable:
ReplicateIgnoreTable:
ReplicateWitdDoTable
ReplicateWildDoTable:
Replicate_WitdIgnore_Table
ReplicatewildIgnoreTable:
LastErrno日
image.png

 
3.8、测试双主
mysgl>usedbo2;
tedatabasedba2:
mysgl>created
ed(o.oosec
Readingtableinformationforcompletionoftaleadcoume
Queryoklrowaffected(0
YouCanturnoFfthisfeaturetogetquickerstartupwithA
mysql>usedbo2;
Databasechanged
Databasechanged
mysqlinsertintotlvalues(1):6
mysql>createtabletl(idint):3
Queryokrowaffected(0.06sec
Queryokorowsaffected(0.26sec)
mysquinsertintotlvalues(w);
fromti:
mysgoselect
ERROR1054(42S22):Unkowcolum_wi
mysql>insertintotlvalues(2):7
id
Queryokrowaffected(0.0osec)
TNm
可以看到双方写入数据均可以在对方哪里看到
mysqlinsertintotlvalues(3):
双主架构数据库层面成功!
Queryok1rowaffected(0.oosec)
0.00
set
sec
mysgl>
rOwS
in
mysg
image.png

 
3.9、双主高可用
高可用是使用keepalived实现VIP。从而实现一个IP无感知操作两个主节点。
 
Bash
 
 
复制代码
 
 
 
 
1
 
1、安装keepalived高可用软件(两个节点上全都安装)
2
 
[root@mysql-1 ~]# yum install keepalived -y
3
 
[root@mysql-2 ~]# yum install keepalived -y
4
 
5
 
6
 
2、修改keepalived的配置文件
7
 
[root@mysql-1 ~]# vim /etc/keepalived/keepalived.conf
8
 
! Configuration File for keepalived
9
 
 
global_defs {
10
 
    router_id LVS_DEVEL
11
 
}
12
 
 
vrrp_script chk_kubernetes {
13
 
    script "/etc/keepalived/check_kubernetes.sh"
14
 
    interval 2
15
 
    weight -5
16
 
    fall 3
17
 
    rise 2
18
 
}
19
 
 
vrrp_instance VI_1 {
20
 
    state MASTER
21
 
    interface eth0
22
 
    mcast_src_ip 192.168.15.61      # 所在节点的IP
23
 
    virtual_router_id 51
24
 
    priority 100
25
 
    advert_int 2
26
 
 
    authentication {
27
 
        auth_type PASS
28
 
        auth_pass K8SHA_KA_AUTH
29
 
    }
30
 
 
    virtual_ipaddress {
31
 
        192.168.15.60
32
 
    }
33
 
}
 
 
Navicat
Database
本地数据库
ConnectionName:
192.168.15.60
Host:
3306
Port:
root
UserName:
Password:
Savepassword
使用VIP连接数据库成功
image.png

本地数据库
RBeginTransaction
Filter具Sort
Export
lmport
Text
dbo1
id
dbo2
Tables
用t1
3
l.Views
4
Functions
5
Queries
Backups
Cinformationschema
mysql
助吻
performanceschema
Sys
添加数据OK
image.png

 
mysql>usedb02;
mysqlusedbo2;
Readingtableinformationforcompletionofaleadco.umam
Readingtableinformationforcompletionoaleaco.m
YouCanturnoffthisfeaturetodetaduickerstartuwith-A
mes
YoucanturnoffthisfeaturetogetaquickerstartupwithA
atapasecnanged
mysqlsselect*fromtii
Balabaoeciaigcu
mysqlsselect*fromti;
id
id
HNm寸5no
Hwm寸5nto
数据一致
0.00
set
rows
sec
in
rowSinset(0.0esec)
mysql>
mVSql>
image.png




 
 
 
 
posted @   那就凑个整吧  阅读(100)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示