开源数据库MySQL DBA运维实战-集群

开源数据库MySQL DBA运维实战-集群

  • 一.集群技术
    • 1.集群概念(MySQL复制技术)
      • 1.1集群目的
      • 1.2图示
      • 1.3类型
      • 1.4原理图示
    • 2.集群案例
      • 2.1环境
      • 2.2一主一从(M-S)(1)
      • 2.3一主一从(M-S)(2)
      • 2.4双主双从(MM-SS)
  • 二.代理技术
    • 1.代理简介
      • 1.1名词
      • 1.2功能
      • 1.3产品
      • 1.4图示
    • 2.Mycat实战
      • 2.1架构
      • 2.2案例1
      • 2.3案例2

一.集群技术

1.集群概念(MySQL复制技术)

1.1集群目的

1.负载均衡:解决高并发
2.高可用HA:服务可用性
3.远程灾备:数据有效性

1.2图示

开源数据库MySQL DBA运维实战-集群_第1张图片

1.3类型

1.M
2.M-S
3.M-S-S…
4.M-M
5.M-M-S-S

1.4原理图示

1.图示Ⅰ
开源数据库MySQL DBA运维实战-集群_第2张图片

2.图示Ⅱ
开源数据库MySQL DBA运维实战-集群_第3张图片
3.概念
Ⅰ.在主库上把数据更改(DDL DML DCL)记录到二进制日志(Binary Log)中.
Ⅱ.备库I/O线程将主库上的日志复制到自己的中继日志(Relay Log)中.
Ⅲ.备库SQL线程读取中继日志中的事件,将其重放到备库数据库之上.

2.集群案例

2.1环境

  • Ⅰ.全新服务器-互相通信
  • Ⅱ.全新安装mysql5.7-分别安装( 重新安装多台数据库,不要克隆已经安装的数据。因为数据库的ID相同。可以克隆初始化过未安装MySQL。)
  • Ⅲ.配置域名解析 vim /etc/hosts
  • Ⅳ.
    1.master1—192.168.36.134—systemctl start mysqld
    2.master2—192.168.36.147—systemctl start mysqld
    3.slave1—192.168.36.144—systemctl start mysqld
    4.slave2—192.168.36.145—systemctl start mysqld
  • Ⅴ.可以使用host文件的形式,也可以使用DNS服务器解析

2.2一主一从(M-S)(1)

  • Ⅰ.主(master1)

1.部署一台新mysql服务器.准备好域名解析.
mysql数据库部署

2.准备数据1(验证主从同步使用)-master1

mysql> create database master1db;
mysql> create table master1db.master1tab(name char(50));
mysql> insert into master1db.master1tab values (1111);
mysql> insert into master1db.master1tab values (2222);

3.开启二进制日志-master1

[root@localhost ~]# vim /etc/my.cnf
log_bin
server-id=1
[root@localhost ~]# systemctl restart mysqld   #重启生效

4.创建具有复制权限用户-master1

mysql> grant replication slave, replication client on *.* to 'rep'@'192.168.36.%' identified by 'Q@123';

5.备份master数据库的数据-master1

[root@localhost ~]# mysqldump -p'Q@123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F`-mysql-all.sql
[root@localhost ~]# scp -r 2020-08-31-mysql-all.sql master2:/tmp   #发送给另一台主机,已经域名解析过用的是master2,也可用域名.
[root@localhost ~]# vim vim 2020-08-31-mysql-all.sql    #第22行,观察二进制日志分割点
-- CHANGE MASTER TO MASTER_LOG_FILE='localhost-bin.000003', MASTER_LOG_POS=154;

6.准备数据2(验证主从同步使用)-master1

mysql> insert into master1db.master1tab values (33333333);
mysql> insert into master1db.master1tab values (44444);
  • Ⅱ.从(master2)
1.测试rep用户是否可用,预防账户有问题-master2

[root@localhost ~]# mysql -h master1 -urep -p'Q@123'

2.启动服务器序号-master2

[root@localhost ~]#vim /etc/my.cnf
#不用在从设备上开启二进制日志,没有人向master2请求日志。
server-id=2   #服务器id必须设置

[root@localhost ~]# systemctl restart mysqld

[root@localhost ~]# mysql -uroot -p'Q@123'
#测试服务器是否修改正确。能否正常登陆。

3.手动同步数据-master2
mysql>  set sql_log_bin=0;
#临时设置关闭二进制日志,退出下一次再进入数据库就会开启

mysql>  source /tmp/2020-08-31-mysql-full.sql;

4.设置主服务器-master2

mysql> change master to
-> master_host='master1',
-> master_user='rep',
-> master_password='QianFeng@123',
-> master_log_file='localhost-bin.000003',
-> master_log_pos=154;
#注意,二进制日志的位置,应该参照主服务器备份时生成的新位置。

5.启动从设备-master2

mysql> start slave;

6.查看启动状态(IO-YES/SQL-YES)-master2

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master1
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: localhost-bin.000003
          Read_Master_Log_Pos: 154
               Relay_Log_File: localhost-relay-bin.000003
                Relay_Log_Pos: 375
        Relay_Master_Log_File: localhost-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

