目录
- 搭建一个(双主双从) (然后搭建mycat)
- 四台主机配置
- master1 (主库1)
- master2 (主库2)
- slave 1(从库1)
- master1 (主库1)
- slave 1(从库1)
- 如果配置出错 需要从这里从新配置
- 写入数据(测试)
- mycat
- 安装java
- 安装mycat
- 编辑文件server.xml
- 编辑文件schema.xml
- 配置 mycat 用户
- 配置schema.xml
- 上述库的一些参数
- 启动mycat服务
- 登录mysql 用户端 测试
- 测试 主从 数据库负载均衡
- 测试负载均衡
搭建一个(双主双从) (然后搭建mycat)
- 需要准备四台机器(master1、master2、slave1、slave2)
- 克隆的时候 不要链接 要完整克隆
-
四台主机配置
# 配置本地解析
或者 vim /etc/hosts
cat >> /etc/hosts << EOF
{ip} master1
{ip} master2
{ip} slave1
{ip} slave2
{ip} mycat
EOF
cat >> /etc/hosts << EOF
10.12.155.146 master1
10.12.155.89 master2
10.12.155.92 slave1
10.12.155.97 slave2
10.12.155.93 mycat
EOF
# 配置 复制数据库
scp mysql5.7.44.tar.gz master1:/opt/
scp mysql5.7.44.tar.gz master2:/opt/
scp mysql5.7.44.tar.gz slave1:/opt/
scp mysql5.7.44.tar.gz slave2:/opt/
scp mysql5.7.44.tar.gz mycat:/opt/
# 解压包 安装
tar -xf /opt/mysql5.7.44.tar.gz
# 安装mysql
cd /opt/mysql5.7.44/
yum -y localinstall *
#启动数据库
systemctl start mysqld
systemctl enable mysqld
#修改mysql密码
mysqladmin -uroot -p"`awk '/temporary password/{p=$NF}END{print p}' /var/log/mysqld.log`" password '@Baipiao123'
# 创建备份文件
mkdir /data
chown mysql.mysql /data
master1 (主库1)
# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 1
log-slave-updates #添加上这个配置之后 就可以传多分bin-log
# 登录数据库
mysql -uroot -p"@Baipiao123"
# 授权账号。
mysql> grant replication slave on *.* to "king2"@"%" identified by "@Baipiao123";
# 刷新授权表
mysql> flush privileges;
# 查看当前binlog 日志文件用的哪个 以及post
msyql> show master status\G
## 重新设置 设置轮转日志
mysql> reset master;
# 重启数据库
systemctl restart mysqld
mysql -uroot -p"@Baipiao123"
# 登录数据库 查看myster 的状态
msyql> show master status\G
master2 (主库2)
# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 2
log-slave-updates
# 登录数据库 配置从的信息
mysql -uroot -p"@Baipiao123"
# 授权账号。
mysql> grant replication slave on *.* to "king2"@"%" identified by "@Baipiao123";
# 刷新授权表
mysql> flush privileges;
# 配置成 master 1 的从库
mysql>? change master to
CHANGE MASTER TO
MASTER_HOST='master1',
MASTER_USER='king',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
# 重新加载配置
mysql>start slave;
# 登录数据库 查看myster 的状态
msyql> show slave status\G
slave 1(从库1)
# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 3
# 登录数据库 配置从的信息
mysql -uroot -p"@Baipiao123"
# 配置成 master 1 的从库
mysql>? change master to
mysql>CHANGE MASTER TO
MASTER_HOST='master1',
MASTER_USER='king',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
# 重新加载配置
mysql>start slave;
# 登录数据库 查看myster 的状态
msyql> show slave status\G
master1 (主库1)
这里是回头把 master1 (主库1) 配置成 master2 (主库2) 的从库
这样,master1 (主库1) 和 master2 (主库2) 就可以互为主从
# 登录数据库 配置从的信息
mysql -uroot -p"@Baipiao123"
# 查看主机2
msyql> show master status\G
# 配置成 master 1 的从库
mysql>? change master to
mysql>CHANGE MASTER TO
MASTER_HOST='master2',
MASTER_USER='king2',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
# 重新加载配置
mysql>start slave;
# 登录数据库 查看myster 的状态
msyql> show slave status\G
slave 1(从库1)
配置成 主库2 的从库
# 配置文件
vim /etc/my.cnf
log_bin=/data/mysql-bin
server-id = 4
# 登录数据库 配置从的信息
mysql -uroot -p"@Baipiao123"
# 配置成 master 1 的从库
mysql>? change master to
mysql>CHANGE MASTER TO
MASTER_HOST='master2',
MASTER_USER='king2',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
# 重新加载配置
mysql>start slave;
# 登录数据库 查看myster 的状态
msyql> show slave status\G
如果配置出错 需要从这里从新配置
mysql>stop slave;
mysql> reset slave;
mysql>CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='master',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
## 启动slave
mysql>start slave;
# 产看状态
msyql>show slave status\G;
# -------------------------------------------------------------------
CHANGE MASTER TO
MASTER_HOST='master1',
MASTER_USER='king',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=1511,
MASTER_CONNECT_RETRY=10;
CHANGE MASTER TO
MASTER_HOST='master2',
MASTER_USER='king2',
MASTER_PASSWORD='@Baipiao123',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
写入数据(测试)
只往 master1 上写
# 在主库1 上插入数据
mysql -uroot -p"@Baipiao123" -e"create database baipiao;"
mysql -uroot -p"@Baipiao123" -e"create table baipiao.t1(id int,myname varchar(40));"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(1,'hanwudi');"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(2,'liubang');"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(3,'xiaohe');"
mysql -uroot -p"@Baipiao123" -e"insert into baipiao.t1 values(4,'zhangliang');"
# 在其余三个库中查寻数据
mysql -uroot -p"@Baipiao123" -e"select * from baipiao.t1"
mycat
安装java
安装java 环境
因为mycat 是用 java 写的 所以这里需要一个java环境
需要 jdk 环境
# 安装 杰哥 的包 直接用
# 解压包
tar -xf jdk-8u211-linux-x64c.tar.gz
# 移动解压包
mv jdk1.8.0_0 /usr/jdk
# 修改配置文件 增加全局变量
vim /etc/profile.d/java.sh
# 写入内容
export JAVA_HOME=/usr/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 更新环境变量
source /etc/profile
source /etc/profile.d/java.sh
# 检查 java 版本 (java 不用启动)
java -version
安装mycat
# mycat 解压就可以用了
tar -xf {mycat 包}
tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
# 移动解压包
mv mycat /usr/
# 一个假的 一个真的
/usr/mycat/conf/server.xml //存放和假的
/usr/mycat/conf/schema.xml //存放着真的
# server.xml
给后端的时候
就给一个假的 到时候假的 会对应一个真的 然后进行登录
# 编制之前先备份
cp /usr/mycat/conf/server.xml /usr/mycat/conf/server.xml.back
cp /usr/mycat/conf/schema.xml /usr/mycat/conf/schema.xml.back
# 编辑文件 会在下边逐个编辑 (此处仅为展示)
vim /usr/mycat/conf/server.xml
vim /usr/mycat/conf/schema.xml
编辑文件server.xml
vim /usr/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!-- name="root" 是假库 用户名 -->
<user name="root" defaultAccount="true">
<!-- 这里是 假库密码 -->
<property name="password">123456</property>
<!-- 这里是假库库名 -->
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
编辑文件schema.xml
vim /usr/mycat/conf/schema.xml
配置 mycat 用户
# 授权一个mycat 用户
mysql> grant all on *.* to "mycat"@"%" identified by "@Baipiao123";
# 查看用户
mysql> select user from mysql.user;
# 刷新授权
mysql> flush privileges;
# 创建一个真库 (假库 TESTDB 会对应到db1库)
mysql> create database db1;
# 给库中创建一个表格
mysql> create table db1.t1(id int);
配置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="db1" />
<!-- balance="3" 负载均衡 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 做一个判断,判断 主1 库是否正常 -->
<heartbeat>select user()</heartbeat>
<!-- 主库1 master1 -->
<writeHost host="hostM1" url="master1:3306" user="mycat"
password="@Baipiao123">
<!-- 从库1(slave1) -->
<readHost host="hostS1" url="slave1:3306" user="mycat" password="@Baipiao123" />
</writeHost>
<!-- 主库2 (master2)-->
<writeHost host="hostM2" url="master2:3306" user="mycat"
password="@Baipiao123">
<!-- 从库2(slave2) -->
<readHost host="hostS2" url="slave2:3306" user="mycat" password="@Baipiao123" />
</writeHost>
</dataHost>
</mycat:schema>
上述库的一些参数
----------------------------------------------------------------------------------------------
配置到这里就结束了 下边是一些参数解释
----------------------------------------------------------------------------------------------
database="db1" 需写一个真实的库
maxCon ="1000" 最大连接数
minCon ="10" 最少连接数
balance = "0" 负载均衡
writeType=
dbType= //数据库类型
dbDriver= //引擎
--------------------------------------------------
<heartbeat>select user()</heartbeat>
试试检测 库1 有没有宕机
--------------------------------------------------
writeHost
host =
url= {数据库链接地址}
user= {数据库用户名}
passwd= {数据库用户密码}
启动mycat服务
#配置文件 改完之后
/usr/mycat/bin/mycat #mycat 配置
/usr/mycat/bin/mycat status # 查看状态
/usr/mycat/bin/mycat start # 查看状态
/usr/mycat/bin/mycat restart # 重新启动
jps # 查看java 进程
ss -ntlp
登录mysql 用户端 测试
使用 mysql 客户端
mycat 端口是8066
mysql -P8066 -uroot -p123456 -hmycat
show databases;
测试 主从 数据库负载均衡
balance 属性
负载均衡类型,目前的取值有 3 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1", 全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2
互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
4. balance="2", 所有读操作都随机的在 writeHost、readhost 上分发。
5. balance="3", 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
测试负载均衡
# 登录四个库
mysql -uroot -p"@Baipiao123"
show databases;
use db1;
# 关闭链接 分别创建四个库
mysql -uroot -p"@Baipiao123" -e"stop slave;"
stop slave;
# 每个库执行一个 每个库执行一个 每个库执行一个
# 注意哈 这个四个命令是在四个库中执行的 这个时候数据是不一样的
# 这里是为了测试 是不是完成了读写分离
mysql -uroot -p"@Baipiao123" -e"create table db1.kk1(id int);"
mysql -uroot -p"@Baipiao123" -e"create table db1.kk2(id int);"
mysql -uroot -p"@Baipiao123" -e"create table db1.kk3(id int);"
mysql -uroot -p"@Baipiao123" -e"create table db1.kk4(id int);"
# 这里是 sql 语法
create table db1.kk1(id int);
create table db1.kk2(id int);
create table db1.kk3(id int);
create table db1.kk4(id int);
# 登录假库
mysql -P8066 -uroot -p123456 -hmycat
# 进入到假库中
use TESTDB;
# 多次执行这个命令 可以看到如图的 现象
show databases;
🌸🌸花开的时候,那便是春风带给来的盛装和温暖,每年都是这样。爱也一样,三千年不会变。🌸🌸