mysql 主从服务器配置

当遇到磁盘读写的事务锁 导致的系统读写能力下降的问题,可以使用主从读写分离的模式进行优化。不过读写分离会导致数据读取的延时性。

mysql的主从复制 主要依赖于数据库的二级制文件进行数据库的同步功能。

参考链接:

http://blog.csdn.net/cutesource/article/details/5710645

http://blog.itpub.net/29870867/viewspace-1304862/

1.安装mysql  我的master 用的是win10系统  mysql版本是5.6,虚拟机 slave 系统为centos mysql 版本 5.5  (查看版本命令    mysql -V)

主从同步

2.配置master数据库

在Master MySQL上创建一个用户‘repl’,并允许其他Slave服务器可以通过远程访问Master,通过该用户读取二进制日志,实现数据同步。

create user master_user;

//master_user用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限,密码为mysql。说明一下192.168.2.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示192.168.0.0-192.168.0.255的Server都可以以repl用户登陆主服务器。当然你也可以指定固定Ip。

GRANT REPLICATION SLAVE ON *.* TO ‘master_user‘@‘192.168.2.%‘ IDENTIFIED BY ‘mysql‘;

// 赋予权限

grant all privileges on *.* to ‘master_user‘ @"192.168.2.%" identified by "mysql";

flush privileges;

找到MySQL安装文件夹修改my.Ini文件。mysql中有好几种日志方式,这不是今天的重点。我们只要启动二进制日志log-bin就ok。

在mysqld节点 添加

server-id=1
log-bin=master-bin
binlog-do-db=master_test// 是我们要同步的数据库

重启mysql

show master status;//  用来查看配置是否起效

由于开启了binlog会导致磁盘的日志写满,

清除10天的日志

PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);

另外可以配置

expire_logs_days = 10

在运行时修改:
show binary logs;
show variables like ‘%log%‘;
set global expire_logs_days = 10;
清除之前可以采用相应的备份策略。

3.配置slave 数据库

同样找到mysqld节点 添加配置

server-id=2

重启mysql服务

systemctl restart mysql

进入mysql命名模式

mysql -uroot -p123456

创建链接

CHANGE MASTER TO MASTER_HOST=‘192.168.2.220‘,MASTER_USER=‘master_user‘,MASTER_PASSWORD=‘mysql‘,MASTER_LOG_FILE=‘master-bin.000006‘,MASTER_LOG_POS=120;

开启从服务器

start slave;

检查从服务器状态

show slave status\G;

发现报错

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

show variables like ‘server_id‘;

发现从服务器的seerver_id 也是1  则确认 my.conf 无效 ,手动修改 server_id

set global server_id=2;

show variables like ‘server_id‘;

并开启 slave;

再次show slave status\G;

发现报错

Got fatal error 1236 from master when reading data from binary log: ‘Slave can not handle replication events with the checksum that master is configured to log; the first event ‘master-bin.000006‘ at 120, the last event read from ‘.\master-bin.000006‘ at 120, the last byte read from ‘.\master-bin.000006‘ at 120.‘

这个错误一般出现在master5.6,slave在低版本的情况下。这是由于5.6使用了crc32做binlog的checksum。把master的设置从crc32改到none

修改master mysqld配置

binlog-checksum = none

重启master主机

slave中重新启动slave;

show slave status\G; 发现 Slave_IO_Running: Yes 标识 配置主从正确;

在master数据库的 master_test 中创建一个表 发现 同步到了slave数据库中~~~

通过以上,便可实现mysql的主从同步,接下来,开始读写分离的配置;

读写分离

架设数据库代理

database proxy采用amoeba ,它的相关信息可以查阅官方文档

1.安装amoeba

下载amoeba(1.2.0-GA)后解压到本地(D:/amoeba),即完成安装

2.配置amoeba

先配置proxy连接和与各后端mysql服务器连接信息,修改amoeba目录中的conf/amoeba.xml

<server>
<!-- proxy server绑定的端口 -->
<property name="port">8066</property>

<!-- proxy server绑定的IP -->
<!--
<property name="ipAddress">127.0.0.1</property>
-->
<!-- proxy server net IO Read thread size -->
<property name="readThreadPoolSize">20</property>

<!-- proxy server client process thread size -->
<property name="clientSideThreadPoolSize">30</property>

