数据库主从、双主模式(day09)

1.知识复习

数据库主从、双主模式(day09)_第1张图片
安装数据库

//1).安装数据库 
yum install mariadb-server
//2).启动数据库 
systemctl start mariadb
//3).配置数据库 
mysql_secure_installation
//4).开放数据库的对外访问权限
mysql -u root -p
use mysql;
select host,user from user;
update user set host="%" where host = "localhost";
//操作mysql库中的user表 修改数据库信息 之后重启数据库/刷新权限 
flush privileges;
//5).导入jtdb的数据库

操作防火墙

//1).配置开关 标识防火墙的以后的操作 
systemctl disable firewalld.service
//2).临时操作 操作防火墙现在的状态	
systemctl stop firewalld.service
//3).检查防火墙状态 
firewall-cmd --state

部署服务器

1).配置JDK tar -xvf jdk-8u51-linux-x64.tar.gz vim /etc/profile source /etc/profile
2).部署服务项 8081/8082/8083
3).设定后台启动
4).设定脚本启动

安装nginx

1).下载nginx安装包
2).配置/编译/安装 ./configure make make install
3).查找nginx工作目录
4).启动nginx
5).配置nginx配置文件 实现反向代理

2.实现数据库高可用

  • 项目部署之后弊端
    问题描述1: 当数据库宕机之后,可能导致数据丢失.必须通过某些策略,保证数据的有效性.
    问题描述2: 如果后端数据库宕机,则通过某些技术手段可以实现高可用(可以实现自动的故障迁移)
  • 目的:为了保证数据不丢失
    数据库主从、双主模式(day09)_第2张图片

数据库热备份原理图

  • 冷备份

冷备份说明: 定期将数据库内容进行转储. 弊端:可能丢失数据. 公司中也会采用冷备份的方式以防万一.
数据库主从、双主模式(day09)_第3张图片

  • 数据库热备份原理

特点:可以保证数据的实时备份.
数据库主从、双主模式(day09)_第4张图片
工作原理说明:
1.数据库主库将更新的数据信息写入到二进制日志文件中.
2.数据库从库通过IO线程去主库中获取二进制文件修改内容. 之后写入到中继日志中
3.数据库从库中的Sql线程读取中继日志中的信息,实现数据的同步.
并且为了降低组件之间的耦合性,采用异步的方式处理.

3 准备第二台Linux操作系统

复制虚拟机文件新建一个slave文件把新的linux放进去
数据库主从、双主模式(day09)_第5张图片
数据库主从、双主模式(day09)_第6张图片

3.1修改虚拟机IP地址

规定: 主机IP地址 192.168.126.129 从机 192.168.126.130

//进入修改IP地址目录
cd /etc/sysconfig/network-scripts/
//打开ifcfg-ens33
vim ifcfg-ens33
//将ip修改为192.168.126.130
//然后保存配置
service network restart
//查看是否成功
ip addr

3.2在Xshell中新建Slave的连接

数据库主从、双主模式(day09)_第7张图片

3.3利用sqlYog工具链接从库

新建数据库添加129里面的jtdb
数据库主从、双主模式(day09)_第8张图片

3.3.1主库二进制文件

vim /etc/my.cnf

添加
server-id=1
log-bin=mysql-bin
//mysql-bin是自定义名字

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id=1
log-bin=mysql-bin

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
//数据库工作目录
cd /var/lib/mysql/
//重启数据库
systemctl restart mariadb

在这里插入图片描述

3.3.2从库二进制文件

vim /etc/my.cnf

添加
server-id=2
log-bin=mysql-bin
//mysql-bin是自定义名字

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
server-id=2
log-bin=mysql-bin

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
//数据库工作目录
cd /var/lib/mysql/
//重启数据库
systemctl restart mariadb

3.4查询主库状态

/* 我是主库 129*/
SHOW MASTER STATUS

数据库主从、双主模式(day09)_第9张图片

3.5主从数据库挂载

注:
一个一个执行

/* 从机130  实现主从挂载host,port,user,password,二进制文件*/
CHANGE MASTER TO MASTER_HOST="192.168.126.129",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=245;

/*开启主从服务*/
START SLAVE;

/*检查主从同步状态*/
SHOW SLAVE STATUS;

出现两个yes表示成功
数据库主从、双主模式(day09)_第10张图片

在这里插入图片描述

4数据库读写分离

  • 读写分离说明
    当数据库执行写操作时,应该操作主库. 如果用户进行读操作时应该读从库.
    实现该机制需要准备一个代理数据库服务器.
    数据库主从、双主模式(day09)_第11张图片

4.1mycat介绍

  • 什么是MYCAT
  1. 一个彻底开源的,面向企业应用开发的大数据库集群
  2. 支持事务、ACID、可以替代MySQL的加强版数据库
  3. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  4. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  5. 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  6. 一个新颖的数据库中间件产品
  • 关键特性
