-
(1)基本的理论知识:
首先,要实现mysql的读写分离,可以使用mysql的主(master)从(slave)复制(Replication)来实现:
主(master)库只提供写数据的服务,而从(slave)库只提供读数据的服务。
什么是主从复制?
简单来说,就是主(master)库把对数据改动的操作保存到一个文件里面,而从(slave)库会隔一个时间间隔根据这个文件更新自己的数据
(所以读到的数据是有延迟的,这个延迟取决于从(slave)库设置的时间间隔)
关于主从复制的详细内容,可以问度娘
(2)实际操作步骤:
使用以下三台电脑:
主库(master)的IP:192.168.1.65
从库1(slave)的IP:192.168.1.49
从库2(slave)的IP:192.168.1.64
三台电脑都安装了MySQL5.5(实验室的电脑,版本比较老~)
然后把三台电脑的mysql服务停掉
A.打开主库(master)的mysql安装目录,打开配置文件my.ini

B.在[mysql]的后面添加如下代码:
12345server-id=1 #master的标示log-bin=mysql-bin #slave会基于此log-bin来做replicationbinlog-do-db=test #用于master-slave的具体数据库binlog_ignore_db=mysql #不用于master-slave的具体数据库binlog_ignore_db=information_schema #和binlog-do-db一样,可以设置多个C.打开主库(master)的mysql服务,进入mysql的命令行,输入如下代码:
1show master status;
记下File(日志文件)和PZ喎�"/kf/ware/vc/" target="_blank" class="keylink">vc2l0aW9uKMjV1r7Ou9bDKaOstNO/4ihzbGF2ZSm74bj5vt3V4rj2yNXWvs7EvP66zcjV1r7Ou9bDwLS4/NDC19S8urXEse2jrNK7uPa007/ixeTWw83qs8nWrsewo6yyu9KqttTW97/iKG1hc3Rlcim1xMr9vt3X9sjOus7Q3rjEstnX96GjPC9wPg0KPGg0IGlkPQ=="d分别给两个从库复制权限">D.分别给两个从库复制权限
1grantreplication slaveon*.*to'slave'@'192.168.1.%'identifiedby'123456';其中的’slave’为登录账号,’123456’为密码,’192.168.1.%’为从库的IP(这里偷懒使用了通配符~)

E.打开从库1的mysql安装目录,打开配置文件my.ini,在[mysql]的后面添加如下代码:
123server-id=2 #比刚刚主库设定的server-id大就行了,且从库之间不能有一样log-bin=mysql-bin #slave会基于此log-bin来做replicationreplicate-do-db=test #用于master-slave的具体数据库保存后启动从库1的mysql服务,进入mysql的命令行,输入如下代码:
先停止它的slave:
1stop slave;再改变它的master:
123456change mastertomaster_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:
1start slave;然后再输入如下代码,检查是否成功:
1show slave status\G;
如果看到上面这句话的,那就没问题了~
当然你也可以在主库(master)上做修改数据的操作,看看从库会不会更新~(注意:从库(slave)的数据库需要自己手动创建)
F.对从库2的操作和从库1的基本一样
打开配置文件my.ini,在[mysql]的后面添加如下代码:
123server-id=3 #比刚刚主库设定的server-id大就行了,且从库之间不能有一样log-bin=mysql-bin #slave会基于此log-bin来做replicationreplicate-do-db=test #用于master-slave的具体数据库因为从库1的server-id为2,所以从库2的server-id不能为2
保存后启动从库2的mysql服务。
注意要再从主库上获取一次最新的File(日志文件)和Position(日志位置)

先停止它的slave:
1stop slave;再改变它的master:
123456change mastertomaster_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一毛一样~
G.到这里,mysql的读写分离就完成了~
但是这样不够方便,因为我们写数据时需要连接主库,而读数据时需要连接从库。在连接从库时,不能负载均衡。
这时候就要靠神器Amoeba了~
它就像一个中转站,将所有的写请求分配给主库,读请求分配给从库,并且在从库之间实现负载均衡,丢个官网的图~

