Mysql实现主从复制读写分离

Centos7安装mysql5.7主从配置实现读写分离以及分库分表

一. Centos7安装mysql5.7步骤

  1. 准备

准备两台Centos7环境的虚拟机,我用的两台:192.168.13.150(master),192.168.13.151(slave)

  1. 下载mysql的repo源

wget http://repo.mysql.com/mysql57-community-release-el7-8.noarch.rpm
Mysql实现主从复制读写分离

  1. 安装源
    rpm -ivh mysql57-community-release-el7-8.noarch.rpm
    Mysql实现主从复制读写分离

  2. 安装数据库
    yum install mysql-server

Mysql实现主从复制读写分离

  1. 启动数据库
    systemctl start mysqld
    二. 登录数据库、密码设置和访问权限设置
  2. 登录数据库
    a. 5.7版本默认对于root帐号有一个随机密码,可以通过 grep “password” /var/log/mysqld.log获得,[email protected]: 此处为随机密码

Mysql实现主从复制读写分离

b. 运行mysql -uroot -p 回车,粘贴随机密码

Mysql实现主从复制读写分离

  1. 设置新密码

a. 默认的随机密码是没办法直接对数据库做操作的,需要修改密码,然后,5.7版本用了validate_password密码加强插件,因此在修改密码的时候绝对不是 123456 能糊弄过去的。需要严格按照规范去设置密码.

b. 但是,如果想让密码简单点也可以,降低安全策略, 登录到mysql客户端执行如下两条命令
set global validate_password_length=1;

set global validate_password_policy=0;

set password=password(‘root’);
这样就能设置简单的密码了,但是密码长度必须是大于等于4位,上图的密码为root。

  1. 设置其他机器能访问到数据库

GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION;
上面为一行,请一同复制。

4.创建一个同步用户,slave与master进行同步
create user repl identified by ‘repl’;
Mysql实现主从复制读写分离

设置同步权限
grant replication slave on . to ‘repl’@’192.168.13.150’ identified by ‘repl’;
这样安装好一台虚拟机的mysql,同样的方式安装另外一台虚拟机的mysql
三. 设置主从

  1. 数据安装好后,几个数据文件
    mysql的数据文件和二进制文件: /var/lib/mysql/
    mysql的配置文件: /etc/my.cnf
    mysql的日志文件: /var/log/mysql.log

  2. 配置192.168.13.150(master)
    修改 /etc/my.cnf:
    vim /etc/my.cnf
    Mysql实现主从复制读写分离
    保存后重启mysql数据库:systemctl restart mysqld

Mysql实现主从复制读写分离

重启后登录mysql数据库查看master状态
mysql -uroot -proot
show master status;
Mysql实现主从复制读写分离

master配置完毕。

  1. 配置192.168.13.151(slave)
    修改配置文件 /etc/my.cnf:
    vim /etc/my.cnf
    Mysql实现主从复制读写分离
    重启mysql数据库
    systemctl restart mysqld

登录到数据库
mysql -uroot -proot
配置同步
change master to master_host=‘192.168.13.150’,master_port=3306,master_user=‘root’,master_password=‘root’,master_log_file=‘mysql-bin.000001’,master_log_pos=154;
master_host是master的ip
master_port是master的端口
master_user是master设置的同步用户
master_password是同步用户的密码
master_log_file是通过命令:show master status;查看master的File
master_log_pos是通过命令:show master status;查看开始同步的位置Position。

启动slave
start slave;

查看slave的状态
show slave status\G;
Mysql实现主从复制读写分离

当图中的两个线程都为Yes时,主从配置设置成功。如果不全是Yes,则配置有误.

主从服务器测试 在主服务器上执行以下操作:
在Navicat可视化工具上面分别连接两个服务器的主从数据库,在主表中建表写数据,再连接从库,会发现,数据也同步到了另外一张表,至此,主从同步就成功实现。

MyCat实现读写分离
Mycat 192.168.13.153
主从同步配置(这里就不介绍了,先把主从同步做了,授权,防火墙关闭等)
Mycat 需要安装JDK 1.7 或者以上版本。(请自行安装配置环境变量)
Mycat默认端口是8066和9066,注意防火墙开启8066 和9066 端口

wget https://raw.githubusercontent.com/MyCATApache/Mycat-download/master/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

解压到指定文件夹下
tar xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

