Mysql通过配置主从,读写分离简单实现数据备份,负载均衡

本文详细介绍了如何在阿里云服务器上配置MySQL的主从服务,包括安全组规则设置、Master和Slave的配置,以及读写分离的实现。通过安装amoeba进行读写分离,并调整JDBC连接信息,确保数据备份和负载均衡。同时,文章列举了一些常见的配置错误及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 配置master&slave服务

注意:此处是通过阿里云服务器做的实验
阿里云服务器参数:
系统:ubuntu
数据库:服务器的MySql

1.1 配置阿里云服务器

注意:该步骤主从都要配置

添加安全组规则:
入方向
协议类型选择My SQL
授权类型改为地址段访问
授权对象输入:0.0.0.0/0(所有ip所有端口)

1.2 配置Master

1.2.1 修改主机/etc/mysql/mysql.cnf.d/mysqld.cnf文件

1. 将bind_address注释掉(此处的目的是让mysql可以被远程访问) 

2. 在[mysqld]模块中解开并配置如下:
# 设置服务器id,(在一个组中是唯一的,注意不要重复)
server-id               = 1
# 设置修改日志(主机中的修改动作会存在此处供slave读取)
log_bin                 = /var/log/mysql/mysql-bin.log
# 设置要同步的数据库
binlog_do_db            = your_database
# 需要忽略的数据库
binlog_ignore_db        = mysql

1.2.2 创建一个新用户用来远程连接使用:

//1. 创建一个用来进行远程连接的用户,其中%表示所有地址可登录 例:
create user 'admin'@'%' IDENTIFIED BY 'admin'
//2. 给创建的用户授权 例:
GRANT SELECT, INSERT ON database.table TO 'admin'@'%';
//补充:你也可以授予所有权限:
GRANT ALL ON *.* TO 'admin'@'%';
//3. 授予从机操作权限
GRANT REPLICATION SLAVE ON *.* TO 'admin'@'%' IDENTIFIED BY 'admin';    

1.2.3 重启MySql

  1. 退出mysql:exit;
  2. 输入service mysql restart

1.2.4 登录mysql,查看master状态(注意记录File 和Position的值待用)

show master status;

1.3 配置Slave

1.3.1 修改MySQL配置文件/etc/mysql.conf.d/mysqld.cnf

#1. 将bind_address注释掉(此处的目的是让mysql可以被远程访问)
#2. 在[mysqld]中添加:
#定义服务器id
server-id = 2
#定义从机日志位置(通过io流从主机读取的日志存放位置)
relay-log = slave-relay-bin
#同上
relay-log-index = slave-relay-bin.index

1.3.2 重启mysql服务

1.3.3 登录slave,设置master信息

change master to master_host='120.79.21.141',master_post=3306,master_user='ttt',master_password='111111',master_log_file='mysql-bin.000003',master_log_pos=154;

注意:
1. master_host对应主服务器的外网IP地址
2. master_port对应主服务器的端口(3306)
3. master_log_file对应show master status显示的File列:mysql->bin.000001
4. master_log_pos对应Position列:154

1.3.4 创建与Master相同的database及表
1.3.5 再次重启服务
1.3.6 登录slave开启slave服务 :start slave
1.3.7 查看slave状态:show slave status 出现两个yes就应该成功了

  1. 若不成功,查看状态,看是传入的io流的问题还是读写日志入库的原因。
  2. 前者检查change命令,后者检查配置文件
  3. stop slave重起一下slave服务

2.配置读写分离

2.1 配置MySql主从(同上)

2.2 安装amoeba

此处的版本:amoeba-mysql-3.0.5-RC
解压到某一个自定义文件加

2.3 配置amoeba

2.3.1 配置 doServers.xml(路径:安装路径下的conf文件夹中)

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:dbServers SYSTEM "dbserver.dtd">
<amoeba:dbServers xmlns:amoeba="http://amoeba.meidusa.com/">

    <dbServer name="abstractServer" abstractive="true">
        <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
            <property name="connectionManager">${defaultManager}</property>
            <property name="sendBufferSize">64</property>
            <property name="receiveBufferSize">128</property>

            <!-- 1. 修改成 mysql 端口号port -->
            <property name="port">3306</property>

            <!-- 2. mysql schema数据库名称 -->
            <property name="schema">your_database</property>

            <!--3. mysql 用户和密码-->
            <property name="user">admin</property>

            <property name="password">admin</property>
        </factoryConfig>
        <!-- 配置线程池-->
        <poolConfig class="com.meidusa.toolkit.common.poolable.PoolableObjectPool">
            <property name="maxActive">500</property>
            <property name="maxIdle">500</property>
            <property name="minIdle">1</property>
            <property name="minEvictableIdleTimeMillis">600000</property>
            <property name="timeBetweenEvictionRunsMillis">600000</property>
            <property name="testOnBorrow">true</property>
            <property name="testOnReturn">true</property>
            <property name="testWhileIdle">true</property>
        </poolConfig>
    </dbServer>
    <!-- 配置Master,即实现写入数据的数据库——>
    <dbServer name="server1"  parent="abstractServer">
        <factoryConfig>
            <!—4. Master  mysql ip -->
            <property name="ipAddress">112.74.33.243</property>
        </factoryConfig>
    </dbServer>
    <!-- 配置Slave,即实现读数据的数据库——>
    <dbServer name="server2"  parent="abstractServer">
        <factoryConfig>
            <!--5. slave mysql ip -->
            <property name="ipAddress">119.23.247.195</property>
        </factoryConfig>
    </dbServer>
    <!-- 配置一个服务器组-->
    <dbServer name="multiPool" virtual="true">
        <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
            <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
            <property name="loadbalance">1</property>

            <!--6.  在此处配置刚刚配置的主从服务器 -->
            <property name="poolNames">server1,server2</property>
        </poolConfig>
    </dbServer>

