数据库进化之路

之前,我们了解了如何通过Nginx实现负载均衡。这时候就会陆续出现几个问题:

  1. Nginx将流量分配到了不同的Tomcat服务器上,为了保持数据的一致性,不同的Tomcat服务器应该操作同一个数据库。这样无论是访客被分配到了哪个Tomcat服务器上,其最终操作的都是一个数据库。最简单的做法就是配备一台专门的数据库服务器。如下图所示:
    file
  2. 然而这样做的话,相当于一台数据库服务器需要承载多台Tomcat服务器的数据库CRUD压力。Tomcat服务器的负载虽然被Nginx稀释了,数据库服务器的压力却依然很大。为了解决这个问题,我们希望也能够像Tomcat服务器一样有多台数据库服务器,这些数据库服务器要满足两个特点:
    A. CRUD操作被分流到多台数据库服务器上。
    B. 多台数据库服务器的数据需要实时同步。
    file
  3. 为了实现第2条的功能,我们需要实现数据库的“主从复制”和“读写分离”功能。
    A. 主从复制。一台主数据库服务器(Master),若干台从数据库服务器(Slave)。从数据库服务器实时同步主数据库服务器的数据。在MySQL中,实现主从复制不需要借助第三方软件,MySQL自带了相关的功能。其原理就是将主MySQL数据库的操作SQL语句以日志的方式保存下来,并复制到从MySQL数据库中,然后由从MySQL数据库执行日志中的SQL语句。
    B. 读写分离。数据库查询操作发送给从数据库服务器;数据库增删改操作发送给数据库主服务器。读写分离操作需要借助第三方软件,本文使用mycat实现。
    file

A1. 主从复制:环境搭建

1. 搭建3台数据库服务器。
我是在WorkStation下建立了3台虚拟机,每台虚拟机对应的IP地址如下:
file
2. 在服务器中安装MySQL数据库。
安装方法参考:http://www.moonlightgate.com/archives/173

3. MySQL客户端测试
三台服务器的MySQL安装好后,可以通过MySQL客户端测试一下,确保三台机器的MySQL都可以远程访问。
file

A2. 主从复制:主机Master操作步骤

1. 修改/etc/my.cnf
在文件中添加如下内容:

#以服务器IP地址作为server-id,随意取,确保不冲突即可
server-id=135
log_bin
#需要同步的数据库
binlog-do-db=royotech
#无需同步的数据库
binlog-ignore-db=mysql

2. 重启mysql服务

systemctl restart mysql

3. 查看并记录主数据库状态

mysql -uroot -p111111

然后

show master status

得到如下结果:
file
这里面最重要的信息是File和Position,120代表当前主数据库的位置。

A3. 主从复制:从机Slave1操作步骤

1. 删除auto.cnf文件

rm /usr/local/mysql/data/auto.cnf

注意:

  1. auto.cnf文件里面保存着mysql的uuid信息,由于我的测试环境是通过VMWare克隆出来的,因此三台MySQL服务器的uuid信息都相同,uuid冲突的情况下后面的操作会报错。
  2. 删除这个文件后重启mysql,会自动生成新的auto.cnf文件,这时里面的uuid就是全新的了。
  3. 不同安装方法auto.cnf的文件位置也不同。
    如果需要查找auto.cnf的位置,可以在mysql里面运行如下语句:

    user mysql;
    show variables like 'datadir';

2. 修改/etc/my.cnf
file
这里只需要添加一句:

server-id=136

3. 重启mysql服务

systemctl restart mysql

4. 登陆mysql,设置主MySQL连接信息

mysql -uroot -p111111

然后

stop slave

然后

change master to master_host='192.168.81.135',master_user='root',master_password='111111',master_log_file='localhost-bin.000001',master_log_pos=120;

然后

start slave

5. 查看从节点状态

show slave status\G

\G可以格式化输出,否则排版很乱,没法查看。
file
上面两个地方都是Yes的时候,说明操作成功了!

A4. 主从复制:从机Slave2操作步骤

和Slave1一样的操作

1. 删除auto.cnf文件

rm /usr/local/mysql/data/auto.cnf

2. 修改/etc/my.cnf
添加一句:

server-id=137

3. 重启mysql服务

systemctl restart mysql

4. 登陆mysql,设置主MySQL连接信息

mysql -uroot -p111111

然后

stop slave

然后

change master to master_host='192.168.81.135',master_user='root',master_password='111111',master_log_file='localhost-bin.000001',master_log_pos=120;

然后

start slave

5. 查看从节点状态

show slave status\G

file

A5. 主从复制:主从复制配置完成!测试一下

1. 在主MySQL中新建royotech数据库,新建user表
file

2. 在从MySQL中刷新一下
file
欧耶!同步过来了!

B1. 读写分离:环境搭建

1. 搭建Mycat服务器
在WorkStation中增加一台服务器用于安装Mycat,IP地址如下:
file

2. 在服务器中安装Mycat
第一步:下载Mycat安装包。
可以通过Mycat官网下载:http://www.mycat.io/
也可以通过本站下载:Mycat-server-1.6-RELEASE-20161028204710-linux.tar

第二步:上传、解压。

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

然后将mycat复制到/usr/local/下

mycat /usr/local

第三步:放行8066(Mycat默认使用该端口号)端口。

firewall-cmd --zone=public --add-port=8066/tcp --permanent

然后

firewall-cmd --reload

B2. 读写分离:配置Mycat

1. 配置环境变量

vim /etc/profile

增加如下内容:

export MYCAT_HOME=/usr/local/mycat
export PATH=$MYCAT_HOME/bin:$PATH

file
然后:

source /etc/profile

2. 修改Mycat的server.xml和schema.xml配置文件
修改:/usr/local/mycat/conf/server.xml

    <user name="root">
        <property name="password">123456</property>
        <property name="schemas">TESTDB</property>
    </user>

这三个信息,是程序数据库接口连接Mycat时使用的“数据库名称”“用户名”“密码”,如果只是为了测试用,这三个信息可以不变。
修改:/usr/local/mycat/conf/schema.xml为以下内容

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>

    <dataNode name="dn1" dataHost="localhost1" database="royotech" />

    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="192.168.81.135:3306" user="root" password="111111">
            <readHost host="hostS1" url="192.168.81.136:3306" user="root" password="111111" />
            <readHost host="hostS2" url="192.168.81.137:3306" user="root" password="111111" />
        </writeHost>
    </dataHost>
</mycat:schema>

balance=0:不开启读写分离,所有读操作发生在writeHost上
balance=1:所有读操作随机发送到readHost和备用的writeHost上
balance=2:所有读操作随机发送到writeHost和readHost上
balance=3:所有读操作只发送到readHost上。

file

3. 启动Mycat

mycat console

启动成功后,界面就不能关了。
启动Mycat时可能会遇到如下错误:

wrapper  | JVM exited while loading the application.
jvm 1    | Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
jvm 1    | Unrecognized VM option 'AggressiveOpts'
jvm 1    | Error: Could not create the Java Virtual Machine.
jvm 1    | Error: A fatal exception has occurred. Program will exit.

修改/usr/local/mycat/conf/wrapper.conf,注释掉wrapper.java.additional.3=-XX:+AggressiveOpts即可:
file

B3. 读写分离:测试

1. 连接Mycat测试
file
如果能连接成功,则证明Mycat安装成功。

2. 测试读写分离
现在Slave1和Slave2中分别添加一条数据:
file
然后在Mycat中进行select测试,如果结果出现Slave1和Slave2中增加的内容,证明读写分离成功。
file

发表评论

邮箱地址不会被公开。 必填项已用*标注