<!-- mysql server data packet process thread size -->
<property name="serverSideThreadPoolSize">30</property>

<!-- socket Send and receive BufferSize(unit:K) -->
<property name="netBufferSize">128</property>

<!-- Enable/disable TCP_NODELAY (disable/enable Nagle‘s algorithm). -->
<property name="tcpNoDelay">true</property>

<!-- 对外验证的用户名 -->
<property name="user">root</property>

<!-- 对外验证的密码 -->

<property name="password">root</property>
</server>

以上是proxy提供给client的连接配置

<dbServer name="server1">

<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->
<property name="port">3306</property>

<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.2.220</property>
<property name="schema">master_test</property>

<!-- 用于登陆mysql的用户名 -->
<property name="user">root</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">123456</property>

</factoryConfig>

<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>

<dbServer name="server2">

<!-- PoolableObjectFactory实现类 -->
<factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
<property name="manager">defaultManager</property>

<!-- 真实mysql数据库端口 -->
<property name="port">3306</property>

<!-- 真实mysql数据库IP -->
<property name="ipAddress">192.168.2.55</property>
<property name="schema">master_test</property>

<!-- 用于登陆mysql的用户名 -->
<property name="user">master_user</property>

<!-- 用于登陆mysql的密码 -->

<property name="password">mysql</property>

</factoryConfig>

<!-- ObjectPool实现类 -->
<poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
<property name="maxActive">200</property>
<property name="maxIdle">200</property>
<property name="minIdle">10</property>
<property name="minEvictableIdleTimeMillis">600000</property>
<property name="timeBetweenEvictionRunsMillis">600000</property>
<property name="testOnBorrow">true</property>
<property name="testWhileIdle">true</property>
</poolConfig>
</dbServer>

配置两个server

以上是proxy与后端各mysql数据库服务器配置信息

最后是读写分离配置

<queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
<property name="ruleConfig">${amoeba.home}/conf/rule.xml</property>
<property name="functionConfig">${amoeba.home}/conf/functionMap.xml</property>
<property name="ruleFunctionConfig">${amoeba.home}/conf/ruleFunctionMap.xml</property>
<property name="LRUMapSize">1500</property>
<property name="defaultPool">server1</property>

<property name="writePool">server1</property>
<property name="readPool">server2</property>

<!--
<property name="writePool">server1</property>
<property name="readPool">server1</property>
-->
<property name="needParse">true</property>
</queryRouter>

读slave库,写master库

到此配置完毕

3.启动amoeba

命令行进入 /bin/amoeba.bat 执行

发生错误 错误: 必须设置环境变量“JAVA_HOME”,指向JDK的安装路径

由于 amoeba是基于java的,需要安装java的运行库

故而需要安装 java jdk

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

http://jingyan.baidu.com/article/870c6fc3257891b03fe4bef6.html

在上面的链接中下载,安装

安装并配置环境变量

完成后,再次 命令行进入 /bin/amoeba.bat 执行

log4j:WARN log4j config load completed from file:D:\amoeba\bin\..\conf\log4j.xml
log4j:WARN ip access config load completed from file:D:\amoeba\bin\../conf/access_list.conf
2017-03-23 15:39:15,381 INFO net.ServerableConnectionManager - Server listening on 0.0.0.0/0.0.0.0:8066.

amoeba 数据库代理成功搭建

开始测试读写分离

实例:

$mysql_server_name=‘192.168.2.220:8066‘; //改成自己的mysql数据库服务器

$mysql_username=‘root‘; //改成自己的mysql数据库用户名

$mysql_password=‘root‘; //改成自己的mysql数据库密码

$mysql_database=‘master_test‘; //改成自己的mysql数据库名

$conn=mysql_connect($mysql_server_name,$mysql_username,$mysql_password) or die("error connecting") ; //连接数据库

mysql_query("set names ‘utf8‘");

mysql_select_db($mysql_database); //打开数据库

$sql ="select * from master1 "; //SQL语句

$result = mysql_query($sql,$conn); //查询
print_r($result);

查看mysql日志 可以发现 读操作 在slave主机的mysql日志中有记录,而在master主机中没有日志记录,说明读操作 只通过了slave数据库

