javaweb在阿里云centos7下搭建mysql5.6简单的主从结构

来源:互联网 发布:死亡扳机2机枪 mac 编辑:程序博客网 时间:2024/06/11 04:49

  最近为了增加公司服务的抗压能力,搭建了一套mysql的主从结构。目前这套服务只是最基本的一主一从结构,只是实现了最基本的读写分离功能,后期还需要大量的优化。这里把搭建过程记录下来,以备后续。


 首先,先描述一下具体的实施步骤:

1.搭建mysql数据库

2.配置数据库热备份

3.配置mycat中间件


需要准备:

1:两台centos服务器

192.168.1.1

192.168.1.2

2:mysql5.6安装包

安装包下载地址

https://dev.mysql.com/downloads/mysql/

选择相应的安装包版本下载

3:jdk1.8

mycat运行需要jdk环境,所以首先要下载安装jdk

安装包下载地址

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

4:下载mycat

下载地址

http://www.mycat.io/


环境搭建:


一:安装mysql

1)检查安装环境

首先,需要确认服务器是是否安装有mysql

一般centsos7会自带一个Mariadb,需要先卸载掉


rpm -qa|grep mariadb   #查看安装的包

rpm -e --nodeps 查询出的包名  #卸载安装包


删除etc目录下的my.cnf文件

rm /etc/my.cnf


检查mysql是否存在

rpm -qa | grep mysql


如果存在,卸载,如果不存在执行安装步骤


rpm -e --nodeps 查询出的包名  #卸载安装包

find / -name mysql  将查询出的相关信息

rm -rf  查询出的相关文件删除掉


2)安装mysql

将下载好的mysql包上传到192.168.1.1

解压

tar -zxvf  安装包名称

一般安装三个server  client  del

rpm -ivh 安装包名

按照上安装包名称依次安装,否则会缺少环境报错。


将初始配置文件copy一份到etc目录下

cp /usr/share/mysql/my-default.cnf /etc/my.cnf


分别运行下述命令,初始化MySQL及设置密码。

/usr/bin/mysql_install_db    #初始化MySQL

service mysql start        #启动MySQL

cat /root/.mysql_secret        #查看root账号的初始密码


登录mysql,将cat/root/.mysql_secret  显示的密码输入

mysql -u root -p

修改密码

set password=password('123456');

退出mysql

exit;


设置mysql开机启动

chkconfig mysql on

chkconfig --list | grep mysql 查看打印出的mysql启动信息 2~5 位on表示已经设置为开机启动


重启mysql

service mysqld restart


按照上述配置重新配置另一台服务器



二:搭建数据库主从结构

1.给两个服务器分配新的mysql用户和权限等信息

主库:

mysql -u root -p #root用户登录

insert into mysql.user (host,user,password) values('%','test',PASSWORD('test')); #设置新的test用户

update user set password=password('test123') where user='test' #更新密码


创建新的数据库

create database test_db;

#给数据库赋权,允许本地和另一台ip为192.168.1.2的服务进行

grant all privileges on test_db.* to test@localhost identified by 'test1234';

grant all privileges on test_db.* to test@'192.168.1.2' identified by 'test1234';

flush privileges; #刷新数据库权限


按照上述描述配置另一个数据库


2.搭建读写分离

mysql读写分离,也叫热备份,是通过开启主库日志,从库读取主库日志来同步数据库操作。对数据库写的操作在主库进行,读的操作在从库进行。

主库配置:

修改配置文件信息 /etc/my.cnf


在[mysqld]下增加如下信息

#配置启动日志
log_bin = master-bin
log_bin_index = master-bin.index
#配置唯一标志
server-id = 1
#配置日志记录时间
expire_logs_days = 7
#日志最大空间
max_binlog_size = 100M

#若涉及及同步函数或者存储过程需要配置,否则主备会产生异常不能同步  
log_bin_trust_function_creators = TRUE

#配置记录日志的数据库
binlog_do_db = test#需要备份数据,多个写多行,不写全部都备份
binlog_do_db = test2
binlog_ignore_db = information_schema
binlog_ignore_db = mysql