H.配置Amoeba服务器:
这里最好找另外的一台电脑充当Amoeba服务器:192.168.1.62
博主使用的版本是amoeba-mysql-3.0.5-RC-distribution,链接如下:
下载链接
下载完成后解压,打开conf文件夹,配置amoeba.xml和dbServer.xml:
amoeba.xml:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970<proxy><!-- service class must implements com.meidusa.amoeba.service.Service --><service class="com.meidusa.amoeba.mysql.server.MySQLService"name="Amoeba for Mysql"><!-- amoeba代理端口号 --><propertyname="port">8066</property><!-- amoeba服务器IP地址 --><propertyname="ipAddress">192.168.1.62</property><propertyname="connectionFactory"><bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory"><propertyname="sendBufferSize">128</property><propertyname="receiveBufferSize">64</property></bean></property><propertyname="authenticateProvider"><bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator"><!-- amoeba服务器用户名 --><propertyname="user">amoeba</property><!-- amoeba服务器密码 --><propertyname="password">123456</property><propertyname="filter"><bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController"><propertyname="ipFile">${amoeba.home}/conf/access_list.conf</property></bean></property></bean></property></service><runtime class="com.meidusa.amoeba.mysql.context.MysqlRuntimeContext"><!-- proxy server client process thread size --><propertyname="executeThreadSize">128</property><!-- per connection cache prepared statement size --><propertyname="statementCacheSize">500</property><!-- default charset --><propertyname="serverCharset">utf8</property><!-- query timeout( default: 60 second , TimeUnit:second) --><propertyname="queryTimeout">60</property></runtime></proxy><!--Each ConnectionManager will startasthreadmanager responsiblefortheConnectionIOread, Death Detection--><connectionmanagerlist><connectionmanager class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper"name="defaultManager"><propertyname="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property></connectionmanager></connectionmanagerlist><!-- default using file loader --><dbserverloader class="com.meidusa.amoeba.context.DBServerConfigFileLoader"><propertyname="configFile">${amoeba.home}/conf/dbServers.xml</property></dbserverloader><queryrouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter"><propertyname="ruleLoader"><bean class="com.meidusa.amoeba.route.TableRuleFileLoader"><propertyname="ruleFile">${amoeba.home}/conf/rule.xml</property><propertyname="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property></bean></property><propertyname="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property><propertyname="LRUMapSize">1500</property><!-- 设定默认节点--><propertyname="defaultPool">master</property><!-- 设定可写节点--><propertyname="writePool">master</property><!-- 设定只读节点--><propertyname="readPool"> multiPool </property><propertyname="needParse">true</property></queryrouter></amoeba:configuration>dbServers.xml:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263<!--Each dbServer needstobe configuredintoa Pool,If you needtoconfigure multiple dbServerwithloadbalancing that can be simplifiedbythe following configuration:addattributewithnamevirtual ="true"indbServer, but the configuration doesnotallow the elementwithnamefactoryConfigsuchas'multiPool'dbServer--><dbserver abstractive="true"name="abstractServer"><factoryconfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory"><propertyname="connectionManager">${defaultManager}</property><propertyname="sendBufferSize">64</property><propertyname="receiveBufferSize">128</property><!-- mysql port(数据库端口) --><propertyname="port">3306</property><!-- mysql schema(数据库名称,数据库中必须存在此数据库) --><propertyname="schema">test</property><!-- mysql user(控制数据库用户名) --><propertyname="user">proxy</property><!-- mysql password(控制数据库密码) --><propertyname="password">123456</property></factoryconfig><poolconfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool"><propertyname="maxActive">500</property><propertyname="maxIdle">500</property><propertyname="minIdle">1</property><propertyname="minEvictableIdleTimeMillis">600000</property><propertyname="timeBetweenEvictionRunsMillis">600000</property><propertyname="testOnBorrow">true</property><propertyname="testOnReturn">true</property><propertyname="testWhileIdle">true</property></poolconfig></dbserver><!-- 主数据库配置 --><dbservername="master"parent="abstractServer"><factoryconfig><!-- mysql ip --><propertyname="ipAddress">192.168.1.65</property></factoryconfig></dbserver><!-- 从数据库配置 --><dbservername="slave1"parent="abstractServer"><factoryconfig><!-- mysql ip --><propertyname="ipAddress">192.168.1.64</property></factoryconfig></dbserver><dbservername="slave2"parent="abstractServer"><factoryconfig><!-- mysql ip --><propertyname="ipAddress">192.168.1.49</property></factoryconfig></dbserver><!-- 定义虚拟服务器组,即只读池 --><dbservername="multiPool"virtual="true"><poolconfig class="com.meidusa.amoeba.server.MultipleServerPool"><!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA--><propertyname="loadbalance">1</property><!-- Separated by commas,such as: server1,server2,server1 --><propertyname="poolNames">slave1,slave2</property></poolconfig></dbserver></amoeba:dbservers>I.给Amoeba授权:
分别到主库、从库1、从库2的mysql控制台下给Amoeba服务器授权,代码如下:
1grantallon*.*to'proxy'@'192.168.1.62'identifiedby'123456';这里的账号和密码必须和dbServers.xml中的配置一毛一样:

连接Amoeba数据库,这里的账号、密码、Ip、端口必须和amoeba.xml的配置一毛一样:

然后使用这个连接对数据库test做数据修改操作,再到主库从库上面查看是否有同步修改,如果有,那就完成了读写分离~
如果想看看有没有实现负载均衡,可以打开Amoeba安装目录的logs/root.log查看查询日志。
然后我们的应用就可以通过连接Amoeba服务器来访问数据库中的数据了
博客
前端高频面试(1)
06-21
335
335
04-10
620
620
04-08
456
456
02-02
1772
1772
02-01
348
348
博客
Uniapp上传图片
01-09
689
689
12-11
593
593
12-11
556
556
11-27
633
633
10-19
477
477


被折叠的 条评论
为什么被折叠?