7.返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。

2.3一主一从(M-S)(2)

  • 1.需求
    实验2与上一个实验需求基本相同经。master1 作为主mysql,master2 作为从mysql。
    不同之处,使用了
    “gtid_mode=ON
    enforce_gtid_consistency=1”
    该属性自动记录position位置。不需要手动指定了。
  • 2.环境—与实验1功能相同
重置master2数据库以便于开始实验2

[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /var/lib/mysql/*
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# grep password /var/log/mysqld.log
[root@localhost ~]# mysqladmin -p'VsudOt+g%5Nw' password 'Q@123'
  • 3.主master1
.启动二进制日志,服务器id,gtid.-master1

[root@localhost ~]# vim /etc/my.cnf
log_bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1
[root@localhost ~]# systemctl restart mysqld.授权复制用户rep(上个实验已做过可忽略)-master1

mysql> grant replication slave,replication client on *.* to 'rep'@'192.168.36.%' identified by 'Q@123';
mysql> flush privileges;.备份数据-master1
[root@localhost ~]# mysqldump -p'QianFeng@123' --all-databases --single-transaction --master-data=2 --flush-logs > `date +%F-%H`-mysql-all.sql
[root@localhost ~]# scp -r 2020-08-31-20-mysql-all.sql    master2:/tmp.模拟数据变化-master1

[root@localhost ~]# insert into master1db.master1tab values (6666666666);
  • 4.从master2
1.测试rep用户是否可用-master2

[root@localhost ~]# mysql -hmaster1 -uroot -p'Q@123'  #预防账户有问题注意防火墙关闭

2.启动二进制日志,服务器id,gtid。-master2

[root@localhost ~]# vim /etc/my.cnf
log_bin
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
[root@localhost ~]# systemctl restart mysqld   
#测试配置是否有问题,如果启动失败。请检查配置。

3.恢复数据-master2

mysql> set sql_log_bin=0;
mysql> source /tmp/2020-08-31-20-mysql-all.sql;
mysql> select * from master1db.master1tab;

4.设置主服务器-master1

mysql> change master to
-> master_host='maste1',
-> master_user='rep',
-> master_password='Q@123',
-> master_auto_position=1;
#注意和前一个实验对比观察一下区别
mysql> start slave;
mysql> show slave status\G;

5.返回主服务器(master1)更新数据,在从服务器(master2)观察是否同步。

2.4双主双从(MM-SS)

  • 双主(MM)
.前言

之前的实验,主服务器单节点设置,假如主服务器故障会影响全局的写入事件。故设置双主。
目前:已经设置master1为master2的主服务器,只需设置master2为master1的主服务器。

Ⅱ.设置master2为master1的主服务器
1.在master2上进行授权

mysql> grant replication slave, replication  client on *.* to 'rep'@'192.168.36.%'  identified by 'Q@123';
mysql> flush privileges;

2.在master1上进行设置

mysql> change master to
-> master_host='master2',
-> master_user='rep',
-> master_password='QianFeng@123',
-> master_auto_position=1;
mysql> start slave;
mysql> show slave status\G;

3.测试
在master1上插入数据,在master2上观察
在master2上插入数据,在master1上观察
双方同步成功,双主设置完成。
  • 双从(SS)
.同步现有数据库
1.master1

[root@localhost ~]# mysqldump -p'Q@123' --all-databases --single-transaction --master-data=2  --flush-logs > `date +%F`-mysql-all.sql
[root@localhost ~]# scp -r 2020-08-31-mysql-all.sql slave1:/tmp 
[root@localhost ~]# scp -r 2020-08-31-mysql-all.sql slave2:/tmp .启动从服务器id,gtid
1.slave1

[root@localhost ~]# server-id=3
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
#从机把主的信息存在主信息仓库里。主信息库可以是文件也可以是表,具体由—master-info-repository参数值决定。—master-info-repository=file时 会生成master.info 和 relay-log.info2个文件,如果—master-info-repository=table,信息就会存在mysql.master_slave_info表中。

[root@localhost ~]# systemctl restart mysqld

2.slave2

[root@localhost ~]# vim /etc/my.cnf
server-id=4
gtid_mode=ON
enforce_gtid_consistency=1
master-info-repository=TABLE
relay-log-info-repository=TABLE
[root@localhost ~]# systemctl restart mysqld.设置主服务器
1.slave1

mysql> change master to
-> master_host='master1',
-> master_user='rep',
-> master_password='Q@123',
-> master_auto_position=1 for channel 'master1';

mysql> change master to
-> master_host='master2',
-> master_user='rep',
-> master_password='Q@123',
-> master_auto_position=1 for channel 'master2';

mysql> start slave;
mysql> show slave status\G;

2.slave2

mysql> change master to
-> master_host='master1',
-> master_user='rep',
-> master_password='Q@123',
-> master_auto_position=1 for channel 'master1';

mysql> change master to
-> master_host='master2',
-> master_user='rep',
-> master_password='Q@123',
-> master_auto_position=1 for channel 'master2';

mysql> start slave;
mysql> show slave status\G;.测试
1.master1插入数据
2.master2插入数据
3.slave1查看
4.slave2查看

二.代理技术

1.代理简介

1.1名词

  • DB Proxy,数据库中间件

1.2功能

  • 1.读写分离—M-S-S M-M-S-S
  • 2.负载均衡—Galera Cluster
  • 3.支持数据的分片自动路由与聚合

1.3产品

  • MySQL Proxy—MySQL官方
  • Atlas—奇虎360
  • DBProxy—美团点评
  • Amoeba—早期阿里巴巴
  • cober—阿里巴巴
  • MyCat—阿里巴巴

1.4图示

开源数据库MySQL DBA运维实战-集群_第4张图片

2.Mycat实战

2.1架构

  • 1.准备好域名解析
[root@localhost ~]# vim /etc/hosts
  • 2.Mycat
192.168.36.148 mycat
  • 3.M-M-S-S
192.168.36.134 master1
192.168.36.147 master2
192.168.36.144 slave1
192.168.36.145 slave2

2.2案例1

  • Ⅰ.配置Java环境(甲骨文官网下载jdk包)
[root@localhost ~]# tar xf jdk-8u91-linux-x64.tar.gz -C /usr/local/
[root@localhost ~]# ln -s /usr/local/jdk1.8.0_91/ /usr/local/java
[root@localhost ~]# tail -3 /etc/profile
JAVA_HOME=/usr/local/java
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH
#最后添加三行,设置JAVA变量,便于JAVA调用

[root@localhost ~]# source /etc/profile
[root@localhost ~]# env | grep JAVA
[root@localhost ~]# java -version
#查询到版本。说明jdk安装成功
  • Ⅱ.配置Mycat

1.下载mycat(http://www.mycat.org.cn/)

[root@localhost ~]# wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@localhost ~]# tar xf  Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@localhost ~]# ls /usr/local/mycat/

2.配置mycat前端

[root@localhost ~]# vim /usr/local/mycat/conf/server.xml

注释掉多余用户(95行—99行)

开源数据库MySQL DBA运维实战-集群_第5张图片

启动mycqt管理员

开源数据库MySQL DBA运维实战-集群_第6张图片

3.配置mycqt后端

先备份该文件

 [root@localhost ~]# vim /usr/local/mycat/conf/schema.xml

开源数据库MySQL DBA运维实战-集群_第7张图片
注释

schema name:mycat维护的集群名称。
datanode:后方节点群的名称。
datahost:后方节点群的主机名称。
writehost:写主机
readhost:读主机

在本例中switchType值设置为1,表示自动切换,某些对主从数据一致要求较高的场景,建议使用2判断主从状态后再切换
切换的触发条件为主节点mysql服务崩溃或停止
slaveThreshold 主从的延迟在多少秒以内,则把读请求分发到这个从节点,否则不往这个节点分发,假设生产环境能容忍的主从延时为60秒,则设置此值为60,此例中设置值为100

4.关于属性的介绍

---balance类型---

1. balance=“0”, 关闭读写分离功能。所有读操作都发送到当前可用的writeHost上。
2. balance=“1”,开启读写分离所有读操作都随机的发送到readHost。

---writeType属性---

备份型:writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
负载型:writeType="1",所有写操作都随机的发送到配置的 writeHost

---switchType模式---

switchType指的是切换的模式,目前的取值也有4种:
1. switchType='-1' 负1表示不自动切换
2. switchType='1' 默认值,表示根据延时自动切换
3. switchType='2' 根据MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
  • Ⅲ.配置mysql集群
#M-M-S-S 准备Mycat连接的用户及权限
#例如master1

mysql> grant all on *.* to 'mycatproxy'@'192.168.36.148' identified by 'QianFeng@123';
#192.168.36.148是mycat服务器的IP
  • Ⅳ.启动Mycat

在mycat服务器上

[root@localhost ~]# /usr/local/mycat/bin/mycat start
#Starting Mycat-server...
#启动成功,否则就是配置Mycat后端语法错误。

[root@localhost ~]# netstat  -anpt | grep java
#检测进程是否启动

[root@localhost ~]# ps aux | grep mycat
#检测进程是否启动

[root@localhost ~]# yum install -y mariadb
#安装客户端

[root@localhost ~]# mysql -hmycat -uroot -p123456 -P8066

MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| tianyun  |
+----------+
1 row in set (0.01 sec)
#看到的数据库是虚拟的。注意后方mysql群中应该创建该库

在mycat-master1上创建库表

MySQL [(none)]> create database  tianyun;
MySQL [(none)]> create table tianyun.t1 (id int);
  • Ⅴ.mycat使用后方数据库
1.在mycat上

MySQL [(none)]> select * from tianyun.t1;
MySQL [(none)]> insert into tianyun.t1 values(3);

2.在mysql集群能 查询到数据。实验完成。

2.3案例2

  • 多库时如何设置mycat
    开源数据库MySQL DBA运维实战-集群_第8张图片
    开源数据库MySQL DBA运维实战-集群_第9张图片

你可能感兴趣的:(开源数据库MySQL,DBA运维实战,数据库,mysql,负载均衡)