保存退出

重启mysql

mysqld service restart

登录账户赋权

mysql -u root -p

GRANT REPLICATION SLAVE ON  test.* to 'test'@'%' identified by 'test1234';

flash privileges; #刷新权限

show master status; #查询主库配置信息

记录下file 和 position 的位置


从库:

#配置启动日志
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
#配置唯一标志
server-id = 2
#配置日志记录时间
expire_logs_days = 7
#日志最大空间
max_binlog_size = 100M
replicate-do-db = test #复制某个库
replicate-do-db = test2
replicate-ignore-db = information_schema     #不复制某个库
replicate-ignore-db = mysql

保存退出

重启mysql

mysqld service restart

登录账户赋权

mysql -u root -p

change master to master_host='192.168.1.1',master_user='test',master_password='test123',master_log_file='主库file',master_log_pos=主库position;

start slave; #启动从库赋值功能

show slave satatus;#显示配置信息

Slave_IO_Running: Yes    Slave_SQL_Running: Yes  两个状态为yes表示配置成功

登录navicat查看检验功能的实现。


三:配置jdk1.8

mycatt需要jdk作为运行环境,首先查看是否有安装jdk

java -version

如果没有将,jdk上传到服务器

tar -zxvf 安装包名称 #解压tar包

vi /etc/profile

在profile中添加如下内容:

#set java environment
JAVA_HOME=/usr/java/jdk1.8.0_79
JRE_HOME=/usr/java/jdk1.8.0_79/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

让修改文件生效

source /etc/profile

java -version



四:配置mycat作为中间件

mycat作为一个中间件,提供了类似于nignx的功能,将负载通过配置自动分发到不同的数据库,javaweb可以之间jdbc连接替换为mycat。

mycat配置文件有很多,这里只做一个最简单的配置,主要配置server.xml和schema.xml

首先配置server.xml

server.xml中主要配置了一些登录信息,记录了登录用户名密码和数据源等参数

<user name="test">
        <property name="password">test123</property>
        <property name="schemas">testdb</property>
        <property name="readOnly">false</property>
        <!-- 表级 DML 权限设置 -->
        <!--         
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>        
         -->
    </user>    
    <user name="test2">
        <property name="password">test2345</property>
        <property name="schemas">testdb2</property>
        <property name="readOnly">false</property>
    </user>   


然后配置schema.xml,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>
    <schema name="testdb2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2"></schema>
    
    
    <!-- 业务分片 -->
    <dataNode name="dn1" dataHost="localhost1" database="testdb" />
    <dataNode name="dn2" dataHost="localhost2" database="testdb2" />
    
    <!--
    balance:
    
    1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。

    2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,
    并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。

    3. balance="2",所有读操作都随机的在writeHost、readhost上分发。

    4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
    

    switchType: 指的是切换的模式,目前的取值也有4种:

    1. switchType='-1' 表示不自动切换

    2. switchType='1' 默认值,表示自动切换

    3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status

    4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
    
    writeType:
    
    writeType="0",所有的操作发送到配置的第一个writehost

    writeType="1",随机发送到配置的所有writehost

    writeType="2",不执行写操作
    -->
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="192.168.1.1:3306" user="test"
                   password="test123">
            <!-- can have multi read hosts -->
            <readHost host="hostS1" url="192.168.1.2:3306" user="test" password="test123"/>
        </writeHost>
    </dataHost>
    <dataHost name="localhost2" maxCon="1000" minCon="10" balance="1"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM2" url="192.168.1.1:3306" user="test2"
                   password="test2345">
            <!-- can have multi read hosts -->
            <readHost host="hostS2" url="192.168.1.2:3306" user="test2" password="test2345"/>
        </writeHost>
    </dataHost>
</mycat:schema>




至此,简单的javaweb读写分离搭建完成,其中一些数据库的用户名密码有些不对,需要根据实际情况自行修改设计。














阅读全文
0 0