而写操作,在master  中先有,而后 在slave中亦发生了写库操作

说明读写分离配置成功~~

时间: 2024-11-08 21:08:14

mysql 主从服务器配置的相关文章

mysql主从服务器配置

假如一个业务场景,测试后,读写比列为1:20,根据读写比例,合理设置优化方案. 读写比列: 写数据/读数据比例,    insert/update/delete    /  select 从"读写分离"概念推导实现基本要素: 一般来说,读服务器就是指写服务器的数据镜像. 从服务器端看:要有N台从服务器和主服务器保持数据一致. 从客户端看:比如有一条insert语句和一条select语句, 则要区分读/写语句,并且分别请求从/主服务器. 服务器端读写分离的具体技术 1:数据库集群技术 集

【转载】MySQL主从服务器配置

摘要: 1.配置主服务器 2.配置从服务器 3.主从服务器状态查看及问题处理 MySQL的主从同步架构是当前比较流行的一种数据库架构,利用MySQL的主从配置,可以实现读写分离,减轻主数据库的访问压力,提升网站性能.MySQL的主从服务器的基本原理如下: 大致描述一下过程:从服务器的IO线程从主服务器获取二进制日志,并在本地保存为中继日志,然后通过SQL线程来在从上执行中继日志中的内容,从而使从库和主库保持一致.主从同步的详细过程如下: 1. 主服务器验证连接. 2. 主服务器为从服务器开启一个

mysql主从数据库复制

Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的.复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环.这些日志可以记录发送到从服务器的更新.当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起发生的

搭建mysql主从服务器

搭建mysql主从服务器: //注:注释掉my.cn文件中的skip-federated字段[[email protected] ]# /bin/cp -r /usr/local/mysql/share/mysql/my-huge.cnf  /etc/my.cnf 配置主服务器:修改my.cnf文件server-id=1 //每个数据库服务器都要指定唯一一个server-id log-bin=mysql-bin //mysql进行主从复制时通过二进制日志文件来进行的,所以必须开启mysql日志功

mysql 主从原理及配置

MySQL的Replication(英文为复制)是一个多MySQL数据库做主从同步的方案,特点是异步复制,广泛用在各种对MySQL有更高性能.更高可靠性要求的场合.与之对应的是另一个同步技术是MySQL Cluster,但因为MySQL Cluster配置比较复杂,所以使用者较少. MySQL的Replication是一个异步复制的过程(mysql5.1.7以上版本分为异步复制和半同步两种模式),它是从一个Mysql instance(instance英文为实例)(我们称之为Master)复制到

mysql 主从配置(master slave)

mysql主从复制(超简单) 怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下: 1.主从服务器分别作以下操作:  1.1.版本一致  1.2.初始化表,并在后台启动mysql  1.3.修改root的密码 2.修改主服务器master:   #vi /etc/my.cnf       [mysqld]       log-bin=mysql-bin   //[必须]启用二进制日志       server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP

《高可用MySQL》读书笔记2 – 单机版MySQL主从配置

这里搭建的主从是最简单的单一主从复制(即一个Master和一个slave,没有任何的热机备份和多slave),该主从结构的基本拓扑图如下所示: 建立基本的主从复制可以总结为以下三个基本步骤: 配置master服务器 配置slave服务器 将slave连接到master 在配置完成之后,我们会做一个简单的测试,测试复制是否正常. 本文所涉及的master和slave服务器均位于同一台单机上,使用不同的端口号区分,基本的环境为:Window 7 旗舰版 32位,MySQL的版本为5.6.21 .上一

MySQL主从同步、读写分离配置步骤

现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用. 为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致; 环境:192.168.0.1 (Master) 192.168.0.2 (Slave) MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1 1.登录Master服务器,修改my.cnf,添加如下内容: server-id = 1 //数据库ID号,

MySQL主从备份详细步骤

1.主从服务器分别作以下操作: 1.1.版本一致  1.2.初始化表,并在后台启动mysql  1.3.修改root的密码 2.修改主服务器master:   #vi /etc/my.cnf       [mysqld]       log-bin=mysql-bin   //[必须]启用二进制日志       server-id=222      //[必须]服务器唯一ID,默认是1,一般取IP最后一段 3.修改从服务器slave:   #vi /etc/my.cnf       [mysql