添加mycat用户
[[email protected] ~]# useradd mycat
[[email protected] ~]# chown -R mycat.mycat /usr/local/mycat/
注意:Linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf 下配置 lower_case_table_names=1 使Linux环境下MySQL忽略表名大小写,否则使用MyCAT的时候会提示找不到表的错误!
修改配置文件 vim /usr/local/mycat/conf/server.xml
Mysql实现主从复制读写分离
配置 schema vim /usr/local/mycat/conf/schema.xml

Mysql实现主从复制读写分离
添加mycat的环境变量 vim /etc/profile 添加 MYCAT_HOME=/usr/local/mycat PATH=MYCATHOME/bin:MYCAT_HOME/bin:PATH
执行 source /etc/profile 命令,使环境变量生效。

mycat的端口是8066
查看 netstat -antp |grep 8066
Mysql实现主从复制读写分离
Linux下运行:./mycat console 达到此下图红框内容代表启动成功,此方法启动可以查看错误信息日志。
Mysql实现主从复制读写分离
确保能正常启动,可以用./mycat start后台启动
Mysql实现主从复制读写分离
连接测试
mysql -uroot -proot -P8066 -h192.168.13.153(ip是安装了mycat的机器的ip,端口是mycat的端口,用户是mycat的server.xml里面的配置,mycat用户,密码也是mycat密码)
Mysql实现主从复制读写分离
能够正确登入说明mycat安装成功了,是进行读写分离的前提。
现在我们用navicat premium登入mycat,输入ip,端口,用户名和密码,需要linux开启8066端口9066端口远程访问。
Mysql实现主从复制读写分离
点击连接测试,成功以后在点击确定即连接mycat成功了。
测试步骤:
关闭主从同步stop slave;
往mycat插入一条数据,提交刷新。
观察刚插入的数据,发现mycat并没查看到这条数据。
观看主库,发现主库有这条通过mycat添加的数据。
观看从库,发现从库没有通过mycat添加的数据。
开启从数据库主从同步start slave;
通过从库查看发现有刚新添加的数据。
通过mycat查看发现也有这条刚添加的数据。
说明使用mycat进行读写分离成功了。
实现分库分表
创建数据库以及表
1.两张表users和item,三个数据库db01,db02,db03(三个库在一个数据库实例上)
2.users只在db01中存储。
3.item表被分割到db02和db03中存储。
create database db01;
use db01;
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL default ‘’,
indate DATETIME NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
如果sql运行错误
Mysql实现主从复制读写分离
原因是mysql版本兼容问题导致,修改以下一行即可
Mysql实现主从复制读写分离
在db02和db03中分别创建item表,SQL脚本如下:
create database db02 if not exists db02;
use db02;
CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default 0,
indate DATETIME NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

create database db03 if not exists db03;
use db03;
CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default 0,
indate DATETIME NOT NULL default ‘0000-00-00 00:00:00’,
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;

Server.xml
Mysql实现主从复制读写分离
Rule.xml (修改以下对应的两个模块即可)
Mysql实现主从复制读写分离

Schema.xml
Mysql实现主从复制读写分离
启动测试
在命令行切换bin目录下,然后执行如下命令:
Mysql实现主从复制读写分离
如上图,代表正常启动mycat。
在命令行访问mycat逻辑数据库,采用如下的命令:
mysql -uroot -proot -P8066 -h192.168.13.153
Mysql实现主从复制读写分离
现在在访问Mycat在数据库中插入数据,看数据能否按照前面配置的路由规则进行分表。
现在执行如下的SQL语句进行数据的插入。
insert into users(name,indate) values(‘kk’,now());
insert into users(name,indate) values(‘ss’,now());
insert into item(id,value,indate) values(1,100,now());
insert into item(id,value,indate) values(2,100,now());

然后实际登录数据库查看数据
db01库中users的表的数据成功写入。
Mysql实现主从复制读写分离

给item表,分别插入两条数据id为1、2的数据,发现插入的数据会分别存入db02以及db03的item表中,成功分表。

Mysql实现主从复制读写分离
Mysql实现主从复制读写分离
原创文档,按照文档一步一步来,肯定可以配置成功。
以下是我的微信公众号"Java开发平台",会定期更新,供大家学习交流技术以及面试经验,也有提供开发工具**等等,
有问题大家也可以找我。
Mysql实现主从复制读写分离