首先,要实现mysql的读写分离,可以使用mysql的主(master)从(slave)复制(Replication)来实现:
主(master)库只提供写数据的服务,而从(slave)库只提供读数据的服务。
什么是主从复制?
简单来说,就是主(master)库把对数据改动的操作保存到一个文件里面,而从(slave)库会隔一个时间间隔根据这个文件更新自己的数据
(所以读到的数据是有延迟的,这个延迟取决于从(slave)库设置的时间间隔)
关于主从复制的详细内容,可以问度娘
使用以下三台电脑:
主库(master)的IP:192.168.1.65
从库1(slave)的IP:192.168.1.49
从库2(slave)的IP:192.168.1.64
三台电脑都安装了MySQL5.5(实验室的电脑,版本比较老~)
然后把三台电脑的mysql服务停掉
1
2
3
4
5
|
server-id=1 #master的标示
log-bin=mysql-bin #slave会基于此log-bin来做replication
binlog-do-db=test #用于master-slave的具体数据库
binlog_ignore_db=mysql #不用于master-slave的具体数据库
binlog_ignore_db=information_schema #和binlog-do-db一样,可以设置多个
|
1
|
show master status;
|
记下File(日志文件)和PZ喎�"/kf/ware/vc/" target="_blank" class="keylink">vc2l0aW9uKMjV1r7Ou9bDKaOstNO/4ihzbGF2ZSm74bj5vt3V4rj2yNXWvs7EvP66zcjV1r7Ou9bDwLS4/NDC19S8urXEse2jrNK7uPa007/ixeTWw83qs8nWrsewo6yyu9KqttTW97/iKG1hc3Rlcim1xMr9vt3X9sjOus7Q3rjEstnX96GjPC9wPg0KPGg0IGlkPQ=="d分别给两个从库复制权限">D.分别给两个从库复制权限
1
|
grant
replication slave
on
*.*
to
'slave'
@
'192.168.1.%'
identified
by
'123456'
;
|
其中的’slave’为登录账号,’123456’为密码,’192.168.1.%’为从库的IP(这里偷懒使用了通配符~)
1
2
3
|
server-id=2 #比刚刚主库设定的server-id大就行了,且从库之间不能有一样
log-bin=mysql-bin #slave会基于此log-bin来做replication
replicate-do-db=test #用于master-slave的具体数据库
|
保存后启动从库1的mysql服务,进入mysql的命令行,输入如下代码:
先停止它的slave:
1
|
stop slave;
|
再改变它的master:
1
2
3
4
5
6
|
change master
to
master_host=
'192.168.1.65'
,
master_port=3306,
master_user=
'slave'
,
master_password=
'123456'
,
master_log_file=
'mysql-bin.000040'
,
master_log_pos=717;
|
再启动它的slave:
1
|
start slave;
|
然后再输入如下代码,检查是否成功:
1
|
show slave status\G;
|
如果看到上面这句话的,那就没问题了~
当然你也可以在主库(master)上做修改数据的操作,看看从库会不会更新~(注意:从库(slave)的数据库需要自己手动创建)
打开配置文件my.ini,在[mysql]的后面添加如下代码:
1
2
3
|
server-id=3 #比刚刚主库设定的server-id大就行了,且从库之间不能有一样
log-bin=mysql-bin #slave会基于此log-bin来做replication
replicate-do-db=test #用于master-slave的具体数据库
|
因为从库1的server-id为2,所以从库2的server-id不能为2
保存后启动从库2的mysql服务。
注意要再从主库上获取一次最新的File(日志文件)和Position(日志位置)
先停止它的slave:
1
|
stop slave;
|
再改变它的master:
1
2
3
4
5
6
|
change master
to
master_host=
'192.168.1.65'
,
master_port=3306,
master_user=
'slave'
,
master_password=
'123456'
,
master_log_file=
'mysql-bin.000040'
,
master_log_pos=1751;
|
剩下的操作和从库1一毛一样~
但是这样不够方便,因为我们写数据时需要连接主库,而读数据时需要连接从库。在连接从库时,不能负载均衡。
这时候就要靠神器Amoeba了~
它就像一个中转站,将所有的写请求分配给主库,读请求分配给从库,并且在从库之间实现负载均衡,丢个官网的图~
这里最好找另外的一台电脑充当Amoeba服务器:192.168.1.62
博主使用的版本是amoeba-mysql-3.0.5-RC-distribution,链接如下:
下载链接
下载完成后解压,打开conf文件夹,配置amoeba.xml和dbServer.xml:
amoeba.xml:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
Each ConnectionManager will start
as
thread
manager responsible
for
the
Connection
IO
read
, Death Detection
-->
|
dbServers.xml:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
Each dbServer needs
to
be configured
into
a Pool,
If you need
to
configure multiple dbServer
with
load
balancing that can be simplified
by
the following configuration:
add
attribute
with
name
virtual =
"true"
in
dbServer, but the configuration does
not
allow the element
with
name
factoryConfig
such
as
'multiPool'
dbServer
-->
|
分别到主库、从库1、从库2的mysql控制台下给Amoeba服务器授权,代码如下:
1
|
grant
all
on
*.*
to
'proxy'
@
'192.168.1.62'
identified
by
'123456'
;
|
这里的账号和密码必须和dbServers.xml中的配置一毛一样:
连接Amoeba数据库,这里的账号、密码、Ip、端口必须和amoeba.xml的配置一毛一样:
然后使用这个连接对数据库test做数据修改操作,再到主库从库上面查看是否有同步修改,如果有,那就完成了读写分离~
如果想看看有没有实现负载均衡,可以打开Amoeba安装目录的logs/root.log查看查询日志。
然后我们的应用就可以通过连接Amoeba服务器来访问数据库中的数据了