【数据库私房菜 | 04】项目私房菜——MySQL的项目实战(二)

🗺️博客地图

📍一、mysql互为主从

🖈(一)服务器1操作配置

🖈(二)服务器2操作配置

🖈(三)服务器1配置

🖈(四)检验测试

📍二、MySQL数据库读写分离

🖈(一)背景

🖈(二)原理

🖈(三)Amoeba简介 

🖈(四)项目实践


一、mysql互为主从

(一)服务器1操作配置

1、安装数据库

yum -y install mysql mysql-server
vim /etc/my.cnf
    log-bin=mysql-bin
    server-id=20
    replicate-do-db=test            #要同步的数据库
    binlog-ignore-db=mysql            #不同步的数据库
    binlog-ignore-db=information_schema
    auto-increment-increment=2    #自增长的步长
    auto-increment-offset=1        #自增长的初始值

2、启动数据库

service mysqld restart

3、设置root密码

mysqladmin -uroot password 123

4、登录数据库

mysql -uroot -p123

5、创建同步数据库(所有主主服务器同步数据库必须一致

create  database  数据库名;

6、创建同步用户并赋予权限

mysql> grant all on *.* to 'master01'@'%' identified by '123'; 

7、查询master用户的状态

mysql> show master status;

(二)服务器2操作配置

# 安装mysql数据库

yum -y install mysql mysql-server

# 在主配置文件中 [mysqld] 区域添加如下信息

vim /etc/my.cnf
    log-bin=mysql-bin
    server-id=30
    replicate-do-db=test            #要同步的数据库
    binlog-ignore-db=mysql            #不同步的数据库
    binlog-ignore-db=information_schema
    auto-increment-increment=2    #自增长的步长
    auto-increment-offset=2        #自增长的初始值

# 启动mysqld服务

service mysqld restart

# 设置root密码

mysqladmin -uroot password 123

# 进入数据库

mysql -uroot -p123

# 创建同步数据库(所有主主服务器同步数据库必须一致

mysql> grant all on *.* to 'master02'@'%' identified by '123'; 

# 执行以下sql语句(此处设置的信息全部为主服务器1上的信息
mysql> change master to master_user='master01',master_password='123',master_host='192.168.43.20',master_log_file='mysql-bin.000004',master_log_pos=106;

# 启动slave
mysql> start slave; 

# 验证上述sql语句是否成功执行
mysql> show slave status\G;

(三)服务器1配置

mysql -uroot -p123


mysql> change master to master_user='master02',master_password='123',master_host='192.168.43.30',master_log_file='mysql-bin.000004',master_log_pos=240;


mysql> start slave;


mysql> show slave status\G;

(四)检验测试

各在服务器1和服务器2的test库插入数据

mysql> insert into test.users values (4,"song");

测试是否同步

mysql> select * from test.users;

二、MySQL数据库读写分离

(一)背景

Nginx、PHP属于无状态服务,其水平扩展很方便,但MySQL数据库是典型的有状态服务,其水平扩展很难,为解决这一问题,我们需要在PHP和MySQL之间添加一个数据库中间键,该中间键水平扩展很方便,其作用是承上(承接MySQL客户端的访问请求)启下(向MySQL服务器端获取或写入数据),该中间键还能实现数据库读写分离。

(二)原理

当客户端向proxy请求写入数据时,proxy与MySQL主服务器建立连接,并将数据写入主服务器,主服务器将数据同步至多台从服务器;当客户端向proxy请求获取数据时,proxy与MySQL从服务器建立连接,实现负载均衡,降低服务器压力。

(三)Amoeba简介 

Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它由阿里巴巴源首席架构师陈思儒主导开发。它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。

Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来替代作者的实现。这个程序总体上比较符合KISS原则的思想。

1、优势:

Amoeba主要解决以下问题:

a). 数据切分后复杂数据源整合

b). 提供数据切分规则并降低数据切分规则给数据库带来的影响

c). 降低数据库与客户端连接

d). 读写分离路由

2、不足:

a)、还不支持事务

b)、暂时不支持存储过程(近期会支持)

c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)

d)、暂时不支持分库分表,amoeba只做到分数据库实例,每个被切分的节点需要保持库表结构一致。

 (四)项目实践

1、构建mysql主从从服务器

a)主服务器配置

yum -y install mysql mysql-server

vim /etc/my.cnf
    [mysqld]
    server-id=20
    log-bin=mysql-bin

service mysqld start

mysqladmin -uroot password 123

mysql -uroot -p123

mysql> grant all on *.* to 'master'@'%' identified by '123';

mysql> show master status;

b)从服务器1配置

yum -y install mysql mysql-server