</amoeba:dbServers>

2.3.2 配置amoeba.xml,配置amoeba的信息

<?xml version="1.0" encoding="gbk"?>

<!DOCTYPE amoeba:configuration SYSTEM "amoeba.dtd">
<amoeba:configuration xmlns:amoeba="http://amoeba.meidusa.com/">

    <proxy> 
        <!-- service class must implements com.meidusa.amoeba.service.Service -->
        <service name="Amoeba for Mysql" class="com.meidusa.amoeba.mysql.server.MySQLService">
            <!--1. 配置amoeba服务器的端口-->
            <property name="port">8066</property>

            <!--2.  bind ipAddress 此处可以配置指定连接的ip地址,这里注释掉即所有ip可访问 -->
            <!-- 
            <property name="ipAddress">127.0.0.1</property>
             -->

            <property name="connectionFactory">
                <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">
                    <property name="sendBufferSize">128</property>
                    <property name="receiveBufferSize">64</property>
                </bean>
            </property>

            <property name="authenticateProvider">
                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
                    <!—-3. 代理服务器的访问用户和密码-->
                    <property name="user">root</property>

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

                    <property name="filter">
                        <bean class="com.meidusa.toolkit.net.authenticate.server.IPAccessController">
                            <property name="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 -->
            <property name="executeThreadSize">128</property>

            <!-- per connection cache prepared statement size  -->
            <property name="statementCacheSize">500</property>

            <!-- default charset -->
            <property name="serverCharset">utf8</property>

            <!-- query timeout( default: 60 second , TimeUnit:second) -->
            <property name="queryTimeout">60</property>
        </runtime>

    </proxy>

    <!-- 
        Each ConnectionManager will start as thread
        manager responsible for the Connection IO read , Death Detection
    -->
    <connectionManagerList>
        <connectionManager name="defaultManager" class="com.meidusa.toolkit.net.MultiConnectionManagerWrapper">
            <property name="subManagerClassName">com.meidusa.toolkit.net.AuthingableConnectionManager</property>
        </connectionManager>
    </connectionManagerList>

        <!-- default using file loader -->
    <dbServerLoader class="com.meidusa.amoeba.context.DBServerConfigFileLoader">
        <property name="configFile">${amoeba.home}/conf/dbServers.xml</property>
    </dbServerLoader>

    <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
        <property name="ruleLoader">
            <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
                <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
                <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
            </bean>
        </property>
        <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
        <property name="LRUMapSize">1500</property>
        <!-- 4. 这里配置默认的服务器(即在doServers.xml中配置的)
        <property name="defaultPool">server1</property>
        <!--5. 这里配置写入的服务器即Master--> 
        <property name="writePool">server1</property>
        <!--6. 这里配置读取数据的服务即Slave
        <property name="readPool">server2</property>

        <property name="needParse">true</property>
    </queryRouter>
</amoeba:configuration>

2.4 修改 jvm.proerties

在安装路径下,将JVM_OPTIONS后面的值中的 -Xss196k 修改为 -Xss256k

2.5给amoeba/bin目录执行权限

chmod +x 安装路径/bin/*

2.6 阿里服务器配置安全组

配置8066端口任意地址可访问

2.7 启动amoeba

进入bin目录下,通过./launcher start命令启动,如果出现可访问ip地址,启动成功,ctrl+c强制退出

2.8 配置项目JDBC连接信息

将项目jdbc的连接参数:url,端口,用户名,密码换成amoeba的,即在amoeba中配置的

常见错误:

1、如果提示 Unknown system variable ‘language’ 错误,将mysql的包换成5.1.24试试。
2、提示无法打开console.log,就将logs文件夹权限修改一下,比如:chmod 777 logs
3、提示Adress in Use,直接重启服务器好了,reboot

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值