主从&读写分离

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库 简单 复用

数据库 主从&读写分离

节点规划
IP 主机名 节点
10.35.172.77 mysql1 主数据库节点
10.35.172.78 mysql2 从数据库节点
10.35.172.79 mycat 数据库中间件节

1、基础环境搭建

### mysql1
# 修改主机名
[root@mysql1 ~]# hostnamectl set-hostname mysql1
# 配置解析文件
[root@mysql1 ~]# echo "10.35.172.77 mysql1
10.35.172.78 mysql2" >> /etc/hosts
# 关闭 selinux&防火墙
[root@mysql1 ~]# setenforce 0
[root@mysql1 ~]# systemctl stop firewalld
# SecureXF上传 mariad-repo.tar.gz && 解压到 /opt
[root@mysql1 ~]# tar -zxvf mariadb-repo.tar.gz -C /opt
# 配置yum源
[root@mysql1 ~]# mkdir /etc/yum.repo.d/bak
[root@mysql1 ~]# mv /etc/yum.repo.d/* /bak
[root@mysql1 ~]# echo "[mariadb]
name=mariadb
baseurl=file:///opt/mariadb-repo
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=ftp://10.35.172.81/centos
gpgcheck=0
enabled=1" > /etc/yum.repos.d/local.repo 

### mysql2
[root@mysql2 ~]# hostnamectl set-hostname mysql2
[root@mysql2 ~]# echo "10.35.172.77 mysql1
10.35.172.78 mysql2" >> /etc/hosts
[root@mysql2 ~]# setenforce 0
[root@mysql2 ~]# systemctl stop firewalld
# SecureXF 上传 mariad-repo.tar.gz
[root@mysql1 ~]# tar -zxvf mariadb-repo.tar.gz -C /opt
[root@mysql2 ~]# mkdir /etc/yum.repo.d/bak
[root@mysql2 ~]# mv /etc/yum.repo.d/* /bak
[root@mysql2 ~]# echo "[mariadb]
name=mariadb
baseurl=file:///opt/mariadb-repo
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=ftp://10.35.172.81/centos
gpgcheck=0
enabled=1" > /etc/yum.repos.d/local.repo 

### mycat
[root@mycat ~]# hostnamectl set-hostname mycat
[root@mycat ~]# setenforce 0
[root@mycat ~]# systemctl stop firewalld
[root@mycat ~]# mkdir /etc/yum.repo.d/bak
[root@mycat ~]# mv /etc/yum.repo.d/* /bak
# SecureXF 上传 mariad-repo.tar.gz
[root@mycat ~]# tar -zxvf mariadb-repo.tar.gz -C /opt
[root@mycat ~]# echo "[mariadb]
name=mariadb
baseurl=file:///opt/mariadb-repo
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=ftp://10.35.172.81/centos
gpgcheck=0
enabled=1" > /etc/yum.repos.d/local.repo 

2、安装服务

# 安装 mariadb 并启动
[root@mysql1 ~]# yum install -y mariadb mariadb-server
[root@mysql1 ~]# systemctl start mariadb && systemctl enable mariadb

[root@mysql2 ~]# yum install -y mariadb mariadb-server
[root@mysql2 ~]# systemctl start mariadb && systemctl enable mariadb

# 初始化mariadb
[root@mysql1 ~]# mysql_secure_installation 
## 注意:Disallow root login remotely? [Y/n] n
##      其他为 yes ;密码设置为 000000

[root@mysql2 ~]# mysql_secure_installation 
## 注意:Disallow root login remotely? [Y/n] n
##      其他为 yes ;密码设置为 000000

# 安装JDK & 查看JDK版本
[root@mycat ~]# yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
[root@mycat ~]# java -version

# 二进制安装 mycat
## SecureXF 上传 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

# 配置环境变量
[root@mycat ~]# echo export MYCAT_HOME=/usr/local/mycat/ >> /etc/profile
[root@mycat ~]# source /etc/profile

3、配置服务

### 主从复制
# mysql1
[root@mysql1 ~]# vi/etc/my.cnf.d/server.cnf
# 在 [mysqld]标签下添加
log_bin = mysql-bin           #记录操作日志
binlog_ignore_db = mysql      #不同步mysql系统数据库
server_id = 77                #数据库集群中的每个节点id都要不同
# 重启数据库
[root@mysql1 ~]# systemctl restart mariadb
# 进入数据库并配置
[root@mysql1 ~]# mysql -uroot -p000000
MariaDB [(none)]> grant all privileges  on *.* to root@'%' identified by "000000";
MariaDB [(none)]> grant replication slave on *.* to 'user'@'mysql2' identified by '000000';