1. 支持SQL92标准
2. 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
3. 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
4. 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
5. 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
6. 基于Nio实现,有效管理线程,解决高并发问题。
7. 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
8. 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
9. 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
10. 支持多租户方案。
11. 支持分布式事务(弱xa)。
12. 支持XA分布式事务(1.6.5)。
13. 支持全局序列号,解决分布式下的主键生成问题。
14. 分片规则丰富,插件化开发,易于扩展。
15. 强大的web,命令行监控。
16. 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
17. 支持密码加密
18. 支持服务降级
19. 支持IP白名单
20. 支持SQL黑名单、sql注入攻击拦截
21. 支持prepare预编译指令(1.622. 支持非堆内存(Direct Memory)聚合计算(1.623. 支持PostgreSQL的native协议(1.624. 支持mysql和oracle存储过程,out参数、多结果集返回(1.625. 支持zookeeper协调主从切换、zk序列、配置zk化(1.626. 支持库内分表(1.627. 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

4.2mycat安装

//进入src
cd /usr/local/src
//安装包拉进来
//解压
tar -zxvf mycat.tar.gz
//删除安装包 
rm mycat.tar.gz
  • 修改server.xml
<user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</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="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>

=====修改成=====


<!--用户标签-->
	<user name="root">
		<property name="password">root</property>
		<!--与schema.xml中的配置相同 注意数据库的大小写-->
		<property name="schemas">jtdb</property>
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">jtdb</property>
		<property name="readOnly">true</property>
	</user>
  • 修改schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	
	<!--name属性是自定义的  dataNode表示数据库的节点信息  jtdb表示逻辑库-->
	<schema name="jtdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="jtdb"/>

	<!--定义节点名称/节点主机/数据名称-->
	<dataNode name="jtdb" dataHost="localhost1" database="jtdb" />
		<!--参数介绍-->
		<!--balance 0表示所有的读操作都会发往writeHost主机 -->  
		<!--1表示所有的读操作发往readHost和闲置的主节点中-->
		<!--writeType=0 所有的写操作都发往第一个writeHost主机-->	
		<!--writeType=1 所有的写操作随机发往writeHost中-->
		<!--dbType 表示数据库类型 mysql/oracle-->
		<!--dbDriver="native"  固定参数 不变-->
		<!--switchType=-1 表示不自动切换, 主机宕机后不会自动切换从节点-->
		<!--switchType=1  表示会自动切换(默认值)如果第一个主节点宕机后,Mycat会进行3次心跳检测,如果3次都没有响应,则会自动切换到第二个主节点-->
		<!--并且会更新/conf/dnindex.properties文件的主节点信息 localhost1=0 表示第一个节点.该文件不要随意修改否则会出现大问题-->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select 1</heartbeat>

		<!--配置第一台主机主要进行写库操作,在默认的条件下Mycat主要操作第一台主机在第一台主机中已经实现了读写分离.因为默认写操作会发往137的数据库.读的操作默认发往141.如果从节点比较忙,则主节点分担部分压力.
		-->
		<writeHost host="hostM1" url="192.168.126.129:3306" user="root" password="root">
			<!--读数据库1-->
			<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
			<!--读数据库2-->
			<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
			
		</writeHost>

			<!--定义第二台主机 由于数据库内部已经实现了双机热备.-->
			<!--Mycat实现高可用.当第一个主机137宕机后.mycat会自动发出心跳检测.检测3.-->
			<!--如果主机137没有给Mycat响应则判断主机死亡.则回启东第二台主机继续为用户提供服务.-->
			<!--如果137主机恢复之后则处于等待状态.如果141宕机则137再次持续为用户提供服务.-->
			<!--前提:实现双机热备.-->
		
		<!--	<writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">-->
			<!--读数据库1-->
		<!--	<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />-->
			<!--读数据库2-->
		<!--	<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
		</writeHost>-->
		
	</dataHost>
</mycat:schema>
//启动mycat
./mycat start

//如下:
[root@localhost src]# cd mycat
[root@localhost mycat]# ls
bin  catlet  conf  lib  logs  version.txt
[root@localhost mycat]# cd bin
[root@localhost bin]# ls
dataMigrate.sh  init_zk_data.sh  mycat  rehash.sh  startup_nowrap.sh  wrapper-linux-ppc-64  wrapper-linux-x86-32  wrapper-linux-x86-64
[root@localhost bin]# ./mycat
Usage: ./mycat { console | start | stop | restart | status | dump }
[root@localhost bin]# ./mycat start
Starting Mycat-server...

4.3修改数据源配置

spring:
  datasource:
    #引入druid数据源
    #type: com.alibaba.druid.pool.DruidDataSource
    #driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.126.129:8066/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
    username: root
    password: root

4.4 负载均衡测试

启动程序链接数据库,检查数据访问是否正常。之后修改从库信息 检查负载均衡是否正确。

5双主模式

/* 我是主库 129*/
SHOW MASTER STATUS;
/*我之前是主库   现在是从库*/
CHANGE MASTER TO 
MASTER_HOST="192.168.126.130",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=245;

/*开启主从服务*/
START SLAVE;

/*检查主从同步状态*/
SHOW SLAVE STATUS;
/* 从机130  实现主从挂载host,port,user,password,二进制文件*/
CHANGE MASTER TO 
MASTER_HOST="192.168.126.129",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000001",
MASTER_LOG_POS=2065;

/*开启主从服务*/
START SLAVE;

/*检查主从同步状态*/
SHOW SLAVE STATUS;

/* 翻身当主库 */
SHOW MASTER STATUS;

数据库主从、双主模式(day09)_第12张图片

5.1配置数据库高可用

  • 什么是数据库高可用
    说明: 当其中有一台数据库宕机之后,用户依然可以正确的访问数据库不受任何影响,(实现了故障迁移).主要数据库能够正常的工作,则重新启动数据库之后则可以实现自动的数据的同步.
  • 实现数据库高可用配置
    放开注释
<writeHost host="hostM2" url="192.168.126.130:3306" user="root" password="root">-
			<!--读数据库1-->
			<readHost host="hostS1" url="192.168.126.130:3306" user="root" password="root" />
			<!--读数据库2-->
			<readHost host="hostS2" url="192.168.126.129:3306" user="root" password="root" />
		</writeHost>
  • 测试数据库高可用
    先将主库宕机,之后查询数据,之后重启主库 检查主从同步的状态是否正确.

你可能感兴趣的:(笔记四)