vim /etc/my.cnf
    [mysqld]
    server-id=30
    log-bin=mysql-bin

service mysqld start

mysqladmin -uroot password 123

mysql -uroot -p123

mysql> change master to

master_user='master',master_password='123',master_host='192.168.43.20',master_log_file='mysql-bin.000003',master_log_pos=371;

mysql> start slave;

mysql> show slave status\G;

# 从服务器2配置同上,配置两个从服务器设置一致,仅仅server-id不同

c)检验测试

主服务器:

mysql> create database test;
mysql> use test;
mysql> create table users (id int;name char(200));
mysql> insert into users values (1,"li");

从服务器:

mysql> select * from test.users;

#为了实验效果,测试连接是主服务器还是从服务器,先将两台从服务器同步关闭:

mysql> stop slave;

从服务器1:

mysql> insert into users values (2,"zhang");

从服务器2:

mysql> insert into users values (3,"wang");

2、配置Amoeba安装环境

a)上传amoeba软件包

yum -y install gcc gcc-c++

mkdir /mnt/iso

mount -o loop amoeba-n.iso /mnt/iso

cp -a /mnt/iso/* .

tar -zxvf jdk-7u40-linux-x64.gz

mv jdk1.7.0_40/ /usr/local/jdk

vim /etc/profile
    #JDK
    JAVA_HOME=/usr/local/jdk
    export JAVA_HOME
    PATH=$JAVA_HOME/bin:$PATH
    export PATH    CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH
    export CLASSPATH

source /etc/profile        #刷新配置文件使其生效

Java -varsion            #查看Java版本信息

3、安装Amoeba服务器

unzip amoeba-mysql-1.3.1-BETA.zip -d /usr/local/amoeba

chmod -R a+x /usr/local/amoeba/bin/

cd /usr/local/amoeba/conf/

vim amoeba.xml
    <property name="port">9000</property>
    <property name="ipAddress">192.168.43.10</property>
    ……
    <property name="password">123</property>
<dbServerList>

    <dbServer name="server1">
      <factoryConfig……>
        <property name="manager">defaultManager</property>
        <property name="port">3306</property>
        <property name="ipAddress">192.168.43.20</property>
        <property name="schema">test</property>
        <property name="user">amoeba</property>
        <property name="password">123</property>
      </factoryConfig>
    <poolConfig……>
            </poolConfig>
  </dbServer>

<dbServer name="server2">
      <factoryConfig……>
        <property name="manager">defaultManager</property>
        <property name="port">3306</property>
        <property name="ipAddress">192.168.43.30</property>
        <property name="schema">test</property>
        <property name="user">amoeba</property>
        <property name="password">123</property>
      </factoryConfig>
    <poolConfig……>
            </poolConfig>
  </dbServer>

<dbServer name="server3">
      <factoryConfig……>
        <property name="manager">defaultManager</property>
        <property name="port">3306</property>
        <property name="ipAddress">192.168.43.40</property>
        <property name="schema">test</property>
        <property name="user">amoeba</property>
        <property name="password">123</property>
      </factoryConfig>
    <poolConfig……>
            </poolConfig>
  </dbServer>

<dbServer name="master" virtual="true">
    <poolConfig>
        ……
        <property name="poolNames">server1</property>
    </poolConfig>
  </dbServer>

<dbServer name="slave" virtual="true">
        ……
    <property name="poolNames">server2,server3</property>
  </dbServer>

</dbServerList>
    
<queryRouter ……
             ……
        <property name="defaultPool">master</property>
        <property name="writePool">master</property>
        <property name="readPool">slave</property>
        <property name="needParse">true</property>
  </queryRouter>
</amoeba:configuration>

#配置amoeba初始内存

vim /usr/local/amoeba/bin/amoeba
DEFAULT_OPTS="-server -Xms256m-Xmx256m-Xss256k"
#修改128k-256k(48位)   

#启动amoeba

nohup bash -x /usr/local/amoeba/bin/amoeba &

#关闭amoeba

ps aux | grep amoeba    #查看amoeba进程号
kill -9 2362            #杀死amoeba进程号

#主从服务器中都创建连接中间件的用户

mysql> grant all on *.* to 'amoeba'@'%' identified by '123';

4、检验测试

amoeba服务器下载mysql

yum -y install mysql

mysql -uroot -p 123 -P 8066 -h 192.168.43.10

mysql> use test

mysql> select * from users;

mysql> select * from users;
        #会在两台从服务器之间负载均衡

mysql> insert into users values (100,"ma");
        #写入内容会写入server1,也就是主服务器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子Linux

各位看官老爷,行行好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值