# mysql2
[root@mysql2 ~]# vi/etc/my.cnf.d/server.cnf
# 在 [mysqld]标签下添加
log_bin = mysql-bin
binlog_ignore_db = mysql
server_id = 78
[root@mysql2 ~]# systemctl restart mariadb
[root@mysql2 ~]# mysql -uroot -p000000
MariaDB [(none)]> change master to master_host='mysql1',master_user='user',master_password='000000';

### 读写分离
# mycat
# schema.xml配置文件 ;将原内容替换为下面文字
[root@mycat ~]# vi /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="USERDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema> 
<dataNode name="dn1" dataHost="localhost1" database="test" />  
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native" writeType="0" switchType="1"  slaveThreshold="100">  
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="172.30.11.12:3306" user="root" password="000000">
        <readHost host="hostS1" url="172.30.11.13:3306" user="root" password="000000" />
    </writeHost>
</dataHost>
</mycat:schema>
# 修改配置文件权限
[root@mycat ~]# chown root:root /usr/local/mycat/conf/schema.xml
# 编辑mycat的访问用户
[root@mycat ~]# vi /usr/local/mycat/conf/server.xml 
# 在配置文件的最后部分,修改 password schemas
<user name="root">
        <property name="password">000000</property>
        <property name="schemas">USERDB</property
# 然后删除如下几行:
<user name="user">
        <property name="password">user</property>
        <property name="schemas">TESTDB</property>
        <property name="readOnly">true</property>
</user>
# 启动Mycat服务
[root@mycat ~]# /bin/bash /usr/local/mycat/bin/mycat start

4、验证

### 主从复制
# mysql2
# 登录查询主从状态
[root@mysql2 ~]# mysql -uroot -p000000
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G

# mysql1 创建库test,并在库test中创建表company,插入表数据
[root@mysql1 ~]# mysql -uroot -p000000
MariaDB [(none)]> create database test;
MariaDB [(none)]> use test;
MariaDB [test]> create table company(id int not null primary key,name varchar(50),addr varchar(255));
MariaDB [test]> insert into company values(1,"alibaba","china");
MariaDB [test]> select * from company;

# mysql2 查看数据库列表。找到test数据库,查询表 验证从数据库的复制
[root@mysql2 ~]# mysql -uroot -p000000
MariaDB [(none)]> use test;
MariaDB [test]> show tables;
MariaDB [test]> select * from company;

### 读写分离
# 安装客户端工具
[root@mycat ~]# yum install -y MariaDB-client
# 使用mysql命令查看Mycat服务的逻辑库USERDB
[root@mycat ~]# mysql -h127.0.0.1 -P8066 -uroot -p000000
MySQL [(none)]> show databases;
MySQL [(none)]> use USERDB
MySQL [USERDB]> show tables;
MySQL [USERDB]> select * from company;
# 使用mysql命令对表company添加一条数据
MySQL [USERDB]> insert into company values(2,"bastetball","usa");
MySQL [USERDB]> select * from company;

# 验证Mycat服务对数据库读写操作分离
[root@mycat ~]# mysql -h127.0.0.1 -P9066 -uroot -p000000 -e 'show  @@datasource;'
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
SQL 存储 关系型数据库
MySQL主从复制、读写分离
MySQL主从复制、读写分离
189 0
|
3月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
4月前
|
数据库
读写分离
【8月更文挑战第9天】
155 4
|
7月前
|
SQL 运维 关系型数据库
什么是读写分离?
什么是读写分离?
53 4
|
缓存 算法 搜索推荐
为什么需要读写分离?
为什么需要读写分离?
|
缓存 搜索推荐 数据库
什么时候需要做读写分离?
很多小伙伴可能会认为数据库的负载问题就应该使用“读写分离”来解决。这其实是一个非常大的误区,我们要使用“读写分离”,首先要搞明白“读写分离”能解决什么问题,而不仅仅只会使用这个技术。
150 0
|
SQL 缓存 关系型数据库
|
负载均衡 数据库
主从复制
主从复制
111 0
|
SQL 存储 关系型数据库
|
关系型数据库 MySQL Java
MySQL主从复制+读写分离(二)
MySQL主从复制+读写分离(二)
MySQL主从复制+读写分离(二)