zoukankan      html  css  js  c++  java
  • 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 statusG;

    发现报错

    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 statusG;

    发现报错

    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 statusG; 发现 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:amoebain..conflog4j.xml
    log4j:WARN ip access config load completed from file:D:amoebain../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中亦发生了写库操作

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

  • 相关阅读:
    initctl 创建自己的JOB
    TortoiseXX 与TotalCommander (TC)的图标问题
    eclipse 与 tomcat 的那些路径
    把函数视为对象
    序列增量赋值的一个谜题: +=
    __new__ 和 __init__ 的区别
    Python 中 is 与 == 区别
    Flask 2.0.1 changes
    flask run 与 DispatcherMiddleware 不兼容处理
    waitress 部署 flask服务
  • 原文地址:https://www.cnblogs.com/kinmos/p/6829864.html
Copyright © 2011-2022 走看看